mitch donaberger 3 miesięcy temu
commit
5722d7e2a1
80 zmienionych plików z 36508 dodań i 0 usunięć
  1. 1 0
      .eslintignore
  2. 93 0
      .eslintrc.json
  3. 4 0
      .gitignore
  4. 6 0
      .npmignore
  5. 1 0
      .npmrc
  6. 343 0
      DOCUMENTATION.md
  7. 20 0
      LICENSE
  8. 86 0
      README.md
  9. 11 0
      dist-rename.js
  10. 1702 0
      dist/badiDate-locales.js
  11. 5 0
      dist/badiDate-locales.min.js
  12. 0 0
      dist/badiDate-locales.min.js.map
  13. 5 0
      dist/badiDate-locales.min.mjs
  14. 0 0
      dist/badiDate-locales.min.mjs.map
  15. 1693 0
      dist/badiDate-locales.mjs
  16. 67 0
      dist/badiDate.d.ts
  17. 773 0
      dist/badiDate.js
  18. 5 0
      dist/badiDate.min.js
  19. 0 0
      dist/badiDate.min.js.map
  20. 5 0
      dist/badiDate.min.mjs
  21. 0 0
      dist/badiDate.min.mjs.map
  22. 764 0
      dist/badiDate.mjs
  23. 1699 0
      dist/localBadiDate-locales.js
  24. 5 0
      dist/localBadiDate-locales.min.js
  25. 0 0
      dist/localBadiDate-locales.min.js.map
  26. 5 0
      dist/localBadiDate-locales.min.mjs
  27. 0 0
      dist/localBadiDate-locales.min.mjs.map
  28. 1696 0
      dist/localBadiDate-locales.mjs
  29. 2469 0
      dist/localBadiDate-msm-locales.js
  30. 2465 0
      dist/localBadiDate-msm-locales.m.js
  31. 10 0
      dist/localBadiDate-msm-locales.min.js
  32. 0 0
      dist/localBadiDate-msm-locales.min.js.map
  33. 10 0
      dist/localBadiDate-msm-locales.min.mjs
  34. 0 0
      dist/localBadiDate-msm-locales.min.mjs.map
  35. 2465 0
      dist/localBadiDate-msm-locales.mjs
  36. 1540 0
      dist/localBadiDate-msm.js
  37. 10 0
      dist/localBadiDate-msm.min.js
  38. 0 0
      dist/localBadiDate-msm.min.js.map
  39. 10 0
      dist/localBadiDate-msm.min.mjs
  40. 0 0
      dist/localBadiDate-msm.min.mjs.map
  41. 1536 0
      dist/localBadiDate-msm.mjs
  42. 770 0
      dist/localBadiDate.js
  43. 5 0
      dist/localBadiDate.min.js
  44. 0 0
      dist/localBadiDate.min.js.map
  45. 5 0
      dist/localBadiDate.min.mjs
  46. 0 0
      dist/localBadiDate.min.mjs.map
  47. 767 0
      dist/localBadiDate.mjs
  48. 20 0
      jest.config.js
  49. 10310 0
      package-lock.json
  50. 69 0
      package.json
  51. 1684 0
      res/badiYearsLongFormat.ts
  52. 390 0
      res/equinoxes.ts
  53. 81 0
      res/generateYearData.ts
  54. 138 0
      res/uncertainties.ts
  55. 68 0
      rollup.config.js
  56. 390 0
      src/badiDate.ts
  57. 40 0
      src/badiLocale.ts
  58. 28 0
      src/badiYears.ts
  59. 3 0
      src/clockLocations.ts
  60. 220 0
      src/formatter.ts
  61. 163 0
      src/localBadiDate.ts
  62. 110 0
      src/locale/ar.ts
  63. 51 0
      src/locale/de.ts
  64. 6 0
      src/locale/en-us.ts
  65. 132 0
      src/locale/en.ts
  66. 51 0
      src/locale/es.ts
  67. 131 0
      src/locale/fa.ts
  68. 51 0
      src/locale/fr.ts
  69. 51 0
      src/locale/lv.ts
  70. 51 0
      src/locale/nl.ts
  71. 51 0
      src/locale/pt.ts
  72. 129 0
      src/locale/ru.ts
  73. 51 0
      src/locale/sv.ts
  74. 129 0
      src/locale/zh.ts
  75. 13 0
      src/settings.ts
  76. 42 0
      src/types.d.ts
  77. 383 0
      test/badiDate.test.ts
  78. 297 0
      test/localBadiDate.test.ts
  79. 116 0
      test/testData.ts
  80. 8 0
      tsconfig.json

+ 1 - 0
.eslintignore

@@ -0,0 +1 @@
+*dist*

+ 93 - 0
.eslintrc.json

@@ -0,0 +1,93 @@
+{
+    "extends": "standard",
+    "env": {"jest": true},
+    "parser": "@typescript-eslint/parser",
+    "plugins": ["prefer-arrow", "@typescript-eslint"],
+    "rules": {
+        "array-bracket-spacing": ["error", "never"],
+        "array-callback-return": "error",
+        "arrow-body-style": ["error", "as-needed"],
+        "arrow-parens": ["error", "as-needed"],
+        "block-scoped-var": "error",
+        "camelcase": ["error", { "properties": "always" }],
+        "class-methods-use-this": "off",
+        "comma-dangle": ["error", "always-multiline"],
+        "complexity": ["error", 11],
+        "computed-property-spacing": ["error", "never"],
+        "consistent-return": "error",
+        "consistent-this": "error",
+        "default-case": ["error", {"commentPattern": "^skip\\sdefault"}],
+        "dot-notation": "error",
+        "for-direction": "error",
+        "func-style": ["error", "expression"],
+        "getter-return": "error",
+        "guard-for-in": "error",
+        "implicit-arrow-linebreak": ["error", "beside"],
+        "indent": ["error", 4, {"SwitchCase": 1}],
+        "linebreak-style": ["error", "unix"],
+        "line-comment-position": ["error", "above"],
+        "lines-between-class-members": ["error", "always", {"exceptAfterSingleLine": true}],
+        "max-depth": ["error", 4],
+        "max-len": ["error", {"code": 120, "ignorePattern": "\\/\\* eslint"}],
+        "multiline-ternary": ["error", "always-multiline"],
+        "newline-per-chained-call": "off",
+        "no-alert": "error",
+        "no-await-in-loop": "error",
+        "no-case-declarations": "error",
+        "no-catch-shadow": "error",
+        "no-confusing-arrow": ["error", {"allowParens": true}],
+        "no-console": "error",
+        "no-div-regex": "error",
+        "no-duplicate-imports": "error",
+        "no-else-return": "error",
+        "no-empty": "error",
+        "no-empty-function": "error",
+        "no-eq-null": "error",
+        "no-extra-semi": "error",
+        "no-floating-decimal": "error",
+        "no-implicit-coercion": "error",
+        "no-implicit-globals": "error",
+        "no-invalid-this": "error",
+        "no-lonely-if": "error",
+        "no-loop-func": "error",
+        "no-multi-assign": "error",
+        "nonblock-statement-body-position": ["error", "beside"],
+        "no-negated-condition": "error",
+        "no-nested-ternary": "error",
+        "no-prototype-builtins": "error",
+        "no-script-url": "error",
+        "no-underscore-dangle": "off",
+        "no-useless-concat": "error",
+        "no-var": "error",
+        "no-void": "error",
+        "no-warning-comments": ["error", {"terms": ["todo", "fix", "fixme"]}],
+        "no-throw-literal": "off",
+        "object-curly-newline": "off",
+        "object-curly-spacing": ["error", "always"],
+        "object-shorthand": "error",
+        "prefer-arrow/prefer-arrow-functions": ["error"],
+        "prefer-const": "error",
+        "prefer-numeric-literals": "error",
+        "prefer-rest-params": "error",
+        "prefer-spread": "error",
+        "prefer-template": "error",
+        "radix": "error",
+        "require-await": "error",
+        "require-jsdoc": ["off", {"require": {"FunctionDeclaration": true, "MethodDefinition": true, "ClassDeclaration": true, "ArrowFunctionExpression": false, "FunctionExpression": true}}],
+        "require-yield": "error",
+        "rest-spread-spacing": ["error", "never"],
+        "semi": ["error", "always"],
+        "semi-style": ["error", "last"],
+        "sort-imports": "off",
+        "sort-keys": "off",
+        "sort-vars": "off",
+        "space-before-function-paren": "off",
+        "switch-colon-spacing": "error",
+        "valid-jsdoc": ["off", {"prefer": {"arg": "param", "argument": "param", "class": "constructor", "return": "returns", "virtual": "abstract"}, "requireReturn": false}],
+        "wrap-regex": "error",
+        "@typescript-eslint/no-unused-vars": ["error"]
+    },
+    "globals": {
+        "luxon": false
+    }
+}

+ 4 - 0
.gitignore

@@ -0,0 +1,4 @@
+node_modules
+coverage
+.idea
+*.py

+ 6 - 0
.npmignore

@@ -0,0 +1,6 @@
+node_modules
+coverage
+res
+test
+.idea
+*.py

+ 1 - 0
.npmrc

@@ -0,0 +1 @@
+node-options="--max-old-space-size=4096"

+ 343 - 0
DOCUMENTATION.md

@@ -0,0 +1,343 @@
+# badiDate - Documentation
+
+## Dependencies
+
+badiDate requires [Luxon](https://moment.github.io/luxon/). In order to use the `LocalBadiDate` class,
+[MeeusSunMoon](https://github.com/janrg/MeeusSunMoon) (v3.0.0+) is also required. Versions that bundle MeeusSunMoon are
+included.
+
+## Installation
+
+### Bundles
+
+A variety of different bundles are provided depending on the exact requirements:
+
+`badiDate*.js` files include the `BadiDate` class and the function `badiDateOptions`.  
+`localBadiDate*.js` files include all of the above as well as the `LocalBadiDate` class.
+
+Files with `-msm` in the name have the MeeusSunMoon module bundled in. For usage of `LocalBadiDate` without a bundled
+version of MeeusSunMoon see below.
+
+Files with `-locales` in the name include all currently available locales, files without only include the english locale.
+Creating bundles with a custom set of bundled locales is also possible (see `rollup.config.js`)
+
+Files ending in `.mjs` ES6 modules, files without are packed as UMD modules.
+
+### Script Include
+
+Compiled versions (both minified and not) are located in `dist/`.
+
+Include for example as:
+
+```html
+<script src="{yourjspath}/localBadiDate-msm-locales.min.js"></script>
+```
+
+If a non`-msm` file is used, MeeusSunMoon needs to be included separately.
+
+Luxon can be included from a CDN, such as CDNJS:
+
+```html
+<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/1.24.1/luxon.min.js"></script>
+```
+
+### NPM
+
+`npm install badidate`
+
+For bundling (e.g. with rollup) you can then import the ES6 module via
+
+```js
+import { adiDate, LocalBadiDate, badiDateSettings } from 'badidate';
+```
+
+or directly use it in the browser via
+
+```js
+import { BadiDate, LocalBadiDate, badiDateSettings } from './node_modules/badidate/dist/localBadiDate-msm-locales.m.js';
+```
+
+If the version of `localBadiDate*.js` without bundled  MeeusSunMoon is used, the module has to be loaded globally
+via its UMD bundle in order for it to be available inside of the LocalBadiDate class.
+
+## Configuration
+
+There are three configuration options that can be set as
+
+```js
+badiDateSettings({
+  useClockLocations: false, // default: true
+  defaultLanguage: 'en', // default: 'en'
+  underlineFormat: 'diacritic' // default: 'css'
+});
+```
+
+(Note that two of the options for MeeusSunMoon, `roundToNearestMinute` and `returnTimeForPNMS`, default to `true`
+when using the badiDate module.)
+
+`useClockLocations` will use the appropriate times for regions in which fixed times are used rather than the actual
+times for sunrise, sunset etc.. Setting it to `false` will disable this behaviour. For a list of currently implemented
+regions, see below. This option is only available if the `LocalBadiDate` class is used.
+
+`defaultLanguage` sets the default language for output of Badí' dates. (Alternatively this can be overwritten on each
+call to `format()`, see below.) For a list of available languages see `src/locale/`.
+
+`underlineFormat` sets how terms that include underlined letters should be rendered. The technically most correct
+choice is `'diacritic'`, where each underlined letter is combined with the symbol U+0332 ("Combining Low Line"),
+as the underlining is not styling but belongs to the letter. This is also the only way in which the underlining
+will remain when copied as plain text. Unfortunately, some fonts will not display this correctly and not connect
+the lines under adjacent characters. The default, and typically most robust option is `'css'`, where the letters
+are wrapped in `<span style="text-decoration:underline;">|</span>`. `'u'`, which will wrap the letters in `<u>|</u>`,
+should only be used if for some reason neither of the others can be used for your situation, as the `<u>` tag has
+been deprecated for many years. `'none'` will result in no uderlining at all.
+
+## The BadiDate Class
+
+The BadiDate object represents a Badí' date with some simplifications in order to make it independent of location
+(for local Badí' dates, a wrapper class, `LocalBadiDate()` exists, see below), namely
+
+*   Badí' dates are taken to correspond to Gregorian dates 1-1, i.e. to start at midnight
+*   No other times (e.g. for Holy Day commemorations) are stored
+
+For dates in 172 B.E. and after (21 March 2015 and after), the new implementation is used to calculate the beginning
+of the year, all Holy Days, and the length of Ayyám-i-Há, for earlier dates the earlier implementation, where for the
+Twin Birthdays, the earlier implementation as customary in countries predominantly using the Gregorian calendar (i.e.
+5 'Ilm and 9 Qudrat) is used.
+
+### Creating a badiDate Object
+
+There are a number of different ways, in which a badiDate object can be created:
+
+#### From a luxon.DateTime or Date object
+
+```js
+const datetime = luxon.DateTime.fromISO('2015-03-21');
+const myBadiDate1 = new BadiDate(datetime);
+
+const date = new Date('2015-03-21');
+const myBadiDate2 = new BadiDate(date);
+```
+
+sets the Badí' date from the Gregorian date given by the luxon.DateTime or Date object. Any time or timezone information
+is ignored.
+
+#### From an object representing a Badí' date
+
+```js
+const myBadiDate1 = new BadiDate({ year: 172, month: 1, day: 1 });
+const myBadiDate2 = new BadiDate({ year: 172, holyDayNumber: 1 });
+```
+
+Sets the Badí' date from the given object. Arguments can either be in the format `{ year, month, day }`, or
+`{ year, holyDayNumber }` where year, month, day, and holyDayNumber are integers and stand for
+Badí' year, Badí' month, Badí' day, and Holy Day respectively. Badí' year can range from 1 to currently 507, Badí'
+month from 1 to 20 (20 is used to represent Ayyám-i-Há throughout this module), Badí' day from 1 to 19 (except if
+the month is 20 in which case it is from 1 to 5, a value of 5 in a year with 365 days bubbles up to 1 'Alá' automatically),
+and Holy Day from 1 to 11 (corresponding to Naw-Rúz, First Day of Riḍván, Ninth Day of Riḍván, Twelfth Day of Riḍván,
+Declaration of the Báb, Ascension of Bahá'u'lláh, Martyrdom of the Báb, Birth of the Báb, Birth of Bahá'u'lláh, Day of
+the Covenant, Ascension of 'Abdu'l-Bahá).
+
+### Properties and Methods
+
+| Property | Type | Description |
+| --- | --- | --- |
+| `ayyamiHaLength` | number         | The length of Ayyám-i-Há in days for the given year (4 or 5) |
+| `day`            | number         | The day in the Badí' month (1-19) |
+| `gregorianDate`  | luxon.DateTime | The gregorian date corresponding to the end of the Badí' date |
+| `holyDayNumber`  | number?        | The number of the Holy Day (1-11) or undefined if not a Holy Day |
+| `invalidReason`  | string?        | If the date is invalid, this gives the reason, otherwise undefined |
+| `isValid`        | boolean        | Whether this is a valid Badí' date |
+| `kullIShay`      | number         | The Kull-i-Shay' of the Badí' date 1 for all dates between 1 B.E and 361 B.E. |
+| `month`          | number         | The month in the Badí' year (1-20, 20 representing Ayyam-i-Há) |
+| `nextDay`        | BadiDate       | The Badí' date immediately following this one |
+| `nextMonth`      | BadiDate       | The first day of the Badí' month following this one |
+| `previousDay`    | BadiDate       | The Badí' date immediately preceding this one |
+| `previousMonth`  | BadiDate       | The first day of the Badí' month preceding this one |
+| `vahid`          | number         | The Vaḥid in the current Kull-i-Shay' (1-19)|
+| `weekday`        | number         | The number of the weekday (1-7, with one representing Jalál |
+| `workSuspended`  | boolean?       | If this is a Holy Day, whether work is suspended, otherwise undefined |
+| `year`           | number         | The Badí' year |
+| `yearInVahid`    | number         | The year in the current Vaḥid |
+
+| Method | Return Type | Description |
+| --- | --- | --- |
+| `format(formatString?: string, language?: string)` | string | The date in the format as given by `formatString` (see below ) |
+| `holyDay(language?: string)` | string | The name of the Holy Day in the given language or an empty string if not a Holy Day |
+| `equals(other: BadiDate)` | boolean | Returns `true` if both dates are valid and correspond to the same day, month, and year |
+
+#### Formatting Tokens
+
+|                   | Token | Output
+|-------------------|-------|--------
+| **Day**           | d     | Day of the month, without leading zeroes
+|                   | dd    | Day of the month, with leading zeroes
+|                   | D     | Day of the month as 3-letter (+ apostrophes) abbreviation of transliteration
+|                   | DD    | Full day of month transliteration
+|                   | DDL   | Full day of month translation
+|                   | DD+   | Full day of month transliteration followed by translation in brackets
+| **Month**         | m     | Badí' month, without leading zeroes, Ayyám-i-Há is 20
+|                   | mm    | Badí' month, with leading zeroes, Ayyám-i-Há is 20
+|                   | M     | Badí' month as 3-letter (+ apostrophes) abbreviation of transliteration
+|                   | MM    | Badí' month transliteration
+|                   | MML   | Badí' month translation
+|                   | MM+   | Badí' month transliteration followed by translation in brackets
+| **Year**          | y     | Badí' year without leading zeros
+|                   | yy    | 3 digit Badí' year with leading zeroes
+| **Weekday**       | ww    | Badí' weekday, 2 letter abbreviation of transliteration
+|                   | W     | Badí' weekday, 3 letter abbreviation of transliteration
+|                   | WW    | Badí' weekday, transliteration
+|                   | WWL   | Badí' weekday, translation
+| **Year in Váḥid** | yv    | Year in Váḥid, without leading zeroes
+|                   | yyv   | Year in Váḥid, with leading zeroes
+|                   | YV    | Year in Váḥid, transliteration
+| **Váḥid**         | v     | Váḥid without leading zeroes
+|                   | vv    | Váḥid with leading zeroes
+| **Kull-i-Shay’**  | k     | Kull-i-Shay’ without leading zeroes
+|                   | kk    | Kull-i-Shay’ with leading zeroes
+| **Labels**        | BE    | localized version of B.E. to indicate a Badí' year
+|                   | BC    | localized version of the term "Badí' Calendar"
+|                   | Va    | localized version of the term "Váḥid"
+|                   | KiS   | localized version of the term "Kull-i-Shay'"
+
+If no formatting string is given, `format()` defaults to `'d MM+ y BE'` (With some exceptions. The default format can be set in the
+respective locale file.) E.g.
+
+```js
+const myBadiDate = new BadiDate({ year: 172, month: 1, day: 1 });
+console.log(myBadiDate.format());
+```
+
+will print
+
+```
+1 Bahá (Splendour) 172 B.E.
+```
+
+(assuming that the default language is English)
+
+Any text in the formatting string wrapped in `{}` will not be parsed and output as-is.
+A `{` without matching `}` will result in a return value of `"Invalid formatting string."`.
+
+Note that for right-to-left languages such as Arabic, it may be necessary to wrap the formatting string in `U+200F` (Right-To-Left Mark,
+HTML token: `&#8207;`) to achieve the correct display order.
+
+## The LocalBadiDate Class
+
+`LocalBadiDate` is a wrapper object for a `BadiDate` that is valid for a specific location.
+This object contains the BadiDate object, as well as datetime objects for the start and end of the Badí' date as well as
+sunrise, solar noon, and - if applicable - the time for commemoration of the Holy Day.
+
+It requires the module [MeeusSunMoon](https://github.com/janrg/MeeusSunMoon), which is included in some of the bundles.
+
+
+### Creating Badí' Dates
+
+A local Badí' date object is created with
+
+```js
+const date1 = new LocalBadiDate(date, latitude, longitude, timezoneId);
+```
+
+where `date` accepts the same input formats as `BadiDate()`, `latitude` and `longitude` are the geographic latitude and longitude
+(-90 to 90, -180 to 180, north and east are positive) and `timezoneId` is an IANA timezone string, e.g. `"Europe/London"`.
+
+All input formats for `date` **except for luxon.DateTime object** are treated the same as in the `BadiDate()`
+constructor. For a luxon.DateTime object, the time of day is taken into consideration and if appropriate, the Badí' day shifted forward
+by a day. If this is not desired, make sure to assign an early time that will definitely not be after sunset, to the moment
+object before invoking `LocalBadiDate()`.
+
+### Properties
+
+| Property | Type | Description |
+| --- | --- | --- |
+| `badiDate`             | BadiDate        | The corresponding BadiDate object |
+| `clockLocation`        | string?         | The name of the region which causes this date to use fixed times for sunrise, noon and sunset if applicable, else undefined |
+| `end`                  | luxon.DateTime  | The datetime corresponding to the end of this date |
+| `holyDayCommemoration` | luxon.DateTime? | The commemoration time if this is a Holy Day with a set commemoration time, else undefined |
+| `latitude`             | number          | The latitude for which this local Badí' date was calculated |
+| `longitude`            | number          | The longitude for which this local Badí' date was calculated |
+| `nextDay`              | LocalBadiDate   | The Badí' date immediately following this one as a LocalBadiDate |
+| `nextMonth      `      | LocalBadiDate   | The first day of the Badí' month following this one as a LocalBadiDate |
+| `previousDay`          | LocalBadiDate   | The Badí' date immediately preceding this one as a LocalBadiDate |
+| `previousMonth`        | LocalBadiDate   | The first day of the Badí' month preceding this one as a LocalBadiDate |
+| `solarNoon`            | luxon.DateTime  | The datetime corresponding to solar noon on this date |
+| `start`                | luxon.DateTime  | The datetime corresponding to the start of this date |
+| `sunrise`              | luxon.DateTime  | The datetime corresponding to sunrise on this date |
+| `timezoneId`           | string          | The IANA timezone id for the timezone of this date |
+
+## Localization
+
+The output of Badí' dates fully supports localization and a number of different localizations are provided.
+Data is stored in `src/locale/`.
+
+Note that entries with letters that should be underlined will be stored in the respective locale file by wrapping the letters
+in question in underscores, like e.g. `Ma_sh_íyyat` or `_Sh_araf`.
+
+### Language Fallbacks
+
+Date formatting is subject to a series of language fallbacks if a given component is not available in the selected language.
+The maximum possible fallback sequence is
+
+```
+IETF language tag (regional variant) -> IETF language tag (primary language) -> configured default language -> English
+```
+
+Hence if e.g. French was set as the default language and a BadiDate was formatted using the language tag 'pt-br' (Portuguese
+(Brazil)), for each date component in the output, the formatter will attempt to use the Brazilian Portuguese entry; if this
+is not available, the Portuguese entry; if this is not available the French entry; and if this is not available the English entry.
+
+### Contributing a Locale
+
+Follow these steps if you wish to add a locale to the module:
+1. Copy the file `src/locale/en.ts` to `src/locale/{languagecode}.js` where `{languagecode}` is the IETF language code of the
+language you wish to contribute.
+2. Replace all the strings that differ from the English version, **delete all that do not**, these will be taken care of
+by the fallback. Don't forget to also remove entries that no longer exist above from the export statement.
+3. Add the appropriate lines for your language to `src/badiLocale.ts`. Note that for regional variants, the variable names
+need to use an underscore instead of a hyphen.
+4. Add the appropriate entr(y/ies) to `localeRegex` in `rollup.config.js`. Note that for regional variants, entries with
+both hyphen and underscore are required.
+
+### Bundles With Custom Locale Sets
+
+`rollup.config.js` is set up to allow bundling custom sets of languages if desired. For this, simply pass an array of
+locale strings to `rollupConfig()` and set the filename with the optional `filename` parameter. Note that for regional
+variants, entries with both hyphen and underscore are required.
+
+## Locations for Which Fixed Times are Used
+
+The following locations use fixed times rather than actual sunrise, sunset, etc. for purposes of the Badí' calendar. The module determines
+the appropriate region by checking whether the given coordinates lie within polygons that are included in the code. Slight inaccuracies
+near borders are possible since the polygons had to be simplified for performance and size reasons. Over water, boundaries are drawn very
+roughly to reduce vertex count and no attempt was made to capture to boundary to international waters.
+
+The groups of three times given below correspond to sunrise, solar noon, and sunset.
+
+*   **Canada**: 06:30, 12:00, 18:00 above 60°N latitude.
+*   **Finland**: 06:00, 12:00, 18:00 local standard time (i.e. 07:00, 13:00, 19:00 in local time when DST is in effect), **except** for the
+month of \`Alá´, where the actual times for sunrise, solar noon, and sunset are used.
+*   **Iceland**: 06:00, 13:00, 18:00.
+*   **Norway**: 06:00, 12:00, 18:00.
+*   **Sweden**: 06:00, 12:00, 18:00 in Norrland (i.e. Lapland, Norrbotten, Västerbotten, Jämtland, Ångermanland, Medelpad, Härjedalen,
+Hälsingland, and Gästriksland)
+*   **USA**: 06:00, 12:00, 18:00 local standard time (i.e. 07:00, 13:00, 19:00 in local time when DST is in effect) **in Alaska**.
+
+## The Source Data
+
+The list of equinox times used can be found in `res/equinoxes.ts`. The BadiDate class itself contains data for every year from 172 to
+the end of the range, specifically the date of Naw-Rúz, the length of Ayyám-i-Há, and the dates of the Twin Birthdays.
+The data can be generated in two formats via `npm run generateYearData`, long and short format The short format is the one used by default
+in the BadiDate class. Every year is represented by a 4 character string in base36 encoding where the first character indicates the day
+in March on which the end of Naw-Rúz falls, the second character the length of Ayyám-i-Há, and the third and fourth character the Badí'
+month and day respectively on which the Birth of the Báb falls. This data is then internally unpacked into the long format as needed,
+though it is also possible to replace the short format data in `badiDate.ts` with the long format without any additional changes (though
+this appears to make the handling of the object slightly slower (and of course increases the file size significantly.
+An item in the long format looks as follows:
+
+```js
+172: {
+    ayyamiHaLength: 4,
+    nawRuz: '2015-03-21',
+    twinBirthdays: [13, 10, 13, 11],
+},
+```

+ 20 - 0
LICENSE

@@ -0,0 +1,20 @@
+Copyright (c) 2016 Jan Greis
+
+Permission is hereby granted, free of charge, to any person obtaining a 
+copy of this software and associated documentation files (the 
+"Software"), to deal in the Software without restriction, including 
+without limitation the rights to use, copy, modify, merge, publish, 
+distribute, sublicense, and/or sell copies of the Software, and to 
+permit persons to whom the Software is furnished to do so, subject to 
+the following conditions:
+
+The above copyright notice and this permission notice shall be included 
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 86 - 0
README.md

@@ -0,0 +1,86 @@
+# Badí' Date
+
+[![MIT License][license-image]][license-url]
+
+A JavaScript module for dates in the Badí' calendar. Badí' date objects can be created from Gregorian or Badí' dates in
+a variety of input formats. The currently handled range of dates is from 1 Bahá 1 BE (21 March 1844) to 19 'Alá' 556 BE
+(19 Mach 2400). Badí' dates are treated as if corresponding exactly to Gregorian dates (i.e. starting at midnight), but
+with the provided `LocalBadiDate` class, local information can be generated incl. the start and end date
+and time of the Badí' date, the times for sunrise and solar noon, as well as - if applicable - the time for a Holy Day
+commemoration.
+
+## Dependencies
+
+badiDate requires [Luxon](https://moment.github.io/luxon/). In order to use the `LocalBadiDate` class,
+[MeeusSunMoon](https://github.com/janrg/MeeusSunMoon) (v3.0.0+) is also required. Versions that bundle MeeusSunMoon are
+included.
+
+## [Documentation](DOCUMENTATION.md)
+
+## Accuracy
+
+Accuracies of solar and lunar calculations are given by [MeeusSunMoon](https://github.com/janrg/MeeusSunMoon).
+
+The accuracy of the calculation of the date of Naw-Rúz and the dates of the Twin Birthdays depend on those as well as that
+of the equinox calculations, which are immensely complex. Equinox dates until 2200 are calculated with an algorithm using
+the [JPL DE405 Ephemeris](https://en.wikipedia.org/wiki/Jet_Propulsion_Laboratory_Development_Ephemeris), and from 2200 onwards
+with an algorithm using the [VSOP87 Ephemeris](https://en.wikipedia.org/wiki/VSOP_(planets)#VSOP87), which is slightly less
+accurate, but only on the order of a few seconds.
+
+The main source of uncertainty for far future dates comes from the uncertainty on [ΔT](https://en.wikipedia.org/wiki/%CE%94T).
+A detailed analysis of uncertainties is included in the code. The range of dates is limited to until 20 March 2351, as the
+uncertainty in ΔT means the date of Naw-Rúz 2352 AD produced by the algorithm may not be correct.
+
+## Changelog
+
+### 3.0.2
+
+- Fixed typo in `main` path in `package.json
+
+### 3.0.1
+
+- Fixed error in `previousDay`
+
+### 3.0.0
+
+- Switched to using Luxon instead of moment-timezone.
+- Changed all accessors to `get()` attributes
+- Added the properties `invalidReason`, `nextDay`, `nextMonth`, `previousDay`, `previousMonth` to the BadiDate class
+- Added the `equals()` method to the `BadiDate` class
+- Added the properties `clockLocation`, `latitude`, `longitude`, `nextDay`, `nextMonth`, `previousDay`, `previousMonth`,
+`timezoneId` to the `LocalBadiDate` class
+- Some bugfixes
+
+###### Breaking Changes:
+- Inputs and outputs are now Luxon DateTime objects instead of moment objects
+- Arrays and date strings can no longer be used in the constructors.
+- Browser support for browsers not supported by Luxon dropped. Any reasonably modern
+  browser will work. No version of IE is supported.
+- Changed all accessors to `get()` attributes
+
+
+### 2.1.0
+
+*   Added several new tokens to `BadiDate.format()`
+*   More robust handling of locale entries with underlined letters
+*   Improvements to handling of Arabic and Farsi locales
+
+### 2.0.0
+
+Refactored into ES6 modules and distributed via node. **This version is incompatible with previous versions of the module.**
+
+### 1.1.0
+
+Fixed some output formatting, added uncertainty analysis for far future dates and based on this reduced the range of dates slightly
+(now ends in 507 BE), added Persian localization (thanks to arminhaghi).
+
+### 1.0.0
+
+Initial release
+
+## License
+
+badiDate is freely distributable under the terms of the [MIT license](LICENSE).
+
+[license-image]: http://img.shields.io/badge/license-MIT-blue.svg
+[license-url]: LICENSE

+ 11 - 0
dist-rename.js

@@ -0,0 +1,11 @@
+const fs = require('fs');
+
+// fancy-rollup can't deal with filesnames that only differ by extension so we need to rename afterwards
+for (const filename of fs.readdirSync('dist/')) {
+    if (filename.includes('.m.js')) {
+        fs.renameSync(`dist/${filename}`, `dist/${filename.replace('.m.js', '.mjs')}`);
+    }
+}
+
+// Some packages still can't deal with mjs file extensions
+fs.copyFileSync('dist/localBadiDate-msm-locales.mjs', 'dist/localBadiDate-msm-locales.m.js');

+ 1702 - 0
dist/badiDate-locales.js

@@ -0,0 +1,1702 @@
+/**
+ * @license BadiDate v3.0.2
+ * (c) 2018 Jan Greis
+ * licensed under MIT
+ */
+
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('luxon')) :
+    typeof define === 'function' && define.amd ? define(['exports', 'luxon'], factory) :
+    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.window = global.window || {}, global.luxon));
+}(this, (function (exports, luxon) { 'use strict';
+
+    const month = {
+        1: 'Bahá',
+        2: 'Jalál',
+        3: 'Jamál',
+        4: '‘Aẓamat',
+        5: 'Núr',
+        6: 'Raḥmat',
+        7: 'Kalimát',
+        8: 'Kamál',
+        9: 'Asmá’',
+        10: '‘Izzat',
+        11: 'Ma_sh_íyyat',
+        12: '‘Ilm',
+        13: 'Qudrat',
+        14: 'Qawl',
+        15: 'Masá’il',
+        16: '_Sh_araf',
+        17: 'Sulṭán',
+        18: 'Mulk',
+        19: '‘Alá’',
+        20: 'Ayyám-i-Há',
+    };
+    const monthL = {
+        1: 'Splendour',
+        2: 'Glory',
+        3: 'Beauty',
+        4: 'Grandeur',
+        5: 'Light',
+        6: 'Mercy',
+        7: 'Words',
+        8: 'Perfection',
+        9: 'Names',
+        10: 'Might',
+        11: 'Will',
+        12: 'Knowledge',
+        13: 'Power',
+        14: 'Speech',
+        15: 'Questions',
+        16: 'Honour',
+        17: 'Sovereignty',
+        18: 'Dominion',
+        19: 'Loftiness',
+        20: 'Ayyám-i-Há',
+    };
+    const holyDay = {
+        1: 'Naw-Rúz',
+        2: 'First day of Riḍván',
+        3: 'Ninth day of Riḍván',
+        4: 'Twelfth day of Riḍván',
+        5: 'Declaration of the Báb',
+        6: 'Ascension of Bahá’u’lláh',
+        7: 'Martyrdom of the Báb',
+        8: 'Birth of the Báb',
+        9: 'Birth of Bahá’u’lláh',
+        10: 'Day of the Covenant',
+        11: 'Ascension of ‘Abdu’l-Bahá',
+    };
+    // CAREFUL: Numbering corresponds to Badí' week, i.e. 1 is Jalál (-> Saturday)
+    const weekday = {
+        1: 'Jalál',
+        2: 'Jamál',
+        3: 'Kamál',
+        4: 'Fiḍál',
+        5: '‘Idál',
+        6: 'Istijlál',
+        7: 'Istiqlál',
+    };
+    const weekdayAbbr3 = {
+        1: 'Jal',
+        2: 'Jam',
+        3: 'Kam',
+        4: 'Fiḍ',
+        5: '‘Idá',
+        6: 'Isj',
+        7: 'Isq',
+    };
+    const weekdayAbbr2 = {
+        1: 'Jl',
+        2: 'Jm',
+        3: 'Ka',
+        4: 'Fi',
+        5: '‘Id',
+        6: 'Ij',
+        7: 'Iq',
+    };
+    const weekdayL = {
+        1: 'Glory',
+        2: 'Beauty',
+        3: 'Perfection',
+        4: 'Grace',
+        5: 'Justice',
+        6: 'Majesty',
+        7: 'Independence',
+    };
+    const yearInVahid = {
+        1: 'Alif',
+        2: 'Bá’',
+        3: 'Ab',
+        4: 'Dál',
+        5: 'Báb',
+        6: 'Váv',
+        7: 'Abad',
+        8: 'Jád',
+        9: 'Bahá',
+        10: 'Ḥubb',
+        11: 'Bahháj',
+        12: 'Javáb',
+        13: 'Aḥad',
+        14: 'Vahháb',
+        15: 'Vidád',
+        16: 'Badí‘',
+        17: 'Bahí',
+        18: 'Abhá',
+        19: 'Váḥid',
+    };
+    const vahid = 'Váḥid';
+    const kulliShay = 'Kull-i-_Sh_ay’';
+    const BE = 'B.E.';
+    const badiCalendar = 'Badí‘ Calendar';
+    const unicodeCharForZero = '0';
+    const defaultFormat = 'd MM+ y BE';
+
+    var en = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        month: month,
+        monthL: monthL,
+        holyDay: holyDay,
+        weekday: weekday,
+        weekdayAbbr3: weekdayAbbr3,
+        weekdayAbbr2: weekdayAbbr2,
+        weekdayL: weekdayL,
+        yearInVahid: yearInVahid,
+        vahid: vahid,
+        kulliShay: kulliShay,
+        BE: BE,
+        badiCalendar: badiCalendar,
+        unicodeCharForZero: unicodeCharForZero,
+        defaultFormat: defaultFormat
+    });
+
+    const month$1 = {
+        1: 'البهاء',
+        2: 'الجلال',
+        3: 'الجمال',
+        4: 'العظمة',
+        5: 'النور',
+        6: 'الرحمة',
+        7: 'الكلمات',
+        8: 'الكمال',
+        9: 'الأسماء',
+        10: 'العزّة',
+        11: 'المشية',
+        12: 'العلم',
+        13: 'القدرة',
+        14: 'القول',
+        15: 'المسائل',
+        16: 'الشرف',
+        17: 'السلطان',
+        18: 'الملك',
+        19: 'العلاء',
+        20: 'ايام الهاء',
+    };
+    const monthL$1 = month$1;
+    const holyDay$1 = {
+        1: 'عيد النَّيروز',
+        2: 'اليوم الأول من عيد الرِّضوان',
+        3: 'اليوم التاسع من عيد الرِّضوان',
+        4: 'اليوم الثاني عشر من عيد الرِّضوان',
+        5: 'يوم إعلان دعوة حضرة الباب',
+        6: 'يوم صعود حضرة بهاء الله',
+        7: 'يوم استشهاد حضرة الباب',
+        8: 'يوم ولادة حضرة الباب',
+        9: 'يوم ولادة حضرة بهاء الله',
+        10: 'يوم الميثاق',
+        11: 'يوم صعود حضرة عبد البهاء',
+    };
+    const weekday$1 = {
+        1: 'الجلال',
+        2: 'الجمال',
+        3: 'الكمال',
+        4: 'الفضّال',
+        5: 'العدّال',
+        6: 'الأستجلال',
+        7: 'الاستقلال',
+    };
+    const weekdayAbbr3$1 = {
+        1: 'جلا',
+        2: 'جما',
+        3: 'كما',
+        4: 'فضّا',
+        5: 'عدّا',
+        6: 'اسج',
+        7: 'اسق',
+    };
+    const weekdayAbbr2$1 = {
+        1: 'جل',
+        2: 'جم',
+        3: 'كم',
+        4: 'فض',
+        5: 'عد',
+        6: 'اج',
+        7: 'اق',
+    };
+    const weekdayL$1 = {
+        1: 'الجلال',
+        2: 'الجمال',
+        3: 'الكمال',
+        4: 'الفضّال',
+        5: 'العدّال',
+        6: 'الأستجلال',
+        7: 'أستقلال',
+    };
+    const yearInVahid$1 = {
+        1: 'ألف',
+        2: 'باء',
+        3: 'أب',
+        4: 'دﺍﻝ',
+        5: 'باب',
+        6: 'وﺍو',
+        7: 'أبد',
+        8: 'جاد',
+        9: 'بهاء',
+        10: 'حب',
+        11: 'بهاج',
+        12: 'جواب',
+        13: 'احد',
+        14: 'وﻫﺎب',
+        15: 'وداد',
+        16: 'بدیع',
+        17: 'بهي',
+        18: 'ابهى',
+        19: 'واحد',
+    };
+    const vahid$1 = 'واحد';
+    const kulliShay$1 = 'كل شيء';
+    const BE$1 = 'بديع';
+    const badiCalendar$1 = 'تقويم بديع';
+    const unicodeCharForZero$1 = '٠';
+    const defaultFormat$1 = '&#8207;d MM y BE&#8207;';
+
+    var ar = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        month: month$1,
+        monthL: monthL$1,
+        holyDay: holyDay$1,
+        weekday: weekday$1,
+        weekdayAbbr3: weekdayAbbr3$1,
+        weekdayAbbr2: weekdayAbbr2$1,
+        weekdayL: weekdayL$1,
+        yearInVahid: yearInVahid$1,
+        vahid: vahid$1,
+        kulliShay: kulliShay$1,
+        BE: BE$1,
+        badiCalendar: badiCalendar$1,
+        unicodeCharForZero: unicodeCharForZero$1,
+        defaultFormat: defaultFormat$1
+    });
+
+    const monthL$2 = {
+        1: 'Herrlichkeit',
+        2: 'Ruhm',
+        3: 'Schönheit',
+        4: 'Größe',
+        5: 'Licht',
+        6: 'Barmherzigkeit',
+        7: 'Worte',
+        8: 'Vollkommenheit',
+        9: 'Namen',
+        10: 'Macht',
+        11: 'Wille',
+        12: 'Wissen',
+        13: 'Kraft',
+        14: 'Sprache',
+        15: 'Fragen',
+        16: 'Ehre',
+        17: 'Souveränität',
+        18: 'Herrschaft',
+        19: 'Erhabenheit',
+        20: 'Ayyám-i-Há',
+    };
+    const holyDay$2 = {
+        1: 'Naw-Rúz',
+        2: 'Erster Riḍván-Tag',
+        3: 'Neunter Riḍván-Tag',
+        4: 'Zwölfter Riḍván-Tag',
+        5: 'Erklärung des Báb',
+        6: 'Hinscheiden Bahá’u’lláhs',
+        7: 'Märtyrertod des Báb',
+        8: 'Geburt des Báb',
+        9: 'Geburt Bahá’u’lláhs',
+        10: 'Tag des Bundes',
+        11: 'Hinscheiden ‘Abdu’l-Bahás',
+    };
+    const weekdayL$2 = {
+        1: 'Ruhm',
+        2: 'Schönheit',
+        3: 'Vollkommenheit',
+        4: 'Gnade',
+        5: 'Gerechtigkeit',
+        6: 'Majestät',
+        7: 'Unabhängigkeit',
+    };
+    const BE$2 = 'B.E.';
+    const badiCalendar$2 = 'Badí‘ Kalender';
+
+    var de = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        monthL: monthL$2,
+        holyDay: holyDay$2,
+        weekdayL: weekdayL$2,
+        BE: BE$2,
+        badiCalendar: badiCalendar$2
+    });
+
+    const monthL$3 = {
+        1: 'Esplendor',
+        2: 'Gloria',
+        3: 'Belleza',
+        4: 'Grandeza',
+        5: 'Luz',
+        6: 'Misericordia',
+        7: 'Palabras',
+        8: 'Perfección',
+        9: 'Nombres',
+        10: 'Fuerza',
+        11: 'Voluntad',
+        12: 'Conocimiento',
+        13: 'Poder',
+        14: 'Discurso',
+        15: 'Preguntas',
+        16: 'Honor',
+        17: 'Soberanía',
+        18: 'Dominio',
+        19: 'Sublimidad',
+        20: 'Ayyám-i-Há',
+    };
+    const holyDay$3 = {
+        1: 'Naw-Rúz',
+        2: 'Primer día de Riḍván',
+        3: 'Noveno día de Riḍván',
+        4: 'Duodécimo día de Riḍván',
+        5: 'Declaración del Báb',
+        6: 'Ascensión de Bahá’u’lláh',
+        7: 'Martirio del Báb',
+        8: 'Nacimiento del Báb',
+        9: 'Nacimiento de Bahá’u’lláh',
+        10: 'Día de la Alianza',
+        11: 'Fallecimiento de ‘Abdu’l-Bahá',
+    };
+    const weekdayL$3 = {
+        1: 'Gloria',
+        2: 'Belleza',
+        3: 'Perfección',
+        4: 'Gracia',
+        5: 'Justicia',
+        6: 'Majestuosidad',
+        7: 'Independencia',
+    };
+    const BE$3 = 'E.B.';
+    const badiCalendar$3 = 'Calendario Badí‘';
+
+    var es = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        monthL: monthL$3,
+        holyDay: holyDay$3,
+        weekdayL: weekdayL$3,
+        BE: BE$3,
+        badiCalendar: badiCalendar$3
+    });
+
+    const month$2 = {
+        1: 'البهاء',
+        2: 'الجلال',
+        3: 'الجمال',
+        4: 'العظمة',
+        5: 'النور',
+        6: 'الرحمة',
+        7: 'الكلمات',
+        8: 'الكمال',
+        9: 'الأسماء',
+        10: 'العزّة',
+        11: 'المشية',
+        12: 'العلم',
+        13: 'القدرة',
+        14: 'القول',
+        15: 'المسائل',
+        16: 'الشرف',
+        17: 'السلطان',
+        18: 'الملك',
+        19: 'العلاء',
+        20: 'ايام الهاء',
+    };
+    const monthL$4 = {
+        1: 'بهاء',
+        2: 'جلال',
+        3: 'جمال',
+        4: 'عظمت',
+        5: 'نور',
+        6: 'رحمت',
+        7: 'كلمات',
+        8: 'كمال',
+        9: 'أسماء',
+        10: 'عزّت',
+        11: 'مشيت',
+        12: 'علم',
+        13: 'قدرت',
+        14: 'قول',
+        15: 'مسائل',
+        16: 'شرف',
+        17: 'سلطان',
+        18: 'ملك',
+        19: 'علاء',
+        20: 'ايام ها',
+    };
+    const holyDay$4 = {
+        1: 'عید نوروز',
+        2: 'روز اوّل عید رضوان',
+        3: 'روز نهم عید رضوان',
+        4: 'روز دوازدهم عید رضوان',
+        5: 'بعثت حضرت باب',
+        6: 'صعود حضرت بهاالله',
+        7: 'شهادت حضرت اعلی',
+        8: 'تولّد حضرت اعلی',
+        9: 'تولّد حضرت بهالله',
+        10: 'روز عهد و میثاق',
+        11: 'صعود حضرت عبدالبها',
+    };
+    const weekday$2 = {
+        1: 'یوم الجلال',
+        2: 'یوم الجمال',
+        3: 'یوم الكمال',
+        4: 'یوم الفضّال',
+        5: 'یوم العدّال',
+        6: 'یوم الأستجلال',
+        7: 'یوم الاستقلال',
+    };
+    const weekdayAbbr3$2 = {
+        1: 'جلا',
+        2: 'جما',
+        3: 'كما',
+        4: 'فضّا',
+        5: 'عدّا',
+        6: 'اسج',
+        7: 'اسق',
+    };
+    const weekdayAbbr2$2 = {
+        1: 'جل',
+        2: 'جم',
+        3: 'كم',
+        4: 'فض',
+        5: 'عد',
+        6: 'اج',
+        7: 'اق',
+    };
+    const weekdayL$4 = {
+        1: 'جلال',
+        2: 'جمال',
+        3: 'كمال',
+        4: 'فضّال',
+        5: 'عدّال',
+        6: 'استجلال',
+        7: 'استقلال',
+    };
+    const yearInVahid$2 = {
+        1: 'ألف',
+        2: 'باء',
+        3: 'أب',
+        4: 'دﺍﻝ',
+        5: 'باب',
+        6: 'وﺍو',
+        7: 'أبد',
+        8: 'جاد',
+        9: 'بهاء',
+        10: 'حب',
+        11: 'بهاج',
+        12: 'جواب',
+        13: 'احد',
+        14: 'وﻫﺎب',
+        15: 'وداد',
+        16: 'بدیع',
+        17: 'بهي',
+        18: 'ابهى',
+        19: 'واحد',
+    };
+    const vahid$2 = 'واحد';
+    const kulliShay$2 = 'كل شيء';
+    const BE$4 = 'بديع';
+    const badiCalendar$4 = 'تقويم بديع';
+    const unicodeCharForZero$2 = '۰';
+    const defaultFormat$2 = '&#8207;d MML y BE&#8207;';
+
+    var fa = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        month: month$2,
+        monthL: monthL$4,
+        holyDay: holyDay$4,
+        weekday: weekday$2,
+        weekdayAbbr3: weekdayAbbr3$2,
+        weekdayAbbr2: weekdayAbbr2$2,
+        weekdayL: weekdayL$4,
+        yearInVahid: yearInVahid$2,
+        vahid: vahid$2,
+        kulliShay: kulliShay$2,
+        BE: BE$4,
+        badiCalendar: badiCalendar$4,
+        unicodeCharForZero: unicodeCharForZero$2,
+        defaultFormat: defaultFormat$2
+    });
+
+    const monthL$5 = {
+        1: 'Splendeur',
+        2: 'Gloire',
+        3: 'Beauté',
+        4: 'Grandeur',
+        5: 'Lumière',
+        6: 'Miséricorde',
+        7: 'Paroles',
+        8: 'Perfection',
+        9: 'Noms',
+        10: 'Puissance',
+        11: 'Volonté',
+        12: 'Connaissance',
+        13: 'Pouvoir',
+        14: 'Discours',
+        15: 'Questions',
+        16: 'Honneur',
+        17: 'Souveraineté',
+        18: 'Empire',
+        19: 'Élévation',
+        20: 'Ayyám-i-Há',
+    };
+    const holyDay$5 = {
+        1: 'Naw-Rúz',
+        2: 'Premier jour de Riḍván',
+        3: 'Neuvième jour de Riḍván',
+        4: 'Douzième jour de Riḍván',
+        5: 'Déclaration du Báb',
+        6: 'Ascension de Bahá’u’lláh',
+        7: 'Martyre du Báb',
+        8: 'Naissance du Báb',
+        9: 'Naissance de Bahá’u’lláh',
+        10: 'Jour de l’Alliance',
+        11: 'Ascension de ‘Abdu’l-Bahá',
+    };
+    const weekdayL$5 = {
+        1: 'Gloire',
+        2: 'Beauté',
+        3: 'Perfection',
+        4: 'Grâce',
+        5: 'Justice',
+        6: 'Majesté',
+        7: 'Indépendance',
+    };
+    const BE$5 = 'E.B.';
+    const badiCalendar$5 = 'Calendrier Badí‘';
+
+    var fr = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        monthL: monthL$5,
+        holyDay: holyDay$5,
+        weekdayL: weekdayL$5,
+        BE: BE$5,
+        badiCalendar: badiCalendar$5
+    });
+
+    const monthL$6 = {
+        1: 'Spožums',
+        2: 'Slava',
+        3: 'Skaistums',
+        4: 'Dižums',
+        5: 'Gaisma',
+        6: 'Žēlastība',
+        7: 'Vārdi',
+        8: 'Pilnība',
+        9: 'Nosaukumi',
+        10: 'Varenība',
+        11: 'Griba',
+        12: 'Zināšanas',
+        13: 'Vara',
+        14: 'Runa',
+        15: 'Jautājumi',
+        16: 'Gods',
+        17: 'Suverenitāte',
+        18: 'Valdīšana',
+        19: 'Cēlums',
+        20: 'Ayyám-i-Há',
+    };
+    const holyDay$6 = {
+        1: 'Naw-Rúz',
+        2: 'Riḍván pirmā diena',
+        3: 'Riḍván devītā diena',
+        4: 'Riḍván divpadsmitā diena',
+        5: 'Bába paziņojums',
+        6: 'Bahá’u’lláh Debessbraukšana',
+        7: 'Bába mocekļa nāve',
+        8: 'Bába dzimšanas diena',
+        9: 'Bahá’u’lláh dzimšanas diena',
+        10: 'Derības diena',
+        11: '‘Abdu’l-Bahá Debessbraukšana',
+    };
+    const weekdayL$6 = {
+        1: 'Slava',
+        2: 'Skaistums',
+        3: 'Pilnība',
+        4: 'Žēlastība',
+        5: 'Taisnīgums',
+        6: 'Majestātiskums',
+        7: 'Neatkarība',
+    };
+    const BE$6 = 'B.Ē.';
+    const badiCalendar$6 = 'Badí‘ kalendārs';
+
+    var lv = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        monthL: monthL$6,
+        holyDay: holyDay$6,
+        weekdayL: weekdayL$6,
+        BE: BE$6,
+        badiCalendar: badiCalendar$6
+    });
+
+    const monthL$7 = {
+        1: 'Pracht',
+        2: 'Heerlijkheid',
+        3: 'Schoonheid',
+        4: 'Grootheid',
+        5: 'Licht',
+        6: 'Barmhartigheid',
+        7: 'Woorden',
+        8: 'Volmaaktheid',
+        9: 'Namen',
+        10: 'Macht',
+        11: 'Wil',
+        12: 'Kennis',
+        13: 'Kracht',
+        14: 'Spraak',
+        15: 'Vragen',
+        16: 'Eer',
+        17: 'Soevereiniteit',
+        18: 'Heerschappij',
+        19: 'Verhevenheid',
+        20: 'Ayyám-i-Há',
+    };
+    const holyDay$7 = {
+        1: 'Naw-Rúz',
+        2: 'Eerste dag van Riḍván',
+        3: 'Negende dag van Riḍván',
+        4: 'Twaalfde dag van Riḍván',
+        5: 'Verkondiging van de Báb',
+        6: 'Heengaan van Bahá’u’lláh',
+        7: 'Marteldood van de Báb',
+        8: 'Geboortedag van de Báb',
+        9: 'Geboortedag van Bahá’u’lláh',
+        10: 'Dag van het Verbond',
+        11: 'Heengaan van ‘Abdu’l-Bahá',
+    };
+    const weekdayL$7 = {
+        1: 'Heerlijkheid',
+        2: 'Schoonheid',
+        3: 'Volmaaktheid',
+        4: 'Genade',
+        5: 'Gerechtigheid',
+        6: 'Majesteit',
+        7: 'Onafhankelijkheid',
+    };
+    const BE$7 = 'B.E.';
+    const badiCalendar$7 = 'Badí‘-Kalender';
+
+    var nl = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        monthL: monthL$7,
+        holyDay: holyDay$7,
+        weekdayL: weekdayL$7,
+        BE: BE$7,
+        badiCalendar: badiCalendar$7
+    });
+
+    const monthL$8 = {
+        1: 'Esplendor',
+        2: 'Glória',
+        3: 'Beleza',
+        4: 'Grandeza',
+        5: 'Luz',
+        6: 'Miséricórdia',
+        7: 'Palavras',
+        8: 'Perfeição',
+        9: 'Nomes',
+        10: 'Potência',
+        11: 'Vontade',
+        12: 'Conhecimento',
+        13: 'Poder',
+        14: 'Discurso',
+        15: 'Perguntas',
+        16: 'Honra',
+        17: 'Soberania',
+        18: 'Domínio',
+        19: 'Sublimidade',
+        20: 'Ayyám-i-Há',
+    };
+    const holyDay$8 = {
+        1: 'Naw-Rúz',
+        2: '1º dia do Riḍván',
+        3: '9º dia do Riḍván',
+        4: '12º dia do Riḍván',
+        5: 'Declaração do Báb',
+        6: 'Ascensão de Bahá’u’lláh',
+        7: 'Martírio do Báb',
+        8: 'Aniversário do Báb',
+        9: 'Aniversário de Bahá’u’lláh',
+        10: 'Dia do Convênio',
+        11: 'Ascensão de ‘Abdu’l-Bahá',
+    };
+    const weekdayL$8 = {
+        1: 'Glória',
+        2: 'Beleza',
+        3: 'Perfeição',
+        4: 'Graça',
+        5: 'Justiça',
+        6: 'Majestade',
+        7: 'Independência',
+    };
+    const BE$8 = 'E.B.';
+    const badiCalendar$8 = 'Calendário Badí‘';
+
+    var pt = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        monthL: monthL$8,
+        holyDay: holyDay$8,
+        weekdayL: weekdayL$8,
+        BE: BE$8,
+        badiCalendar: badiCalendar$8
+    });
+
+    const month$3 = {
+        1: 'Бахā',
+        2: 'Джалāл',
+        3: 'Джамāл',
+        4: '‘Аз̣амат',
+        5: 'Нӯр',
+        6: 'Рах̣мат',
+        7: 'Калимāт',
+        8: 'Камāл',
+        9: 'Асмā’',
+        10: '‘Иззат',
+        11: 'Машӣййат',
+        12: '‘Илм',
+        13: 'К̣удрат',
+        14: 'К̣аул',
+        15: 'Масā’ил',
+        16: 'Шараф',
+        17: 'Султ̣ан',
+        18: 'Мулк',
+        19: '‘Алā’',
+        20: 'Аййāм-и Хā',
+    };
+    const monthL$9 = {
+        1: 'Великолепие',
+        2: 'Слава',
+        3: 'Красота',
+        4: 'Величие',
+        5: 'Свет',
+        6: 'Милость',
+        7: 'Слова',
+        8: 'Совершенство',
+        9: 'Имена',
+        10: 'Мощь',
+        11: 'Воля',
+        12: 'Знание',
+        13: 'Могущество',
+        14: 'Речь',
+        15: 'Вопросы',
+        16: 'Честь',
+        17: 'Владычество',
+        18: 'Господство',
+        19: 'Возвышенность',
+        20: 'Аййāм-и Хā',
+    };
+    const holyDay$9 = {
+        1: 'Нау-Рӯз',
+        2: '1-й день Рид̣вāна',
+        3: '9-й день Рид̣вāна',
+        4: '12-й день Рид̣вāна',
+        5: 'Возвещение Баба',
+        6: 'Вознесение Бахауллы',
+        7: 'Мученическая Баба',
+        8: 'рождения Баба',
+        9: 'рождения Бахауллы',
+        10: 'День Завета',
+        11: 'Вознесение Абдул-Баха',
+    };
+    const weekday$3 = {
+        1: 'Джалāл',
+        2: 'Джамāл',
+        3: 'Камāл',
+        4: 'Фид̣āл',
+        5: '‘Идāл',
+        6: 'Истиджлāл',
+        7: 'Истик̣лāл',
+    };
+    const weekdayAbbr3$3 = {
+        1: 'Джл',
+        2: 'Джм',
+        3: 'Кам',
+        4: 'Фид̣',
+        5: '‘Идā',
+        6: 'Исд',
+        7: 'Иск̣',
+    };
+    const weekdayAbbr2$3 = {
+        1: 'Дл',
+        2: 'Дм',
+        3: 'Ка',
+        4: 'Фи',
+        5: '‘Ид',
+        6: 'Ид',
+        7: 'Ик̣',
+    };
+    const weekdayL$9 = {
+        1: 'Слава',
+        2: 'Красота',
+        3: 'Совершенство',
+        4: 'Благодать',
+        5: 'Справедливость',
+        6: 'Величие',
+        7: 'Независимость',
+    };
+    const yearInVahid$3 = {
+        1: 'Алиф',
+        2: 'Бā’',
+        3: 'Аб',
+        4: 'Дāл',
+        5: 'Бāб',
+        6: 'Вāв',
+        7: 'Абад',
+        8: 'Джāд',
+        9: 'Бахā',
+        10: 'Х̣убб',
+        11: 'Баххāдж',
+        12: 'Джавāб',
+        13: 'Ах̣ад',
+        14: 'Ваххāб',
+        15: 'Видāд',
+        16: 'Бадӣ‘',
+        17: 'Бахӣ',
+        18: 'Абхā',
+        19: 'Вāх̣ид',
+    };
+    const vahid$3 = 'Вāх̣ид';
+    const kulliShay$3 = 'кулл-и шай’';
+    const BE$9 = 'Э.Б.';
+    const badiCalendar$9 = 'Календарь Бадӣ‘';
+
+    var ru = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        month: month$3,
+        monthL: monthL$9,
+        holyDay: holyDay$9,
+        weekday: weekday$3,
+        weekdayAbbr3: weekdayAbbr3$3,
+        weekdayAbbr2: weekdayAbbr2$3,
+        weekdayL: weekdayL$9,
+        yearInVahid: yearInVahid$3,
+        vahid: vahid$3,
+        kulliShay: kulliShay$3,
+        BE: BE$9,
+        badiCalendar: badiCalendar$9
+    });
+
+    const monthL$a = {
+        1: 'Praktfullhet',
+        2: 'Härlighet',
+        3: 'Skönhet',
+        4: 'Storhet',
+        5: 'Ljus',
+        6: 'Barmhärtighet',
+        7: 'Ord',
+        8: 'Fullkomlighet',
+        9: 'Namn',
+        10: 'Makt',
+        11: 'Vilja',
+        12: 'Kunskap',
+        13: 'Kraft',
+        14: 'Tal',
+        15: 'Frågor',
+        16: 'Ära',
+        17: 'Överhöghet',
+        18: 'Herravälde',
+        19: 'Upphöjdhet',
+        20: 'Ayyám-i-Há',
+    };
+    const holyDay$a = {
+        1: 'Naw-Rúz',
+        2: 'Första Riḍván',
+        3: 'Nionde Riḍván',
+        4: 'Tolfte Riḍván',
+        5: 'Bábs Deklaration',
+        6: 'Bahá’u’lláhs Bortgång',
+        7: 'Bábs Martyrskap',
+        8: 'Bábs Födelse',
+        9: 'Bahá’u’lláhs Födelse',
+        10: 'Förbundets dag',
+        11: '‘Abdu’l-Bahás Bortgång',
+    };
+    const weekdayL$a = {
+        1: 'Härlighet',
+        2: 'Skönhet',
+        3: 'Fullkomlighet',
+        4: 'Nåd',
+        5: 'Rättvisa',
+        6: 'Majestät',
+        7: 'Oberoende',
+    };
+    const BE$a = 'B.E.';
+    const badiCalendar$a = 'Badí‘kalendern';
+
+    var sv = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        monthL: monthL$a,
+        holyDay: holyDay$a,
+        weekdayL: weekdayL$a,
+        BE: BE$a,
+        badiCalendar: badiCalendar$a
+    });
+
+    const month$4 = {
+        1: '巴哈',
+        2: '贾拉勒',
+        3: '贾迈勒',
+        4: '阿泽迈特',
+        5: '努尔',
+        6: '拉赫迈特',
+        7: '凯利马特',
+        8: '卡迈勒',
+        9: '艾斯玛',
+        10: '伊扎特',
+        11: '迈希耶特',
+        12: '伊勒姆',
+        13: '古德雷特',
+        14: '高勒',
+        15: '迈萨伊勒',
+        16: '谢拉夫',
+        17: '苏丹',
+        18: '穆勒克',
+        19: '阿拉',
+        20: '阿亚米哈',
+    };
+    const monthL$b = {
+        1: '耀',
+        2: '辉',
+        3: '美',
+        4: '宏',
+        5: '光',
+        6: '仁',
+        7: '言',
+        8: '完',
+        9: '名',
+        10: '能',
+        11: '意',
+        12: '知',
+        13: '力',
+        14: '语',
+        15: '问',
+        16: '尊',
+        17: '权',
+        18: '统',
+        19: '崇',
+        20: '哈之日',
+    };
+    const holyDay$b = {
+        1: '诺鲁孜节',
+        2: '里兹万节第一日',
+        3: '里兹万节第九日',
+        4: '里兹万节第十二日',
+        5: '巴孛宣示日',
+        6: '巴哈欧拉升天日',
+        7: '巴孛殉道日',
+        8: '巴孛诞辰',
+        9: '巴哈欧拉诞辰',
+        10: '圣约日',
+        11: '阿博都-巴哈升天日',
+    };
+    const weekday$4 = {
+        1: '贾拉勒',
+        2: '贾迈勒',
+        3: '卡迈勒',
+        4: '菲达勒',
+        5: '伊达勒',
+        6: '伊斯提杰拉勒',
+        7: '伊斯提格拉勒',
+    };
+    const weekdayAbbr3$4 = {
+        1: '贾拉勒',
+        2: '贾迈勒',
+        3: '卡迈勒',
+        4: '菲达勒',
+        5: '伊达勒',
+        6: '伊斯杰',
+        7: '伊斯格',
+    };
+    const weekdayAbbr2$4 = {
+        1: '贾拉',
+        2: '贾迈',
+        3: '卡迈',
+        4: '菲达',
+        5: '伊达',
+        6: '伊杰',
+        7: '伊格',
+    };
+    const weekdayL$b = {
+        1: '辉日',
+        2: '美日',
+        3: '完日',
+        4: '恩日',
+        5: '正日',
+        6: '威日',
+        7: '独日',
+    };
+    const yearInVahid$4 = {
+        1: '艾利夫',
+        2: '巴',
+        3: '艾卜',
+        4: '达勒',
+        5: '巴卜',
+        6: '瓦乌',
+        7: '阿巴德',
+        8: '贾德',
+        9: '巴哈',
+        10: '胡卜',
+        11: '巴哈杰',
+        12: '贾瓦卜',
+        13: '阿哈德',
+        14: '瓦哈卜',
+        15: '维达德',
+        16: '巴迪',
+        17: '巴希',
+        18: '阿卜哈',
+        19: '瓦希德',
+    };
+    const vahid$4 = '瓦希德';
+    const kulliShay$4 = '库里沙伊';
+    const BE$b = 'BE';
+    const badiCalendar$b = '巴迪历';
+
+    var zh = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        month: month$4,
+        monthL: monthL$b,
+        holyDay: holyDay$b,
+        weekday: weekday$4,
+        weekdayAbbr3: weekdayAbbr3$4,
+        weekdayAbbr2: weekdayAbbr2$4,
+        weekdayL: weekdayL$b,
+        yearInVahid: yearInVahid$4,
+        vahid: vahid$4,
+        kulliShay: kulliShay$4,
+        BE: BE$b,
+        badiCalendar: badiCalendar$b
+    });
+
+    const monthL$c = {
+        1: 'Splendor',
+        16: 'Honor',
+    };
+
+    var en_us = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        monthL: monthL$c
+    });
+
+    /* eslint-disable dot-notation, line-comment-position, camelcase, sort-imports */
+    const badiLocale = { en, ar, de, es, fa, fr, lv, nl, pt, ru, sv, zh, 'en-us': en_us, default: en };
+    const setDefaultLanguage = (language) => {
+        if (badiLocale[language] === undefined) {
+            // eslint-disable-next-line no-console
+            console.log('Chosen language does not exist. Setting has not been changed.');
+        }
+        else {
+            badiLocale['default'] = badiLocale[language];
+        }
+    };
+    let underlineFormat = 'css';
+    const setUnderlineFormat = (format) => {
+        if (['css', 'u', 'diacritic', 'none'].includes(format)) {
+            underlineFormat = format;
+        }
+        else {
+            // eslint-disable-next-line no-console
+            console.log('Invalid underline format. Choose one of ["css", "u", "diacritic", "none"]. ' +
+                'Setting has not been changed.');
+        }
+    };
+
+    const formatTokens = [
+        ['DDL', 'DD+', 'MML', 'MM+', 'WWL', 'yyv', 'KiS'],
+        ['dd', 'DD', 'mm', 'MM', 'ww', 'WW', 'yv', 'YV', 'vv', 'kk', 'yy', 'BE', 'BC', 'Va'],
+        ['d', 'D', 'm', 'M', 'W', 'v', 'k', 'y']
+    ];
+    // eslint-disable-next-line complexity
+    const formatBadiDate = (badiDate, formatString, language) => {
+        if (!badiDate.isValid) {
+            return 'Not a valid Badí‘ date';
+        }
+        if (typeof language === 'string' && badiLocale[language] === undefined && language.includes('-')) {
+            language = language.split('-')[0];
+        }
+        if (language === undefined || badiLocale[language] === undefined) {
+            language = 'default';
+        }
+        formatString = formatString !== null && formatString !== void 0 ? formatString : formatItemFallback(language, 'defaultFormat');
+        let formattedDate = '';
+        const length = formatString.length;
+        for (let i = 0; i < length; i++) {
+            // Text wrapped in {} is output as-is. A '{' without a matching '}'
+            // results in invalid input
+            if (formatString[i] === '{' && i < length - 1) {
+                for (let j = i + 1; j <= length; j++) {
+                    if (j === length) {
+                        return 'Invalid formatting string.';
+                    }
+                    if (formatString[j] === '}') {
+                        i = j;
+                        break;
+                    }
+                    formattedDate += formatString[j];
+                }
+            }
+            else {
+                const next1 = formatString[i];
+                const next2 = next1 + formatString[i + 1];
+                const next3 = next2 + formatString[i + 2];
+                if (formatTokens[0].includes(next3)) {
+                    formattedDate += getFormatItem(badiDate, next3, language);
+                    i += 2;
+                }
+                else if (formatTokens[1].includes(next2)) {
+                    formattedDate += getFormatItem(badiDate, next2, language);
+                    i += 1;
+                }
+                else if (formatTokens[2].includes(next1)) {
+                    formattedDate += getFormatItem(badiDate, next1, language);
+                }
+                else {
+                    formattedDate += next1;
+                }
+            }
+        }
+        return formattedDate;
+    };
+    // eslint-disable-next-line complexity
+    const getFormatItem = (badiDate, token, language) => {
+        switch (token) {
+            // Single character tokens
+            case 'd':
+                return digitRewrite(badiDate.day, language);
+            case 'D':
+                return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.day), 3);
+            case 'm':
+                return digitRewrite(badiDate.month, language);
+            case 'M':
+                return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.month), 3);
+            case 'W':
+                return formatItemFallback(language, 'weekdayAbbr3', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+            case 'y':
+                return digitRewrite(badiDate.year, language);
+            case 'v':
+                return digitRewrite((Math.floor((badiDate.year - 1) / 19) % 19) + 1, language);
+            case 'k':
+                return digitRewrite(Math.floor((badiDate.year - 1) / 361) + 1, language);
+            // Two character tokens
+            case 'dd':
+                return digitRewrite((`0${String(badiDate.day)}`).slice(-2), language);
+            case 'DD':
+                return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.day));
+            case 'mm':
+                return digitRewrite((`0${String(badiDate.month)}`).slice(-2), language);
+            case 'MM':
+                return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.month));
+            case 'ww':
+                return formatItemFallback(language, 'weekdayAbbr2', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+            case 'WW':
+                return formatItemFallback(language, 'weekday', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+            case 'yy':
+                return digitRewrite((`00${String(badiDate.year)}`).slice(-3), language);
+            case 'yv':
+                return digitRewrite((badiDate.year - 1) % 19 + 1, language);
+            case 'YV':
+                return formatItemFallback(language, 'yearInVahid', (badiDate.year - 1) % 19 + 1);
+            case 'vv':
+                return digitRewrite((`0${String((Math.floor((badiDate.year - 1) / 19) + 2) % 19 - 1)}`).slice(-2), language);
+            case 'kk':
+                return digitRewrite((`0${String(Math.floor((badiDate.year - 1) / 361) + 1)}`).slice(-2), language);
+            case 'Va':
+                return formatItemFallback(language, 'vahid');
+            case 'BE':
+                return formatItemFallback(language, 'BE');
+            case 'BC':
+                return formatItemFallback(language, 'badiCalendar');
+            // Three character tokens
+            case 'DDL':
+                return formatItemFallback(language, 'monthL', badiDate.day);
+            case 'DD+': {
+                const day = postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.day));
+                const dayL = formatItemFallback(language, 'monthL', badiDate.day);
+                if (day === dayL) {
+                    return day;
+                }
+                if (badiLocale[language] === badiLocale.fa) {
+                    return `<span dir="rtl">${day} (${dayL})</span>`;
+                }
+                return `${day} (${dayL})`;
+            }
+            case 'MML':
+                return formatItemFallback(language, 'monthL', badiDate.month);
+            case 'MM+': {
+                const month = postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.month));
+                const monthL = formatItemFallback(language, 'monthL', badiDate.month);
+                if (month === monthL) {
+                    return month;
+                }
+                if (badiLocale[language] === badiLocale.fa) {
+                    return `<span dir="rtl">${month} (${monthL})</span>`;
+                }
+                return `${month} (${monthL})`;
+            }
+            case 'WWL':
+                return formatItemFallback(language, 'weekdayL', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+            case 'yyv':
+                return digitRewrite((`0${String((badiDate.year - 1) % 19 + 1)}`).slice(-2), language);
+            case 'KiS':
+                return postProcessLocaleItem(formatItemFallback(language, 'kulliShay'));
+            // istanbul ignore next
+            default:
+                return '';
+        }
+    };
+    const postProcessLocaleItem = (item, crop) => {
+        if (crop && crop < item.length) {
+            let char = 0;
+            let counter = 0;
+            while (counter < crop) {
+                if (!'_’‘'.includes(item[char])) {
+                    counter++;
+                }
+                char++;
+            }
+            if ('_’‘'.includes(item[char])) {
+                char++;
+            }
+            item = item.slice(0, char);
+            if (item.split('_').length % 2 === 0) {
+                item += '_';
+            }
+        }
+        const stringComponents = item.split('_');
+        for (let i = 1; i < stringComponents.length; i += 2) {
+            stringComponents[i] = underlineString(stringComponents[i]);
+        }
+        return stringComponents.join('');
+    };
+    const underlineString = (str) => {
+        switch (underlineFormat) {
+            case 'css':
+                return `<span style="text-decoration:underline">${str}</span>`;
+            case 'diacritic':
+                return str.split('').map(char => `${char}\u0332`).join('');
+            case 'u':
+                return `<u>${str}</u>`;
+            case 'none':
+                return str;
+            // istanbul ignore next
+            default:
+                throw new TypeError('Unexpected underlineFormat');
+        }
+    };
+    const digitRewrite = (number, language) => {
+        number = String(number);
+        const unicodeOffset = formatItemFallback(language, 'unicodeCharForZero').charCodeAt(0) - '0'.charCodeAt(0);
+        if (unicodeOffset === 0) {
+            return number;
+        }
+        const codePoints = [...number].map(num => num.charCodeAt(0) + unicodeOffset);
+        return String.fromCharCode(...codePoints);
+    };
+    const formatItemFallback = (language, category, index) => {
+        var _a;
+        if (index === undefined) {
+            while (badiLocale[language][category] === undefined) {
+                language = languageFallback(language);
+            }
+            return badiLocale[language][category];
+        }
+        while (((_a = badiLocale[language][category]) === null || _a === void 0 ? void 0 : _a[index]) === undefined) {
+            language = languageFallback(language);
+        }
+        return badiLocale[language][category][index];
+    };
+    const languageFallback = (languageCode) => {
+        if (languageCode.includes('-')) {
+            return languageCode.split('-')[0];
+            // eslint-disable-next-line no-negated-condition
+        }
+        else if (languageCode !== 'default') {
+            return 'default';
+        }
+        return 'en';
+    };
+
+    const badiYears = [
+        'l4da', 'k4ci', 'k5c7', 'l4d6', 'l4ce', 'k4c4', 'k5d4', 'l4cb', 'l4c1', 'k4cj', 'k5c8', 'l4d7', 'l4cf', 'k4c5',
+        'k4d5', 'k5ce', 'l4c2', 'k4d2', 'k4ca', 'k5da', 'l4ch', 'k4c6', 'k4d6', 'k5cf', 'l4c4', 'k4d4', 'k4cc', 'k5c1',
+        'l4cj', 'k4c8', 'k4d8', 'k5cg', 'l4c5', 'k4d5', 'k4ce', 'k5c3', 'l4d2', 'k4ca', 'k4d9', 'k5ci', 'l4c6', 'k4d6',
+        'k4cf', 'k4c4', 'k5d4', 'k4cb', 'k4bj', 'k4cj', 'k5c9', 'k4d8', 'k4cg', 'k4c6', 'k5d6', 'k4cd', 'k4c2', 'k4d2',
+        'k5ca', 'k4d9', 'k4ci', 'k4c7', 'k5d7', 'k4cf', 'k4c4', 'k4d4', 'k5cc', 'k4bj', 'k4cj', 'k4c9', 'k5d9', 'k4cg',
+        'k4c6', 'k4d5', 'k5cd', 'k4c2', 'k4d1', 'k4ca', 'k4da', 'j5cj', 'k4c7', 'k4d7', 'k4cf', 'j5c4', 'k4d3', 'k4cb',
+        'k4c1', 'k5d1', 'l4c9', 'l4d9', 'l4ch', 'k5c6', 'l4d5', 'l4cd', 'l4c2', 'k5d2', 'l4ca', 'l4da', 'l4cj', 'k5c8',
+        'l4d7', 'l4cf', 'l4c4', 'k5d4', 'l4cb', 'l4c1', 'l4d1', 'k5c9', 'l4d8', 'l4cg', 'l4c5', 'k4d5', 'k5ce', 'l4c2',
+        'l4d2', 'k4cb', 'k5db', 'l4ci', 'l4c7', 'k4d7', 'k5cf', 'l4c4', 'l4d4', 'k4cc', 'k5c2', 'l4d1', 'l4c9', 'k4d9',
+        'k5ch', 'l4c5', 'l4d5', 'k4ce', 'k5c3', 'l4d2', 'l4cb', 'k4da', 'k5ci', 'l4c6', 'l4d6', 'k4cf', 'k5c5', 'l4d4',
+        'l4cc', 'k4c1', 'k4d1', 'k5c9', 'l4d8', 'k4cg', 'k4c6', 'k5d6', 'l4ce', 'k4c3', 'k4d3', 'k5cb', 'l4da', 'k4ci',
+        'k4c7', 'k5d7', 'l4cf', 'k4c5', 'k4d5', 'k5cd', 'l4c1', 'k4cj', 'k4c9', 'k5d9', 'l4cg', 'k4c6', 'k4d6', 'k5ce',
+        'l4c3', 'k4d2', 'k4ca', 'k5bj', 'l4ci', 'k4c7', 'k4d7', 'k4cg', 'k5c5', 'k4d4', 'k4cc', 'k4c1', 'k5d1', 'k4c9',
+        'k4d9', 'k4ch', 'k5c7', 'l4d6', 'l4ce', 'l4c3', 'l5d3', 'l4ca', 'l4da', 'l4cj', 'l5c8', 'l4d7', 'l4cg', 'l4c5',
+        'l5d4', 'l4cb', 'l4c1', 'l4d1', 'l5ca', 'l4d9', 'l4ch', 'l4c6', 'l5d6', 'l4cd', 'l4c2', 'l4d2', 'l4cb', 'k5c1',
+        'l4cj', 'l4c8', 'l4d8', 'k5cg', 'l4c4', 'l4d4', 'l4cc', 'k5c2', 'l4d1', 'l4ca', 'l4da', 'k5ci', 'l4c6', 'l4d5',
+        'l4ce', 'k5c3', 'l4d2', 'l4cb', 'l4db', 'k5cj', 'l4c8', 'l4d7', 'l4cf', 'k5c5', 'l4d4', 'l4cc', 'l4c2', 'k5d2',
+        'l4c9', 'l4d9', 'l4ch', 'k4c6', 'k5d6', 'l4ce', 'l4c3', 'k4d3', 'k5cc', 'l4db', 'l4cj', 'k4c8', 'k5d8', 'l4cf',
+        'l4c4', 'k4d5', 'k5cd', 'l4c2', 'l4d2', 'k4ca', 'k5d9', 'l4cg', 'l4c6', 'k4d6', 'k5cf', 'l4c3', 'l4d3', 'k4cb',
+        'k5bj', 'l4ci', 'l4c7', 'k4d7', 'k5cg', 'l4c5', 'l4d5', 'k4cd', 'k4c2', 'k5d2', 'l4c9', 'k4d9', 'k4ch', 'k5c7',
+        'l4d6', 'k4cf', 'k4c4', 'k5d4', 'l4cb', 'l4bj', 'l4cj', 'l5c8', 'm4d7', 'l4cg', 'l4c5', 'l5d5', 'm4cc', 'l4c1',
+        'l4d1', 'l5ca', 'm4d9', 'l4ch', 'l4c7', 'l5d7', 'm4ce', 'l4c3', 'l4d3', 'l5cb', 'm4bi', 'l4ci', 'l4c8', 'l4d8',
+        'l5ch', 'l4c5', 'l4d5', 'l4cd', 'l5c2', 'l4d1', 'l4c9', 'l4da', 'l5ci', 'l4c7', 'l4d7', 'l4cf', 'l5c4', 'l4d2',
+        'l4cb', 'l4bj', 'l5d1', 'l4c8', 'l4d8', 'l4cg', 'l5c5', 'l4d4', 'l4cc', 'l4c2', 'l5d2', 'l4c9', 'l4da', 'l4ci',
+    ];
+
+    class BadiDate {
+        constructor(date) {
+            this._holyDay = undefined;
+            this._valid = true;
+            this._invalidReason = undefined;
+            try {
+                if (this._isDateObject(date)) {
+                    this._gregorianDate = luxon.DateTime.fromObject({ year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate(), zone: 'UTC' });
+                }
+                else if (luxon.DateTime.isDateTime(date)) {
+                    this._gregorianDate = luxon.DateTime.fromObject({ year: date.year, month: date.month, day: date.day, zone: 'UTC' });
+                }
+                else if (this._isYearMonthDay(date) || this._isYearHolyDayNumber(date)) {
+                    this._setFromBadiDate(date);
+                }
+                else {
+                    throw new TypeError('Unrecognized input format');
+                }
+                if (this._year === undefined) {
+                    // We haven't set the Badí' date yet
+                    this._setFromGregorianDate();
+                }
+                this._setHolyDay();
+            }
+            catch (err) {
+                this._setInvalid(err);
+            }
+            Object.freeze(this);
+        }
+        format(formatString, language) {
+            return formatBadiDate(this, formatString, language);
+        }
+        _isDateObject(arg) {
+            return Object.prototype.toString.call(arg) === '[object Date]';
+        }
+        _isYearMonthDay(arg) {
+            return typeof arg.year === 'number' && typeof arg.month === 'number' &&
+                typeof arg.day === 'number';
+        }
+        _isYearHolyDayNumber(arg) {
+            return typeof arg.year === 'number' && arg.month === undefined &&
+                arg.day === undefined && typeof arg.holyDayNumber === 'number';
+        }
+        _notInValidGregorianDateRange(datetime) {
+            const lowerBound = luxon.DateTime.fromObject({ year: 1844, month: 3, day: 21, zone: 'UTC' });
+            const upperBound = luxon.DateTime.fromObject({ year: 2351, month: 3, day: 20, zone: 'UTC' });
+            return datetime < lowerBound || datetime > upperBound;
+        }
+        _setFromGregorianDate() {
+            if (this._notInValidGregorianDateRange(this._gregorianDate)) {
+                throw new RangeError('Input date outside of valid range (1844-03-21 - 2351-03-20)');
+            }
+            const gregorianYear = this._gregorianDate.year;
+            const oldImplementationCutoff = luxon.DateTime.fromObject({ year: 2015, month: 3, day: 21, zone: 'UTC' });
+            if (this._gregorianDate < oldImplementationCutoff) {
+                const { month, day } = this._gregorianDate;
+                if (month < 3 || (month === 3 && day < 21)) {
+                    this._nawRuz = luxon.DateTime.fromObject({ year: gregorianYear - 1, month: 3, day: 21, zone: 'UTC' });
+                    this._year = gregorianYear - 1844;
+                }
+                else {
+                    this._nawRuz = luxon.DateTime.fromObject({ year: gregorianYear, month: 3, day: 21, zone: 'UTC' });
+                    this._year = gregorianYear - 1843;
+                }
+                this._setOldAyyamiHaLength();
+                this._yearTwinBirthdays = [12, 5, 13, 9];
+            }
+            else {
+                this._year = gregorianYear - 1843;
+                this._setBadiYearInfo(true);
+            }
+            this._setBadiMonthAndDay();
+        }
+        /**
+         * Set Badí' month and day from Gregorian date
+         */
+        _setBadiMonthAndDay() {
+            const dayOfBadiYear = this._dayOfYear(this._gregorianDate);
+            if (dayOfBadiYear < 343) {
+                this._month = Math.floor((dayOfBadiYear - 1) / 19 + 1);
+                this._day = (dayOfBadiYear - 1) % 19 + 1;
+            }
+            else if (dayOfBadiYear < 343 + this._ayyamiHaLength) {
+                this._month = 20;
+                this._day = dayOfBadiYear - 342;
+            }
+            else {
+                this._month = 19;
+                this._day = dayOfBadiYear - (342 + this._ayyamiHaLength);
+            }
+        }
+        _setFromBadiDate(date) {
+            this._year = date.year;
+            if (this._year < 1 || this._year > 507) {
+                throw new RangeError('Input date outside of valid range (1 - 507 B.E.)');
+            }
+            else if (this._year < 172) {
+                this._nawRuz = luxon.DateTime.fromObject({ year: 1843 + this._year, month: 3, day: 21, zone: 'UTC' });
+                this._setOldAyyamiHaLength();
+                this._yearTwinBirthdays = [12, 5, 13, 9];
+            }
+            else {
+                this._setBadiYearInfo();
+            }
+            if (this._isYearMonthDay(date)) {
+                this._month = date.month;
+                this._day = date.day;
+                if (this._month === 20 && this._day > this._ayyamiHaLength) {
+                    // If only off by one day, we'll bubble up so that 5th Ayyám-i-Há in a year with only 4 days of
+                    // Ayyám-i-Há can be salvaged
+                    if (this._day - this._ayyamiHaLength === 1) {
+                        this._month = 19;
+                        this._day = 1;
+                    }
+                    else {
+                        throw new TypeError('Input numbers do not designate a valid date');
+                    }
+                }
+                if (this._month < 1 || this._month > 20 || this._day < 1 || this.day > 19) {
+                    throw new TypeError('Input numbers do not designate a valid date');
+                }
+            }
+            else {
+                if (date.holyDayNumber < 1 || date.holyDayNumber > 11) {
+                    throw new TypeError('Input numbers do not designate a valid Holy Day');
+                }
+                this._holyDay = date.holyDayNumber;
+                [this._month, this._day] = this._holyDayMapping()[this._holyDay];
+            }
+            this._gregorianDate = this._nawRuz.plus(luxon.Duration.fromObject({ days: this._dayOfYear([this._year, this._month, this._day]) - 1 }));
+        }
+        _setOldAyyamiHaLength() {
+            if (luxon.DateTime.fromObject({ year: this._nawRuz.year + 1 }).isInLeapYear) {
+                this._ayyamiHaLength = 5;
+            }
+            else {
+                this._ayyamiHaLength = 4;
+            }
+        }
+        _setBadiYearInfo(fromGregorianDate = false) {
+            let yearData = this._extractBadiYearInfo();
+            if (fromGregorianDate && this._gregorianDate < yearData.nawRuz) {
+                this._year -= 1;
+                yearData = this._extractBadiYearInfo();
+            }
+            this._nawRuz = yearData.nawRuz;
+            this._ayyamiHaLength = yearData.ayyamiHaLength;
+            this._yearTwinBirthdays = yearData.twinBirthdays;
+        }
+        _extractBadiYearInfo() {
+            let nawRuz, ayyamiHaLength, twinBirthdays;
+            // Check whether data needs to be unpacked or exists in the verbose version
+            // istanbul ignore else
+            if (badiYears[0] === 'l4da') {
+                const components = badiYears[this._year - 172].split('');
+                nawRuz = luxon.DateTime.fromObject({ year: this._year - 172 + 2015, month: 3, day: parseInt(components[0], 36), zone: 'UTC' });
+                ayyamiHaLength = parseInt(components[1], 36);
+                const TB1 = [parseInt(components[2], 36), parseInt(components[3], 36)];
+                const TB2 = TB1[1] < 19 ? [TB1[0], TB1[1] + 1] : [TB1[0] + 1, 1];
+                twinBirthdays = [TB1[0], TB1[1], TB2[0], TB2[1]];
+            }
+            else {
+                ({ nawRuz, ayyamiHaLength, twinBirthdays } = badiYears[this._year]);
+                nawRuz = luxon.DateTime.fromISO(nawRuz, { zone: 'UTC' });
+            }
+            return { nawRuz, ayyamiHaLength, twinBirthdays };
+        }
+        _dayOfYear(date) {
+            // Naw-Rúz is day 1
+            if (Array.isArray(date)) {
+                // We have a Badí' date
+                if (date[1] < 19) {
+                    return 19 * (date[1] - 1) + date[2];
+                }
+                else if (date[1] === 20) {
+                    return 342 + date[2];
+                }
+                // date[1] === 19
+                return 342 + this._ayyamiHaLength + date[2];
+            }
+            return date.diff(this._nawRuz).as('days') + 1;
+        }
+        _setInvalid(invalidReason) {
+            this._gregorianDate = luxon.DateTime.invalid('Not a valid Badí‘ date');
+            this._year = NaN;
+            this._month = NaN;
+            this._day = NaN;
+            this._ayyamiHaLength = NaN;
+            this._nawRuz = luxon.DateTime.invalid('Not a valid Badí‘ date');
+            this._valid = false;
+            this._invalidReason = invalidReason;
+        }
+        _setHolyDay() {
+            const mapping = this._holyDayMapping();
+            this._holyDay = parseInt(Object.keys(mapping)
+                .find(key => mapping[key][0] === this._month && mapping[key][1] === this._day), 10);
+        }
+        _holyDayMapping() {
+            return {
+                [1 /* NawRuz */]: [1, 1],
+                [2 /* FirstRidvan */]: [2, 13],
+                [3 /* NinthRidvan */]: [3, 2],
+                [4 /* TwelfthRidvan */]: [3, 5],
+                [5 /* DeclarationOfTheBab */]: [4, this._year < 172 ? 7 : 8],
+                [6 /* AscensionOfBahaullah */]: [4, 13],
+                [7 /* MartyrdomOfTheBab */]: [6, this._year < 172 ? 16 : 17],
+                [8 /* BirthOfTheBab */]: [this._yearTwinBirthdays[0], this._yearTwinBirthdays[1]],
+                [9 /* BirthOfBahaullah */]: [this._yearTwinBirthdays[2], this._yearTwinBirthdays[3]],
+                [10 /* DayOfTheCovenant */]: [14, 4],
+                [11 /* AscensionOfAbdulBaha */]: [14, 6],
+            };
+        }
+        _leapYearsBefore() {
+            let leapYearsBefore = Math.floor(Math.min(this.year - 1, 171) / 4);
+            if (this.year > 172) {
+                // istanbul ignore else
+                if (badiYears[0] === 'l4da') {
+                    leapYearsBefore += badiYears.slice(0, this.year - 172).filter(entry => entry[1] === '5').length;
+                }
+                else {
+                    leapYearsBefore += Object.entries(badiYears)
+                        .filter(([year, data]) => parseInt(year, 10) < this.year &&
+                        data.ayyamiHaLength === 5).length;
+                }
+            }
+            return leapYearsBefore;
+        }
+        holyDay(language = undefined) {
+            if (!this._holyDay) {
+                return '';
+            }
+            if (language === undefined || badiLocale[language] === undefined) {
+                language = 'default';
+            }
+            return formatItemFallback(language, 'holyDay', this._holyDay);
+        }
+        valueOf() {
+            return this._dayOfYear([this.year, this.month, this.day]) + this._leapYearsBefore() + (this.year - 1) * 365;
+        }
+        equals(other) {
+            return this.isValid && other.isValid && this.valueOf() === other.valueOf();
+        }
+        get isValid() {
+            return this._valid;
+        }
+        get invalidReason() {
+            return this._invalidReason;
+        }
+        get day() {
+            return this._day;
+        }
+        get month() {
+            return this._month;
+        }
+        get year() {
+            return this._year;
+        }
+        // number of the Badí' weekday between 1 (Jalál ~> Saturday) and 7 (Istiqlál ~> Friday).
+        get weekday() {
+            return (this._gregorianDate.weekday + 1) % 7 + 1;
+        }
+        get yearInVahid() {
+            return (this._year - 1) % 19 + 1;
+        }
+        get vahid() {
+            return (Math.floor((this._year - 1) / 19) % 19) + 1;
+        }
+        get kullIShay() {
+            return Math.floor((this._year - 1) / 361) + 1;
+        }
+        // Gregorian date on whose sunset the Badí' date ends.
+        get gregorianDate() {
+            return this._gregorianDate;
+        }
+        get ayyamiHaLength() {
+            return this._ayyamiHaLength;
+        }
+        get holyDayNumber() {
+            return this._holyDay ? this._holyDay : undefined;
+        }
+        get workSuspended() {
+            return this._holyDay ? this.holyDayNumber < 10 : undefined;
+        }
+        get nextMonth() {
+            let { year, month } = this;
+            switch (month) {
+                case 18:
+                    month = 20;
+                    break;
+                case 19:
+                    month = 1;
+                    year += 1;
+                    break;
+                case 20:
+                    month = 19;
+                    break;
+                default:
+                    month += 1;
+            }
+            return new BadiDate({ year, month, day: 1 });
+        }
+        get previousMonth() {
+            let { year, month } = this;
+            switch (month) {
+                case 1:
+                    month = 19;
+                    year -= 1;
+                    break;
+                case 19:
+                    month = 20;
+                    break;
+                case 20:
+                    month = 18;
+                    break;
+                default:
+                    month -= 1;
+            }
+            return new BadiDate({ year, month, day: 1 });
+        }
+        get nextDay() {
+            if (this._day === 19 || (this._month === 20 && this._day === this._ayyamiHaLength)) {
+                return this.nextMonth;
+            }
+            return new BadiDate({ year: this._year, month: this._month, day: this._day + 1 });
+        }
+        get previousDay() {
+            if (this._day === 1) {
+                const { previousMonth } = this;
+                let day = 19;
+                if (this._month === 19) {
+                    day = this._ayyamiHaLength;
+                }
+                return new BadiDate({
+                    year: previousMonth.year,
+                    month: previousMonth.month,
+                    day,
+                });
+            }
+            return new BadiDate({ year: this._year, month: this._month, day: this._day - 1 });
+        }
+    }
+    const badiDateSettings = (settings) => {
+        if (settings.defaultLanguage) {
+            setDefaultLanguage(settings.defaultLanguage);
+        }
+        if (settings.underlineFormat) {
+            setUnderlineFormat(settings.underlineFormat);
+        }
+    };
+
+    exports.BadiDate = BadiDate;
+    exports.badiDateSettings = badiDateSettings;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+})));

Plik diff jest za duży
+ 5 - 0
dist/badiDate-locales.min.js


Plik diff jest za duży
+ 0 - 0
dist/badiDate-locales.min.js.map


Plik diff jest za duży
+ 5 - 0
dist/badiDate-locales.min.mjs


Plik diff jest za duży
+ 0 - 0
dist/badiDate-locales.min.mjs.map


+ 1693 - 0
dist/badiDate-locales.mjs

@@ -0,0 +1,1693 @@
+/**
+ * @license BadiDate v3.0.2
+ * (c) 2018 Jan Greis
+ * licensed under MIT
+ */
+
+import { DateTime, Duration } from 'luxon';
+
+const month = {
+    1: 'Bahá',
+    2: 'Jalál',
+    3: 'Jamál',
+    4: '‘Aẓamat',
+    5: 'Núr',
+    6: 'Raḥmat',
+    7: 'Kalimát',
+    8: 'Kamál',
+    9: 'Asmá’',
+    10: '‘Izzat',
+    11: 'Ma_sh_íyyat',
+    12: '‘Ilm',
+    13: 'Qudrat',
+    14: 'Qawl',
+    15: 'Masá’il',
+    16: '_Sh_araf',
+    17: 'Sulṭán',
+    18: 'Mulk',
+    19: '‘Alá’',
+    20: 'Ayyám-i-Há',
+};
+const monthL = {
+    1: 'Splendour',
+    2: 'Glory',
+    3: 'Beauty',
+    4: 'Grandeur',
+    5: 'Light',
+    6: 'Mercy',
+    7: 'Words',
+    8: 'Perfection',
+    9: 'Names',
+    10: 'Might',
+    11: 'Will',
+    12: 'Knowledge',
+    13: 'Power',
+    14: 'Speech',
+    15: 'Questions',
+    16: 'Honour',
+    17: 'Sovereignty',
+    18: 'Dominion',
+    19: 'Loftiness',
+    20: 'Ayyám-i-Há',
+};
+const holyDay = {
+    1: 'Naw-Rúz',
+    2: 'First day of Riḍván',
+    3: 'Ninth day of Riḍván',
+    4: 'Twelfth day of Riḍván',
+    5: 'Declaration of the Báb',
+    6: 'Ascension of Bahá’u’lláh',
+    7: 'Martyrdom of the Báb',
+    8: 'Birth of the Báb',
+    9: 'Birth of Bahá’u’lláh',
+    10: 'Day of the Covenant',
+    11: 'Ascension of ‘Abdu’l-Bahá',
+};
+// CAREFUL: Numbering corresponds to Badí' week, i.e. 1 is Jalál (-> Saturday)
+const weekday = {
+    1: 'Jalál',
+    2: 'Jamál',
+    3: 'Kamál',
+    4: 'Fiḍál',
+    5: '‘Idál',
+    6: 'Istijlál',
+    7: 'Istiqlál',
+};
+const weekdayAbbr3 = {
+    1: 'Jal',
+    2: 'Jam',
+    3: 'Kam',
+    4: 'Fiḍ',
+    5: '‘Idá',
+    6: 'Isj',
+    7: 'Isq',
+};
+const weekdayAbbr2 = {
+    1: 'Jl',
+    2: 'Jm',
+    3: 'Ka',
+    4: 'Fi',
+    5: '‘Id',
+    6: 'Ij',
+    7: 'Iq',
+};
+const weekdayL = {
+    1: 'Glory',
+    2: 'Beauty',
+    3: 'Perfection',
+    4: 'Grace',
+    5: 'Justice',
+    6: 'Majesty',
+    7: 'Independence',
+};
+const yearInVahid = {
+    1: 'Alif',
+    2: 'Bá’',
+    3: 'Ab',
+    4: 'Dál',
+    5: 'Báb',
+    6: 'Váv',
+    7: 'Abad',
+    8: 'Jád',
+    9: 'Bahá',
+    10: 'Ḥubb',
+    11: 'Bahháj',
+    12: 'Javáb',
+    13: 'Aḥad',
+    14: 'Vahháb',
+    15: 'Vidád',
+    16: 'Badí‘',
+    17: 'Bahí',
+    18: 'Abhá',
+    19: 'Váḥid',
+};
+const vahid = 'Váḥid';
+const kulliShay = 'Kull-i-_Sh_ay’';
+const BE = 'B.E.';
+const badiCalendar = 'Badí‘ Calendar';
+const unicodeCharForZero = '0';
+const defaultFormat = 'd MM+ y BE';
+
+var en = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    month: month,
+    monthL: monthL,
+    holyDay: holyDay,
+    weekday: weekday,
+    weekdayAbbr3: weekdayAbbr3,
+    weekdayAbbr2: weekdayAbbr2,
+    weekdayL: weekdayL,
+    yearInVahid: yearInVahid,
+    vahid: vahid,
+    kulliShay: kulliShay,
+    BE: BE,
+    badiCalendar: badiCalendar,
+    unicodeCharForZero: unicodeCharForZero,
+    defaultFormat: defaultFormat
+});
+
+const month$1 = {
+    1: 'البهاء',
+    2: 'الجلال',
+    3: 'الجمال',
+    4: 'العظمة',
+    5: 'النور',
+    6: 'الرحمة',
+    7: 'الكلمات',
+    8: 'الكمال',
+    9: 'الأسماء',
+    10: 'العزّة',
+    11: 'المشية',
+    12: 'العلم',
+    13: 'القدرة',
+    14: 'القول',
+    15: 'المسائل',
+    16: 'الشرف',
+    17: 'السلطان',
+    18: 'الملك',
+    19: 'العلاء',
+    20: 'ايام الهاء',
+};
+const monthL$1 = month$1;
+const holyDay$1 = {
+    1: 'عيد النَّيروز',
+    2: 'اليوم الأول من عيد الرِّضوان',
+    3: 'اليوم التاسع من عيد الرِّضوان',
+    4: 'اليوم الثاني عشر من عيد الرِّضوان',
+    5: 'يوم إعلان دعوة حضرة الباب',
+    6: 'يوم صعود حضرة بهاء الله',
+    7: 'يوم استشهاد حضرة الباب',
+    8: 'يوم ولادة حضرة الباب',
+    9: 'يوم ولادة حضرة بهاء الله',
+    10: 'يوم الميثاق',
+    11: 'يوم صعود حضرة عبد البهاء',
+};
+const weekday$1 = {
+    1: 'الجلال',
+    2: 'الجمال',
+    3: 'الكمال',
+    4: 'الفضّال',
+    5: 'العدّال',
+    6: 'الأستجلال',
+    7: 'الاستقلال',
+};
+const weekdayAbbr3$1 = {
+    1: 'جلا',
+    2: 'جما',
+    3: 'كما',
+    4: 'فضّا',
+    5: 'عدّا',
+    6: 'اسج',
+    7: 'اسق',
+};
+const weekdayAbbr2$1 = {
+    1: 'جل',
+    2: 'جم',
+    3: 'كم',
+    4: 'فض',
+    5: 'عد',
+    6: 'اج',
+    7: 'اق',
+};
+const weekdayL$1 = {
+    1: 'الجلال',
+    2: 'الجمال',
+    3: 'الكمال',
+    4: 'الفضّال',
+    5: 'العدّال',
+    6: 'الأستجلال',
+    7: 'أستقلال',
+};
+const yearInVahid$1 = {
+    1: 'ألف',
+    2: 'باء',
+    3: 'أب',
+    4: 'دﺍﻝ',
+    5: 'باب',
+    6: 'وﺍو',
+    7: 'أبد',
+    8: 'جاد',
+    9: 'بهاء',
+    10: 'حب',
+    11: 'بهاج',
+    12: 'جواب',
+    13: 'احد',
+    14: 'وﻫﺎب',
+    15: 'وداد',
+    16: 'بدیع',
+    17: 'بهي',
+    18: 'ابهى',
+    19: 'واحد',
+};
+const vahid$1 = 'واحد';
+const kulliShay$1 = 'كل شيء';
+const BE$1 = 'بديع';
+const badiCalendar$1 = 'تقويم بديع';
+const unicodeCharForZero$1 = '٠';
+const defaultFormat$1 = '&#8207;d MM y BE&#8207;';
+
+var ar = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    month: month$1,
+    monthL: monthL$1,
+    holyDay: holyDay$1,
+    weekday: weekday$1,
+    weekdayAbbr3: weekdayAbbr3$1,
+    weekdayAbbr2: weekdayAbbr2$1,
+    weekdayL: weekdayL$1,
+    yearInVahid: yearInVahid$1,
+    vahid: vahid$1,
+    kulliShay: kulliShay$1,
+    BE: BE$1,
+    badiCalendar: badiCalendar$1,
+    unicodeCharForZero: unicodeCharForZero$1,
+    defaultFormat: defaultFormat$1
+});
+
+const monthL$2 = {
+    1: 'Herrlichkeit',
+    2: 'Ruhm',
+    3: 'Schönheit',
+    4: 'Größe',
+    5: 'Licht',
+    6: 'Barmherzigkeit',
+    7: 'Worte',
+    8: 'Vollkommenheit',
+    9: 'Namen',
+    10: 'Macht',
+    11: 'Wille',
+    12: 'Wissen',
+    13: 'Kraft',
+    14: 'Sprache',
+    15: 'Fragen',
+    16: 'Ehre',
+    17: 'Souveränität',
+    18: 'Herrschaft',
+    19: 'Erhabenheit',
+    20: 'Ayyám-i-Há',
+};
+const holyDay$2 = {
+    1: 'Naw-Rúz',
+    2: 'Erster Riḍván-Tag',
+    3: 'Neunter Riḍván-Tag',
+    4: 'Zwölfter Riḍván-Tag',
+    5: 'Erklärung des Báb',
+    6: 'Hinscheiden Bahá’u’lláhs',
+    7: 'Märtyrertod des Báb',
+    8: 'Geburt des Báb',
+    9: 'Geburt Bahá’u’lláhs',
+    10: 'Tag des Bundes',
+    11: 'Hinscheiden ‘Abdu’l-Bahás',
+};
+const weekdayL$2 = {
+    1: 'Ruhm',
+    2: 'Schönheit',
+    3: 'Vollkommenheit',
+    4: 'Gnade',
+    5: 'Gerechtigkeit',
+    6: 'Majestät',
+    7: 'Unabhängigkeit',
+};
+const BE$2 = 'B.E.';
+const badiCalendar$2 = 'Badí‘ Kalender';
+
+var de = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    monthL: monthL$2,
+    holyDay: holyDay$2,
+    weekdayL: weekdayL$2,
+    BE: BE$2,
+    badiCalendar: badiCalendar$2
+});
+
+const monthL$3 = {
+    1: 'Esplendor',
+    2: 'Gloria',
+    3: 'Belleza',
+    4: 'Grandeza',
+    5: 'Luz',
+    6: 'Misericordia',
+    7: 'Palabras',
+    8: 'Perfección',
+    9: 'Nombres',
+    10: 'Fuerza',
+    11: 'Voluntad',
+    12: 'Conocimiento',
+    13: 'Poder',
+    14: 'Discurso',
+    15: 'Preguntas',
+    16: 'Honor',
+    17: 'Soberanía',
+    18: 'Dominio',
+    19: 'Sublimidad',
+    20: 'Ayyám-i-Há',
+};
+const holyDay$3 = {
+    1: 'Naw-Rúz',
+    2: 'Primer día de Riḍván',
+    3: 'Noveno día de Riḍván',
+    4: 'Duodécimo día de Riḍván',
+    5: 'Declaración del Báb',
+    6: 'Ascensión de Bahá’u’lláh',
+    7: 'Martirio del Báb',
+    8: 'Nacimiento del Báb',
+    9: 'Nacimiento de Bahá’u’lláh',
+    10: 'Día de la Alianza',
+    11: 'Fallecimiento de ‘Abdu’l-Bahá',
+};
+const weekdayL$3 = {
+    1: 'Gloria',
+    2: 'Belleza',
+    3: 'Perfección',
+    4: 'Gracia',
+    5: 'Justicia',
+    6: 'Majestuosidad',
+    7: 'Independencia',
+};
+const BE$3 = 'E.B.';
+const badiCalendar$3 = 'Calendario Badí‘';
+
+var es = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    monthL: monthL$3,
+    holyDay: holyDay$3,
+    weekdayL: weekdayL$3,
+    BE: BE$3,
+    badiCalendar: badiCalendar$3
+});
+
+const month$2 = {
+    1: 'البهاء',
+    2: 'الجلال',
+    3: 'الجمال',
+    4: 'العظمة',
+    5: 'النور',
+    6: 'الرحمة',
+    7: 'الكلمات',
+    8: 'الكمال',
+    9: 'الأسماء',
+    10: 'العزّة',
+    11: 'المشية',
+    12: 'العلم',
+    13: 'القدرة',
+    14: 'القول',
+    15: 'المسائل',
+    16: 'الشرف',
+    17: 'السلطان',
+    18: 'الملك',
+    19: 'العلاء',
+    20: 'ايام الهاء',
+};
+const monthL$4 = {
+    1: 'بهاء',
+    2: 'جلال',
+    3: 'جمال',
+    4: 'عظمت',
+    5: 'نور',
+    6: 'رحمت',
+    7: 'كلمات',
+    8: 'كمال',
+    9: 'أسماء',
+    10: 'عزّت',
+    11: 'مشيت',
+    12: 'علم',
+    13: 'قدرت',
+    14: 'قول',
+    15: 'مسائل',
+    16: 'شرف',
+    17: 'سلطان',
+    18: 'ملك',
+    19: 'علاء',
+    20: 'ايام ها',
+};
+const holyDay$4 = {
+    1: 'عید نوروز',
+    2: 'روز اوّل عید رضوان',
+    3: 'روز نهم عید رضوان',
+    4: 'روز دوازدهم عید رضوان',
+    5: 'بعثت حضرت باب',
+    6: 'صعود حضرت بهاالله',
+    7: 'شهادت حضرت اعلی',
+    8: 'تولّد حضرت اعلی',
+    9: 'تولّد حضرت بهالله',
+    10: 'روز عهد و میثاق',
+    11: 'صعود حضرت عبدالبها',
+};
+const weekday$2 = {
+    1: 'یوم الجلال',
+    2: 'یوم الجمال',
+    3: 'یوم الكمال',
+    4: 'یوم الفضّال',
+    5: 'یوم العدّال',
+    6: 'یوم الأستجلال',
+    7: 'یوم الاستقلال',
+};
+const weekdayAbbr3$2 = {
+    1: 'جلا',
+    2: 'جما',
+    3: 'كما',
+    4: 'فضّا',
+    5: 'عدّا',
+    6: 'اسج',
+    7: 'اسق',
+};
+const weekdayAbbr2$2 = {
+    1: 'جل',
+    2: 'جم',
+    3: 'كم',
+    4: 'فض',
+    5: 'عد',
+    6: 'اج',
+    7: 'اق',
+};
+const weekdayL$4 = {
+    1: 'جلال',
+    2: 'جمال',
+    3: 'كمال',
+    4: 'فضّال',
+    5: 'عدّال',
+    6: 'استجلال',
+    7: 'استقلال',
+};
+const yearInVahid$2 = {
+    1: 'ألف',
+    2: 'باء',
+    3: 'أب',
+    4: 'دﺍﻝ',
+    5: 'باب',
+    6: 'وﺍو',
+    7: 'أبد',
+    8: 'جاد',
+    9: 'بهاء',
+    10: 'حب',
+    11: 'بهاج',
+    12: 'جواب',
+    13: 'احد',
+    14: 'وﻫﺎب',
+    15: 'وداد',
+    16: 'بدیع',
+    17: 'بهي',
+    18: 'ابهى',
+    19: 'واحد',
+};
+const vahid$2 = 'واحد';
+const kulliShay$2 = 'كل شيء';
+const BE$4 = 'بديع';
+const badiCalendar$4 = 'تقويم بديع';
+const unicodeCharForZero$2 = '۰';
+const defaultFormat$2 = '&#8207;d MML y BE&#8207;';
+
+var fa = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    month: month$2,
+    monthL: monthL$4,
+    holyDay: holyDay$4,
+    weekday: weekday$2,
+    weekdayAbbr3: weekdayAbbr3$2,
+    weekdayAbbr2: weekdayAbbr2$2,
+    weekdayL: weekdayL$4,
+    yearInVahid: yearInVahid$2,
+    vahid: vahid$2,
+    kulliShay: kulliShay$2,
+    BE: BE$4,
+    badiCalendar: badiCalendar$4,
+    unicodeCharForZero: unicodeCharForZero$2,
+    defaultFormat: defaultFormat$2
+});
+
+const monthL$5 = {
+    1: 'Splendeur',
+    2: 'Gloire',
+    3: 'Beauté',
+    4: 'Grandeur',
+    5: 'Lumière',
+    6: 'Miséricorde',
+    7: 'Paroles',
+    8: 'Perfection',
+    9: 'Noms',
+    10: 'Puissance',
+    11: 'Volonté',
+    12: 'Connaissance',
+    13: 'Pouvoir',
+    14: 'Discours',
+    15: 'Questions',
+    16: 'Honneur',
+    17: 'Souveraineté',
+    18: 'Empire',
+    19: 'Élévation',
+    20: 'Ayyám-i-Há',
+};
+const holyDay$5 = {
+    1: 'Naw-Rúz',
+    2: 'Premier jour de Riḍván',
+    3: 'Neuvième jour de Riḍván',
+    4: 'Douzième jour de Riḍván',
+    5: 'Déclaration du Báb',
+    6: 'Ascension de Bahá’u’lláh',
+    7: 'Martyre du Báb',
+    8: 'Naissance du Báb',
+    9: 'Naissance de Bahá’u’lláh',
+    10: 'Jour de l’Alliance',
+    11: 'Ascension de ‘Abdu’l-Bahá',
+};
+const weekdayL$5 = {
+    1: 'Gloire',
+    2: 'Beauté',
+    3: 'Perfection',
+    4: 'Grâce',
+    5: 'Justice',
+    6: 'Majesté',
+    7: 'Indépendance',
+};
+const BE$5 = 'E.B.';
+const badiCalendar$5 = 'Calendrier Badí‘';
+
+var fr = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    monthL: monthL$5,
+    holyDay: holyDay$5,
+    weekdayL: weekdayL$5,
+    BE: BE$5,
+    badiCalendar: badiCalendar$5
+});
+
+const monthL$6 = {
+    1: 'Spožums',
+    2: 'Slava',
+    3: 'Skaistums',
+    4: 'Dižums',
+    5: 'Gaisma',
+    6: 'Žēlastība',
+    7: 'Vārdi',
+    8: 'Pilnība',
+    9: 'Nosaukumi',
+    10: 'Varenība',
+    11: 'Griba',
+    12: 'Zināšanas',
+    13: 'Vara',
+    14: 'Runa',
+    15: 'Jautājumi',
+    16: 'Gods',
+    17: 'Suverenitāte',
+    18: 'Valdīšana',
+    19: 'Cēlums',
+    20: 'Ayyám-i-Há',
+};
+const holyDay$6 = {
+    1: 'Naw-Rúz',
+    2: 'Riḍván pirmā diena',
+    3: 'Riḍván devītā diena',
+    4: 'Riḍván divpadsmitā diena',
+    5: 'Bába paziņojums',
+    6: 'Bahá’u’lláh Debessbraukšana',
+    7: 'Bába mocekļa nāve',
+    8: 'Bába dzimšanas diena',
+    9: 'Bahá’u’lláh dzimšanas diena',
+    10: 'Derības diena',
+    11: '‘Abdu’l-Bahá Debessbraukšana',
+};
+const weekdayL$6 = {
+    1: 'Slava',
+    2: 'Skaistums',
+    3: 'Pilnība',
+    4: 'Žēlastība',
+    5: 'Taisnīgums',
+    6: 'Majestātiskums',
+    7: 'Neatkarība',
+};
+const BE$6 = 'B.Ē.';
+const badiCalendar$6 = 'Badí‘ kalendārs';
+
+var lv = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    monthL: monthL$6,
+    holyDay: holyDay$6,
+    weekdayL: weekdayL$6,
+    BE: BE$6,
+    badiCalendar: badiCalendar$6
+});
+
+const monthL$7 = {
+    1: 'Pracht',
+    2: 'Heerlijkheid',
+    3: 'Schoonheid',
+    4: 'Grootheid',
+    5: 'Licht',
+    6: 'Barmhartigheid',
+    7: 'Woorden',
+    8: 'Volmaaktheid',
+    9: 'Namen',
+    10: 'Macht',
+    11: 'Wil',
+    12: 'Kennis',
+    13: 'Kracht',
+    14: 'Spraak',
+    15: 'Vragen',
+    16: 'Eer',
+    17: 'Soevereiniteit',
+    18: 'Heerschappij',
+    19: 'Verhevenheid',
+    20: 'Ayyám-i-Há',
+};
+const holyDay$7 = {
+    1: 'Naw-Rúz',
+    2: 'Eerste dag van Riḍván',
+    3: 'Negende dag van Riḍván',
+    4: 'Twaalfde dag van Riḍván',
+    5: 'Verkondiging van de Báb',
+    6: 'Heengaan van Bahá’u’lláh',
+    7: 'Marteldood van de Báb',
+    8: 'Geboortedag van de Báb',
+    9: 'Geboortedag van Bahá’u’lláh',
+    10: 'Dag van het Verbond',
+    11: 'Heengaan van ‘Abdu’l-Bahá',
+};
+const weekdayL$7 = {
+    1: 'Heerlijkheid',
+    2: 'Schoonheid',
+    3: 'Volmaaktheid',
+    4: 'Genade',
+    5: 'Gerechtigheid',
+    6: 'Majesteit',
+    7: 'Onafhankelijkheid',
+};
+const BE$7 = 'B.E.';
+const badiCalendar$7 = 'Badí‘-Kalender';
+
+var nl = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    monthL: monthL$7,
+    holyDay: holyDay$7,
+    weekdayL: weekdayL$7,
+    BE: BE$7,
+    badiCalendar: badiCalendar$7
+});
+
+const monthL$8 = {
+    1: 'Esplendor',
+    2: 'Glória',
+    3: 'Beleza',
+    4: 'Grandeza',
+    5: 'Luz',
+    6: 'Miséricórdia',
+    7: 'Palavras',
+    8: 'Perfeição',
+    9: 'Nomes',
+    10: 'Potência',
+    11: 'Vontade',
+    12: 'Conhecimento',
+    13: 'Poder',
+    14: 'Discurso',
+    15: 'Perguntas',
+    16: 'Honra',
+    17: 'Soberania',
+    18: 'Domínio',
+    19: 'Sublimidade',
+    20: 'Ayyám-i-Há',
+};
+const holyDay$8 = {
+    1: 'Naw-Rúz',
+    2: '1º dia do Riḍván',
+    3: '9º dia do Riḍván',
+    4: '12º dia do Riḍván',
+    5: 'Declaração do Báb',
+    6: 'Ascensão de Bahá’u’lláh',
+    7: 'Martírio do Báb',
+    8: 'Aniversário do Báb',
+    9: 'Aniversário de Bahá’u’lláh',
+    10: 'Dia do Convênio',
+    11: 'Ascensão de ‘Abdu’l-Bahá',
+};
+const weekdayL$8 = {
+    1: 'Glória',
+    2: 'Beleza',
+    3: 'Perfeição',
+    4: 'Graça',
+    5: 'Justiça',
+    6: 'Majestade',
+    7: 'Independência',
+};
+const BE$8 = 'E.B.';
+const badiCalendar$8 = 'Calendário Badí‘';
+
+var pt = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    monthL: monthL$8,
+    holyDay: holyDay$8,
+    weekdayL: weekdayL$8,
+    BE: BE$8,
+    badiCalendar: badiCalendar$8
+});
+
+const month$3 = {
+    1: 'Бахā',
+    2: 'Джалāл',
+    3: 'Джамāл',
+    4: '‘Аз̣амат',
+    5: 'Нӯр',
+    6: 'Рах̣мат',
+    7: 'Калимāт',
+    8: 'Камāл',
+    9: 'Асмā’',
+    10: '‘Иззат',
+    11: 'Машӣййат',
+    12: '‘Илм',
+    13: 'К̣удрат',
+    14: 'К̣аул',
+    15: 'Масā’ил',
+    16: 'Шараф',
+    17: 'Султ̣ан',
+    18: 'Мулк',
+    19: '‘Алā’',
+    20: 'Аййāм-и Хā',
+};
+const monthL$9 = {
+    1: 'Великолепие',
+    2: 'Слава',
+    3: 'Красота',
+    4: 'Величие',
+    5: 'Свет',
+    6: 'Милость',
+    7: 'Слова',
+    8: 'Совершенство',
+    9: 'Имена',
+    10: 'Мощь',
+    11: 'Воля',
+    12: 'Знание',
+    13: 'Могущество',
+    14: 'Речь',
+    15: 'Вопросы',
+    16: 'Честь',
+    17: 'Владычество',
+    18: 'Господство',
+    19: 'Возвышенность',
+    20: 'Аййāм-и Хā',
+};
+const holyDay$9 = {
+    1: 'Нау-Рӯз',
+    2: '1-й день Рид̣вāна',
+    3: '9-й день Рид̣вāна',
+    4: '12-й день Рид̣вāна',
+    5: 'Возвещение Баба',
+    6: 'Вознесение Бахауллы',
+    7: 'Мученическая Баба',
+    8: 'рождения Баба',
+    9: 'рождения Бахауллы',
+    10: 'День Завета',
+    11: 'Вознесение Абдул-Баха',
+};
+const weekday$3 = {
+    1: 'Джалāл',
+    2: 'Джамāл',
+    3: 'Камāл',
+    4: 'Фид̣āл',
+    5: '‘Идāл',
+    6: 'Истиджлāл',
+    7: 'Истик̣лāл',
+};
+const weekdayAbbr3$3 = {
+    1: 'Джл',
+    2: 'Джм',
+    3: 'Кам',
+    4: 'Фид̣',
+    5: '‘Идā',
+    6: 'Исд',
+    7: 'Иск̣',
+};
+const weekdayAbbr2$3 = {
+    1: 'Дл',
+    2: 'Дм',
+    3: 'Ка',
+    4: 'Фи',
+    5: '‘Ид',
+    6: 'Ид',
+    7: 'Ик̣',
+};
+const weekdayL$9 = {
+    1: 'Слава',
+    2: 'Красота',
+    3: 'Совершенство',
+    4: 'Благодать',
+    5: 'Справедливость',
+    6: 'Величие',
+    7: 'Независимость',
+};
+const yearInVahid$3 = {
+    1: 'Алиф',
+    2: 'Бā’',
+    3: 'Аб',
+    4: 'Дāл',
+    5: 'Бāб',
+    6: 'Вāв',
+    7: 'Абад',
+    8: 'Джāд',
+    9: 'Бахā',
+    10: 'Х̣убб',
+    11: 'Баххāдж',
+    12: 'Джавāб',
+    13: 'Ах̣ад',
+    14: 'Ваххāб',
+    15: 'Видāд',
+    16: 'Бадӣ‘',
+    17: 'Бахӣ',
+    18: 'Абхā',
+    19: 'Вāх̣ид',
+};
+const vahid$3 = 'Вāх̣ид';
+const kulliShay$3 = 'кулл-и шай’';
+const BE$9 = 'Э.Б.';
+const badiCalendar$9 = 'Календарь Бадӣ‘';
+
+var ru = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    month: month$3,
+    monthL: monthL$9,
+    holyDay: holyDay$9,
+    weekday: weekday$3,
+    weekdayAbbr3: weekdayAbbr3$3,
+    weekdayAbbr2: weekdayAbbr2$3,
+    weekdayL: weekdayL$9,
+    yearInVahid: yearInVahid$3,
+    vahid: vahid$3,
+    kulliShay: kulliShay$3,
+    BE: BE$9,
+    badiCalendar: badiCalendar$9
+});
+
+const monthL$a = {
+    1: 'Praktfullhet',
+    2: 'Härlighet',
+    3: 'Skönhet',
+    4: 'Storhet',
+    5: 'Ljus',
+    6: 'Barmhärtighet',
+    7: 'Ord',
+    8: 'Fullkomlighet',
+    9: 'Namn',
+    10: 'Makt',
+    11: 'Vilja',
+    12: 'Kunskap',
+    13: 'Kraft',
+    14: 'Tal',
+    15: 'Frågor',
+    16: 'Ära',
+    17: 'Överhöghet',
+    18: 'Herravälde',
+    19: 'Upphöjdhet',
+    20: 'Ayyám-i-Há',
+};
+const holyDay$a = {
+    1: 'Naw-Rúz',
+    2: 'Första Riḍván',
+    3: 'Nionde Riḍván',
+    4: 'Tolfte Riḍván',
+    5: 'Bábs Deklaration',
+    6: 'Bahá’u’lláhs Bortgång',
+    7: 'Bábs Martyrskap',
+    8: 'Bábs Födelse',
+    9: 'Bahá’u’lláhs Födelse',
+    10: 'Förbundets dag',
+    11: '‘Abdu’l-Bahás Bortgång',
+};
+const weekdayL$a = {
+    1: 'Härlighet',
+    2: 'Skönhet',
+    3: 'Fullkomlighet',
+    4: 'Nåd',
+    5: 'Rättvisa',
+    6: 'Majestät',
+    7: 'Oberoende',
+};
+const BE$a = 'B.E.';
+const badiCalendar$a = 'Badí‘kalendern';
+
+var sv = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    monthL: monthL$a,
+    holyDay: holyDay$a,
+    weekdayL: weekdayL$a,
+    BE: BE$a,
+    badiCalendar: badiCalendar$a
+});
+
+const month$4 = {
+    1: '巴哈',
+    2: '贾拉勒',
+    3: '贾迈勒',
+    4: '阿泽迈特',
+    5: '努尔',
+    6: '拉赫迈特',
+    7: '凯利马特',
+    8: '卡迈勒',
+    9: '艾斯玛',
+    10: '伊扎特',
+    11: '迈希耶特',
+    12: '伊勒姆',
+    13: '古德雷特',
+    14: '高勒',
+    15: '迈萨伊勒',
+    16: '谢拉夫',
+    17: '苏丹',
+    18: '穆勒克',
+    19: '阿拉',
+    20: '阿亚米哈',
+};
+const monthL$b = {
+    1: '耀',
+    2: '辉',
+    3: '美',
+    4: '宏',
+    5: '光',
+    6: '仁',
+    7: '言',
+    8: '完',
+    9: '名',
+    10: '能',
+    11: '意',
+    12: '知',
+    13: '力',
+    14: '语',
+    15: '问',
+    16: '尊',
+    17: '权',
+    18: '统',
+    19: '崇',
+    20: '哈之日',
+};
+const holyDay$b = {
+    1: '诺鲁孜节',
+    2: '里兹万节第一日',
+    3: '里兹万节第九日',
+    4: '里兹万节第十二日',
+    5: '巴孛宣示日',
+    6: '巴哈欧拉升天日',
+    7: '巴孛殉道日',
+    8: '巴孛诞辰',
+    9: '巴哈欧拉诞辰',
+    10: '圣约日',
+    11: '阿博都-巴哈升天日',
+};
+const weekday$4 = {
+    1: '贾拉勒',
+    2: '贾迈勒',
+    3: '卡迈勒',
+    4: '菲达勒',
+    5: '伊达勒',
+    6: '伊斯提杰拉勒',
+    7: '伊斯提格拉勒',
+};
+const weekdayAbbr3$4 = {
+    1: '贾拉勒',
+    2: '贾迈勒',
+    3: '卡迈勒',
+    4: '菲达勒',
+    5: '伊达勒',
+    6: '伊斯杰',
+    7: '伊斯格',
+};
+const weekdayAbbr2$4 = {
+    1: '贾拉',
+    2: '贾迈',
+    3: '卡迈',
+    4: '菲达',
+    5: '伊达',
+    6: '伊杰',
+    7: '伊格',
+};
+const weekdayL$b = {
+    1: '辉日',
+    2: '美日',
+    3: '完日',
+    4: '恩日',
+    5: '正日',
+    6: '威日',
+    7: '独日',
+};
+const yearInVahid$4 = {
+    1: '艾利夫',
+    2: '巴',
+    3: '艾卜',
+    4: '达勒',
+    5: '巴卜',
+    6: '瓦乌',
+    7: '阿巴德',
+    8: '贾德',
+    9: '巴哈',
+    10: '胡卜',
+    11: '巴哈杰',
+    12: '贾瓦卜',
+    13: '阿哈德',
+    14: '瓦哈卜',
+    15: '维达德',
+    16: '巴迪',
+    17: '巴希',
+    18: '阿卜哈',
+    19: '瓦希德',
+};
+const vahid$4 = '瓦希德';
+const kulliShay$4 = '库里沙伊';
+const BE$b = 'BE';
+const badiCalendar$b = '巴迪历';
+
+var zh = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    month: month$4,
+    monthL: monthL$b,
+    holyDay: holyDay$b,
+    weekday: weekday$4,
+    weekdayAbbr3: weekdayAbbr3$4,
+    weekdayAbbr2: weekdayAbbr2$4,
+    weekdayL: weekdayL$b,
+    yearInVahid: yearInVahid$4,
+    vahid: vahid$4,
+    kulliShay: kulliShay$4,
+    BE: BE$b,
+    badiCalendar: badiCalendar$b
+});
+
+const monthL$c = {
+    1: 'Splendor',
+    16: 'Honor',
+};
+
+var en_us = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    monthL: monthL$c
+});
+
+/* eslint-disable dot-notation, line-comment-position, camelcase, sort-imports */
+const badiLocale = { en, ar, de, es, fa, fr, lv, nl, pt, ru, sv, zh, 'en-us': en_us, default: en };
+const setDefaultLanguage = (language) => {
+    if (badiLocale[language] === undefined) {
+        // eslint-disable-next-line no-console
+        console.log('Chosen language does not exist. Setting has not been changed.');
+    }
+    else {
+        badiLocale['default'] = badiLocale[language];
+    }
+};
+let underlineFormat = 'css';
+const setUnderlineFormat = (format) => {
+    if (['css', 'u', 'diacritic', 'none'].includes(format)) {
+        underlineFormat = format;
+    }
+    else {
+        // eslint-disable-next-line no-console
+        console.log('Invalid underline format. Choose one of ["css", "u", "diacritic", "none"]. ' +
+            'Setting has not been changed.');
+    }
+};
+
+const formatTokens = [
+    ['DDL', 'DD+', 'MML', 'MM+', 'WWL', 'yyv', 'KiS'],
+    ['dd', 'DD', 'mm', 'MM', 'ww', 'WW', 'yv', 'YV', 'vv', 'kk', 'yy', 'BE', 'BC', 'Va'],
+    ['d', 'D', 'm', 'M', 'W', 'v', 'k', 'y']
+];
+// eslint-disable-next-line complexity
+const formatBadiDate = (badiDate, formatString, language) => {
+    if (!badiDate.isValid) {
+        return 'Not a valid Badí‘ date';
+    }
+    if (typeof language === 'string' && badiLocale[language] === undefined && language.includes('-')) {
+        language = language.split('-')[0];
+    }
+    if (language === undefined || badiLocale[language] === undefined) {
+        language = 'default';
+    }
+    formatString = formatString !== null && formatString !== void 0 ? formatString : formatItemFallback(language, 'defaultFormat');
+    let formattedDate = '';
+    const length = formatString.length;
+    for (let i = 0; i < length; i++) {
+        // Text wrapped in {} is output as-is. A '{' without a matching '}'
+        // results in invalid input
+        if (formatString[i] === '{' && i < length - 1) {
+            for (let j = i + 1; j <= length; j++) {
+                if (j === length) {
+                    return 'Invalid formatting string.';
+                }
+                if (formatString[j] === '}') {
+                    i = j;
+                    break;
+                }
+                formattedDate += formatString[j];
+            }
+        }
+        else {
+            const next1 = formatString[i];
+            const next2 = next1 + formatString[i + 1];
+            const next3 = next2 + formatString[i + 2];
+            if (formatTokens[0].includes(next3)) {
+                formattedDate += getFormatItem(badiDate, next3, language);
+                i += 2;
+            }
+            else if (formatTokens[1].includes(next2)) {
+                formattedDate += getFormatItem(badiDate, next2, language);
+                i += 1;
+            }
+            else if (formatTokens[2].includes(next1)) {
+                formattedDate += getFormatItem(badiDate, next1, language);
+            }
+            else {
+                formattedDate += next1;
+            }
+        }
+    }
+    return formattedDate;
+};
+// eslint-disable-next-line complexity
+const getFormatItem = (badiDate, token, language) => {
+    switch (token) {
+        // Single character tokens
+        case 'd':
+            return digitRewrite(badiDate.day, language);
+        case 'D':
+            return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.day), 3);
+        case 'm':
+            return digitRewrite(badiDate.month, language);
+        case 'M':
+            return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.month), 3);
+        case 'W':
+            return formatItemFallback(language, 'weekdayAbbr3', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+        case 'y':
+            return digitRewrite(badiDate.year, language);
+        case 'v':
+            return digitRewrite((Math.floor((badiDate.year - 1) / 19) % 19) + 1, language);
+        case 'k':
+            return digitRewrite(Math.floor((badiDate.year - 1) / 361) + 1, language);
+        // Two character tokens
+        case 'dd':
+            return digitRewrite((`0${String(badiDate.day)}`).slice(-2), language);
+        case 'DD':
+            return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.day));
+        case 'mm':
+            return digitRewrite((`0${String(badiDate.month)}`).slice(-2), language);
+        case 'MM':
+            return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.month));
+        case 'ww':
+            return formatItemFallback(language, 'weekdayAbbr2', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+        case 'WW':
+            return formatItemFallback(language, 'weekday', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+        case 'yy':
+            return digitRewrite((`00${String(badiDate.year)}`).slice(-3), language);
+        case 'yv':
+            return digitRewrite((badiDate.year - 1) % 19 + 1, language);
+        case 'YV':
+            return formatItemFallback(language, 'yearInVahid', (badiDate.year - 1) % 19 + 1);
+        case 'vv':
+            return digitRewrite((`0${String((Math.floor((badiDate.year - 1) / 19) + 2) % 19 - 1)}`).slice(-2), language);
+        case 'kk':
+            return digitRewrite((`0${String(Math.floor((badiDate.year - 1) / 361) + 1)}`).slice(-2), language);
+        case 'Va':
+            return formatItemFallback(language, 'vahid');
+        case 'BE':
+            return formatItemFallback(language, 'BE');
+        case 'BC':
+            return formatItemFallback(language, 'badiCalendar');
+        // Three character tokens
+        case 'DDL':
+            return formatItemFallback(language, 'monthL', badiDate.day);
+        case 'DD+': {
+            const day = postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.day));
+            const dayL = formatItemFallback(language, 'monthL', badiDate.day);
+            if (day === dayL) {
+                return day;
+            }
+            if (badiLocale[language] === badiLocale.fa) {
+                return `<span dir="rtl">${day} (${dayL})</span>`;
+            }
+            return `${day} (${dayL})`;
+        }
+        case 'MML':
+            return formatItemFallback(language, 'monthL', badiDate.month);
+        case 'MM+': {
+            const month = postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.month));
+            const monthL = formatItemFallback(language, 'monthL', badiDate.month);
+            if (month === monthL) {
+                return month;
+            }
+            if (badiLocale[language] === badiLocale.fa) {
+                return `<span dir="rtl">${month} (${monthL})</span>`;
+            }
+            return `${month} (${monthL})`;
+        }
+        case 'WWL':
+            return formatItemFallback(language, 'weekdayL', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+        case 'yyv':
+            return digitRewrite((`0${String((badiDate.year - 1) % 19 + 1)}`).slice(-2), language);
+        case 'KiS':
+            return postProcessLocaleItem(formatItemFallback(language, 'kulliShay'));
+        // istanbul ignore next
+        default:
+            return '';
+    }
+};
+const postProcessLocaleItem = (item, crop) => {
+    if (crop && crop < item.length) {
+        let char = 0;
+        let counter = 0;
+        while (counter < crop) {
+            if (!'_’‘'.includes(item[char])) {
+                counter++;
+            }
+            char++;
+        }
+        if ('_’‘'.includes(item[char])) {
+            char++;
+        }
+        item = item.slice(0, char);
+        if (item.split('_').length % 2 === 0) {
+            item += '_';
+        }
+    }
+    const stringComponents = item.split('_');
+    for (let i = 1; i < stringComponents.length; i += 2) {
+        stringComponents[i] = underlineString(stringComponents[i]);
+    }
+    return stringComponents.join('');
+};
+const underlineString = (str) => {
+    switch (underlineFormat) {
+        case 'css':
+            return `<span style="text-decoration:underline">${str}</span>`;
+        case 'diacritic':
+            return str.split('').map(char => `${char}\u0332`).join('');
+        case 'u':
+            return `<u>${str}</u>`;
+        case 'none':
+            return str;
+        // istanbul ignore next
+        default:
+            throw new TypeError('Unexpected underlineFormat');
+    }
+};
+const digitRewrite = (number, language) => {
+    number = String(number);
+    const unicodeOffset = formatItemFallback(language, 'unicodeCharForZero').charCodeAt(0) - '0'.charCodeAt(0);
+    if (unicodeOffset === 0) {
+        return number;
+    }
+    const codePoints = [...number].map(num => num.charCodeAt(0) + unicodeOffset);
+    return String.fromCharCode(...codePoints);
+};
+const formatItemFallback = (language, category, index) => {
+    var _a;
+    if (index === undefined) {
+        while (badiLocale[language][category] === undefined) {
+            language = languageFallback(language);
+        }
+        return badiLocale[language][category];
+    }
+    while (((_a = badiLocale[language][category]) === null || _a === void 0 ? void 0 : _a[index]) === undefined) {
+        language = languageFallback(language);
+    }
+    return badiLocale[language][category][index];
+};
+const languageFallback = (languageCode) => {
+    if (languageCode.includes('-')) {
+        return languageCode.split('-')[0];
+        // eslint-disable-next-line no-negated-condition
+    }
+    else if (languageCode !== 'default') {
+        return 'default';
+    }
+    return 'en';
+};
+
+const badiYears = [
+    'l4da', 'k4ci', 'k5c7', 'l4d6', 'l4ce', 'k4c4', 'k5d4', 'l4cb', 'l4c1', 'k4cj', 'k5c8', 'l4d7', 'l4cf', 'k4c5',
+    'k4d5', 'k5ce', 'l4c2', 'k4d2', 'k4ca', 'k5da', 'l4ch', 'k4c6', 'k4d6', 'k5cf', 'l4c4', 'k4d4', 'k4cc', 'k5c1',
+    'l4cj', 'k4c8', 'k4d8', 'k5cg', 'l4c5', 'k4d5', 'k4ce', 'k5c3', 'l4d2', 'k4ca', 'k4d9', 'k5ci', 'l4c6', 'k4d6',
+    'k4cf', 'k4c4', 'k5d4', 'k4cb', 'k4bj', 'k4cj', 'k5c9', 'k4d8', 'k4cg', 'k4c6', 'k5d6', 'k4cd', 'k4c2', 'k4d2',
+    'k5ca', 'k4d9', 'k4ci', 'k4c7', 'k5d7', 'k4cf', 'k4c4', 'k4d4', 'k5cc', 'k4bj', 'k4cj', 'k4c9', 'k5d9', 'k4cg',
+    'k4c6', 'k4d5', 'k5cd', 'k4c2', 'k4d1', 'k4ca', 'k4da', 'j5cj', 'k4c7', 'k4d7', 'k4cf', 'j5c4', 'k4d3', 'k4cb',
+    'k4c1', 'k5d1', 'l4c9', 'l4d9', 'l4ch', 'k5c6', 'l4d5', 'l4cd', 'l4c2', 'k5d2', 'l4ca', 'l4da', 'l4cj', 'k5c8',
+    'l4d7', 'l4cf', 'l4c4', 'k5d4', 'l4cb', 'l4c1', 'l4d1', 'k5c9', 'l4d8', 'l4cg', 'l4c5', 'k4d5', 'k5ce', 'l4c2',
+    'l4d2', 'k4cb', 'k5db', 'l4ci', 'l4c7', 'k4d7', 'k5cf', 'l4c4', 'l4d4', 'k4cc', 'k5c2', 'l4d1', 'l4c9', 'k4d9',
+    'k5ch', 'l4c5', 'l4d5', 'k4ce', 'k5c3', 'l4d2', 'l4cb', 'k4da', 'k5ci', 'l4c6', 'l4d6', 'k4cf', 'k5c5', 'l4d4',
+    'l4cc', 'k4c1', 'k4d1', 'k5c9', 'l4d8', 'k4cg', 'k4c6', 'k5d6', 'l4ce', 'k4c3', 'k4d3', 'k5cb', 'l4da', 'k4ci',
+    'k4c7', 'k5d7', 'l4cf', 'k4c5', 'k4d5', 'k5cd', 'l4c1', 'k4cj', 'k4c9', 'k5d9', 'l4cg', 'k4c6', 'k4d6', 'k5ce',
+    'l4c3', 'k4d2', 'k4ca', 'k5bj', 'l4ci', 'k4c7', 'k4d7', 'k4cg', 'k5c5', 'k4d4', 'k4cc', 'k4c1', 'k5d1', 'k4c9',
+    'k4d9', 'k4ch', 'k5c7', 'l4d6', 'l4ce', 'l4c3', 'l5d3', 'l4ca', 'l4da', 'l4cj', 'l5c8', 'l4d7', 'l4cg', 'l4c5',
+    'l5d4', 'l4cb', 'l4c1', 'l4d1', 'l5ca', 'l4d9', 'l4ch', 'l4c6', 'l5d6', 'l4cd', 'l4c2', 'l4d2', 'l4cb', 'k5c1',
+    'l4cj', 'l4c8', 'l4d8', 'k5cg', 'l4c4', 'l4d4', 'l4cc', 'k5c2', 'l4d1', 'l4ca', 'l4da', 'k5ci', 'l4c6', 'l4d5',
+    'l4ce', 'k5c3', 'l4d2', 'l4cb', 'l4db', 'k5cj', 'l4c8', 'l4d7', 'l4cf', 'k5c5', 'l4d4', 'l4cc', 'l4c2', 'k5d2',
+    'l4c9', 'l4d9', 'l4ch', 'k4c6', 'k5d6', 'l4ce', 'l4c3', 'k4d3', 'k5cc', 'l4db', 'l4cj', 'k4c8', 'k5d8', 'l4cf',
+    'l4c4', 'k4d5', 'k5cd', 'l4c2', 'l4d2', 'k4ca', 'k5d9', 'l4cg', 'l4c6', 'k4d6', 'k5cf', 'l4c3', 'l4d3', 'k4cb',
+    'k5bj', 'l4ci', 'l4c7', 'k4d7', 'k5cg', 'l4c5', 'l4d5', 'k4cd', 'k4c2', 'k5d2', 'l4c9', 'k4d9', 'k4ch', 'k5c7',
+    'l4d6', 'k4cf', 'k4c4', 'k5d4', 'l4cb', 'l4bj', 'l4cj', 'l5c8', 'm4d7', 'l4cg', 'l4c5', 'l5d5', 'm4cc', 'l4c1',
+    'l4d1', 'l5ca', 'm4d9', 'l4ch', 'l4c7', 'l5d7', 'm4ce', 'l4c3', 'l4d3', 'l5cb', 'm4bi', 'l4ci', 'l4c8', 'l4d8',
+    'l5ch', 'l4c5', 'l4d5', 'l4cd', 'l5c2', 'l4d1', 'l4c9', 'l4da', 'l5ci', 'l4c7', 'l4d7', 'l4cf', 'l5c4', 'l4d2',
+    'l4cb', 'l4bj', 'l5d1', 'l4c8', 'l4d8', 'l4cg', 'l5c5', 'l4d4', 'l4cc', 'l4c2', 'l5d2', 'l4c9', 'l4da', 'l4ci',
+];
+
+class BadiDate {
+    constructor(date) {
+        this._holyDay = undefined;
+        this._valid = true;
+        this._invalidReason = undefined;
+        try {
+            if (this._isDateObject(date)) {
+                this._gregorianDate = DateTime.fromObject({ year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate(), zone: 'UTC' });
+            }
+            else if (DateTime.isDateTime(date)) {
+                this._gregorianDate = DateTime.fromObject({ year: date.year, month: date.month, day: date.day, zone: 'UTC' });
+            }
+            else if (this._isYearMonthDay(date) || this._isYearHolyDayNumber(date)) {
+                this._setFromBadiDate(date);
+            }
+            else {
+                throw new TypeError('Unrecognized input format');
+            }
+            if (this._year === undefined) {
+                // We haven't set the Badí' date yet
+                this._setFromGregorianDate();
+            }
+            this._setHolyDay();
+        }
+        catch (err) {
+            this._setInvalid(err);
+        }
+        Object.freeze(this);
+    }
+    format(formatString, language) {
+        return formatBadiDate(this, formatString, language);
+    }
+    _isDateObject(arg) {
+        return Object.prototype.toString.call(arg) === '[object Date]';
+    }
+    _isYearMonthDay(arg) {
+        return typeof arg.year === 'number' && typeof arg.month === 'number' &&
+            typeof arg.day === 'number';
+    }
+    _isYearHolyDayNumber(arg) {
+        return typeof arg.year === 'number' && arg.month === undefined &&
+            arg.day === undefined && typeof arg.holyDayNumber === 'number';
+    }
+    _notInValidGregorianDateRange(datetime) {
+        const lowerBound = DateTime.fromObject({ year: 1844, month: 3, day: 21, zone: 'UTC' });
+        const upperBound = DateTime.fromObject({ year: 2351, month: 3, day: 20, zone: 'UTC' });
+        return datetime < lowerBound || datetime > upperBound;
+    }
+    _setFromGregorianDate() {
+        if (this._notInValidGregorianDateRange(this._gregorianDate)) {
+            throw new RangeError('Input date outside of valid range (1844-03-21 - 2351-03-20)');
+        }
+        const gregorianYear = this._gregorianDate.year;
+        const oldImplementationCutoff = DateTime.fromObject({ year: 2015, month: 3, day: 21, zone: 'UTC' });
+        if (this._gregorianDate < oldImplementationCutoff) {
+            const { month, day } = this._gregorianDate;
+            if (month < 3 || (month === 3 && day < 21)) {
+                this._nawRuz = DateTime.fromObject({ year: gregorianYear - 1, month: 3, day: 21, zone: 'UTC' });
+                this._year = gregorianYear - 1844;
+            }
+            else {
+                this._nawRuz = DateTime.fromObject({ year: gregorianYear, month: 3, day: 21, zone: 'UTC' });
+                this._year = gregorianYear - 1843;
+            }
+            this._setOldAyyamiHaLength();
+            this._yearTwinBirthdays = [12, 5, 13, 9];
+        }
+        else {
+            this._year = gregorianYear - 1843;
+            this._setBadiYearInfo(true);
+        }
+        this._setBadiMonthAndDay();
+    }
+    /**
+     * Set Badí' month and day from Gregorian date
+     */
+    _setBadiMonthAndDay() {
+        const dayOfBadiYear = this._dayOfYear(this._gregorianDate);
+        if (dayOfBadiYear < 343) {
+            this._month = Math.floor((dayOfBadiYear - 1) / 19 + 1);
+            this._day = (dayOfBadiYear - 1) % 19 + 1;
+        }
+        else if (dayOfBadiYear < 343 + this._ayyamiHaLength) {
+            this._month = 20;
+            this._day = dayOfBadiYear - 342;
+        }
+        else {
+            this._month = 19;
+            this._day = dayOfBadiYear - (342 + this._ayyamiHaLength);
+        }
+    }
+    _setFromBadiDate(date) {
+        this._year = date.year;
+        if (this._year < 1 || this._year > 507) {
+            throw new RangeError('Input date outside of valid range (1 - 507 B.E.)');
+        }
+        else if (this._year < 172) {
+            this._nawRuz = DateTime.fromObject({ year: 1843 + this._year, month: 3, day: 21, zone: 'UTC' });
+            this._setOldAyyamiHaLength();
+            this._yearTwinBirthdays = [12, 5, 13, 9];
+        }
+        else {
+            this._setBadiYearInfo();
+        }
+        if (this._isYearMonthDay(date)) {
+            this._month = date.month;
+            this._day = date.day;
+            if (this._month === 20 && this._day > this._ayyamiHaLength) {
+                // If only off by one day, we'll bubble up so that 5th Ayyám-i-Há in a year with only 4 days of
+                // Ayyám-i-Há can be salvaged
+                if (this._day - this._ayyamiHaLength === 1) {
+                    this._month = 19;
+                    this._day = 1;
+                }
+                else {
+                    throw new TypeError('Input numbers do not designate a valid date');
+                }
+            }
+            if (this._month < 1 || this._month > 20 || this._day < 1 || this.day > 19) {
+                throw new TypeError('Input numbers do not designate a valid date');
+            }
+        }
+        else {
+            if (date.holyDayNumber < 1 || date.holyDayNumber > 11) {
+                throw new TypeError('Input numbers do not designate a valid Holy Day');
+            }
+            this._holyDay = date.holyDayNumber;
+            [this._month, this._day] = this._holyDayMapping()[this._holyDay];
+        }
+        this._gregorianDate = this._nawRuz.plus(Duration.fromObject({ days: this._dayOfYear([this._year, this._month, this._day]) - 1 }));
+    }
+    _setOldAyyamiHaLength() {
+        if (DateTime.fromObject({ year: this._nawRuz.year + 1 }).isInLeapYear) {
+            this._ayyamiHaLength = 5;
+        }
+        else {
+            this._ayyamiHaLength = 4;
+        }
+    }
+    _setBadiYearInfo(fromGregorianDate = false) {
+        let yearData = this._extractBadiYearInfo();
+        if (fromGregorianDate && this._gregorianDate < yearData.nawRuz) {
+            this._year -= 1;
+            yearData = this._extractBadiYearInfo();
+        }
+        this._nawRuz = yearData.nawRuz;
+        this._ayyamiHaLength = yearData.ayyamiHaLength;
+        this._yearTwinBirthdays = yearData.twinBirthdays;
+    }
+    _extractBadiYearInfo() {
+        let nawRuz, ayyamiHaLength, twinBirthdays;
+        // Check whether data needs to be unpacked or exists in the verbose version
+        // istanbul ignore else
+        if (badiYears[0] === 'l4da') {
+            const components = badiYears[this._year - 172].split('');
+            nawRuz = DateTime.fromObject({ year: this._year - 172 + 2015, month: 3, day: parseInt(components[0], 36), zone: 'UTC' });
+            ayyamiHaLength = parseInt(components[1], 36);
+            const TB1 = [parseInt(components[2], 36), parseInt(components[3], 36)];
+            const TB2 = TB1[1] < 19 ? [TB1[0], TB1[1] + 1] : [TB1[0] + 1, 1];
+            twinBirthdays = [TB1[0], TB1[1], TB2[0], TB2[1]];
+        }
+        else {
+            ({ nawRuz, ayyamiHaLength, twinBirthdays } = badiYears[this._year]);
+            nawRuz = DateTime.fromISO(nawRuz, { zone: 'UTC' });
+        }
+        return { nawRuz, ayyamiHaLength, twinBirthdays };
+    }
+    _dayOfYear(date) {
+        // Naw-Rúz is day 1
+        if (Array.isArray(date)) {
+            // We have a Badí' date
+            if (date[1] < 19) {
+                return 19 * (date[1] - 1) + date[2];
+            }
+            else if (date[1] === 20) {
+                return 342 + date[2];
+            }
+            // date[1] === 19
+            return 342 + this._ayyamiHaLength + date[2];
+        }
+        return date.diff(this._nawRuz).as('days') + 1;
+    }
+    _setInvalid(invalidReason) {
+        this._gregorianDate = DateTime.invalid('Not a valid Badí‘ date');
+        this._year = NaN;
+        this._month = NaN;
+        this._day = NaN;
+        this._ayyamiHaLength = NaN;
+        this._nawRuz = DateTime.invalid('Not a valid Badí‘ date');
+        this._valid = false;
+        this._invalidReason = invalidReason;
+    }
+    _setHolyDay() {
+        const mapping = this._holyDayMapping();
+        this._holyDay = parseInt(Object.keys(mapping)
+            .find(key => mapping[key][0] === this._month && mapping[key][1] === this._day), 10);
+    }
+    _holyDayMapping() {
+        return {
+            [1 /* NawRuz */]: [1, 1],
+            [2 /* FirstRidvan */]: [2, 13],
+            [3 /* NinthRidvan */]: [3, 2],
+            [4 /* TwelfthRidvan */]: [3, 5],
+            [5 /* DeclarationOfTheBab */]: [4, this._year < 172 ? 7 : 8],
+            [6 /* AscensionOfBahaullah */]: [4, 13],
+            [7 /* MartyrdomOfTheBab */]: [6, this._year < 172 ? 16 : 17],
+            [8 /* BirthOfTheBab */]: [this._yearTwinBirthdays[0], this._yearTwinBirthdays[1]],
+            [9 /* BirthOfBahaullah */]: [this._yearTwinBirthdays[2], this._yearTwinBirthdays[3]],
+            [10 /* DayOfTheCovenant */]: [14, 4],
+            [11 /* AscensionOfAbdulBaha */]: [14, 6],
+        };
+    }
+    _leapYearsBefore() {
+        let leapYearsBefore = Math.floor(Math.min(this.year - 1, 171) / 4);
+        if (this.year > 172) {
+            // istanbul ignore else
+            if (badiYears[0] === 'l4da') {
+                leapYearsBefore += badiYears.slice(0, this.year - 172).filter(entry => entry[1] === '5').length;
+            }
+            else {
+                leapYearsBefore += Object.entries(badiYears)
+                    .filter(([year, data]) => parseInt(year, 10) < this.year &&
+                    data.ayyamiHaLength === 5).length;
+            }
+        }
+        return leapYearsBefore;
+    }
+    holyDay(language = undefined) {
+        if (!this._holyDay) {
+            return '';
+        }
+        if (language === undefined || badiLocale[language] === undefined) {
+            language = 'default';
+        }
+        return formatItemFallback(language, 'holyDay', this._holyDay);
+    }
+    valueOf() {
+        return this._dayOfYear([this.year, this.month, this.day]) + this._leapYearsBefore() + (this.year - 1) * 365;
+    }
+    equals(other) {
+        return this.isValid && other.isValid && this.valueOf() === other.valueOf();
+    }
+    get isValid() {
+        return this._valid;
+    }
+    get invalidReason() {
+        return this._invalidReason;
+    }
+    get day() {
+        return this._day;
+    }
+    get month() {
+        return this._month;
+    }
+    get year() {
+        return this._year;
+    }
+    // number of the Badí' weekday between 1 (Jalál ~> Saturday) and 7 (Istiqlál ~> Friday).
+    get weekday() {
+        return (this._gregorianDate.weekday + 1) % 7 + 1;
+    }
+    get yearInVahid() {
+        return (this._year - 1) % 19 + 1;
+    }
+    get vahid() {
+        return (Math.floor((this._year - 1) / 19) % 19) + 1;
+    }
+    get kullIShay() {
+        return Math.floor((this._year - 1) / 361) + 1;
+    }
+    // Gregorian date on whose sunset the Badí' date ends.
+    get gregorianDate() {
+        return this._gregorianDate;
+    }
+    get ayyamiHaLength() {
+        return this._ayyamiHaLength;
+    }
+    get holyDayNumber() {
+        return this._holyDay ? this._holyDay : undefined;
+    }
+    get workSuspended() {
+        return this._holyDay ? this.holyDayNumber < 10 : undefined;
+    }
+    get nextMonth() {
+        let { year, month } = this;
+        switch (month) {
+            case 18:
+                month = 20;
+                break;
+            case 19:
+                month = 1;
+                year += 1;
+                break;
+            case 20:
+                month = 19;
+                break;
+            default:
+                month += 1;
+        }
+        return new BadiDate({ year, month, day: 1 });
+    }
+    get previousMonth() {
+        let { year, month } = this;
+        switch (month) {
+            case 1:
+                month = 19;
+                year -= 1;
+                break;
+            case 19:
+                month = 20;
+                break;
+            case 20:
+                month = 18;
+                break;
+            default:
+                month -= 1;
+        }
+        return new BadiDate({ year, month, day: 1 });
+    }
+    get nextDay() {
+        if (this._day === 19 || (this._month === 20 && this._day === this._ayyamiHaLength)) {
+            return this.nextMonth;
+        }
+        return new BadiDate({ year: this._year, month: this._month, day: this._day + 1 });
+    }
+    get previousDay() {
+        if (this._day === 1) {
+            const { previousMonth } = this;
+            let day = 19;
+            if (this._month === 19) {
+                day = this._ayyamiHaLength;
+            }
+            return new BadiDate({
+                year: previousMonth.year,
+                month: previousMonth.month,
+                day,
+            });
+        }
+        return new BadiDate({ year: this._year, month: this._month, day: this._day - 1 });
+    }
+}
+const badiDateSettings = (settings) => {
+    if (settings.defaultLanguage) {
+        setDefaultLanguage(settings.defaultLanguage);
+    }
+    if (settings.underlineFormat) {
+        setUnderlineFormat(settings.underlineFormat);
+    }
+};
+
+export { BadiDate, badiDateSettings };

+ 67 - 0
dist/badiDate.d.ts

@@ -0,0 +1,67 @@
+import * as luxon from 'luxon';
+
+export interface YearMonthDay {
+    year: number;
+    month: number;
+    day: number;
+}
+
+export interface YearHolyDayNumber {
+    year: number;
+    holyDayNumber: number;
+}
+
+export type InputDate = luxon.DateTime | Date | YearMonthDay | YearHolyDayNumber;
+
+export type UnderlineFormat = 'css' | 'u' | 'diacritic' | 'none';
+
+export interface BadiDateSettings {
+    defaultLanguage?: string;
+    underlineFormat?: UnderlineFormat;
+    useClockLocations?: boolean;
+}
+
+export class BadiDate {
+    constructor(date: InputDate);
+    ayyamiHaLength: number;
+    day: number;
+    gregorianDate: luxon.DateTime;
+    holyDayNumber: number | undefined;
+    invalidReason: string | undefined;
+    isValid: boolean;
+    kullIShay: number;
+    month: number;
+    nextDay: BadiDate;
+    nextMonth: BadiDate;
+    previousDay: BadiDate;
+    previousMonth: BadiDate;
+    vahid: number;
+    weekday: number;
+    workSuspended: boolean | undefined;
+    year: number;
+    yearInVahid: number;
+    format(formatString?: string, language?: string): string;
+    holyDay(language?: string): string;
+    equals(other: BadiDate): boolean;
+    valueOf(): number;
+}
+
+export class LocalBadiDate {
+    constructor(date: InputDate, latitude: number, longitude: number, timezoneId: string);
+    badiDate: BadiDate;
+    clockLocation: string | undefined;
+    end: luxon.DateTime;
+    holyDayCommemoration: luxon.DateTime | undefined;
+    latitude: number;
+    longitude: number;
+    nextDay: LocalBadiDate;
+    nextMonth: LocalBadiDate;
+    previousDay: LocalBadiDate;
+    previousMonth: LocalBadiDate;
+    solarNoon: luxon.DateTime;
+    start: luxon.DateTime;
+    sunrise: luxon.DateTime;
+    timezoneId: string;
+}
+
+export function badiDateSettings(settings: BadiDateSettings): void;

+ 773 - 0
dist/badiDate.js

@@ -0,0 +1,773 @@
+/**
+ * @license BadiDate v3.0.2
+ * (c) 2018 Jan Greis
+ * licensed under MIT
+ */
+
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('luxon')) :
+    typeof define === 'function' && define.amd ? define(['exports', 'luxon'], factory) :
+    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.window = global.window || {}, global.luxon));
+}(this, (function (exports, luxon) { 'use strict';
+
+    const month = {
+        1: 'Bahá',
+        2: 'Jalál',
+        3: 'Jamál',
+        4: '‘Aẓamat',
+        5: 'Núr',
+        6: 'Raḥmat',
+        7: 'Kalimát',
+        8: 'Kamál',
+        9: 'Asmá’',
+        10: '‘Izzat',
+        11: 'Ma_sh_íyyat',
+        12: '‘Ilm',
+        13: 'Qudrat',
+        14: 'Qawl',
+        15: 'Masá’il',
+        16: '_Sh_araf',
+        17: 'Sulṭán',
+        18: 'Mulk',
+        19: '‘Alá’',
+        20: 'Ayyám-i-Há',
+    };
+    const monthL = {
+        1: 'Splendour',
+        2: 'Glory',
+        3: 'Beauty',
+        4: 'Grandeur',
+        5: 'Light',
+        6: 'Mercy',
+        7: 'Words',
+        8: 'Perfection',
+        9: 'Names',
+        10: 'Might',
+        11: 'Will',
+        12: 'Knowledge',
+        13: 'Power',
+        14: 'Speech',
+        15: 'Questions',
+        16: 'Honour',
+        17: 'Sovereignty',
+        18: 'Dominion',
+        19: 'Loftiness',
+        20: 'Ayyám-i-Há',
+    };
+    const holyDay = {
+        1: 'Naw-Rúz',
+        2: 'First day of Riḍván',
+        3: 'Ninth day of Riḍván',
+        4: 'Twelfth day of Riḍván',
+        5: 'Declaration of the Báb',
+        6: 'Ascension of Bahá’u’lláh',
+        7: 'Martyrdom of the Báb',
+        8: 'Birth of the Báb',
+        9: 'Birth of Bahá’u’lláh',
+        10: 'Day of the Covenant',
+        11: 'Ascension of ‘Abdu’l-Bahá',
+    };
+    // CAREFUL: Numbering corresponds to Badí' week, i.e. 1 is Jalál (-> Saturday)
+    const weekday = {
+        1: 'Jalál',
+        2: 'Jamál',
+        3: 'Kamál',
+        4: 'Fiḍál',
+        5: '‘Idál',
+        6: 'Istijlál',
+        7: 'Istiqlál',
+    };
+    const weekdayAbbr3 = {
+        1: 'Jal',
+        2: 'Jam',
+        3: 'Kam',
+        4: 'Fiḍ',
+        5: '‘Idá',
+        6: 'Isj',
+        7: 'Isq',
+    };
+    const weekdayAbbr2 = {
+        1: 'Jl',
+        2: 'Jm',
+        3: 'Ka',
+        4: 'Fi',
+        5: '‘Id',
+        6: 'Ij',
+        7: 'Iq',
+    };
+    const weekdayL = {
+        1: 'Glory',
+        2: 'Beauty',
+        3: 'Perfection',
+        4: 'Grace',
+        5: 'Justice',
+        6: 'Majesty',
+        7: 'Independence',
+    };
+    const yearInVahid = {
+        1: 'Alif',
+        2: 'Bá’',
+        3: 'Ab',
+        4: 'Dál',
+        5: 'Báb',
+        6: 'Váv',
+        7: 'Abad',
+        8: 'Jád',
+        9: 'Bahá',
+        10: 'Ḥubb',
+        11: 'Bahháj',
+        12: 'Javáb',
+        13: 'Aḥad',
+        14: 'Vahháb',
+        15: 'Vidád',
+        16: 'Badí‘',
+        17: 'Bahí',
+        18: 'Abhá',
+        19: 'Váḥid',
+    };
+    const vahid = 'Váḥid';
+    const kulliShay = 'Kull-i-_Sh_ay’';
+    const BE = 'B.E.';
+    const badiCalendar = 'Badí‘ Calendar';
+    const unicodeCharForZero = '0';
+    const defaultFormat = 'd MM+ y BE';
+
+    var en = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        month: month,
+        monthL: monthL,
+        holyDay: holyDay,
+        weekday: weekday,
+        weekdayAbbr3: weekdayAbbr3,
+        weekdayAbbr2: weekdayAbbr2,
+        weekdayL: weekdayL,
+        yearInVahid: yearInVahid,
+        vahid: vahid,
+        kulliShay: kulliShay,
+        BE: BE,
+        badiCalendar: badiCalendar,
+        unicodeCharForZero: unicodeCharForZero,
+        defaultFormat: defaultFormat
+    });
+
+    /* eslint-disable dot-notation, line-comment-position, camelcase, sort-imports */
+    const badiLocale = { en, default: en };
+    const setDefaultLanguage = (language) => {
+        if (badiLocale[language] === undefined) {
+            // eslint-disable-next-line no-console
+            console.log('Chosen language does not exist. Setting has not been changed.');
+        }
+        else {
+            badiLocale['default'] = badiLocale[language];
+        }
+    };
+    let underlineFormat = 'css';
+    const setUnderlineFormat = (format) => {
+        if (['css', 'u', 'diacritic', 'none'].includes(format)) {
+            underlineFormat = format;
+        }
+        else {
+            // eslint-disable-next-line no-console
+            console.log('Invalid underline format. Choose one of ["css", "u", "diacritic", "none"]. ' +
+                'Setting has not been changed.');
+        }
+    };
+
+    const formatTokens = [
+        ['DDL', 'DD+', 'MML', 'MM+', 'WWL', 'yyv', 'KiS'],
+        ['dd', 'DD', 'mm', 'MM', 'ww', 'WW', 'yv', 'YV', 'vv', 'kk', 'yy', 'BE', 'BC', 'Va'],
+        ['d', 'D', 'm', 'M', 'W', 'v', 'k', 'y']
+    ];
+    // eslint-disable-next-line complexity
+    const formatBadiDate = (badiDate, formatString, language) => {
+        if (!badiDate.isValid) {
+            return 'Not a valid Badí‘ date';
+        }
+        if (typeof language === 'string' && badiLocale[language] === undefined && language.includes('-')) {
+            language = language.split('-')[0];
+        }
+        if (language === undefined || badiLocale[language] === undefined) {
+            language = 'default';
+        }
+        formatString = formatString !== null && formatString !== void 0 ? formatString : formatItemFallback(language, 'defaultFormat');
+        let formattedDate = '';
+        const length = formatString.length;
+        for (let i = 0; i < length; i++) {
+            // Text wrapped in {} is output as-is. A '{' without a matching '}'
+            // results in invalid input
+            if (formatString[i] === '{' && i < length - 1) {
+                for (let j = i + 1; j <= length; j++) {
+                    if (j === length) {
+                        return 'Invalid formatting string.';
+                    }
+                    if (formatString[j] === '}') {
+                        i = j;
+                        break;
+                    }
+                    formattedDate += formatString[j];
+                }
+            }
+            else {
+                const next1 = formatString[i];
+                const next2 = next1 + formatString[i + 1];
+                const next3 = next2 + formatString[i + 2];
+                if (formatTokens[0].includes(next3)) {
+                    formattedDate += getFormatItem(badiDate, next3, language);
+                    i += 2;
+                }
+                else if (formatTokens[1].includes(next2)) {
+                    formattedDate += getFormatItem(badiDate, next2, language);
+                    i += 1;
+                }
+                else if (formatTokens[2].includes(next1)) {
+                    formattedDate += getFormatItem(badiDate, next1, language);
+                }
+                else {
+                    formattedDate += next1;
+                }
+            }
+        }
+        return formattedDate;
+    };
+    // eslint-disable-next-line complexity
+    const getFormatItem = (badiDate, token, language) => {
+        switch (token) {
+            // Single character tokens
+            case 'd':
+                return digitRewrite(badiDate.day, language);
+            case 'D':
+                return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.day), 3);
+            case 'm':
+                return digitRewrite(badiDate.month, language);
+            case 'M':
+                return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.month), 3);
+            case 'W':
+                return formatItemFallback(language, 'weekdayAbbr3', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+            case 'y':
+                return digitRewrite(badiDate.year, language);
+            case 'v':
+                return digitRewrite((Math.floor((badiDate.year - 1) / 19) % 19) + 1, language);
+            case 'k':
+                return digitRewrite(Math.floor((badiDate.year - 1) / 361) + 1, language);
+            // Two character tokens
+            case 'dd':
+                return digitRewrite((`0${String(badiDate.day)}`).slice(-2), language);
+            case 'DD':
+                return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.day));
+            case 'mm':
+                return digitRewrite((`0${String(badiDate.month)}`).slice(-2), language);
+            case 'MM':
+                return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.month));
+            case 'ww':
+                return formatItemFallback(language, 'weekdayAbbr2', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+            case 'WW':
+                return formatItemFallback(language, 'weekday', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+            case 'yy':
+                return digitRewrite((`00${String(badiDate.year)}`).slice(-3), language);
+            case 'yv':
+                return digitRewrite((badiDate.year - 1) % 19 + 1, language);
+            case 'YV':
+                return formatItemFallback(language, 'yearInVahid', (badiDate.year - 1) % 19 + 1);
+            case 'vv':
+                return digitRewrite((`0${String((Math.floor((badiDate.year - 1) / 19) + 2) % 19 - 1)}`).slice(-2), language);
+            case 'kk':
+                return digitRewrite((`0${String(Math.floor((badiDate.year - 1) / 361) + 1)}`).slice(-2), language);
+            case 'Va':
+                return formatItemFallback(language, 'vahid');
+            case 'BE':
+                return formatItemFallback(language, 'BE');
+            case 'BC':
+                return formatItemFallback(language, 'badiCalendar');
+            // Three character tokens
+            case 'DDL':
+                return formatItemFallback(language, 'monthL', badiDate.day);
+            case 'DD+': {
+                const day = postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.day));
+                const dayL = formatItemFallback(language, 'monthL', badiDate.day);
+                if (day === dayL) {
+                    return day;
+                }
+                if (badiLocale[language] === badiLocale.fa) {
+                    return `<span dir="rtl">${day} (${dayL})</span>`;
+                }
+                return `${day} (${dayL})`;
+            }
+            case 'MML':
+                return formatItemFallback(language, 'monthL', badiDate.month);
+            case 'MM+': {
+                const month = postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.month));
+                const monthL = formatItemFallback(language, 'monthL', badiDate.month);
+                if (month === monthL) {
+                    return month;
+                }
+                if (badiLocale[language] === badiLocale.fa) {
+                    return `<span dir="rtl">${month} (${monthL})</span>`;
+                }
+                return `${month} (${monthL})`;
+            }
+            case 'WWL':
+                return formatItemFallback(language, 'weekdayL', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+            case 'yyv':
+                return digitRewrite((`0${String((badiDate.year - 1) % 19 + 1)}`).slice(-2), language);
+            case 'KiS':
+                return postProcessLocaleItem(formatItemFallback(language, 'kulliShay'));
+            // istanbul ignore next
+            default:
+                return '';
+        }
+    };
+    const postProcessLocaleItem = (item, crop) => {
+        if (crop && crop < item.length) {
+            let char = 0;
+            let counter = 0;
+            while (counter < crop) {
+                if (!'_’‘'.includes(item[char])) {
+                    counter++;
+                }
+                char++;
+            }
+            if ('_’‘'.includes(item[char])) {
+                char++;
+            }
+            item = item.slice(0, char);
+            if (item.split('_').length % 2 === 0) {
+                item += '_';
+            }
+        }
+        const stringComponents = item.split('_');
+        for (let i = 1; i < stringComponents.length; i += 2) {
+            stringComponents[i] = underlineString(stringComponents[i]);
+        }
+        return stringComponents.join('');
+    };
+    const underlineString = (str) => {
+        switch (underlineFormat) {
+            case 'css':
+                return `<span style="text-decoration:underline">${str}</span>`;
+            case 'diacritic':
+                return str.split('').map(char => `${char}\u0332`).join('');
+            case 'u':
+                return `<u>${str}</u>`;
+            case 'none':
+                return str;
+            // istanbul ignore next
+            default:
+                throw new TypeError('Unexpected underlineFormat');
+        }
+    };
+    const digitRewrite = (number, language) => {
+        number = String(number);
+        const unicodeOffset = formatItemFallback(language, 'unicodeCharForZero').charCodeAt(0) - '0'.charCodeAt(0);
+        if (unicodeOffset === 0) {
+            return number;
+        }
+        const codePoints = [...number].map(num => num.charCodeAt(0) + unicodeOffset);
+        return String.fromCharCode(...codePoints);
+    };
+    const formatItemFallback = (language, category, index) => {
+        var _a;
+        if (index === undefined) {
+            while (badiLocale[language][category] === undefined) {
+                language = languageFallback(language);
+            }
+            return badiLocale[language][category];
+        }
+        while (((_a = badiLocale[language][category]) === null || _a === void 0 ? void 0 : _a[index]) === undefined) {
+            language = languageFallback(language);
+        }
+        return badiLocale[language][category][index];
+    };
+    const languageFallback = (languageCode) => {
+        if (languageCode.includes('-')) {
+            return languageCode.split('-')[0];
+            // eslint-disable-next-line no-negated-condition
+        }
+        else if (languageCode !== 'default') {
+            return 'default';
+        }
+        return 'en';
+    };
+
+    const badiYears = [
+        'l4da', 'k4ci', 'k5c7', 'l4d6', 'l4ce', 'k4c4', 'k5d4', 'l4cb', 'l4c1', 'k4cj', 'k5c8', 'l4d7', 'l4cf', 'k4c5',
+        'k4d5', 'k5ce', 'l4c2', 'k4d2', 'k4ca', 'k5da', 'l4ch', 'k4c6', 'k4d6', 'k5cf', 'l4c4', 'k4d4', 'k4cc', 'k5c1',
+        'l4cj', 'k4c8', 'k4d8', 'k5cg', 'l4c5', 'k4d5', 'k4ce', 'k5c3', 'l4d2', 'k4ca', 'k4d9', 'k5ci', 'l4c6', 'k4d6',
+        'k4cf', 'k4c4', 'k5d4', 'k4cb', 'k4bj', 'k4cj', 'k5c9', 'k4d8', 'k4cg', 'k4c6', 'k5d6', 'k4cd', 'k4c2', 'k4d2',
+        'k5ca', 'k4d9', 'k4ci', 'k4c7', 'k5d7', 'k4cf', 'k4c4', 'k4d4', 'k5cc', 'k4bj', 'k4cj', 'k4c9', 'k5d9', 'k4cg',
+        'k4c6', 'k4d5', 'k5cd', 'k4c2', 'k4d1', 'k4ca', 'k4da', 'j5cj', 'k4c7', 'k4d7', 'k4cf', 'j5c4', 'k4d3', 'k4cb',
+        'k4c1', 'k5d1', 'l4c9', 'l4d9', 'l4ch', 'k5c6', 'l4d5', 'l4cd', 'l4c2', 'k5d2', 'l4ca', 'l4da', 'l4cj', 'k5c8',
+        'l4d7', 'l4cf', 'l4c4', 'k5d4', 'l4cb', 'l4c1', 'l4d1', 'k5c9', 'l4d8', 'l4cg', 'l4c5', 'k4d5', 'k5ce', 'l4c2',
+        'l4d2', 'k4cb', 'k5db', 'l4ci', 'l4c7', 'k4d7', 'k5cf', 'l4c4', 'l4d4', 'k4cc', 'k5c2', 'l4d1', 'l4c9', 'k4d9',
+        'k5ch', 'l4c5', 'l4d5', 'k4ce', 'k5c3', 'l4d2', 'l4cb', 'k4da', 'k5ci', 'l4c6', 'l4d6', 'k4cf', 'k5c5', 'l4d4',
+        'l4cc', 'k4c1', 'k4d1', 'k5c9', 'l4d8', 'k4cg', 'k4c6', 'k5d6', 'l4ce', 'k4c3', 'k4d3', 'k5cb', 'l4da', 'k4ci',
+        'k4c7', 'k5d7', 'l4cf', 'k4c5', 'k4d5', 'k5cd', 'l4c1', 'k4cj', 'k4c9', 'k5d9', 'l4cg', 'k4c6', 'k4d6', 'k5ce',
+        'l4c3', 'k4d2', 'k4ca', 'k5bj', 'l4ci', 'k4c7', 'k4d7', 'k4cg', 'k5c5', 'k4d4', 'k4cc', 'k4c1', 'k5d1', 'k4c9',
+        'k4d9', 'k4ch', 'k5c7', 'l4d6', 'l4ce', 'l4c3', 'l5d3', 'l4ca', 'l4da', 'l4cj', 'l5c8', 'l4d7', 'l4cg', 'l4c5',
+        'l5d4', 'l4cb', 'l4c1', 'l4d1', 'l5ca', 'l4d9', 'l4ch', 'l4c6', 'l5d6', 'l4cd', 'l4c2', 'l4d2', 'l4cb', 'k5c1',
+        'l4cj', 'l4c8', 'l4d8', 'k5cg', 'l4c4', 'l4d4', 'l4cc', 'k5c2', 'l4d1', 'l4ca', 'l4da', 'k5ci', 'l4c6', 'l4d5',
+        'l4ce', 'k5c3', 'l4d2', 'l4cb', 'l4db', 'k5cj', 'l4c8', 'l4d7', 'l4cf', 'k5c5', 'l4d4', 'l4cc', 'l4c2', 'k5d2',
+        'l4c9', 'l4d9', 'l4ch', 'k4c6', 'k5d6', 'l4ce', 'l4c3', 'k4d3', 'k5cc', 'l4db', 'l4cj', 'k4c8', 'k5d8', 'l4cf',
+        'l4c4', 'k4d5', 'k5cd', 'l4c2', 'l4d2', 'k4ca', 'k5d9', 'l4cg', 'l4c6', 'k4d6', 'k5cf', 'l4c3', 'l4d3', 'k4cb',
+        'k5bj', 'l4ci', 'l4c7', 'k4d7', 'k5cg', 'l4c5', 'l4d5', 'k4cd', 'k4c2', 'k5d2', 'l4c9', 'k4d9', 'k4ch', 'k5c7',
+        'l4d6', 'k4cf', 'k4c4', 'k5d4', 'l4cb', 'l4bj', 'l4cj', 'l5c8', 'm4d7', 'l4cg', 'l4c5', 'l5d5', 'm4cc', 'l4c1',
+        'l4d1', 'l5ca', 'm4d9', 'l4ch', 'l4c7', 'l5d7', 'm4ce', 'l4c3', 'l4d3', 'l5cb', 'm4bi', 'l4ci', 'l4c8', 'l4d8',
+        'l5ch', 'l4c5', 'l4d5', 'l4cd', 'l5c2', 'l4d1', 'l4c9', 'l4da', 'l5ci', 'l4c7', 'l4d7', 'l4cf', 'l5c4', 'l4d2',
+        'l4cb', 'l4bj', 'l5d1', 'l4c8', 'l4d8', 'l4cg', 'l5c5', 'l4d4', 'l4cc', 'l4c2', 'l5d2', 'l4c9', 'l4da', 'l4ci',
+    ];
+
+    class BadiDate {
+        constructor(date) {
+            this._holyDay = undefined;
+            this._valid = true;
+            this._invalidReason = undefined;
+            try {
+                if (this._isDateObject(date)) {
+                    this._gregorianDate = luxon.DateTime.fromObject({ year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate(), zone: 'UTC' });
+                }
+                else if (luxon.DateTime.isDateTime(date)) {
+                    this._gregorianDate = luxon.DateTime.fromObject({ year: date.year, month: date.month, day: date.day, zone: 'UTC' });
+                }
+                else if (this._isYearMonthDay(date) || this._isYearHolyDayNumber(date)) {
+                    this._setFromBadiDate(date);
+                }
+                else {
+                    throw new TypeError('Unrecognized input format');
+                }
+                if (this._year === undefined) {
+                    // We haven't set the Badí' date yet
+                    this._setFromGregorianDate();
+                }
+                this._setHolyDay();
+            }
+            catch (err) {
+                this._setInvalid(err);
+            }
+            Object.freeze(this);
+        }
+        format(formatString, language) {
+            return formatBadiDate(this, formatString, language);
+        }
+        _isDateObject(arg) {
+            return Object.prototype.toString.call(arg) === '[object Date]';
+        }
+        _isYearMonthDay(arg) {
+            return typeof arg.year === 'number' && typeof arg.month === 'number' &&
+                typeof arg.day === 'number';
+        }
+        _isYearHolyDayNumber(arg) {
+            return typeof arg.year === 'number' && arg.month === undefined &&
+                arg.day === undefined && typeof arg.holyDayNumber === 'number';
+        }
+        _notInValidGregorianDateRange(datetime) {
+            const lowerBound = luxon.DateTime.fromObject({ year: 1844, month: 3, day: 21, zone: 'UTC' });
+            const upperBound = luxon.DateTime.fromObject({ year: 2351, month: 3, day: 20, zone: 'UTC' });
+            return datetime < lowerBound || datetime > upperBound;
+        }
+        _setFromGregorianDate() {
+            if (this._notInValidGregorianDateRange(this._gregorianDate)) {
+                throw new RangeError('Input date outside of valid range (1844-03-21 - 2351-03-20)');
+            }
+            const gregorianYear = this._gregorianDate.year;
+            const oldImplementationCutoff = luxon.DateTime.fromObject({ year: 2015, month: 3, day: 21, zone: 'UTC' });
+            if (this._gregorianDate < oldImplementationCutoff) {
+                const { month, day } = this._gregorianDate;
+                if (month < 3 || (month === 3 && day < 21)) {
+                    this._nawRuz = luxon.DateTime.fromObject({ year: gregorianYear - 1, month: 3, day: 21, zone: 'UTC' });
+                    this._year = gregorianYear - 1844;
+                }
+                else {
+                    this._nawRuz = luxon.DateTime.fromObject({ year: gregorianYear, month: 3, day: 21, zone: 'UTC' });
+                    this._year = gregorianYear - 1843;
+                }
+                this._setOldAyyamiHaLength();
+                this._yearTwinBirthdays = [12, 5, 13, 9];
+            }
+            else {
+                this._year = gregorianYear - 1843;
+                this._setBadiYearInfo(true);
+            }
+            this._setBadiMonthAndDay();
+        }
+        /**
+         * Set Badí' month and day from Gregorian date
+         */
+        _setBadiMonthAndDay() {
+            const dayOfBadiYear = this._dayOfYear(this._gregorianDate);
+            if (dayOfBadiYear < 343) {
+                this._month = Math.floor((dayOfBadiYear - 1) / 19 + 1);
+                this._day = (dayOfBadiYear - 1) % 19 + 1;
+            }
+            else if (dayOfBadiYear < 343 + this._ayyamiHaLength) {
+                this._month = 20;
+                this._day = dayOfBadiYear - 342;
+            }
+            else {
+                this._month = 19;
+                this._day = dayOfBadiYear - (342 + this._ayyamiHaLength);
+            }
+        }
+        _setFromBadiDate(date) {
+            this._year = date.year;
+            if (this._year < 1 || this._year > 507) {
+                throw new RangeError('Input date outside of valid range (1 - 507 B.E.)');
+            }
+            else if (this._year < 172) {
+                this._nawRuz = luxon.DateTime.fromObject({ year: 1843 + this._year, month: 3, day: 21, zone: 'UTC' });
+                this._setOldAyyamiHaLength();
+                this._yearTwinBirthdays = [12, 5, 13, 9];
+            }
+            else {
+                this._setBadiYearInfo();
+            }
+            if (this._isYearMonthDay(date)) {
+                this._month = date.month;
+                this._day = date.day;
+                if (this._month === 20 && this._day > this._ayyamiHaLength) {
+                    // If only off by one day, we'll bubble up so that 5th Ayyám-i-Há in a year with only 4 days of
+                    // Ayyám-i-Há can be salvaged
+                    if (this._day - this._ayyamiHaLength === 1) {
+                        this._month = 19;
+                        this._day = 1;
+                    }
+                    else {
+                        throw new TypeError('Input numbers do not designate a valid date');
+                    }
+                }
+                if (this._month < 1 || this._month > 20 || this._day < 1 || this.day > 19) {
+                    throw new TypeError('Input numbers do not designate a valid date');
+                }
+            }
+            else {
+                if (date.holyDayNumber < 1 || date.holyDayNumber > 11) {
+                    throw new TypeError('Input numbers do not designate a valid Holy Day');
+                }
+                this._holyDay = date.holyDayNumber;
+                [this._month, this._day] = this._holyDayMapping()[this._holyDay];
+            }
+            this._gregorianDate = this._nawRuz.plus(luxon.Duration.fromObject({ days: this._dayOfYear([this._year, this._month, this._day]) - 1 }));
+        }
+        _setOldAyyamiHaLength() {
+            if (luxon.DateTime.fromObject({ year: this._nawRuz.year + 1 }).isInLeapYear) {
+                this._ayyamiHaLength = 5;
+            }
+            else {
+                this._ayyamiHaLength = 4;
+            }
+        }
+        _setBadiYearInfo(fromGregorianDate = false) {
+            let yearData = this._extractBadiYearInfo();
+            if (fromGregorianDate && this._gregorianDate < yearData.nawRuz) {
+                this._year -= 1;
+                yearData = this._extractBadiYearInfo();
+            }
+            this._nawRuz = yearData.nawRuz;
+            this._ayyamiHaLength = yearData.ayyamiHaLength;
+            this._yearTwinBirthdays = yearData.twinBirthdays;
+        }
+        _extractBadiYearInfo() {
+            let nawRuz, ayyamiHaLength, twinBirthdays;
+            // Check whether data needs to be unpacked or exists in the verbose version
+            // istanbul ignore else
+            if (badiYears[0] === 'l4da') {
+                const components = badiYears[this._year - 172].split('');
+                nawRuz = luxon.DateTime.fromObject({ year: this._year - 172 + 2015, month: 3, day: parseInt(components[0], 36), zone: 'UTC' });
+                ayyamiHaLength = parseInt(components[1], 36);
+                const TB1 = [parseInt(components[2], 36), parseInt(components[3], 36)];
+                const TB2 = TB1[1] < 19 ? [TB1[0], TB1[1] + 1] : [TB1[0] + 1, 1];
+                twinBirthdays = [TB1[0], TB1[1], TB2[0], TB2[1]];
+            }
+            else {
+                ({ nawRuz, ayyamiHaLength, twinBirthdays } = badiYears[this._year]);
+                nawRuz = luxon.DateTime.fromISO(nawRuz, { zone: 'UTC' });
+            }
+            return { nawRuz, ayyamiHaLength, twinBirthdays };
+        }
+        _dayOfYear(date) {
+            // Naw-Rúz is day 1
+            if (Array.isArray(date)) {
+                // We have a Badí' date
+                if (date[1] < 19) {
+                    return 19 * (date[1] - 1) + date[2];
+                }
+                else if (date[1] === 20) {
+                    return 342 + date[2];
+                }
+                // date[1] === 19
+                return 342 + this._ayyamiHaLength + date[2];
+            }
+            return date.diff(this._nawRuz).as('days') + 1;
+        }
+        _setInvalid(invalidReason) {
+            this._gregorianDate = luxon.DateTime.invalid('Not a valid Badí‘ date');
+            this._year = NaN;
+            this._month = NaN;
+            this._day = NaN;
+            this._ayyamiHaLength = NaN;
+            this._nawRuz = luxon.DateTime.invalid('Not a valid Badí‘ date');
+            this._valid = false;
+            this._invalidReason = invalidReason;
+        }
+        _setHolyDay() {
+            const mapping = this._holyDayMapping();
+            this._holyDay = parseInt(Object.keys(mapping)
+                .find(key => mapping[key][0] === this._month && mapping[key][1] === this._day), 10);
+        }
+        _holyDayMapping() {
+            return {
+                [1 /* NawRuz */]: [1, 1],
+                [2 /* FirstRidvan */]: [2, 13],
+                [3 /* NinthRidvan */]: [3, 2],
+                [4 /* TwelfthRidvan */]: [3, 5],
+                [5 /* DeclarationOfTheBab */]: [4, this._year < 172 ? 7 : 8],
+                [6 /* AscensionOfBahaullah */]: [4, 13],
+                [7 /* MartyrdomOfTheBab */]: [6, this._year < 172 ? 16 : 17],
+                [8 /* BirthOfTheBab */]: [this._yearTwinBirthdays[0], this._yearTwinBirthdays[1]],
+                [9 /* BirthOfBahaullah */]: [this._yearTwinBirthdays[2], this._yearTwinBirthdays[3]],
+                [10 /* DayOfTheCovenant */]: [14, 4],
+                [11 /* AscensionOfAbdulBaha */]: [14, 6],
+            };
+        }
+        _leapYearsBefore() {
+            let leapYearsBefore = Math.floor(Math.min(this.year - 1, 171) / 4);
+            if (this.year > 172) {
+                // istanbul ignore else
+                if (badiYears[0] === 'l4da') {
+                    leapYearsBefore += badiYears.slice(0, this.year - 172).filter(entry => entry[1] === '5').length;
+                }
+                else {
+                    leapYearsBefore += Object.entries(badiYears)
+                        .filter(([year, data]) => parseInt(year, 10) < this.year &&
+                        data.ayyamiHaLength === 5).length;
+                }
+            }
+            return leapYearsBefore;
+        }
+        holyDay(language = undefined) {
+            if (!this._holyDay) {
+                return '';
+            }
+            if (language === undefined || badiLocale[language] === undefined) {
+                language = 'default';
+            }
+            return formatItemFallback(language, 'holyDay', this._holyDay);
+        }
+        valueOf() {
+            return this._dayOfYear([this.year, this.month, this.day]) + this._leapYearsBefore() + (this.year - 1) * 365;
+        }
+        equals(other) {
+            return this.isValid && other.isValid && this.valueOf() === other.valueOf();
+        }
+        get isValid() {
+            return this._valid;
+        }
+        get invalidReason() {
+            return this._invalidReason;
+        }
+        get day() {
+            return this._day;
+        }
+        get month() {
+            return this._month;
+        }
+        get year() {
+            return this._year;
+        }
+        // number of the Badí' weekday between 1 (Jalál ~> Saturday) and 7 (Istiqlál ~> Friday).
+        get weekday() {
+            return (this._gregorianDate.weekday + 1) % 7 + 1;
+        }
+        get yearInVahid() {
+            return (this._year - 1) % 19 + 1;
+        }
+        get vahid() {
+            return (Math.floor((this._year - 1) / 19) % 19) + 1;
+        }
+        get kullIShay() {
+            return Math.floor((this._year - 1) / 361) + 1;
+        }
+        // Gregorian date on whose sunset the Badí' date ends.
+        get gregorianDate() {
+            return this._gregorianDate;
+        }
+        get ayyamiHaLength() {
+            return this._ayyamiHaLength;
+        }
+        get holyDayNumber() {
+            return this._holyDay ? this._holyDay : undefined;
+        }
+        get workSuspended() {
+            return this._holyDay ? this.holyDayNumber < 10 : undefined;
+        }
+        get nextMonth() {
+            let { year, month } = this;
+            switch (month) {
+                case 18:
+                    month = 20;
+                    break;
+                case 19:
+                    month = 1;
+                    year += 1;
+                    break;
+                case 20:
+                    month = 19;
+                    break;
+                default:
+                    month += 1;
+            }
+            return new BadiDate({ year, month, day: 1 });
+        }
+        get previousMonth() {
+            let { year, month } = this;
+            switch (month) {
+                case 1:
+                    month = 19;
+                    year -= 1;
+                    break;
+                case 19:
+                    month = 20;
+                    break;
+                case 20:
+                    month = 18;
+                    break;
+                default:
+                    month -= 1;
+            }
+            return new BadiDate({ year, month, day: 1 });
+        }
+        get nextDay() {
+            if (this._day === 19 || (this._month === 20 && this._day === this._ayyamiHaLength)) {
+                return this.nextMonth;
+            }
+            return new BadiDate({ year: this._year, month: this._month, day: this._day + 1 });
+        }
+        get previousDay() {
+            if (this._day === 1) {
+                const { previousMonth } = this;
+                let day = 19;
+                if (this._month === 19) {
+                    day = this._ayyamiHaLength;
+                }
+                return new BadiDate({
+                    year: previousMonth.year,
+                    month: previousMonth.month,
+                    day,
+                });
+            }
+            return new BadiDate({ year: this._year, month: this._month, day: this._day - 1 });
+        }
+    }
+    const badiDateSettings = (settings) => {
+        if (settings.defaultLanguage) {
+            setDefaultLanguage(settings.defaultLanguage);
+        }
+        if (settings.underlineFormat) {
+            setUnderlineFormat(settings.underlineFormat);
+        }
+    };
+
+    exports.BadiDate = BadiDate;
+    exports.badiDateSettings = badiDateSettings;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+})));

Plik diff jest za duży
+ 5 - 0
dist/badiDate.min.js


Plik diff jest za duży
+ 0 - 0
dist/badiDate.min.js.map


Plik diff jest za duży
+ 5 - 0
dist/badiDate.min.mjs


Plik diff jest za duży
+ 0 - 0
dist/badiDate.min.mjs.map


+ 764 - 0
dist/badiDate.mjs

@@ -0,0 +1,764 @@
+/**
+ * @license BadiDate v3.0.2
+ * (c) 2018 Jan Greis
+ * licensed under MIT
+ */
+
+import { DateTime, Duration } from 'luxon';
+
+const month = {
+    1: 'Bahá',
+    2: 'Jalál',
+    3: 'Jamál',
+    4: '‘Aẓamat',
+    5: 'Núr',
+    6: 'Raḥmat',
+    7: 'Kalimát',
+    8: 'Kamál',
+    9: 'Asmá’',
+    10: '‘Izzat',
+    11: 'Ma_sh_íyyat',
+    12: '‘Ilm',
+    13: 'Qudrat',
+    14: 'Qawl',
+    15: 'Masá’il',
+    16: '_Sh_araf',
+    17: 'Sulṭán',
+    18: 'Mulk',
+    19: '‘Alá’',
+    20: 'Ayyám-i-Há',
+};
+const monthL = {
+    1: 'Splendour',
+    2: 'Glory',
+    3: 'Beauty',
+    4: 'Grandeur',
+    5: 'Light',
+    6: 'Mercy',
+    7: 'Words',
+    8: 'Perfection',
+    9: 'Names',
+    10: 'Might',
+    11: 'Will',
+    12: 'Knowledge',
+    13: 'Power',
+    14: 'Speech',
+    15: 'Questions',
+    16: 'Honour',
+    17: 'Sovereignty',
+    18: 'Dominion',
+    19: 'Loftiness',
+    20: 'Ayyám-i-Há',
+};
+const holyDay = {
+    1: 'Naw-Rúz',
+    2: 'First day of Riḍván',
+    3: 'Ninth day of Riḍván',
+    4: 'Twelfth day of Riḍván',
+    5: 'Declaration of the Báb',
+    6: 'Ascension of Bahá’u’lláh',
+    7: 'Martyrdom of the Báb',
+    8: 'Birth of the Báb',
+    9: 'Birth of Bahá’u’lláh',
+    10: 'Day of the Covenant',
+    11: 'Ascension of ‘Abdu’l-Bahá',
+};
+// CAREFUL: Numbering corresponds to Badí' week, i.e. 1 is Jalál (-> Saturday)
+const weekday = {
+    1: 'Jalál',
+    2: 'Jamál',
+    3: 'Kamál',
+    4: 'Fiḍál',
+    5: '‘Idál',
+    6: 'Istijlál',
+    7: 'Istiqlál',
+};
+const weekdayAbbr3 = {
+    1: 'Jal',
+    2: 'Jam',
+    3: 'Kam',
+    4: 'Fiḍ',
+    5: '‘Idá',
+    6: 'Isj',
+    7: 'Isq',
+};
+const weekdayAbbr2 = {
+    1: 'Jl',
+    2: 'Jm',
+    3: 'Ka',
+    4: 'Fi',
+    5: '‘Id',
+    6: 'Ij',
+    7: 'Iq',
+};
+const weekdayL = {
+    1: 'Glory',
+    2: 'Beauty',
+    3: 'Perfection',
+    4: 'Grace',
+    5: 'Justice',
+    6: 'Majesty',
+    7: 'Independence',
+};
+const yearInVahid = {
+    1: 'Alif',
+    2: 'Bá’',
+    3: 'Ab',
+    4: 'Dál',
+    5: 'Báb',
+    6: 'Váv',
+    7: 'Abad',
+    8: 'Jád',
+    9: 'Bahá',
+    10: 'Ḥubb',
+    11: 'Bahháj',
+    12: 'Javáb',
+    13: 'Aḥad',
+    14: 'Vahháb',
+    15: 'Vidád',
+    16: 'Badí‘',
+    17: 'Bahí',
+    18: 'Abhá',
+    19: 'Váḥid',
+};
+const vahid = 'Váḥid';
+const kulliShay = 'Kull-i-_Sh_ay’';
+const BE = 'B.E.';
+const badiCalendar = 'Badí‘ Calendar';
+const unicodeCharForZero = '0';
+const defaultFormat = 'd MM+ y BE';
+
+var en = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    month: month,
+    monthL: monthL,
+    holyDay: holyDay,
+    weekday: weekday,
+    weekdayAbbr3: weekdayAbbr3,
+    weekdayAbbr2: weekdayAbbr2,
+    weekdayL: weekdayL,
+    yearInVahid: yearInVahid,
+    vahid: vahid,
+    kulliShay: kulliShay,
+    BE: BE,
+    badiCalendar: badiCalendar,
+    unicodeCharForZero: unicodeCharForZero,
+    defaultFormat: defaultFormat
+});
+
+/* eslint-disable dot-notation, line-comment-position, camelcase, sort-imports */
+const badiLocale = { en, default: en };
+const setDefaultLanguage = (language) => {
+    if (badiLocale[language] === undefined) {
+        // eslint-disable-next-line no-console
+        console.log('Chosen language does not exist. Setting has not been changed.');
+    }
+    else {
+        badiLocale['default'] = badiLocale[language];
+    }
+};
+let underlineFormat = 'css';
+const setUnderlineFormat = (format) => {
+    if (['css', 'u', 'diacritic', 'none'].includes(format)) {
+        underlineFormat = format;
+    }
+    else {
+        // eslint-disable-next-line no-console
+        console.log('Invalid underline format. Choose one of ["css", "u", "diacritic", "none"]. ' +
+            'Setting has not been changed.');
+    }
+};
+
+const formatTokens = [
+    ['DDL', 'DD+', 'MML', 'MM+', 'WWL', 'yyv', 'KiS'],
+    ['dd', 'DD', 'mm', 'MM', 'ww', 'WW', 'yv', 'YV', 'vv', 'kk', 'yy', 'BE', 'BC', 'Va'],
+    ['d', 'D', 'm', 'M', 'W', 'v', 'k', 'y']
+];
+// eslint-disable-next-line complexity
+const formatBadiDate = (badiDate, formatString, language) => {
+    if (!badiDate.isValid) {
+        return 'Not a valid Badí‘ date';
+    }
+    if (typeof language === 'string' && badiLocale[language] === undefined && language.includes('-')) {
+        language = language.split('-')[0];
+    }
+    if (language === undefined || badiLocale[language] === undefined) {
+        language = 'default';
+    }
+    formatString = formatString !== null && formatString !== void 0 ? formatString : formatItemFallback(language, 'defaultFormat');
+    let formattedDate = '';
+    const length = formatString.length;
+    for (let i = 0; i < length; i++) {
+        // Text wrapped in {} is output as-is. A '{' without a matching '}'
+        // results in invalid input
+        if (formatString[i] === '{' && i < length - 1) {
+            for (let j = i + 1; j <= length; j++) {
+                if (j === length) {
+                    return 'Invalid formatting string.';
+                }
+                if (formatString[j] === '}') {
+                    i = j;
+                    break;
+                }
+                formattedDate += formatString[j];
+            }
+        }
+        else {
+            const next1 = formatString[i];
+            const next2 = next1 + formatString[i + 1];
+            const next3 = next2 + formatString[i + 2];
+            if (formatTokens[0].includes(next3)) {
+                formattedDate += getFormatItem(badiDate, next3, language);
+                i += 2;
+            }
+            else if (formatTokens[1].includes(next2)) {
+                formattedDate += getFormatItem(badiDate, next2, language);
+                i += 1;
+            }
+            else if (formatTokens[2].includes(next1)) {
+                formattedDate += getFormatItem(badiDate, next1, language);
+            }
+            else {
+                formattedDate += next1;
+            }
+        }
+    }
+    return formattedDate;
+};
+// eslint-disable-next-line complexity
+const getFormatItem = (badiDate, token, language) => {
+    switch (token) {
+        // Single character tokens
+        case 'd':
+            return digitRewrite(badiDate.day, language);
+        case 'D':
+            return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.day), 3);
+        case 'm':
+            return digitRewrite(badiDate.month, language);
+        case 'M':
+            return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.month), 3);
+        case 'W':
+            return formatItemFallback(language, 'weekdayAbbr3', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+        case 'y':
+            return digitRewrite(badiDate.year, language);
+        case 'v':
+            return digitRewrite((Math.floor((badiDate.year - 1) / 19) % 19) + 1, language);
+        case 'k':
+            return digitRewrite(Math.floor((badiDate.year - 1) / 361) + 1, language);
+        // Two character tokens
+        case 'dd':
+            return digitRewrite((`0${String(badiDate.day)}`).slice(-2), language);
+        case 'DD':
+            return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.day));
+        case 'mm':
+            return digitRewrite((`0${String(badiDate.month)}`).slice(-2), language);
+        case 'MM':
+            return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.month));
+        case 'ww':
+            return formatItemFallback(language, 'weekdayAbbr2', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+        case 'WW':
+            return formatItemFallback(language, 'weekday', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+        case 'yy':
+            return digitRewrite((`00${String(badiDate.year)}`).slice(-3), language);
+        case 'yv':
+            return digitRewrite((badiDate.year - 1) % 19 + 1, language);
+        case 'YV':
+            return formatItemFallback(language, 'yearInVahid', (badiDate.year - 1) % 19 + 1);
+        case 'vv':
+            return digitRewrite((`0${String((Math.floor((badiDate.year - 1) / 19) + 2) % 19 - 1)}`).slice(-2), language);
+        case 'kk':
+            return digitRewrite((`0${String(Math.floor((badiDate.year - 1) / 361) + 1)}`).slice(-2), language);
+        case 'Va':
+            return formatItemFallback(language, 'vahid');
+        case 'BE':
+            return formatItemFallback(language, 'BE');
+        case 'BC':
+            return formatItemFallback(language, 'badiCalendar');
+        // Three character tokens
+        case 'DDL':
+            return formatItemFallback(language, 'monthL', badiDate.day);
+        case 'DD+': {
+            const day = postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.day));
+            const dayL = formatItemFallback(language, 'monthL', badiDate.day);
+            if (day === dayL) {
+                return day;
+            }
+            if (badiLocale[language] === badiLocale.fa) {
+                return `<span dir="rtl">${day} (${dayL})</span>`;
+            }
+            return `${day} (${dayL})`;
+        }
+        case 'MML':
+            return formatItemFallback(language, 'monthL', badiDate.month);
+        case 'MM+': {
+            const month = postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.month));
+            const monthL = formatItemFallback(language, 'monthL', badiDate.month);
+            if (month === monthL) {
+                return month;
+            }
+            if (badiLocale[language] === badiLocale.fa) {
+                return `<span dir="rtl">${month} (${monthL})</span>`;
+            }
+            return `${month} (${monthL})`;
+        }
+        case 'WWL':
+            return formatItemFallback(language, 'weekdayL', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+        case 'yyv':
+            return digitRewrite((`0${String((badiDate.year - 1) % 19 + 1)}`).slice(-2), language);
+        case 'KiS':
+            return postProcessLocaleItem(formatItemFallback(language, 'kulliShay'));
+        // istanbul ignore next
+        default:
+            return '';
+    }
+};
+const postProcessLocaleItem = (item, crop) => {
+    if (crop && crop < item.length) {
+        let char = 0;
+        let counter = 0;
+        while (counter < crop) {
+            if (!'_’‘'.includes(item[char])) {
+                counter++;
+            }
+            char++;
+        }
+        if ('_’‘'.includes(item[char])) {
+            char++;
+        }
+        item = item.slice(0, char);
+        if (item.split('_').length % 2 === 0) {
+            item += '_';
+        }
+    }
+    const stringComponents = item.split('_');
+    for (let i = 1; i < stringComponents.length; i += 2) {
+        stringComponents[i] = underlineString(stringComponents[i]);
+    }
+    return stringComponents.join('');
+};
+const underlineString = (str) => {
+    switch (underlineFormat) {
+        case 'css':
+            return `<span style="text-decoration:underline">${str}</span>`;
+        case 'diacritic':
+            return str.split('').map(char => `${char}\u0332`).join('');
+        case 'u':
+            return `<u>${str}</u>`;
+        case 'none':
+            return str;
+        // istanbul ignore next
+        default:
+            throw new TypeError('Unexpected underlineFormat');
+    }
+};
+const digitRewrite = (number, language) => {
+    number = String(number);
+    const unicodeOffset = formatItemFallback(language, 'unicodeCharForZero').charCodeAt(0) - '0'.charCodeAt(0);
+    if (unicodeOffset === 0) {
+        return number;
+    }
+    const codePoints = [...number].map(num => num.charCodeAt(0) + unicodeOffset);
+    return String.fromCharCode(...codePoints);
+};
+const formatItemFallback = (language, category, index) => {
+    var _a;
+    if (index === undefined) {
+        while (badiLocale[language][category] === undefined) {
+            language = languageFallback(language);
+        }
+        return badiLocale[language][category];
+    }
+    while (((_a = badiLocale[language][category]) === null || _a === void 0 ? void 0 : _a[index]) === undefined) {
+        language = languageFallback(language);
+    }
+    return badiLocale[language][category][index];
+};
+const languageFallback = (languageCode) => {
+    if (languageCode.includes('-')) {
+        return languageCode.split('-')[0];
+        // eslint-disable-next-line no-negated-condition
+    }
+    else if (languageCode !== 'default') {
+        return 'default';
+    }
+    return 'en';
+};
+
+const badiYears = [
+    'l4da', 'k4ci', 'k5c7', 'l4d6', 'l4ce', 'k4c4', 'k5d4', 'l4cb', 'l4c1', 'k4cj', 'k5c8', 'l4d7', 'l4cf', 'k4c5',
+    'k4d5', 'k5ce', 'l4c2', 'k4d2', 'k4ca', 'k5da', 'l4ch', 'k4c6', 'k4d6', 'k5cf', 'l4c4', 'k4d4', 'k4cc', 'k5c1',
+    'l4cj', 'k4c8', 'k4d8', 'k5cg', 'l4c5', 'k4d5', 'k4ce', 'k5c3', 'l4d2', 'k4ca', 'k4d9', 'k5ci', 'l4c6', 'k4d6',
+    'k4cf', 'k4c4', 'k5d4', 'k4cb', 'k4bj', 'k4cj', 'k5c9', 'k4d8', 'k4cg', 'k4c6', 'k5d6', 'k4cd', 'k4c2', 'k4d2',
+    'k5ca', 'k4d9', 'k4ci', 'k4c7', 'k5d7', 'k4cf', 'k4c4', 'k4d4', 'k5cc', 'k4bj', 'k4cj', 'k4c9', 'k5d9', 'k4cg',
+    'k4c6', 'k4d5', 'k5cd', 'k4c2', 'k4d1', 'k4ca', 'k4da', 'j5cj', 'k4c7', 'k4d7', 'k4cf', 'j5c4', 'k4d3', 'k4cb',
+    'k4c1', 'k5d1', 'l4c9', 'l4d9', 'l4ch', 'k5c6', 'l4d5', 'l4cd', 'l4c2', 'k5d2', 'l4ca', 'l4da', 'l4cj', 'k5c8',
+    'l4d7', 'l4cf', 'l4c4', 'k5d4', 'l4cb', 'l4c1', 'l4d1', 'k5c9', 'l4d8', 'l4cg', 'l4c5', 'k4d5', 'k5ce', 'l4c2',
+    'l4d2', 'k4cb', 'k5db', 'l4ci', 'l4c7', 'k4d7', 'k5cf', 'l4c4', 'l4d4', 'k4cc', 'k5c2', 'l4d1', 'l4c9', 'k4d9',
+    'k5ch', 'l4c5', 'l4d5', 'k4ce', 'k5c3', 'l4d2', 'l4cb', 'k4da', 'k5ci', 'l4c6', 'l4d6', 'k4cf', 'k5c5', 'l4d4',
+    'l4cc', 'k4c1', 'k4d1', 'k5c9', 'l4d8', 'k4cg', 'k4c6', 'k5d6', 'l4ce', 'k4c3', 'k4d3', 'k5cb', 'l4da', 'k4ci',
+    'k4c7', 'k5d7', 'l4cf', 'k4c5', 'k4d5', 'k5cd', 'l4c1', 'k4cj', 'k4c9', 'k5d9', 'l4cg', 'k4c6', 'k4d6', 'k5ce',
+    'l4c3', 'k4d2', 'k4ca', 'k5bj', 'l4ci', 'k4c7', 'k4d7', 'k4cg', 'k5c5', 'k4d4', 'k4cc', 'k4c1', 'k5d1', 'k4c9',
+    'k4d9', 'k4ch', 'k5c7', 'l4d6', 'l4ce', 'l4c3', 'l5d3', 'l4ca', 'l4da', 'l4cj', 'l5c8', 'l4d7', 'l4cg', 'l4c5',
+    'l5d4', 'l4cb', 'l4c1', 'l4d1', 'l5ca', 'l4d9', 'l4ch', 'l4c6', 'l5d6', 'l4cd', 'l4c2', 'l4d2', 'l4cb', 'k5c1',
+    'l4cj', 'l4c8', 'l4d8', 'k5cg', 'l4c4', 'l4d4', 'l4cc', 'k5c2', 'l4d1', 'l4ca', 'l4da', 'k5ci', 'l4c6', 'l4d5',
+    'l4ce', 'k5c3', 'l4d2', 'l4cb', 'l4db', 'k5cj', 'l4c8', 'l4d7', 'l4cf', 'k5c5', 'l4d4', 'l4cc', 'l4c2', 'k5d2',
+    'l4c9', 'l4d9', 'l4ch', 'k4c6', 'k5d6', 'l4ce', 'l4c3', 'k4d3', 'k5cc', 'l4db', 'l4cj', 'k4c8', 'k5d8', 'l4cf',
+    'l4c4', 'k4d5', 'k5cd', 'l4c2', 'l4d2', 'k4ca', 'k5d9', 'l4cg', 'l4c6', 'k4d6', 'k5cf', 'l4c3', 'l4d3', 'k4cb',
+    'k5bj', 'l4ci', 'l4c7', 'k4d7', 'k5cg', 'l4c5', 'l4d5', 'k4cd', 'k4c2', 'k5d2', 'l4c9', 'k4d9', 'k4ch', 'k5c7',
+    'l4d6', 'k4cf', 'k4c4', 'k5d4', 'l4cb', 'l4bj', 'l4cj', 'l5c8', 'm4d7', 'l4cg', 'l4c5', 'l5d5', 'm4cc', 'l4c1',
+    'l4d1', 'l5ca', 'm4d9', 'l4ch', 'l4c7', 'l5d7', 'm4ce', 'l4c3', 'l4d3', 'l5cb', 'm4bi', 'l4ci', 'l4c8', 'l4d8',
+    'l5ch', 'l4c5', 'l4d5', 'l4cd', 'l5c2', 'l4d1', 'l4c9', 'l4da', 'l5ci', 'l4c7', 'l4d7', 'l4cf', 'l5c4', 'l4d2',
+    'l4cb', 'l4bj', 'l5d1', 'l4c8', 'l4d8', 'l4cg', 'l5c5', 'l4d4', 'l4cc', 'l4c2', 'l5d2', 'l4c9', 'l4da', 'l4ci',
+];
+
+class BadiDate {
+    constructor(date) {
+        this._holyDay = undefined;
+        this._valid = true;
+        this._invalidReason = undefined;
+        try {
+            if (this._isDateObject(date)) {
+                this._gregorianDate = DateTime.fromObject({ year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate(), zone: 'UTC' });
+            }
+            else if (DateTime.isDateTime(date)) {
+                this._gregorianDate = DateTime.fromObject({ year: date.year, month: date.month, day: date.day, zone: 'UTC' });
+            }
+            else if (this._isYearMonthDay(date) || this._isYearHolyDayNumber(date)) {
+                this._setFromBadiDate(date);
+            }
+            else {
+                throw new TypeError('Unrecognized input format');
+            }
+            if (this._year === undefined) {
+                // We haven't set the Badí' date yet
+                this._setFromGregorianDate();
+            }
+            this._setHolyDay();
+        }
+        catch (err) {
+            this._setInvalid(err);
+        }
+        Object.freeze(this);
+    }
+    format(formatString, language) {
+        return formatBadiDate(this, formatString, language);
+    }
+    _isDateObject(arg) {
+        return Object.prototype.toString.call(arg) === '[object Date]';
+    }
+    _isYearMonthDay(arg) {
+        return typeof arg.year === 'number' && typeof arg.month === 'number' &&
+            typeof arg.day === 'number';
+    }
+    _isYearHolyDayNumber(arg) {
+        return typeof arg.year === 'number' && arg.month === undefined &&
+            arg.day === undefined && typeof arg.holyDayNumber === 'number';
+    }
+    _notInValidGregorianDateRange(datetime) {
+        const lowerBound = DateTime.fromObject({ year: 1844, month: 3, day: 21, zone: 'UTC' });
+        const upperBound = DateTime.fromObject({ year: 2351, month: 3, day: 20, zone: 'UTC' });
+        return datetime < lowerBound || datetime > upperBound;
+    }
+    _setFromGregorianDate() {
+        if (this._notInValidGregorianDateRange(this._gregorianDate)) {
+            throw new RangeError('Input date outside of valid range (1844-03-21 - 2351-03-20)');
+        }
+        const gregorianYear = this._gregorianDate.year;
+        const oldImplementationCutoff = DateTime.fromObject({ year: 2015, month: 3, day: 21, zone: 'UTC' });
+        if (this._gregorianDate < oldImplementationCutoff) {
+            const { month, day } = this._gregorianDate;
+            if (month < 3 || (month === 3 && day < 21)) {
+                this._nawRuz = DateTime.fromObject({ year: gregorianYear - 1, month: 3, day: 21, zone: 'UTC' });
+                this._year = gregorianYear - 1844;
+            }
+            else {
+                this._nawRuz = DateTime.fromObject({ year: gregorianYear, month: 3, day: 21, zone: 'UTC' });
+                this._year = gregorianYear - 1843;
+            }
+            this._setOldAyyamiHaLength();
+            this._yearTwinBirthdays = [12, 5, 13, 9];
+        }
+        else {
+            this._year = gregorianYear - 1843;
+            this._setBadiYearInfo(true);
+        }
+        this._setBadiMonthAndDay();
+    }
+    /**
+     * Set Badí' month and day from Gregorian date
+     */
+    _setBadiMonthAndDay() {
+        const dayOfBadiYear = this._dayOfYear(this._gregorianDate);
+        if (dayOfBadiYear < 343) {
+            this._month = Math.floor((dayOfBadiYear - 1) / 19 + 1);
+            this._day = (dayOfBadiYear - 1) % 19 + 1;
+        }
+        else if (dayOfBadiYear < 343 + this._ayyamiHaLength) {
+            this._month = 20;
+            this._day = dayOfBadiYear - 342;
+        }
+        else {
+            this._month = 19;
+            this._day = dayOfBadiYear - (342 + this._ayyamiHaLength);
+        }
+    }
+    _setFromBadiDate(date) {
+        this._year = date.year;
+        if (this._year < 1 || this._year > 507) {
+            throw new RangeError('Input date outside of valid range (1 - 507 B.E.)');
+        }
+        else if (this._year < 172) {
+            this._nawRuz = DateTime.fromObject({ year: 1843 + this._year, month: 3, day: 21, zone: 'UTC' });
+            this._setOldAyyamiHaLength();
+            this._yearTwinBirthdays = [12, 5, 13, 9];
+        }
+        else {
+            this._setBadiYearInfo();
+        }
+        if (this._isYearMonthDay(date)) {
+            this._month = date.month;
+            this._day = date.day;
+            if (this._month === 20 && this._day > this._ayyamiHaLength) {
+                // If only off by one day, we'll bubble up so that 5th Ayyám-i-Há in a year with only 4 days of
+                // Ayyám-i-Há can be salvaged
+                if (this._day - this._ayyamiHaLength === 1) {
+                    this._month = 19;
+                    this._day = 1;
+                }
+                else {
+                    throw new TypeError('Input numbers do not designate a valid date');
+                }
+            }
+            if (this._month < 1 || this._month > 20 || this._day < 1 || this.day > 19) {
+                throw new TypeError('Input numbers do not designate a valid date');
+            }
+        }
+        else {
+            if (date.holyDayNumber < 1 || date.holyDayNumber > 11) {
+                throw new TypeError('Input numbers do not designate a valid Holy Day');
+            }
+            this._holyDay = date.holyDayNumber;
+            [this._month, this._day] = this._holyDayMapping()[this._holyDay];
+        }
+        this._gregorianDate = this._nawRuz.plus(Duration.fromObject({ days: this._dayOfYear([this._year, this._month, this._day]) - 1 }));
+    }
+    _setOldAyyamiHaLength() {
+        if (DateTime.fromObject({ year: this._nawRuz.year + 1 }).isInLeapYear) {
+            this._ayyamiHaLength = 5;
+        }
+        else {
+            this._ayyamiHaLength = 4;
+        }
+    }
+    _setBadiYearInfo(fromGregorianDate = false) {
+        let yearData = this._extractBadiYearInfo();
+        if (fromGregorianDate && this._gregorianDate < yearData.nawRuz) {
+            this._year -= 1;
+            yearData = this._extractBadiYearInfo();
+        }
+        this._nawRuz = yearData.nawRuz;
+        this._ayyamiHaLength = yearData.ayyamiHaLength;
+        this._yearTwinBirthdays = yearData.twinBirthdays;
+    }
+    _extractBadiYearInfo() {
+        let nawRuz, ayyamiHaLength, twinBirthdays;
+        // Check whether data needs to be unpacked or exists in the verbose version
+        // istanbul ignore else
+        if (badiYears[0] === 'l4da') {
+            const components = badiYears[this._year - 172].split('');
+            nawRuz = DateTime.fromObject({ year: this._year - 172 + 2015, month: 3, day: parseInt(components[0], 36), zone: 'UTC' });
+            ayyamiHaLength = parseInt(components[1], 36);
+            const TB1 = [parseInt(components[2], 36), parseInt(components[3], 36)];
+            const TB2 = TB1[1] < 19 ? [TB1[0], TB1[1] + 1] : [TB1[0] + 1, 1];
+            twinBirthdays = [TB1[0], TB1[1], TB2[0], TB2[1]];
+        }
+        else {
+            ({ nawRuz, ayyamiHaLength, twinBirthdays } = badiYears[this._year]);
+            nawRuz = DateTime.fromISO(nawRuz, { zone: 'UTC' });
+        }
+        return { nawRuz, ayyamiHaLength, twinBirthdays };
+    }
+    _dayOfYear(date) {
+        // Naw-Rúz is day 1
+        if (Array.isArray(date)) {
+            // We have a Badí' date
+            if (date[1] < 19) {
+                return 19 * (date[1] - 1) + date[2];
+            }
+            else if (date[1] === 20) {
+                return 342 + date[2];
+            }
+            // date[1] === 19
+            return 342 + this._ayyamiHaLength + date[2];
+        }
+        return date.diff(this._nawRuz).as('days') + 1;
+    }
+    _setInvalid(invalidReason) {
+        this._gregorianDate = DateTime.invalid('Not a valid Badí‘ date');
+        this._year = NaN;
+        this._month = NaN;
+        this._day = NaN;
+        this._ayyamiHaLength = NaN;
+        this._nawRuz = DateTime.invalid('Not a valid Badí‘ date');
+        this._valid = false;
+        this._invalidReason = invalidReason;
+    }
+    _setHolyDay() {
+        const mapping = this._holyDayMapping();
+        this._holyDay = parseInt(Object.keys(mapping)
+            .find(key => mapping[key][0] === this._month && mapping[key][1] === this._day), 10);
+    }
+    _holyDayMapping() {
+        return {
+            [1 /* NawRuz */]: [1, 1],
+            [2 /* FirstRidvan */]: [2, 13],
+            [3 /* NinthRidvan */]: [3, 2],
+            [4 /* TwelfthRidvan */]: [3, 5],
+            [5 /* DeclarationOfTheBab */]: [4, this._year < 172 ? 7 : 8],
+            [6 /* AscensionOfBahaullah */]: [4, 13],
+            [7 /* MartyrdomOfTheBab */]: [6, this._year < 172 ? 16 : 17],
+            [8 /* BirthOfTheBab */]: [this._yearTwinBirthdays[0], this._yearTwinBirthdays[1]],
+            [9 /* BirthOfBahaullah */]: [this._yearTwinBirthdays[2], this._yearTwinBirthdays[3]],
+            [10 /* DayOfTheCovenant */]: [14, 4],
+            [11 /* AscensionOfAbdulBaha */]: [14, 6],
+        };
+    }
+    _leapYearsBefore() {
+        let leapYearsBefore = Math.floor(Math.min(this.year - 1, 171) / 4);
+        if (this.year > 172) {
+            // istanbul ignore else
+            if (badiYears[0] === 'l4da') {
+                leapYearsBefore += badiYears.slice(0, this.year - 172).filter(entry => entry[1] === '5').length;
+            }
+            else {
+                leapYearsBefore += Object.entries(badiYears)
+                    .filter(([year, data]) => parseInt(year, 10) < this.year &&
+                    data.ayyamiHaLength === 5).length;
+            }
+        }
+        return leapYearsBefore;
+    }
+    holyDay(language = undefined) {
+        if (!this._holyDay) {
+            return '';
+        }
+        if (language === undefined || badiLocale[language] === undefined) {
+            language = 'default';
+        }
+        return formatItemFallback(language, 'holyDay', this._holyDay);
+    }
+    valueOf() {
+        return this._dayOfYear([this.year, this.month, this.day]) + this._leapYearsBefore() + (this.year - 1) * 365;
+    }
+    equals(other) {
+        return this.isValid && other.isValid && this.valueOf() === other.valueOf();
+    }
+    get isValid() {
+        return this._valid;
+    }
+    get invalidReason() {
+        return this._invalidReason;
+    }
+    get day() {
+        return this._day;
+    }
+    get month() {
+        return this._month;
+    }
+    get year() {
+        return this._year;
+    }
+    // number of the Badí' weekday between 1 (Jalál ~> Saturday) and 7 (Istiqlál ~> Friday).
+    get weekday() {
+        return (this._gregorianDate.weekday + 1) % 7 + 1;
+    }
+    get yearInVahid() {
+        return (this._year - 1) % 19 + 1;
+    }
+    get vahid() {
+        return (Math.floor((this._year - 1) / 19) % 19) + 1;
+    }
+    get kullIShay() {
+        return Math.floor((this._year - 1) / 361) + 1;
+    }
+    // Gregorian date on whose sunset the Badí' date ends.
+    get gregorianDate() {
+        return this._gregorianDate;
+    }
+    get ayyamiHaLength() {
+        return this._ayyamiHaLength;
+    }
+    get holyDayNumber() {
+        return this._holyDay ? this._holyDay : undefined;
+    }
+    get workSuspended() {
+        return this._holyDay ? this.holyDayNumber < 10 : undefined;
+    }
+    get nextMonth() {
+        let { year, month } = this;
+        switch (month) {
+            case 18:
+                month = 20;
+                break;
+            case 19:
+                month = 1;
+                year += 1;
+                break;
+            case 20:
+                month = 19;
+                break;
+            default:
+                month += 1;
+        }
+        return new BadiDate({ year, month, day: 1 });
+    }
+    get previousMonth() {
+        let { year, month } = this;
+        switch (month) {
+            case 1:
+                month = 19;
+                year -= 1;
+                break;
+            case 19:
+                month = 20;
+                break;
+            case 20:
+                month = 18;
+                break;
+            default:
+                month -= 1;
+        }
+        return new BadiDate({ year, month, day: 1 });
+    }
+    get nextDay() {
+        if (this._day === 19 || (this._month === 20 && this._day === this._ayyamiHaLength)) {
+            return this.nextMonth;
+        }
+        return new BadiDate({ year: this._year, month: this._month, day: this._day + 1 });
+    }
+    get previousDay() {
+        if (this._day === 1) {
+            const { previousMonth } = this;
+            let day = 19;
+            if (this._month === 19) {
+                day = this._ayyamiHaLength;
+            }
+            return new BadiDate({
+                year: previousMonth.year,
+                month: previousMonth.month,
+                day,
+            });
+        }
+        return new BadiDate({ year: this._year, month: this._month, day: this._day - 1 });
+    }
+}
+const badiDateSettings = (settings) => {
+    if (settings.defaultLanguage) {
+        setDefaultLanguage(settings.defaultLanguage);
+    }
+    if (settings.underlineFormat) {
+        setUnderlineFormat(settings.underlineFormat);
+    }
+};
+
+export { BadiDate, badiDateSettings };

Plik diff jest za duży
+ 1699 - 0
dist/localBadiDate-locales.js


Plik diff jest za duży
+ 5 - 0
dist/localBadiDate-locales.min.js


Plik diff jest za duży
+ 0 - 0
dist/localBadiDate-locales.min.js.map


Plik diff jest za duży
+ 5 - 0
dist/localBadiDate-locales.min.mjs


Plik diff jest za duży
+ 0 - 0
dist/localBadiDate-locales.min.mjs.map


Plik diff jest za duży
+ 1696 - 0
dist/localBadiDate-locales.mjs


Plik diff jest za duży
+ 2469 - 0
dist/localBadiDate-msm-locales.js


Plik diff jest za duży
+ 2465 - 0
dist/localBadiDate-msm-locales.m.js


Plik diff jest za duży
+ 10 - 0
dist/localBadiDate-msm-locales.min.js


Plik diff jest za duży
+ 0 - 0
dist/localBadiDate-msm-locales.min.js.map


Plik diff jest za duży
+ 10 - 0
dist/localBadiDate-msm-locales.min.mjs


Plik diff jest za duży
+ 0 - 0
dist/localBadiDate-msm-locales.min.mjs.map


Plik diff jest za duży
+ 2465 - 0
dist/localBadiDate-msm-locales.mjs


Plik diff jest za duży
+ 1540 - 0
dist/localBadiDate-msm.js


Plik diff jest za duży
+ 10 - 0
dist/localBadiDate-msm.min.js


Plik diff jest za duży
+ 0 - 0
dist/localBadiDate-msm.min.js.map


Plik diff jest za duży
+ 10 - 0
dist/localBadiDate-msm.min.mjs


Plik diff jest za duży
+ 0 - 0
dist/localBadiDate-msm.min.mjs.map


Plik diff jest za duży
+ 1536 - 0
dist/localBadiDate-msm.mjs


Plik diff jest za duży
+ 770 - 0
dist/localBadiDate.js


Plik diff jest za duży
+ 5 - 0
dist/localBadiDate.min.js


Plik diff jest za duży
+ 0 - 0
dist/localBadiDate.min.js.map


Plik diff jest za duży
+ 5 - 0
dist/localBadiDate.min.mjs


Plik diff jest za duży
+ 0 - 0
dist/localBadiDate.min.mjs.map


Plik diff jest za duży
+ 767 - 0
dist/localBadiDate.mjs


+ 20 - 0
jest.config.js

@@ -0,0 +1,20 @@
+module.exports = {
+    collectCoverage: true,
+    coverageDirectory: 'coverage',
+    coverageThreshold: {
+        global: {
+            branches: 100,
+            functions: 100,
+            lines: 100,
+            statements: 100,
+        },
+    },
+    preset: 'ts-jest',
+    testEnvironment: 'node',
+    testMatch: ['**/test/*.test.ts'],
+    transform: {
+        '^.+\\.ts$': 'ts-jest',
+        '^.+\\.js$': 'babel-jest',
+    },
+    transformIgnorePatterns: ['/node_modules/(?!(meeussunmoon)/)'],
+};

+ 10310 - 0
package-lock.json

@@ -0,0 +1,10310 @@
+{
+  "name": "badidate",
+  "version": "3.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@babel/code-frame": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+      "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+      "dev": true,
+      "requires": {
+        "@babel/highlight": "^7.10.4"
+      }
+    },
+    "@babel/core": {
+      "version": "7.11.1",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz",
+      "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.10.4",
+        "@babel/generator": "^7.11.0",
+        "@babel/helper-module-transforms": "^7.11.0",
+        "@babel/helpers": "^7.10.4",
+        "@babel/parser": "^7.11.1",
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.11.0",
+        "@babel/types": "^7.11.0",
+        "convert-source-map": "^1.7.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.1",
+        "json5": "^2.1.2",
+        "lodash": "^4.17.19",
+        "resolve": "^1.3.2",
+        "semver": "^5.4.1",
+        "source-map": "^0.5.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
+      }
+    },
+    "@babel/generator": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz",
+      "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.11.0",
+        "jsesc": "^2.5.1",
+        "source-map": "^0.5.0"
+      }
+    },
+    "@babel/helper-function-name": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+      "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-get-function-arity": "^7.10.4",
+        "@babel/template": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-get-function-arity": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+      "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-member-expression-to-functions": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz",
+      "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.11.0"
+      }
+    },
+    "@babel/helper-module-imports": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
+      "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-module-transforms": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
+      "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.10.4",
+        "@babel/helper-simple-access": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.11.0",
+        "@babel/template": "^7.10.4",
+        "@babel/types": "^7.11.0",
+        "lodash": "^4.17.19"
+      }
+    },
+    "@babel/helper-optimise-call-expression": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
+      "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-plugin-utils": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+      "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+      "dev": true
+    },
+    "@babel/helper-replace-supers": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz",
+      "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-member-expression-to-functions": "^7.10.4",
+        "@babel/helper-optimise-call-expression": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-simple-access": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz",
+      "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-split-export-declaration": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+      "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.11.0"
+      }
+    },
+    "@babel/helper-validator-identifier": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+      "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+      "dev": true
+    },
+    "@babel/helpers": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz",
+      "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/highlight": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+      "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.10.4",
+        "chalk": "^2.0.0",
+        "js-tokens": "^4.0.0"
+      }
+    },
+    "@babel/parser": {
+      "version": "7.11.3",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz",
+      "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==",
+      "dev": true
+    },
+    "@babel/plugin-syntax-async-generators": {
+      "version": "7.8.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-bigint": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+      "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-class-properties": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz",
+      "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-import-meta": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-json-strings": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-logical-assignment-operators": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-nullish-coalescing-operator": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-numeric-separator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-object-rest-spread": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-optional-catch-binding": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-optional-chaining": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/template": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+      "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.10.4",
+        "@babel/parser": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/traverse": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz",
+      "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.10.4",
+        "@babel/generator": "^7.11.0",
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.11.0",
+        "@babel/parser": "^7.11.0",
+        "@babel/types": "^7.11.0",
+        "debug": "^4.1.0",
+        "globals": "^11.1.0",
+        "lodash": "^4.17.19"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
+      }
+    },
+    "@babel/types": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz",
+      "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.10.4",
+        "lodash": "^4.17.19",
+        "to-fast-properties": "^2.0.0"
+      }
+    },
+    "@bcoe/v8-coverage": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+      "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+      "dev": true
+    },
+    "@cnakazawa/watch": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz",
+      "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==",
+      "dev": true,
+      "requires": {
+        "exec-sh": "^0.3.2",
+        "minimist": "^1.2.0"
+      }
+    },
+    "@istanbuljs/load-nyc-config": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+      "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+      "dev": true,
+      "requires": {
+        "camelcase": "^5.3.1",
+        "find-up": "^4.1.0",
+        "get-package-type": "^0.1.0",
+        "js-yaml": "^3.13.1",
+        "resolve-from": "^5.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
+        "resolve-from": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+          "dev": true
+        }
+      }
+    },
+    "@istanbuljs/schema": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz",
+      "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==",
+      "dev": true
+    },
+    "@jest/console": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.3.0.tgz",
+      "integrity": "sha512-/5Pn6sJev0nPUcAdpJHMVIsA8sKizL2ZkcKPE5+dJrCccks7tcM7c9wbgHudBJbxXLoTbqsHkG1Dofoem4F09w==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "jest-message-util": "^26.3.0",
+        "jest-util": "^26.3.0",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@jest/core": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.4.0.tgz",
+      "integrity": "sha512-mpXm4OjWQbz7qbzGIiSqvfNZ1FxX6ywWgLtdSD2luPORt5zKPtqcdDnX7L8RdfMaj1znDBgN2+gB094ZIr7vnA==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^26.3.0",
+        "@jest/reporters": "^26.4.0",
+        "@jest/test-result": "^26.3.0",
+        "@jest/transform": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.0.0",
+        "exit": "^0.1.2",
+        "graceful-fs": "^4.2.4",
+        "jest-changed-files": "^26.3.0",
+        "jest-config": "^26.4.0",
+        "jest-haste-map": "^26.3.0",
+        "jest-message-util": "^26.3.0",
+        "jest-regex-util": "^26.0.0",
+        "jest-resolve": "^26.4.0",
+        "jest-resolve-dependencies": "^26.4.0",
+        "jest-runner": "^26.4.0",
+        "jest-runtime": "^26.4.0",
+        "jest-snapshot": "^26.4.0",
+        "jest-util": "^26.3.0",
+        "jest-validate": "^26.4.0",
+        "jest-watcher": "^26.3.0",
+        "micromatch": "^4.0.2",
+        "p-each-series": "^2.1.0",
+        "rimraf": "^3.0.0",
+        "slash": "^3.0.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-escapes": {
+          "version": "4.3.1",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+          "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+          "dev": true,
+          "requires": {
+            "type-fest": "^0.11.0"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "rimraf": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        },
+        "type-fest": {
+          "version": "0.11.0",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
+          "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+          "dev": true
+        }
+      }
+    },
+    "@jest/environment": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.3.0.tgz",
+      "integrity": "sha512-EW+MFEo0DGHahf83RAaiqQx688qpXgl99wdb8Fy67ybyzHwR1a58LHcO376xQJHfmoXTu89M09dH3J509cx2AA==",
+      "dev": true,
+      "requires": {
+        "@jest/fake-timers": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "jest-mock": "^26.3.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@jest/fake-timers": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.3.0.tgz",
+      "integrity": "sha512-ZL9ytUiRwVP8ujfRepffokBvD2KbxbqMhrXSBhSdAhISCw3gOkuntisiSFv+A6HN0n0fF4cxzICEKZENLmW+1A==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "@sinonjs/fake-timers": "^6.0.1",
+        "@types/node": "*",
+        "jest-message-util": "^26.3.0",
+        "jest-mock": "^26.3.0",
+        "jest-util": "^26.3.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@jest/globals": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.4.0.tgz",
+      "integrity": "sha512-QKwoVAeL9d0xaEM9ebPvfc+bolN04F+o3zM2jswGDBiiNjCogZ3LvOaqumRdDyz6kLmbx+UhgMBAVuLunbXZ2A==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "expect": "^26.4.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@jest/reporters": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.4.0.tgz",
+      "integrity": "sha512-14OPAAuYhgRBSNxAocVluX6ksdMdK/EuP9NmtBXU9g1uKaVBrPnohn/CVm6iMot1a9iU8BCxa5715YRf8FEg/A==",
+      "dev": true,
+      "requires": {
+        "@bcoe/v8-coverage": "^0.2.3",
+        "@jest/console": "^26.3.0",
+        "@jest/test-result": "^26.3.0",
+        "@jest/transform": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "chalk": "^4.0.0",
+        "collect-v8-coverage": "^1.0.0",
+        "exit": "^0.1.2",
+        "glob": "^7.1.2",
+        "graceful-fs": "^4.2.4",
+        "istanbul-lib-coverage": "^3.0.0",
+        "istanbul-lib-instrument": "^4.0.3",
+        "istanbul-lib-report": "^3.0.0",
+        "istanbul-lib-source-maps": "^4.0.0",
+        "istanbul-reports": "^3.0.2",
+        "jest-haste-map": "^26.3.0",
+        "jest-resolve": "^26.4.0",
+        "jest-util": "^26.3.0",
+        "jest-worker": "^26.3.0",
+        "node-notifier": "^7.0.0",
+        "slash": "^3.0.0",
+        "source-map": "^0.6.0",
+        "string-length": "^4.0.1",
+        "terminal-link": "^2.0.0",
+        "v8-to-istanbul": "^5.0.1"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@jest/source-map": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.3.0.tgz",
+      "integrity": "sha512-hWX5IHmMDWe1kyrKl7IhFwqOuAreIwHhbe44+XH2ZRHjrKIh0LO5eLQ/vxHFeAfRwJapmxuqlGAEYLadDq6ZGQ==",
+      "dev": true,
+      "requires": {
+        "callsites": "^3.0.0",
+        "graceful-fs": "^4.2.4",
+        "source-map": "^0.6.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "@jest/test-result": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.3.0.tgz",
+      "integrity": "sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/istanbul-lib-coverage": "^2.0.0",
+        "collect-v8-coverage": "^1.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@jest/test-sequencer": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.4.0.tgz",
+      "integrity": "sha512-9Z7lCShS7vERp+DRwIVNH/6sHMWwJK1DPnGCpGeVLGJJWJ4Y08sQI3vIKdmKHu2KmwlUBpRM+BFf7NlVUkl5XA==",
+      "dev": true,
+      "requires": {
+        "@jest/test-result": "^26.3.0",
+        "graceful-fs": "^4.2.4",
+        "jest-haste-map": "^26.3.0",
+        "jest-runner": "^26.4.0",
+        "jest-runtime": "^26.4.0"
+      }
+    },
+    "@jest/transform": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.3.0.tgz",
+      "integrity": "sha512-Isj6NB68QorGoFWvcOjlUhpkT56PqNIsXKR7XfvoDlCANn/IANlh8DrKAA2l2JKC3yWSMH5wS0GwuQM20w3b2A==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.1.0",
+        "@jest/types": "^26.3.0",
+        "babel-plugin-istanbul": "^6.0.0",
+        "chalk": "^4.0.0",
+        "convert-source-map": "^1.4.0",
+        "fast-json-stable-stringify": "^2.0.0",
+        "graceful-fs": "^4.2.4",
+        "jest-haste-map": "^26.3.0",
+        "jest-regex-util": "^26.0.0",
+        "jest-util": "^26.3.0",
+        "micromatch": "^4.0.2",
+        "pirates": "^4.0.1",
+        "slash": "^3.0.0",
+        "source-map": "^0.6.1",
+        "write-file-atomic": "^3.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "@jest/types": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz",
+      "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==",
+      "dev": true,
+      "requires": {
+        "@types/istanbul-lib-coverage": "^2.0.0",
+        "@types/istanbul-reports": "^1.1.1",
+        "@types/yargs": "^15.0.0",
+        "chalk": "^3.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "@rollup/plugin-node-resolve": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz",
+      "integrity": "sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg==",
+      "dev": true,
+      "requires": {
+        "@rollup/pluginutils": "^3.1.0",
+        "@types/resolve": "1.17.1",
+        "builtin-modules": "^3.1.0",
+        "deepmerge": "^4.2.2",
+        "is-module": "^1.0.0",
+        "resolve": "^1.17.0"
+      }
+    },
+    "@rollup/plugin-typescript": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-5.0.2.tgz",
+      "integrity": "sha512-CkS028Itwjqm1uLbFVfpJgtVtnNvZ+og/m6UlNRR5wOOnNTWPcVQzOu5xGdEX+WWJxdvWIqUq2uR/RBt2ZipWg==",
+      "dev": true,
+      "requires": {
+        "@rollup/pluginutils": "^3.0.1",
+        "resolve": "^1.14.1"
+      }
+    },
+    "@rollup/pluginutils": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
+      "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+      "dev": true,
+      "requires": {
+        "@types/estree": "0.0.39",
+        "estree-walker": "^1.0.1",
+        "picomatch": "^2.2.2"
+      }
+    },
+    "@samverschueren/stream-to-observable": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz",
+      "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==",
+      "dev": true,
+      "requires": {
+        "any-observable": "^0.3.0"
+      }
+    },
+    "@sinonjs/commons": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz",
+      "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==",
+      "dev": true,
+      "requires": {
+        "type-detect": "4.0.8"
+      }
+    },
+    "@sinonjs/fake-timers": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz",
+      "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==",
+      "dev": true,
+      "requires": {
+        "@sinonjs/commons": "^1.7.0"
+      }
+    },
+    "@types/babel__core": {
+      "version": "7.1.9",
+      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz",
+      "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==",
+      "dev": true,
+      "requires": {
+        "@babel/parser": "^7.1.0",
+        "@babel/types": "^7.0.0",
+        "@types/babel__generator": "*",
+        "@types/babel__template": "*",
+        "@types/babel__traverse": "*"
+      }
+    },
+    "@types/babel__generator": {
+      "version": "7.6.1",
+      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz",
+      "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@types/babel__template": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz",
+      "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==",
+      "dev": true,
+      "requires": {
+        "@babel/parser": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@types/babel__traverse": {
+      "version": "7.0.13",
+      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz",
+      "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.3.0"
+      }
+    },
+    "@types/color-name": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+      "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
+      "dev": true
+    },
+    "@types/eslint-visitor-keys": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+      "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==",
+      "dev": true
+    },
+    "@types/estree": {
+      "version": "0.0.39",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
+      "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
+      "dev": true
+    },
+    "@types/graceful-fs": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz",
+      "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/istanbul-lib-coverage": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
+      "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==",
+      "dev": true
+    },
+    "@types/istanbul-lib-report": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+      "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+      "dev": true,
+      "requires": {
+        "@types/istanbul-lib-coverage": "*"
+      }
+    },
+    "@types/istanbul-reports": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz",
+      "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==",
+      "dev": true,
+      "requires": {
+        "@types/istanbul-lib-coverage": "*",
+        "@types/istanbul-lib-report": "*"
+      }
+    },
+    "@types/jest": {
+      "version": "26.0.10",
+      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.10.tgz",
+      "integrity": "sha512-i2m0oyh8w/Lum7wWK/YOZJakYF8Mx08UaKA1CtbmFeDquVhAEdA7znacsVSf2hJ1OQ/OfVMGN90pw/AtzF8s/Q==",
+      "dev": true,
+      "requires": {
+        "jest-diff": "^25.2.1",
+        "pretty-format": "^25.2.1"
+      }
+    },
+    "@types/json-schema": {
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz",
+      "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==",
+      "dev": true
+    },
+    "@types/json5": {
+      "version": "0.0.29",
+      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
+      "dev": true
+    },
+    "@types/luxon": {
+      "version": "1.24.3",
+      "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-1.24.3.tgz",
+      "integrity": "sha512-8lkeHb0Hkpyqmj0lYrZItakKM73jaKTUe4/PMl2e8o96oxTUzagbbz2DUOMn0NpjSovmZQTJvoCheFeI2bwS4g==",
+      "dev": true
+    },
+    "@types/node": {
+      "version": "14.0.27",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz",
+      "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==",
+      "dev": true
+    },
+    "@types/normalize-package-data": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+      "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
+      "dev": true
+    },
+    "@types/prettier": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.2.tgz",
+      "integrity": "sha512-IkVfat549ggtkZUthUzEX49562eGikhSYeVGX97SkMFn+sTZrgRewXjQ4tPKFPCykZHkX1Zfd9OoELGqKU2jJA==",
+      "dev": true
+    },
+    "@types/resolve": {
+      "version": "1.17.1",
+      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
+      "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/stack-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz",
+      "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==",
+      "dev": true
+    },
+    "@types/strip-bom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=",
+      "dev": true
+    },
+    "@types/strip-json-comments": {
+      "version": "0.0.30",
+      "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz",
+      "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==",
+      "dev": true
+    },
+    "@types/yargs": {
+      "version": "15.0.5",
+      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz",
+      "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==",
+      "dev": true,
+      "requires": {
+        "@types/yargs-parser": "*"
+      }
+    },
+    "@types/yargs-parser": {
+      "version": "15.0.0",
+      "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz",
+      "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==",
+      "dev": true
+    },
+    "@typescript-eslint/eslint-plugin": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.9.0.tgz",
+      "integrity": "sha512-UD6b4p0/hSe1xdTvRCENSx7iQ+KR6ourlZFfYuPC7FlXEzdHuLPrEmuxZ23b2zW96KJX9Z3w05GE/wNOiEzrVg==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/experimental-utils": "3.9.0",
+        "debug": "^4.1.1",
+        "functional-red-black-tree": "^1.0.1",
+        "regexpp": "^3.0.0",
+        "semver": "^7.3.2",
+        "tsutils": "^3.17.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        }
+      }
+    },
+    "@typescript-eslint/experimental-utils": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.9.0.tgz",
+      "integrity": "sha512-/vSHUDYizSOhrOJdjYxPNGfb4a3ibO8zd4nUKo/QBFOmxosT3cVUV7KIg8Dwi6TXlr667G7YPqFK9+VSZOorNA==",
+      "dev": true,
+      "requires": {
+        "@types/json-schema": "^7.0.3",
+        "@typescript-eslint/types": "3.9.0",
+        "@typescript-eslint/typescript-estree": "3.9.0",
+        "eslint-scope": "^5.0.0",
+        "eslint-utils": "^2.0.0"
+      }
+    },
+    "@typescript-eslint/parser": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.9.0.tgz",
+      "integrity": "sha512-rDHOKb6uW2jZkHQniUQVZkixQrfsZGUCNWWbKWep4A5hGhN5dLHMUCNAWnC4tXRlHedXkTDptIpxs6e4Pz8UfA==",
+      "dev": true,
+      "requires": {
+        "@types/eslint-visitor-keys": "^1.0.0",
+        "@typescript-eslint/experimental-utils": "3.9.0",
+        "@typescript-eslint/types": "3.9.0",
+        "@typescript-eslint/typescript-estree": "3.9.0",
+        "eslint-visitor-keys": "^1.1.0"
+      }
+    },
+    "@typescript-eslint/types": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.9.0.tgz",
+      "integrity": "sha512-rb6LDr+dk9RVVXO/NJE8dT1pGlso3voNdEIN8ugm4CWM5w5GimbThCMiMl4da1t5u3YwPWEwOnKAULCZgBtBHg==",
+      "dev": true
+    },
+    "@typescript-eslint/typescript-estree": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.9.0.tgz",
+      "integrity": "sha512-N+158NKgN4rOmWVfvKOMoMFV5n8XxAliaKkArm/sOypzQ0bUL8MSnOEBW3VFIeffb/K5ce/cAV0yYhR7U4ALAA==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "3.9.0",
+        "@typescript-eslint/visitor-keys": "3.9.0",
+        "debug": "^4.1.1",
+        "glob": "^7.1.6",
+        "is-glob": "^4.0.1",
+        "lodash": "^4.17.15",
+        "semver": "^7.3.2",
+        "tsutils": "^3.17.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        }
+      }
+    },
+    "@typescript-eslint/visitor-keys": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.9.0.tgz",
+      "integrity": "sha512-O1qeoGqDbu0EZUC/MZ6F1WHTIzcBVhGqDj3LhTnj65WUA548RXVxUHbYhAW9bZWfb2rnX9QsbbP5nmeJ5Z4+ng==",
+      "dev": true,
+      "requires": {
+        "eslint-visitor-keys": "^1.1.0"
+      }
+    },
+    "abab": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.4.tgz",
+      "integrity": "sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ==",
+      "dev": true
+    },
+    "acorn": {
+      "version": "7.4.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz",
+      "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==",
+      "dev": true
+    },
+    "acorn-globals": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
+      "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+      "dev": true,
+      "requires": {
+        "acorn": "^7.1.1",
+        "acorn-walk": "^7.1.1"
+      }
+    },
+    "acorn-jsx": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
+      "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
+      "dev": true
+    },
+    "acorn-walk": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+      "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+      "dev": true
+    },
+    "ajv": {
+      "version": "6.12.4",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
+      "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+      "dev": true,
+      "requires": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "ansi-colors": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+      "dev": true
+    },
+    "ansi-escapes": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+      "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+      "dev": true
+    },
+    "ansi-regex": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+      "dev": true
+    },
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
+    },
+    "any-observable": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz",
+      "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==",
+      "dev": true
+    },
+    "anymatch": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+      "dev": true,
+      "requires": {
+        "micromatch": "^3.1.4",
+        "normalize-path": "^2.1.1"
+      },
+      "dependencies": {
+        "normalize-path": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+          "dev": true,
+          "requires": {
+            "remove-trailing-separator": "^1.0.1"
+          }
+        }
+      }
+    },
+    "arg": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+      "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+      "dev": true
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "requires": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "arr-diff": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+      "dev": true
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+      "dev": true
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+      "dev": true
+    },
+    "array-find-index": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+      "dev": true
+    },
+    "array-includes": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz",
+      "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0",
+        "is-string": "^1.0.5"
+      }
+    },
+    "array-unique": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+      "dev": true
+    },
+    "array.prototype.flat": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
+      "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1"
+      }
+    },
+    "asn1": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
+    "assert-plus": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+      "dev": true
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+      "dev": true
+    },
+    "astral-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+      "dev": true
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+      "dev": true
+    },
+    "atob": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+      "dev": true
+    },
+    "aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+      "dev": true
+    },
+    "aws4": {
+      "version": "1.10.1",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz",
+      "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==",
+      "dev": true
+    },
+    "babel-jest": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.3.0.tgz",
+      "integrity": "sha512-sxPnQGEyHAOPF8NcUsD0g7hDCnvLL2XyblRBcgrzTWBB/mAIpWow3n1bEL+VghnnZfreLhFSBsFluRoK2tRK4g==",
+      "dev": true,
+      "requires": {
+        "@jest/transform": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/babel__core": "^7.1.7",
+        "babel-plugin-istanbul": "^6.0.0",
+        "babel-preset-jest": "^26.3.0",
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.4",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "babel-plugin-istanbul": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz",
+      "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@istanbuljs/load-nyc-config": "^1.0.0",
+        "@istanbuljs/schema": "^0.1.2",
+        "istanbul-lib-instrument": "^4.0.0",
+        "test-exclude": "^6.0.0"
+      }
+    },
+    "babel-plugin-jest-hoist": {
+      "version": "26.2.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.2.0.tgz",
+      "integrity": "sha512-B/hVMRv8Nh1sQ1a3EY8I0n4Y1Wty3NrR5ebOyVT302op+DOAau+xNEImGMsUWOC3++ZlMooCytKz+NgN8aKGbA==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.3.3",
+        "@babel/types": "^7.3.3",
+        "@types/babel__core": "^7.0.0",
+        "@types/babel__traverse": "^7.0.6"
+      }
+    },
+    "babel-preset-current-node-syntax": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz",
+      "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/plugin-syntax-bigint": "^7.8.3",
+        "@babel/plugin-syntax-class-properties": "^7.8.3",
+        "@babel/plugin-syntax-import-meta": "^7.8.3",
+        "@babel/plugin-syntax-json-strings": "^7.8.3",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+        "@babel/plugin-syntax-numeric-separator": "^7.8.3",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+      }
+    },
+    "babel-preset-jest": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.3.0.tgz",
+      "integrity": "sha512-5WPdf7nyYi2/eRxCbVrE1kKCWxgWY4RsPEbdJWFm7QsesFGqjdkyLeu1zRkwM1cxK6EPIlNd6d2AxLk7J+t4pw==",
+      "dev": true,
+      "requires": {
+        "babel-plugin-jest-hoist": "^26.2.0",
+        "babel-preset-current-node-syntax": "^0.1.3"
+      }
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+      "dev": true
+    },
+    "base": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+      "dev": true,
+      "requires": {
+        "cache-base": "^1.0.1",
+        "class-utils": "^0.3.5",
+        "component-emitter": "^1.2.1",
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.1",
+        "mixin-deep": "^1.2.0",
+        "pascalcase": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+      "dev": true,
+      "requires": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
+    "blessed": {
+      "version": "0.1.81",
+      "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz",
+      "integrity": "sha1-+WLWh+wsNpVwrnGvhDJW5tDKESk=",
+      "dev": true
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+      "dev": true,
+      "requires": {
+        "arr-flatten": "^1.1.0",
+        "array-unique": "^0.3.2",
+        "extend-shallow": "^2.0.1",
+        "fill-range": "^4.0.0",
+        "isobject": "^3.0.1",
+        "repeat-element": "^1.1.2",
+        "snapdragon": "^0.8.1",
+        "snapdragon-node": "^2.0.1",
+        "split-string": "^3.0.2",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "browser-process-hrtime": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+      "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+      "dev": true
+    },
+    "bs-logger": {
+      "version": "0.2.6",
+      "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz",
+      "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==",
+      "dev": true,
+      "requires": {
+        "fast-json-stable-stringify": "2.x"
+      }
+    },
+    "bser": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+      "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+      "dev": true,
+      "requires": {
+        "node-int64": "^0.4.0"
+      }
+    },
+    "buffer-from": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+      "dev": true
+    },
+    "builtin-modules": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz",
+      "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==",
+      "dev": true
+    },
+    "cache-base": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+      "dev": true,
+      "requires": {
+        "collection-visit": "^1.0.0",
+        "component-emitter": "^1.2.1",
+        "get-value": "^2.0.6",
+        "has-value": "^1.0.0",
+        "isobject": "^3.0.1",
+        "set-value": "^2.0.0",
+        "to-object-path": "^0.3.0",
+        "union-value": "^1.0.0",
+        "unset-value": "^1.0.0"
+      }
+    },
+    "callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true
+    },
+    "camelcase": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+      "dev": true
+    },
+    "camelcase-keys": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+      "dev": true,
+      "requires": {
+        "camelcase": "^2.0.0",
+        "map-obj": "^1.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+          "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+          "dev": true
+        }
+      }
+    },
+    "capture-exit": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz",
+      "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==",
+      "dev": true,
+      "requires": {
+        "rsvp": "^4.8.4"
+      }
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+      "dev": true
+    },
+    "chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      }
+    },
+    "char-regex": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+      "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+      "dev": true
+    },
+    "ci-info": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+      "dev": true
+    },
+    "class-utils": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "cli-cursor": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+      "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+      "dev": true,
+      "requires": {
+        "restore-cursor": "^2.0.0"
+      }
+    },
+    "cli-truncate": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz",
+      "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=",
+      "dev": true,
+      "requires": {
+        "slice-ansi": "0.0.4",
+        "string-width": "^1.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "dev": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "slice-ansi": {
+          "version": "0.0.4",
+          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
+          "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+          "dev": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        }
+      }
+    },
+    "cliui": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+      "dev": true,
+      "requires": {
+        "string-width": "^3.1.0",
+        "strip-ansi": "^5.2.0",
+        "wrap-ansi": "^5.1.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          }
+        }
+      }
+    },
+    "co": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+      "dev": true
+    },
+    "code-point-at": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+      "dev": true
+    },
+    "collect-v8-coverage": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
+      "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
+      "dev": true
+    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "dev": true,
+      "requires": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      }
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "dev": true
+    },
+    "combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dev": true,
+      "requires": {
+        "delayed-stream": "~1.0.0"
+      }
+    },
+    "component-emitter": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+      "dev": true
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
+    },
+    "contains-path": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+      "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+      "dev": true
+    },
+    "convert-source-map": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+      "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "~5.1.1"
+      }
+    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+      "dev": true
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+      "dev": true
+    },
+    "cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "dev": true,
+      "requires": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      }
+    },
+    "cssom": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
+      "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
+      "dev": true
+    },
+    "cssstyle": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+      "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+      "dev": true,
+      "requires": {
+        "cssom": "~0.3.6"
+      },
+      "dependencies": {
+        "cssom": {
+          "version": "0.3.8",
+          "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+          "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+          "dev": true
+        }
+      }
+    },
+    "currently-unhandled": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+      "dev": true,
+      "requires": {
+        "array-find-index": "^1.0.1"
+      }
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "data-urls": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
+      "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+      "dev": true,
+      "requires": {
+        "abab": "^2.0.3",
+        "whatwg-mimetype": "^2.3.0",
+        "whatwg-url": "^8.0.0"
+      }
+    },
+    "date-fns": {
+      "version": "1.30.1",
+      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz",
+      "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==",
+      "dev": true
+    },
+    "dateformat": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
+      "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
+      "dev": true,
+      "requires": {
+        "get-stdin": "^4.0.1",
+        "meow": "^3.3.0"
+      }
+    },
+    "debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+      "dev": true
+    },
+    "decimal.js": {
+      "version": "10.2.0",
+      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz",
+      "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==",
+      "dev": true
+    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "dev": true
+    },
+    "deep-is": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+      "dev": true
+    },
+    "deepmerge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+      "dev": true
+    },
+    "define-properties": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+      "dev": true,
+      "requires": {
+        "object-keys": "^1.0.12"
+      }
+    },
+    "define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "dev": true,
+      "requires": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+      "dev": true
+    },
+    "detect-newline": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+      "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+      "dev": true
+    },
+    "diff": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+      "dev": true
+    },
+    "diff-sequences": {
+      "version": "25.2.6",
+      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz",
+      "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==",
+      "dev": true
+    },
+    "doctrine": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
+      "requires": {
+        "esutils": "^2.0.2"
+      }
+    },
+    "domexception": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
+      "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
+      "dev": true,
+      "requires": {
+        "webidl-conversions": "^5.0.0"
+      },
+      "dependencies": {
+        "webidl-conversions": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
+          "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
+          "dev": true
+        }
+      }
+    },
+    "dynamic-dedupe": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz",
+      "integrity": "sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE=",
+      "dev": true,
+      "requires": {
+        "xtend": "^4.0.0"
+      }
+    },
+    "ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+      "dev": true,
+      "requires": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "elegant-spinner": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz",
+      "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=",
+      "dev": true
+    },
+    "emittery": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.1.tgz",
+      "integrity": "sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ==",
+      "dev": true
+    },
+    "emoji-regex": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+      "dev": true
+    },
+    "end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "dev": true,
+      "requires": {
+        "once": "^1.4.0"
+      }
+    },
+    "enquirer": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+      "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+      "dev": true,
+      "requires": {
+        "ansi-colors": "^4.1.1"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "es-abstract": {
+      "version": "1.17.6",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
+      "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
+      "dev": true,
+      "requires": {
+        "es-to-primitive": "^1.2.1",
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.1",
+        "is-callable": "^1.2.0",
+        "is-regex": "^1.1.0",
+        "object-inspect": "^1.7.0",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.0",
+        "string.prototype.trimend": "^1.0.1",
+        "string.prototype.trimstart": "^1.0.1"
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+      "dev": true,
+      "requires": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      }
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
+    },
+    "escodegen": {
+      "version": "1.14.3",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+      "dev": true,
+      "requires": {
+        "esprima": "^4.0.1",
+        "estraverse": "^4.2.0",
+        "esutils": "^2.0.2",
+        "optionator": "^0.8.1",
+        "source-map": "~0.6.1"
+      },
+      "dependencies": {
+        "levn": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+          "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+          "dev": true,
+          "requires": {
+            "prelude-ls": "~1.1.2",
+            "type-check": "~0.3.2"
+          }
+        },
+        "optionator": {
+          "version": "0.8.3",
+          "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+          "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+          "dev": true,
+          "requires": {
+            "deep-is": "~0.1.3",
+            "fast-levenshtein": "~2.0.6",
+            "levn": "~0.3.0",
+            "prelude-ls": "~1.1.2",
+            "type-check": "~0.3.2",
+            "word-wrap": "~1.2.3"
+          }
+        },
+        "prelude-ls": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+          "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true,
+          "optional": true
+        },
+        "type-check": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+          "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+          "dev": true,
+          "requires": {
+            "prelude-ls": "~1.1.2"
+          }
+        }
+      }
+    },
+    "eslint": {
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.7.0.tgz",
+      "integrity": "sha512-1KUxLzos0ZVsyL81PnRN335nDtQ8/vZUD6uMtWbF+5zDtjKcsklIi78XoE0MVL93QvWTu+E5y44VyyCsOMBrIg==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "ajv": "^6.10.0",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.2",
+        "debug": "^4.0.1",
+        "doctrine": "^3.0.0",
+        "enquirer": "^2.3.5",
+        "eslint-scope": "^5.1.0",
+        "eslint-utils": "^2.1.0",
+        "eslint-visitor-keys": "^1.3.0",
+        "espree": "^7.2.0",
+        "esquery": "^1.2.0",
+        "esutils": "^2.0.2",
+        "file-entry-cache": "^5.0.1",
+        "functional-red-black-tree": "^1.0.1",
+        "glob-parent": "^5.0.0",
+        "globals": "^12.1.0",
+        "ignore": "^4.0.6",
+        "import-fresh": "^3.0.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "js-yaml": "^3.13.1",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.4.1",
+        "lodash": "^4.17.19",
+        "minimatch": "^3.0.4",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.1",
+        "progress": "^2.0.0",
+        "regexpp": "^3.1.0",
+        "semver": "^7.2.1",
+        "strip-ansi": "^6.0.0",
+        "strip-json-comments": "^3.1.0",
+        "table": "^5.2.3",
+        "text-table": "^0.2.0",
+        "v8-compile-cache": "^2.0.3"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "glob-parent": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+          "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "globals": {
+          "version": "12.4.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+          "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+          "dev": true,
+          "requires": {
+            "type-fest": "^0.8.1"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "eslint-config-standard": {
+      "version": "14.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz",
+      "integrity": "sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==",
+      "dev": true
+    },
+    "eslint-import-resolver-node": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
+      "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
+      "dev": true,
+      "requires": {
+        "debug": "^2.6.9",
+        "resolve": "^1.13.1"
+      }
+    },
+    "eslint-module-utils": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
+      "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
+      "dev": true,
+      "requires": {
+        "debug": "^2.6.9",
+        "pkg-dir": "^2.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^2.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^2.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+          "dev": true,
+          "requires": {
+            "p-try": "^1.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^1.1.0"
+          }
+        },
+        "p-try": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+          "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+          "dev": true,
+          "requires": {
+            "find-up": "^2.1.0"
+          }
+        }
+      }
+    },
+    "eslint-plugin-es": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
+      "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+      "dev": true,
+      "requires": {
+        "eslint-utils": "^2.0.0",
+        "regexpp": "^3.0.0"
+      }
+    },
+    "eslint-plugin-import": {
+      "version": "2.22.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz",
+      "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==",
+      "dev": true,
+      "requires": {
+        "array-includes": "^3.1.1",
+        "array.prototype.flat": "^1.2.3",
+        "contains-path": "^0.1.0",
+        "debug": "^2.6.9",
+        "doctrine": "1.5.0",
+        "eslint-import-resolver-node": "^0.3.3",
+        "eslint-module-utils": "^2.6.0",
+        "has": "^1.0.3",
+        "minimatch": "^3.0.4",
+        "object.values": "^1.1.1",
+        "read-pkg-up": "^2.0.0",
+        "resolve": "^1.17.0",
+        "tsconfig-paths": "^3.9.0"
+      },
+      "dependencies": {
+        "doctrine": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+          "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "isarray": "^1.0.0"
+          }
+        }
+      }
+    },
+    "eslint-plugin-node": {
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
+      "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
+      "dev": true,
+      "requires": {
+        "eslint-plugin-es": "^3.0.0",
+        "eslint-utils": "^2.0.0",
+        "ignore": "^5.1.1",
+        "minimatch": "^3.0.4",
+        "resolve": "^1.10.1",
+        "semver": "^6.1.0"
+      },
+      "dependencies": {
+        "ignore": {
+          "version": "5.1.8",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+          "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+          "dev": true
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-plugin-prefer-arrow": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.2.tgz",
+      "integrity": "sha512-C8YMhL+r8RMeMdYAw/rQtE6xNdMulj+zGWud/qIGnlmomiPRaLDGLMeskZ3alN6uMBojmooRimtdrXebLN4svQ==",
+      "dev": true
+    },
+    "eslint-plugin-promise": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz",
+      "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==",
+      "dev": true
+    },
+    "eslint-plugin-standard": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz",
+      "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==",
+      "dev": true
+    },
+    "eslint-scope": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
+      "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
+      "dev": true,
+      "requires": {
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "eslint-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+      "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+      "dev": true,
+      "requires": {
+        "eslint-visitor-keys": "^1.1.0"
+      }
+    },
+    "eslint-visitor-keys": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+      "dev": true
+    },
+    "esm": {
+      "version": "3.2.25",
+      "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+      "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+      "dev": true
+    },
+    "espree": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-7.2.0.tgz",
+      "integrity": "sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g==",
+      "dev": true,
+      "requires": {
+        "acorn": "^7.3.1",
+        "acorn-jsx": "^5.2.0",
+        "eslint-visitor-keys": "^1.3.0"
+      }
+    },
+    "esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "dev": true
+    },
+    "esquery": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
+      "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^5.1.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+          "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+          "dev": true
+        }
+      }
+    },
+    "esrecurse": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^4.1.0"
+      }
+    },
+    "estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "dev": true
+    },
+    "estree-walker": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
+      "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
+      "dev": true
+    },
+    "esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true
+    },
+    "event-registry": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/event-registry/-/event-registry-0.3.0.tgz",
+      "integrity": "sha512-HayOqB2QoO4Kqeq1/wGcDCNbCo/tPhocsj0QOzYUVikd5aWomUTfcTR1u2BZJhl1RBOfwipomkq3c34mX3hOWg==",
+      "dev": true
+    },
+    "exec-sh": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz",
+      "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==",
+      "dev": true
+    },
+    "execa": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+      "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^6.0.0",
+        "get-stream": "^4.0.0",
+        "is-stream": "^1.1.0",
+        "npm-run-path": "^2.0.0",
+        "p-finally": "^1.0.0",
+        "signal-exit": "^3.0.0",
+        "strip-eof": "^1.0.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "dev": true,
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "path-key": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+          "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+          "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^1.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+          "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+          "dev": true
+        },
+        "which": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
+    "exit": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+      "dev": true
+    },
+    "expand-brackets": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+      "dev": true,
+      "requires": {
+        "debug": "^2.3.3",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "posix-character-classes": "^0.1.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "expect": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/expect/-/expect-26.4.0.tgz",
+      "integrity": "sha512-dbYDJhFcqQsamlos6nEwAMe+ahdckJBk5fmw1DYGLQGabGSlUuT+Fm2jHYw5119zG3uIhP+lCQbjJhFEdZMJtg==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "ansi-styles": "^4.0.0",
+        "jest-get-type": "^26.3.0",
+        "jest-matcher-utils": "^26.4.0",
+        "jest-message-util": "^26.3.0",
+        "jest-regex-util": "^26.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "jest-get-type": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "dev": true
+    },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "dev": true,
+      "requires": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "extglob": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+      "dev": true,
+      "requires": {
+        "array-unique": "^0.3.2",
+        "define-property": "^1.0.0",
+        "expand-brackets": "^2.1.4",
+        "extend-shallow": "^2.0.1",
+        "fragment-cache": "^0.2.1",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+      "dev": true
+    },
+    "fancy-rollup": {
+      "version": "0.5.4",
+      "resolved": "https://registry.npmjs.org/fancy-rollup/-/fancy-rollup-0.5.4.tgz",
+      "integrity": "sha512-FQ0WCd2sbobFoNcFTUxsWCprdMipy0F/yQf6Zw8XNp1Y0CFZXZIyGsOk1xNxJYni0wxnUZoQo7t7b4i1zDoKjA==",
+      "dev": true,
+      "requires": {
+        "blessed": "^0.1.81",
+        "chalk": "^2.4.1",
+        "esm": "^3.2.25",
+        "event-registry": "^0.3.0",
+        "listr": "^0.14.1",
+        "log-update": "^3.2.0",
+        "mem": "^5.1.1",
+        "moment": "^2.22.2",
+        "p-defer": "^3.0.0",
+        "pretty-bytes": "^5.1.0",
+        "pretty-ms": "^5.0.0",
+        "require-relative": "^0.8.7",
+        "rollup": "^1.16.4",
+        "serialize-error": "^4.1.0",
+        "split-lines": "^2.0.0",
+        "stats-lite": "^2.1.1",
+        "yargs": "^13.2.4",
+        "zen-observable": "^0.8.9"
+      },
+      "dependencies": {
+        "rollup": {
+          "version": "1.32.1",
+          "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz",
+          "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==",
+          "dev": true,
+          "requires": {
+            "@types/estree": "*",
+            "@types/node": "*",
+            "acorn": "^7.1.0"
+          }
+        }
+      }
+    },
+    "fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "dev": true
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+      "dev": true
+    },
+    "fb-watchman": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
+      "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
+      "dev": true,
+      "requires": {
+        "bser": "2.1.1"
+      }
+    },
+    "figures": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+      "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^1.0.5",
+        "object-assign": "^4.1.0"
+      }
+    },
+    "file-entry-cache": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
+      "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+      "dev": true,
+      "requires": {
+        "flat-cache": "^2.0.1"
+      }
+    },
+    "fill-range": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "find-up": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+      "dev": true,
+      "requires": {
+        "locate-path": "^3.0.0"
+      }
+    },
+    "flat-cache": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
+      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+      "dev": true,
+      "requires": {
+        "flatted": "^2.0.0",
+        "rimraf": "2.6.3",
+        "write": "1.0.3"
+      }
+    },
+    "flatted": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
+      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+      "dev": true
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+      "dev": true
+    },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+      "dev": true
+    },
+    "form-data": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+      "dev": true,
+      "requires": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.6",
+        "mime-types": "^2.1.12"
+      }
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "dev": true,
+      "requires": {
+        "map-cache": "^0.2.2"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "functional-red-black-tree": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+      "dev": true
+    },
+    "gensync": {
+      "version": "1.0.0-beta.1",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
+      "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
+      "dev": true
+    },
+    "get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "dev": true
+    },
+    "get-package-type": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+      "dev": true
+    },
+    "get-stdin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+      "dev": true
+    },
+    "get-stream": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+      "dev": true,
+      "requires": {
+        "pump": "^3.0.0"
+      }
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+      "dev": true
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "glob": {
+      "version": "7.1.6",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+      "dev": true,
+      "requires": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "dev": true
+    },
+    "graceful-fs": {
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+      "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+      "dev": true
+    },
+    "growly": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
+      "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
+      "dev": true,
+      "optional": true
+    },
+    "har-schema": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+      "dev": true
+    },
+    "har-validator": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.12.3",
+        "har-schema": "^2.0.0"
+      }
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        }
+      }
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+      "dev": true
+    },
+    "has-symbols": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+      "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+      "dev": true
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "dev": true,
+      "requires": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "dev": true,
+      "requires": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "hosted-git-info": {
+      "version": "2.8.8",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+      "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+      "dev": true
+    },
+    "html-encoding-sniffer": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
+      "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
+      "dev": true,
+      "requires": {
+        "whatwg-encoding": "^1.0.5"
+      }
+    },
+    "html-escaper": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+      "dev": true
+    },
+    "http-signature": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
+      }
+    },
+    "human-signals": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+      "dev": true
+    },
+    "iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      }
+    },
+    "ignore": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+      "dev": true
+    },
+    "import-fresh": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
+      "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+      "dev": true,
+      "requires": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      }
+    },
+    "import-local": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
+      "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
+      "dev": true,
+      "requires": {
+        "pkg-dir": "^4.2.0",
+        "resolve-cwd": "^3.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+          "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+          "dev": true,
+          "requires": {
+            "find-up": "^4.0.0"
+          }
+        }
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+      "dev": true
+    },
+    "indent-string": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
+      "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
+      "dev": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "dev": true,
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true
+    },
+    "ip-regex": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
+      "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
+      "dev": true
+    },
+    "is-accessor-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+      "dev": true
+    },
+    "is-callable": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
+      "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
+      "dev": true
+    },
+    "is-ci": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+      "dev": true,
+      "requires": {
+        "ci-info": "^2.0.0"
+      }
+    },
+    "is-data-descriptor": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-date-object": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+      "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+      "dev": true
+    },
+    "is-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+      "dev": true,
+      "requires": {
+        "is-accessor-descriptor": "^0.1.6",
+        "is-data-descriptor": "^0.1.4",
+        "kind-of": "^5.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+          "dev": true
+        }
+      }
+    },
+    "is-docker": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz",
+      "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==",
+      "dev": true,
+      "optional": true
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+      "dev": true
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+      "dev": true
+    },
+    "is-finite": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
+      "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
+      "dev": true
+    },
+    "is-fullwidth-code-point": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+      "dev": true
+    },
+    "is-generator-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+      "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+      "dev": true
+    },
+    "is-glob": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+      "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+      "dev": true,
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-module": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+      "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
+      "dev": true
+    },
+    "is-number": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-observable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz",
+      "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==",
+      "dev": true,
+      "requires": {
+        "symbol-observable": "^1.1.0"
+      }
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "is-potential-custom-element-name": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz",
+      "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=",
+      "dev": true
+    },
+    "is-promise": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
+      "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==",
+      "dev": true
+    },
+    "is-regex": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+      "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+      "dev": true,
+      "requires": {
+        "has-symbols": "^1.0.1"
+      }
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+      "dev": true
+    },
+    "is-string": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
+      "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
+      "dev": true
+    },
+    "is-symbol": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+      "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+      "dev": true,
+      "requires": {
+        "has-symbols": "^1.0.1"
+      }
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+      "dev": true
+    },
+    "is-utf8": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+      "dev": true
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+      "dev": true
+    },
+    "is-wsl": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "is-docker": "^2.0.0"
+      }
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "isnumber": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isnumber/-/isnumber-1.0.0.tgz",
+      "integrity": "sha1-Dj+XWbWB2Z3YUIbw7Cp0kJz63QE=",
+      "dev": true
+    },
+    "isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+      "dev": true
+    },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+      "dev": true
+    },
+    "istanbul-lib-coverage": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
+      "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==",
+      "dev": true
+    },
+    "istanbul-lib-instrument": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+      "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.7.5",
+        "@istanbuljs/schema": "^0.1.2",
+        "istanbul-lib-coverage": "^3.0.0",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "istanbul-lib-report": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+      "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+      "dev": true,
+      "requires": {
+        "istanbul-lib-coverage": "^3.0.0",
+        "make-dir": "^3.0.0",
+        "supports-color": "^7.1.0"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "make-dir": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+          "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+          "dev": true,
+          "requires": {
+            "semver": "^6.0.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "istanbul-lib-source-maps": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz",
+      "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.1",
+        "istanbul-lib-coverage": "^3.0.0",
+        "source-map": "^0.6.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "istanbul-reports": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz",
+      "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==",
+      "dev": true,
+      "requires": {
+        "html-escaper": "^2.0.0",
+        "istanbul-lib-report": "^3.0.0"
+      }
+    },
+    "jest": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/jest/-/jest-26.4.0.tgz",
+      "integrity": "sha512-lNCOS+ckRHE1wFyVtQClBmbsOVuH2GWUTJMDL3vunp9DXcah+V8vfvVVApngClcdoc3rgZpqOfCNKLjxjj2l4g==",
+      "dev": true,
+      "requires": {
+        "@jest/core": "^26.4.0",
+        "import-local": "^3.0.2",
+        "jest-cli": "^26.4.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "cliui": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+          "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+          "dev": true,
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^6.2.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "jest-cli": {
+          "version": "26.4.0",
+          "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.4.0.tgz",
+          "integrity": "sha512-kw2Pr3V2x9/WzSDGsbz/MJBNlCoPMxMudrIavft4bqRlv5tASjU51tyO+1Os1LdW2dAnLQZYsxFUZ8oWPyssGQ==",
+          "dev": true,
+          "requires": {
+            "@jest/core": "^26.4.0",
+            "@jest/test-result": "^26.3.0",
+            "@jest/types": "^26.3.0",
+            "chalk": "^4.0.0",
+            "exit": "^0.1.2",
+            "graceful-fs": "^4.2.4",
+            "import-local": "^3.0.2",
+            "is-ci": "^2.0.0",
+            "jest-config": "^26.4.0",
+            "jest-util": "^26.3.0",
+            "jest-validate": "^26.4.0",
+            "prompts": "^2.0.1",
+            "yargs": "^15.3.1"
+          }
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "yargs": {
+          "version": "15.4.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+          "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+          "dev": true,
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "18.1.3",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
+    "jest-changed-files": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.3.0.tgz",
+      "integrity": "sha512-1C4R4nijgPltX6fugKxM4oQ18zimS7LqQ+zTTY8lMCMFPrxqBFb7KJH0Z2fRQJvw2Slbaipsqq7s1mgX5Iot+g==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "execa": "^4.0.0",
+        "throat": "^5.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "execa": {
+          "version": "4.0.3",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz",
+          "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^7.0.0",
+            "get-stream": "^5.0.0",
+            "human-signals": "^1.1.1",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.0",
+            "onetime": "^5.1.0",
+            "signal-exit": "^3.0.2",
+            "strip-final-newline": "^2.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-stream": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+          "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+          "dev": true
+        },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        },
+        "npm-run-path": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.0.0"
+          }
+        },
+        "onetime": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+          "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-config": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.4.0.tgz",
+      "integrity": "sha512-MxsvrBug8YY+C4QcUBtmgnHyFeW7w3Ouk/w9eplCDN8VJGVyBEZFe8Lxzfp2pSqh0Dqurqv8Oik2YkbekGUlxg==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.1.0",
+        "@jest/test-sequencer": "^26.4.0",
+        "@jest/types": "^26.3.0",
+        "babel-jest": "^26.3.0",
+        "chalk": "^4.0.0",
+        "deepmerge": "^4.2.2",
+        "glob": "^7.1.1",
+        "graceful-fs": "^4.2.4",
+        "jest-environment-jsdom": "^26.3.0",
+        "jest-environment-node": "^26.3.0",
+        "jest-get-type": "^26.3.0",
+        "jest-jasmine2": "^26.4.0",
+        "jest-regex-util": "^26.0.0",
+        "jest-resolve": "^26.4.0",
+        "jest-util": "^26.3.0",
+        "jest-validate": "^26.4.0",
+        "micromatch": "^4.0.2",
+        "pretty-format": "^26.4.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "jest-get-type": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "pretty-format": {
+          "version": "26.4.0",
+          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.0.tgz",
+          "integrity": "sha512-mEEwwpCseqrUtuMbrJG4b824877pM5xald3AkilJ47Po2YLr97/siejYQHqj2oDQBeJNbu+Q0qUuekJ8F0NAPg==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^26.3.0",
+            "ansi-regex": "^5.0.0",
+            "ansi-styles": "^4.0.0",
+            "react-is": "^16.12.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "jest-diff": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz",
+      "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==",
+      "dev": true,
+      "requires": {
+        "chalk": "^3.0.0",
+        "diff-sequences": "^25.2.6",
+        "jest-get-type": "^25.2.6",
+        "pretty-format": "^25.5.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-docblock": {
+      "version": "26.0.0",
+      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz",
+      "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==",
+      "dev": true,
+      "requires": {
+        "detect-newline": "^3.0.0"
+      }
+    },
+    "jest-each": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.4.0.tgz",
+      "integrity": "sha512-+cyBh1ehs6thVT/bsZVG+WwmRn2ix4Q4noS9yLZgM10yGWPW12/TDvwuOV2VZXn1gi09/ZwJKJWql6YW1C9zNw==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "chalk": "^4.0.0",
+        "jest-get-type": "^26.3.0",
+        "jest-util": "^26.3.0",
+        "pretty-format": "^26.4.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "jest-get-type": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+          "dev": true
+        },
+        "pretty-format": {
+          "version": "26.4.0",
+          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.0.tgz",
+          "integrity": "sha512-mEEwwpCseqrUtuMbrJG4b824877pM5xald3AkilJ47Po2YLr97/siejYQHqj2oDQBeJNbu+Q0qUuekJ8F0NAPg==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^26.3.0",
+            "ansi-regex": "^5.0.0",
+            "ansi-styles": "^4.0.0",
+            "react-is": "^16.12.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-environment-jsdom": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.3.0.tgz",
+      "integrity": "sha512-zra8He2btIMJkAzvLaiZ9QwEPGEetbxqmjEBQwhH3CA+Hhhu0jSiEJxnJMbX28TGUvPLxBt/zyaTLrOPF4yMJA==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^26.3.0",
+        "@jest/fake-timers": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "jest-mock": "^26.3.0",
+        "jest-util": "^26.3.0",
+        "jsdom": "^16.2.2"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-environment-node": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.3.0.tgz",
+      "integrity": "sha512-c9BvYoo+FGcMj5FunbBgtBnbR5qk3uky8PKyRVpSfe2/8+LrNQMiXX53z6q2kY+j15SkjQCOSL/6LHnCPLVHNw==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^26.3.0",
+        "@jest/fake-timers": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "jest-mock": "^26.3.0",
+        "jest-util": "^26.3.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-get-type": {
+      "version": "25.2.6",
+      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
+      "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==",
+      "dev": true
+    },
+    "jest-haste-map": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.3.0.tgz",
+      "integrity": "sha512-DHWBpTJgJhLLGwE5Z1ZaqLTYqeODQIZpby0zMBsCU9iRFHYyhklYqP4EiG73j5dkbaAdSZhgB938mL51Q5LeZA==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "@types/graceful-fs": "^4.1.2",
+        "@types/node": "*",
+        "anymatch": "^3.0.3",
+        "fb-watchman": "^2.0.0",
+        "fsevents": "^2.1.2",
+        "graceful-fs": "^4.2.4",
+        "jest-regex-util": "^26.0.0",
+        "jest-serializer": "^26.3.0",
+        "jest-util": "^26.3.0",
+        "jest-worker": "^26.3.0",
+        "micromatch": "^4.0.2",
+        "sane": "^4.0.3",
+        "walker": "^1.0.7"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "anymatch": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+          "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+          "dev": true,
+          "requires": {
+            "normalize-path": "^3.0.0",
+            "picomatch": "^2.0.4"
+          }
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "fsevents": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+          "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+          "dev": true,
+          "optional": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "jest-jasmine2": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.4.0.tgz",
+      "integrity": "sha512-cGBxwzDDKB09EPJ4pE69BMDv+2lO442IB1xQd+vL3cua2OKdeXQK6iDlQKoRX/iP0RgU5T8sn9yahLcx/+ox8Q==",
+      "dev": true,
+      "requires": {
+        "@babel/traverse": "^7.1.0",
+        "@jest/environment": "^26.3.0",
+        "@jest/source-map": "^26.3.0",
+        "@jest/test-result": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "co": "^4.6.0",
+        "expect": "^26.4.0",
+        "is-generator-fn": "^2.0.0",
+        "jest-each": "^26.4.0",
+        "jest-matcher-utils": "^26.4.0",
+        "jest-message-util": "^26.3.0",
+        "jest-runtime": "^26.4.0",
+        "jest-snapshot": "^26.4.0",
+        "jest-util": "^26.3.0",
+        "pretty-format": "^26.4.0",
+        "throat": "^5.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "pretty-format": {
+          "version": "26.4.0",
+          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.0.tgz",
+          "integrity": "sha512-mEEwwpCseqrUtuMbrJG4b824877pM5xald3AkilJ47Po2YLr97/siejYQHqj2oDQBeJNbu+Q0qUuekJ8F0NAPg==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^26.3.0",
+            "ansi-regex": "^5.0.0",
+            "ansi-styles": "^4.0.0",
+            "react-is": "^16.12.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-leak-detector": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.4.0.tgz",
+      "integrity": "sha512-7EXKKEKnAWUPyiVtGZzJflbPOtYUdlNoevNVOkAcPpdR8xWiYKPGNGA6sz25S+8YhZq3rmkQJYAh3/P0VnoRwA==",
+      "dev": true,
+      "requires": {
+        "jest-get-type": "^26.3.0",
+        "pretty-format": "^26.4.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "jest-get-type": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+          "dev": true
+        },
+        "pretty-format": {
+          "version": "26.4.0",
+          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.0.tgz",
+          "integrity": "sha512-mEEwwpCseqrUtuMbrJG4b824877pM5xald3AkilJ47Po2YLr97/siejYQHqj2oDQBeJNbu+Q0qUuekJ8F0NAPg==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^26.3.0",
+            "ansi-regex": "^5.0.0",
+            "ansi-styles": "^4.0.0",
+            "react-is": "^16.12.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-matcher-utils": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.4.0.tgz",
+      "integrity": "sha512-u+xdCdq+F262DH+PutJKXLGr2H5P3DImdJCir51PGSfi3TtbLQ5tbzKaN8BkXbiTIU6ayuAYBWTlU1nyckVdzA==",
+      "dev": true,
+      "requires": {
+        "chalk": "^4.0.0",
+        "jest-diff": "^26.4.0",
+        "jest-get-type": "^26.3.0",
+        "pretty-format": "^26.4.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "diff-sequences": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.3.0.tgz",
+          "integrity": "sha512-5j5vdRcw3CNctePNYN0Wy2e/JbWT6cAYnXv5OuqPhDpyCGc0uLu2TK0zOCJWNB9kOIfYMSpIulRaDgIi4HJ6Ig==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "jest-diff": {
+          "version": "26.4.0",
+          "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.4.0.tgz",
+          "integrity": "sha512-wwC38HlOW+iTq6j5tkj/ZamHn6/nrdcEOc/fKaVILNtN2NLWGdkfRaHWwfNYr5ehaLvuoG2LfCZIcWByVj0gjg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^4.0.0",
+            "diff-sequences": "^26.3.0",
+            "jest-get-type": "^26.3.0",
+            "pretty-format": "^26.4.0"
+          }
+        },
+        "jest-get-type": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+          "dev": true
+        },
+        "pretty-format": {
+          "version": "26.4.0",
+          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.0.tgz",
+          "integrity": "sha512-mEEwwpCseqrUtuMbrJG4b824877pM5xald3AkilJ47Po2YLr97/siejYQHqj2oDQBeJNbu+Q0qUuekJ8F0NAPg==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^26.3.0",
+            "ansi-regex": "^5.0.0",
+            "ansi-styles": "^4.0.0",
+            "react-is": "^16.12.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-message-util": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.3.0.tgz",
+      "integrity": "sha512-xIavRYqr4/otGOiLxLZGj3ieMmjcNE73Ui+LdSW/Y790j5acqCsAdDiLIbzHCZMpN07JOENRWX5DcU+OQ+TjTA==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "@jest/types": "^26.3.0",
+        "@types/stack-utils": "^1.0.1",
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.4",
+        "micromatch": "^4.0.2",
+        "slash": "^3.0.0",
+        "stack-utils": "^2.0.2"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "jest-mock": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.3.0.tgz",
+      "integrity": "sha512-PeaRrg8Dc6mnS35gOo/CbZovoDPKAeB1FICZiuagAgGvbWdNNyjQjkOaGUa/3N3JtpQ/Mh9P4A2D4Fv51NnP8Q==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "@types/node": "*"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-pnp-resolver": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
+      "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
+      "dev": true
+    },
+    "jest-regex-util": {
+      "version": "26.0.0",
+      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz",
+      "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==",
+      "dev": true
+    },
+    "jest-resolve": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.4.0.tgz",
+      "integrity": "sha512-bn/JoZTEXRSlEx3+SfgZcJAVuTMOksYq9xe9O6s4Ekg84aKBObEaVXKOEilULRqviSLAYJldnoWV9c07kwtiCg==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.4",
+        "jest-pnp-resolver": "^1.2.2",
+        "jest-util": "^26.3.0",
+        "read-pkg-up": "^7.0.1",
+        "resolve": "^1.17.0",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "parse-json": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz",
+          "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1",
+            "lines-and-columns": "^1.1.6"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+          "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+          "dev": true,
+          "requires": {
+            "@types/normalize-package-data": "^2.4.0",
+            "normalize-package-data": "^2.5.0",
+            "parse-json": "^5.0.0",
+            "type-fest": "^0.6.0"
+          },
+          "dependencies": {
+            "type-fest": {
+              "version": "0.6.0",
+              "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+              "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+              "dev": true
+            }
+          }
+        },
+        "read-pkg-up": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+          "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+          "dev": true,
+          "requires": {
+            "find-up": "^4.1.0",
+            "read-pkg": "^5.2.0",
+            "type-fest": "^0.8.1"
+          }
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-resolve-dependencies": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.4.0.tgz",
+      "integrity": "sha512-hznK/hlrlhu8hwdbieRdHFKmcV83GW8t30libt/v6j1L3IEzb8iN21SaWzV8KRAAK4ijiU0kuge0wnHn+0rytQ==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "jest-regex-util": "^26.0.0",
+        "jest-snapshot": "^26.4.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-runner": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.4.0.tgz",
+      "integrity": "sha512-XF+tnUGolnPriu6Gg+HHWftspMjD5NkTV2mQppQnpZe39GcUangJ0al7aBGtA3GbVAcRd048DQiJPmsQRdugjw==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^26.3.0",
+        "@jest/environment": "^26.3.0",
+        "@jest/test-result": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "emittery": "^0.7.1",
+        "exit": "^0.1.2",
+        "graceful-fs": "^4.2.4",
+        "jest-config": "^26.4.0",
+        "jest-docblock": "^26.0.0",
+        "jest-haste-map": "^26.3.0",
+        "jest-leak-detector": "^26.4.0",
+        "jest-message-util": "^26.3.0",
+        "jest-resolve": "^26.4.0",
+        "jest-runtime": "^26.4.0",
+        "jest-util": "^26.3.0",
+        "jest-worker": "^26.3.0",
+        "source-map-support": "^0.5.6",
+        "throat": "^5.0.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-runtime": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.4.0.tgz",
+      "integrity": "sha512-1fjZgGpkyQBUTo59Vi19I4IcsBwzY6uwVFNjUmR06iIi3XRErkY28yimi4IUDRrofQErqcDEw2n3DF9WmQ6vEg==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^26.3.0",
+        "@jest/environment": "^26.3.0",
+        "@jest/fake-timers": "^26.3.0",
+        "@jest/globals": "^26.4.0",
+        "@jest/source-map": "^26.3.0",
+        "@jest/test-result": "^26.3.0",
+        "@jest/transform": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/yargs": "^15.0.0",
+        "chalk": "^4.0.0",
+        "collect-v8-coverage": "^1.0.0",
+        "exit": "^0.1.2",
+        "glob": "^7.1.3",
+        "graceful-fs": "^4.2.4",
+        "jest-config": "^26.4.0",
+        "jest-haste-map": "^26.3.0",
+        "jest-message-util": "^26.3.0",
+        "jest-mock": "^26.3.0",
+        "jest-regex-util": "^26.0.0",
+        "jest-resolve": "^26.4.0",
+        "jest-snapshot": "^26.4.0",
+        "jest-util": "^26.3.0",
+        "jest-validate": "^26.4.0",
+        "slash": "^3.0.0",
+        "strip-bom": "^4.0.0",
+        "yargs": "^15.3.1"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "cliui": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+          "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+          "dev": true,
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^6.2.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-bom": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+          "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "yargs": {
+          "version": "15.4.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+          "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+          "dev": true,
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "18.1.3",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
+    "jest-serializer": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.3.0.tgz",
+      "integrity": "sha512-IDRBQBLPlKa4flg77fqg0n/pH87tcRKwe8zxOVTWISxGpPHYkRZ1dXKyh04JOja7gppc60+soKVZ791mruVdow==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "graceful-fs": "^4.2.4"
+      }
+    },
+    "jest-snapshot": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.4.0.tgz",
+      "integrity": "sha512-vFGmNGWHMBomrlOpheTMoqihymovuH3GqfmaEIWoPpsxUXyxT3IlbxI5I4m2vg0uv3HUJYg5JoGrkgMzVsAwCg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0",
+        "@jest/types": "^26.3.0",
+        "@types/prettier": "^2.0.0",
+        "chalk": "^4.0.0",
+        "expect": "^26.4.0",
+        "graceful-fs": "^4.2.4",
+        "jest-diff": "^26.4.0",
+        "jest-get-type": "^26.3.0",
+        "jest-haste-map": "^26.3.0",
+        "jest-matcher-utils": "^26.4.0",
+        "jest-message-util": "^26.3.0",
+        "jest-resolve": "^26.4.0",
+        "natural-compare": "^1.4.0",
+        "pretty-format": "^26.4.0",
+        "semver": "^7.3.2"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "diff-sequences": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.3.0.tgz",
+          "integrity": "sha512-5j5vdRcw3CNctePNYN0Wy2e/JbWT6cAYnXv5OuqPhDpyCGc0uLu2TK0zOCJWNB9kOIfYMSpIulRaDgIi4HJ6Ig==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "jest-diff": {
+          "version": "26.4.0",
+          "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.4.0.tgz",
+          "integrity": "sha512-wwC38HlOW+iTq6j5tkj/ZamHn6/nrdcEOc/fKaVILNtN2NLWGdkfRaHWwfNYr5ehaLvuoG2LfCZIcWByVj0gjg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^4.0.0",
+            "diff-sequences": "^26.3.0",
+            "jest-get-type": "^26.3.0",
+            "pretty-format": "^26.4.0"
+          }
+        },
+        "jest-get-type": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+          "dev": true
+        },
+        "pretty-format": {
+          "version": "26.4.0",
+          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.0.tgz",
+          "integrity": "sha512-mEEwwpCseqrUtuMbrJG4b824877pM5xald3AkilJ47Po2YLr97/siejYQHqj2oDQBeJNbu+Q0qUuekJ8F0NAPg==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^26.3.0",
+            "ansi-regex": "^5.0.0",
+            "ansi-styles": "^4.0.0",
+            "react-is": "^16.12.0"
+          }
+        },
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-util": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.3.0.tgz",
+      "integrity": "sha512-4zpn6bwV0+AMFN0IYhH/wnzIQzRaYVrz1A8sYnRnj4UXDXbOVtWmlaZkO9mipFqZ13okIfN87aDoJWB7VH6hcw==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.4",
+        "is-ci": "^2.0.0",
+        "micromatch": "^4.0.2"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "jest-validate": {
+      "version": "26.4.0",
+      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.4.0.tgz",
+      "integrity": "sha512-t56Z/FRMrLP6mpmje7/YgHy0wOzcuc6i3LBXz6kjmsUWYN62OuMdC86Vg9/dX59SvyitSqqegOrx+h7BkNXeaQ==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^26.3.0",
+        "camelcase": "^6.0.0",
+        "chalk": "^4.0.0",
+        "jest-get-type": "^26.3.0",
+        "leven": "^3.1.0",
+        "pretty-format": "^26.4.0"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "camelcase": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz",
+          "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==",
+          "dev": true
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "jest-get-type": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+          "dev": true
+        },
+        "pretty-format": {
+          "version": "26.4.0",
+          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.0.tgz",
+          "integrity": "sha512-mEEwwpCseqrUtuMbrJG4b824877pM5xald3AkilJ47Po2YLr97/siejYQHqj2oDQBeJNbu+Q0qUuekJ8F0NAPg==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^26.3.0",
+            "ansi-regex": "^5.0.0",
+            "ansi-styles": "^4.0.0",
+            "react-is": "^16.12.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "jest-watcher": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.3.0.tgz",
+      "integrity": "sha512-XnLdKmyCGJ3VoF6G/p5ohbJ04q/vv5aH9ENI+i6BL0uu9WWB6Z7Z2lhQQk0d2AVZcRGp1yW+/TsoToMhBFPRdQ==",
+      "dev": true,
+      "requires": {
+        "@jest/test-result": "^26.3.0",
+        "@jest/types": "^26.3.0",
+        "@types/node": "*",
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.0.0",
+        "jest-util": "^26.3.0",
+        "string-length": "^4.0.1"
+      },
+      "dependencies": {
+        "@jest/types": {
+          "version": "26.3.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz",
+          "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@types/istanbul-reports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+          "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-report": "*"
+          }
+        },
+        "ansi-escapes": {
+          "version": "4.3.1",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+          "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+          "dev": true,
+          "requires": {
+            "type-fest": "^0.11.0"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "type-fest": {
+          "version": "0.11.0",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
+          "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+          "dev": true
+        }
+      }
+    },
+    "jest-worker": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz",
+      "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^7.0.0"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "dev": true
+    },
+    "js-yaml": {
+      "version": "3.14.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+      "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+      "dev": true,
+      "requires": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      }
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+      "dev": true
+    },
+    "jsdom": {
+      "version": "16.4.0",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz",
+      "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==",
+      "dev": true,
+      "requires": {
+        "abab": "^2.0.3",
+        "acorn": "^7.1.1",
+        "acorn-globals": "^6.0.0",
+        "cssom": "^0.4.4",
+        "cssstyle": "^2.2.0",
+        "data-urls": "^2.0.0",
+        "decimal.js": "^10.2.0",
+        "domexception": "^2.0.1",
+        "escodegen": "^1.14.1",
+        "html-encoding-sniffer": "^2.0.1",
+        "is-potential-custom-element-name": "^1.0.0",
+        "nwsapi": "^2.2.0",
+        "parse5": "5.1.1",
+        "request": "^2.88.2",
+        "request-promise-native": "^1.0.8",
+        "saxes": "^5.0.0",
+        "symbol-tree": "^3.2.4",
+        "tough-cookie": "^3.0.1",
+        "w3c-hr-time": "^1.0.2",
+        "w3c-xmlserializer": "^2.0.0",
+        "webidl-conversions": "^6.1.0",
+        "whatwg-encoding": "^1.0.5",
+        "whatwg-mimetype": "^2.3.0",
+        "whatwg-url": "^8.0.0",
+        "ws": "^7.2.3",
+        "xml-name-validator": "^3.0.0"
+      }
+    },
+    "jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+      "dev": true
+    },
+    "json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+      "dev": true
+    },
+    "json-schema": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+      "dev": true
+    },
+    "json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
+    },
+    "json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+      "dev": true
+    },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+      "dev": true
+    },
+    "json5": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+      "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+      "dev": true,
+      "requires": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "jsprim": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.2.3",
+        "verror": "1.10.0"
+      }
+    },
+    "kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "dev": true
+    },
+    "kleur": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+      "dev": true
+    },
+    "leven": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+      "dev": true
+    },
+    "levn": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
+      }
+    },
+    "lines-and-columns": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+      "dev": true
+    },
+    "listr": {
+      "version": "0.14.3",
+      "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz",
+      "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==",
+      "dev": true,
+      "requires": {
+        "@samverschueren/stream-to-observable": "^0.3.0",
+        "is-observable": "^1.1.0",
+        "is-promise": "^2.1.0",
+        "is-stream": "^1.1.0",
+        "listr-silent-renderer": "^1.1.1",
+        "listr-update-renderer": "^0.5.0",
+        "listr-verbose-renderer": "^0.5.0",
+        "p-map": "^2.0.0",
+        "rxjs": "^6.3.3"
+      }
+    },
+    "listr-silent-renderer": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz",
+      "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=",
+      "dev": true
+    },
+    "listr-update-renderer": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz",
+      "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.3",
+        "cli-truncate": "^0.2.1",
+        "elegant-spinner": "^1.0.1",
+        "figures": "^1.7.0",
+        "indent-string": "^3.0.0",
+        "log-symbols": "^1.0.2",
+        "log-update": "^2.3.0",
+        "strip-ansi": "^3.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "log-update": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz",
+          "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=",
+          "dev": true,
+          "requires": {
+            "ansi-escapes": "^3.0.0",
+            "cli-cursor": "^2.0.0",
+            "wrap-ansi": "^3.0.1"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "listr-verbose-renderer": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz",
+      "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.1",
+        "cli-cursor": "^2.1.0",
+        "date-fns": "^1.27.2",
+        "figures": "^2.0.0"
+      },
+      "dependencies": {
+        "figures": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+          "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "^1.0.5"
+          }
+        }
+      }
+    },
+    "load-json-file": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+      "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "strip-bom": "^3.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "locate-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+      "dev": true,
+      "requires": {
+        "p-locate": "^3.0.0",
+        "path-exists": "^3.0.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.20",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+      "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+      "dev": true
+    },
+    "lodash.memoize": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+      "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+      "dev": true
+    },
+    "lodash.sortby": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+      "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+      "dev": true
+    },
+    "log-symbols": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
+      "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "log-update": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/log-update/-/log-update-3.4.0.tgz",
+      "integrity": "sha512-ILKe88NeMt4gmDvk/eb615U/IVn7K9KWGkoYbdatQ69Z65nj1ZzjM6fHXfcs0Uge+e+EGnMW7DY4T9yko8vWFg==",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^3.2.0",
+        "cli-cursor": "^2.1.0",
+        "wrap-ansi": "^5.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          }
+        }
+      }
+    },
+    "loud-rejection": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+      "dev": true,
+      "requires": {
+        "currently-unhandled": "^0.4.1",
+        "signal-exit": "^3.0.0"
+      }
+    },
+    "luxon": {
+      "version": "1.24.1",
+      "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.24.1.tgz",
+      "integrity": "sha512-CgnIMKAWT0ghcuWFfCWBnWGOddM0zu6c4wZAWmD0NN7MZTnro0+833DF6tJep+xlxRPg4KtsYEHYLfTMBQKwYg=="
+    },
+    "make-error": {
+      "version": "1.3.6",
+      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+      "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+      "dev": true
+    },
+    "makeerror": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
+      "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
+      "dev": true,
+      "requires": {
+        "tmpl": "1.0.x"
+      }
+    },
+    "map-age-cleaner": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
+      "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
+      "dev": true,
+      "requires": {
+        "p-defer": "^1.0.0"
+      },
+      "dependencies": {
+        "p-defer": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
+          "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
+          "dev": true
+        }
+      }
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+      "dev": true
+    },
+    "map-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+      "dev": true
+    },
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "dev": true,
+      "requires": {
+        "object-visit": "^1.0.0"
+      }
+    },
+    "meeussunmoon": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/meeussunmoon/-/meeussunmoon-3.0.2.tgz",
+      "integrity": "sha512-6uQcR1d6fg436iNU8ofWTeQqY8dpY7jEzGIiZ6w0wrvXFTJOigHnyzjD4oxBYKn6+N+UZ64qK6cw7noJFH5Sog==",
+      "dev": true,
+      "requires": {
+        "luxon": "^1.24.1"
+      }
+    },
+    "mem": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz",
+      "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==",
+      "dev": true,
+      "requires": {
+        "map-age-cleaner": "^0.1.3",
+        "mimic-fn": "^2.1.0",
+        "p-is-promise": "^2.1.0"
+      },
+      "dependencies": {
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        }
+      }
+    },
+    "meow": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+      "dev": true,
+      "requires": {
+        "camelcase-keys": "^2.0.0",
+        "decamelize": "^1.1.2",
+        "loud-rejection": "^1.0.0",
+        "map-obj": "^1.0.1",
+        "minimist": "^1.1.3",
+        "normalize-package-data": "^2.3.4",
+        "object-assign": "^4.0.1",
+        "read-pkg-up": "^1.0.1",
+        "redent": "^1.0.0",
+        "trim-newlines": "^1.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+          "dev": true,
+          "requires": {
+            "path-exists": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "load-json-file": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+          "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "parse-json": "^2.2.0",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0",
+            "strip-bom": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+          "dev": true,
+          "requires": {
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "path-type": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+          "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+          "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "^1.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^1.0.0"
+          }
+        },
+        "read-pkg-up": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+          "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+          "dev": true,
+          "requires": {
+            "find-up": "^1.0.0",
+            "read-pkg": "^1.0.0"
+          }
+        },
+        "strip-bom": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+          "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+          "dev": true,
+          "requires": {
+            "is-utf8": "^0.2.0"
+          }
+        }
+      }
+    },
+    "merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "dev": true
+    },
+    "micromatch": {
+      "version": "3.1.10",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+      "dev": true,
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.3.1",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "extglob": "^2.0.4",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^6.0.2",
+        "nanomatch": "^1.2.9",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.2"
+      }
+    },
+    "mime-db": {
+      "version": "1.44.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+      "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
+      "dev": true
+    },
+    "mime-types": {
+      "version": "2.1.27",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+      "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+      "dev": true,
+      "requires": {
+        "mime-db": "1.44.0"
+      }
+    },
+    "mimic-fn": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+      "dev": true
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "dev": true,
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+      "dev": true
+    },
+    "mixin-deep": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+      "dev": true,
+      "requires": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "mkdirp": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+      "dev": true,
+      "requires": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "moment": {
+      "version": "2.27.0",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz",
+      "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==",
+      "dev": true
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "dev": true
+    },
+    "nanomatch": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+      "dev": true,
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "fragment-cache": "^0.2.1",
+        "is-windows": "^1.0.2",
+        "kind-of": "^6.0.2",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      }
+    },
+    "natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+      "dev": true
+    },
+    "nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+      "dev": true
+    },
+    "node-int64": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+      "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
+      "dev": true
+    },
+    "node-modules-regexp": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
+      "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=",
+      "dev": true
+    },
+    "node-notifier": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-7.0.2.tgz",
+      "integrity": "sha512-ux+n4hPVETuTL8+daJXTOC6uKLgMsl1RYfFv7DKRzyvzBapqco0rZZ9g72ZN8VS6V+gvNYHYa/ofcCY8fkJWsA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "growly": "^1.3.0",
+        "is-wsl": "^2.2.0",
+        "semver": "^7.3.2",
+        "shellwords": "^0.1.1",
+        "uuid": "^8.2.0",
+        "which": "^2.0.2"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "normalize-package-data": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+      "dev": true,
+      "requires": {
+        "hosted-git-info": "^2.1.4",
+        "resolve": "^1.10.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
+      }
+    },
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true
+    },
+    "npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+      "dev": true,
+      "requires": {
+        "path-key": "^2.0.0"
+      },
+      "dependencies": {
+        "path-key": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+          "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+          "dev": true
+        }
+      }
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+      "dev": true
+    },
+    "nwsapi": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
+      "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==",
+      "dev": true
+    },
+    "oauth-sign": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+      "dev": true
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+      "dev": true
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "dev": true,
+      "requires": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "object-inspect": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+      "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+      "dev": true
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "dev": true
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.0"
+      }
+    },
+    "object.assign": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+      "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.2",
+        "function-bind": "^1.1.1",
+        "has-symbols": "^1.0.0",
+        "object-keys": "^1.0.11"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "object.values": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
+      "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1",
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3"
+      }
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "dev": true,
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "onetime": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+      "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+      "dev": true,
+      "requires": {
+        "mimic-fn": "^1.0.0"
+      }
+    },
+    "optionator": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+      "dev": true,
+      "requires": {
+        "deep-is": "^0.1.3",
+        "fast-levenshtein": "^2.0.6",
+        "levn": "^0.4.1",
+        "prelude-ls": "^1.2.1",
+        "type-check": "^0.4.0",
+        "word-wrap": "^1.2.3"
+      }
+    },
+    "p-defer": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz",
+      "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==",
+      "dev": true
+    },
+    "p-each-series": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz",
+      "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==",
+      "dev": true
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "dev": true
+    },
+    "p-is-promise": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
+      "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
+      "dev": true
+    },
+    "p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dev": true,
+      "requires": {
+        "p-try": "^2.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+      "dev": true,
+      "requires": {
+        "p-limit": "^2.0.0"
+      }
+    },
+    "p-map": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+      "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+      "dev": true
+    },
+    "p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "dev": true
+    },
+    "parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "requires": {
+        "callsites": "^3.0.0"
+      }
+    },
+    "parse-json": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "dev": true,
+      "requires": {
+        "error-ex": "^1.2.0"
+      }
+    },
+    "parse-ms": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz",
+      "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==",
+      "dev": true
+    },
+    "parse5": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
+      "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
+      "dev": true
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+      "dev": true
+    },
+    "path-exists": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+      "dev": true
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "dev": true
+    },
+    "path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+      "dev": true
+    },
+    "path-type": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+      "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+      "dev": true,
+      "requires": {
+        "pify": "^2.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "performance-now": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+      "dev": true
+    },
+    "picomatch": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+      "dev": true
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+      "dev": true
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "dev": true,
+      "requires": {
+        "pinkie": "^2.0.0"
+      }
+    },
+    "pirates": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
+      "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==",
+      "dev": true,
+      "requires": {
+        "node-modules-regexp": "^1.0.0"
+      }
+    },
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+      "dev": true
+    },
+    "prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+      "dev": true
+    },
+    "pretty-bytes": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz",
+      "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==",
+      "dev": true
+    },
+    "pretty-format": {
+      "version": "25.5.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz",
+      "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^25.5.0",
+        "ansi-regex": "^5.0.0",
+        "ansi-styles": "^4.0.0",
+        "react-is": "^16.12.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        }
+      }
+    },
+    "pretty-ms": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-5.1.0.tgz",
+      "integrity": "sha512-4gaK1skD2gwscCfkswYQRmddUb2GJZtzDGRjHWadVHtK/DIKFufa12MvES6/xu1tVbUYeia5bmLcwJtZJQUqnw==",
+      "dev": true,
+      "requires": {
+        "parse-ms": "^2.1.0"
+      }
+    },
+    "progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+      "dev": true
+    },
+    "prompts": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz",
+      "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==",
+      "dev": true,
+      "requires": {
+        "kleur": "^3.0.3",
+        "sisteransi": "^1.0.4"
+      }
+    },
+    "psl": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+      "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
+      "dev": true
+    },
+    "pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+      "dev": true
+    },
+    "qs": {
+      "version": "6.5.2",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+      "dev": true
+    },
+    "randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "react-is": {
+      "version": "16.13.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+      "dev": true
+    },
+    "read-pkg": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+      "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+      "dev": true,
+      "requires": {
+        "load-json-file": "^2.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^2.0.0"
+      }
+    },
+    "read-pkg-up": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+      "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+      "dev": true,
+      "requires": {
+        "find-up": "^2.0.0",
+        "read-pkg": "^2.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^2.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^2.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+          "dev": true,
+          "requires": {
+            "p-try": "^1.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^1.1.0"
+          }
+        },
+        "p-try": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+          "dev": true
+        }
+      }
+    },
+    "redent": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+      "dev": true,
+      "requires": {
+        "indent-string": "^2.1.0",
+        "strip-indent": "^1.0.1"
+      },
+      "dependencies": {
+        "indent-string": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+          "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+          "dev": true,
+          "requires": {
+            "repeating": "^2.0.0"
+          }
+        }
+      }
+    },
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "regexpp": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
+      "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+      "dev": true
+    },
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+      "dev": true
+    },
+    "repeat-element": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+      "dev": true
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+      "dev": true
+    },
+    "repeating": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+      "dev": true,
+      "requires": {
+        "is-finite": "^1.0.0"
+      }
+    },
+    "request": {
+      "version": "2.88.2",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+      "dev": true,
+      "requires": {
+        "aws-sign2": "~0.7.0",
+        "aws4": "^1.8.0",
+        "caseless": "~0.12.0",
+        "combined-stream": "~1.0.6",
+        "extend": "~3.0.2",
+        "forever-agent": "~0.6.1",
+        "form-data": "~2.3.2",
+        "har-validator": "~5.1.3",
+        "http-signature": "~1.2.0",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.19",
+        "oauth-sign": "~0.9.0",
+        "performance-now": "^2.1.0",
+        "qs": "~6.5.2",
+        "safe-buffer": "^5.1.2",
+        "tough-cookie": "~2.5.0",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.3.2"
+      },
+      "dependencies": {
+        "tough-cookie": {
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+          "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+          "dev": true,
+          "requires": {
+            "psl": "^1.1.28",
+            "punycode": "^2.1.1"
+          }
+        },
+        "uuid": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+          "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+          "dev": true
+        }
+      }
+    },
+    "request-promise-core": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
+      "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.19"
+      }
+    },
+    "request-promise-native": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
+      "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
+      "dev": true,
+      "requires": {
+        "request-promise-core": "1.1.4",
+        "stealthy-require": "^1.1.1",
+        "tough-cookie": "^2.3.3"
+      },
+      "dependencies": {
+        "tough-cookie": {
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+          "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+          "dev": true,
+          "requires": {
+            "psl": "^1.1.28",
+            "punycode": "^2.1.1"
+          }
+        }
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+      "dev": true
+    },
+    "require-main-filename": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+      "dev": true
+    },
+    "require-relative": {
+      "version": "0.8.7",
+      "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz",
+      "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+      "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+      "dev": true,
+      "requires": {
+        "path-parse": "^1.0.6"
+      }
+    },
+    "resolve-cwd": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^5.0.0"
+      },
+      "dependencies": {
+        "resolve-from": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+          "dev": true
+        }
+      }
+    },
+    "resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "dev": true
+    },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+      "dev": true
+    },
+    "restore-cursor": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+      "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+      "dev": true,
+      "requires": {
+        "onetime": "^2.0.0",
+        "signal-exit": "^3.0.2"
+      }
+    },
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+      "dev": true
+    },
+    "rimraf": {
+      "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
+    "rollup": {
+      "version": "2.26.0",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.26.0.tgz",
+      "integrity": "sha512-1kwpBuxQERz+ymjPLepaXqf3NMRDwSumuEfW/fsTtflmyyhI6ev7nLy5Vdadvn01zd0WWAojRuvA2+0coPGCGQ==",
+      "dev": true,
+      "requires": {
+        "fsevents": "~2.1.2"
+      },
+      "dependencies": {
+        "fsevents": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+          "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "rollup-plugin-re": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-re/-/rollup-plugin-re-1.0.7.tgz",
+      "integrity": "sha1-/hdHBO1ZzahMrwK9ATtYLm/apPY=",
+      "dev": true,
+      "requires": {
+        "magic-string": "^0.16.0",
+        "rollup-pluginutils": "^2.0.1"
+      },
+      "dependencies": {
+        "magic-string": {
+          "version": "0.16.0",
+          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.16.0.tgz",
+          "integrity": "sha1-lw67DacZMwEoX7GqZQ85vdgetFo=",
+          "dev": true,
+          "requires": {
+            "vlq": "^0.2.1"
+          }
+        }
+      }
+    },
+    "rollup-plugin-terser": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.0.tgz",
+      "integrity": "sha512-p/N3lLiFusCjYTLfVkoaiRTOGr5AESEaljMPH12MhOtoMkmTBhIAfuadrcWy4am1U0vU4WTxO9fi0K09O4CboQ==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.10.4",
+        "jest-worker": "^26.2.1",
+        "serialize-javascript": "^4.0.0",
+        "terser": "^5.0.0"
+      }
+    },
+    "rollup-pluginutils": {
+      "version": "2.8.2",
+      "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
+      "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
+      "dev": true,
+      "requires": {
+        "estree-walker": "^0.6.1"
+      },
+      "dependencies": {
+        "estree-walker": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
+          "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
+          "dev": true
+        }
+      }
+    },
+    "rsvp": {
+      "version": "4.8.5",
+      "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
+      "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==",
+      "dev": true
+    },
+    "rxjs": {
+      "version": "6.6.2",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+      "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.9.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.13.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+          "dev": true
+        }
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true
+    },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "dev": true,
+      "requires": {
+        "ret": "~0.1.10"
+      }
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true
+    },
+    "sane": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz",
+      "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==",
+      "dev": true,
+      "requires": {
+        "@cnakazawa/watch": "^1.0.3",
+        "anymatch": "^2.0.0",
+        "capture-exit": "^2.0.0",
+        "exec-sh": "^0.3.2",
+        "execa": "^1.0.0",
+        "fb-watchman": "^2.0.0",
+        "micromatch": "^3.1.4",
+        "minimist": "^1.1.1",
+        "walker": "~1.0.5"
+      }
+    },
+    "saxes": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+      "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+      "dev": true,
+      "requires": {
+        "xmlchars": "^2.2.0"
+      }
+    },
+    "semver": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+      "dev": true
+    },
+    "serialize-error": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-4.1.0.tgz",
+      "integrity": "sha512-5j9GgyGsP9vV9Uj1S0lDCvlsd+gc2LEPVK7HHHte7IyPwOD4lVQFeaX143gx3U5AnoCi+wbcb3mvaxVysjpxEw==",
+      "dev": true,
+      "requires": {
+        "type-fest": "^0.3.0"
+      },
+      "dependencies": {
+        "type-fest": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
+          "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==",
+          "dev": true
+        }
+      }
+    },
+    "serialize-javascript": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+      "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+      "dev": true,
+      "requires": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+      "dev": true
+    },
+    "set-value": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "^3.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true
+    },
+    "shellwords": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
+      "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
+      "dev": true,
+      "optional": true
+    },
+    "signal-exit": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+      "dev": true
+    },
+    "sisteransi": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+      "dev": true
+    },
+    "slice-ansi": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^3.2.0",
+        "astral-regex": "^1.0.0",
+        "is-fullwidth-code-point": "^2.0.0"
+      }
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "dev": true,
+      "requires": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+      "dev": true,
+      "requires": {
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.2.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+      "dev": true
+    },
+    "source-map-resolve": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+      "dev": true,
+      "requires": {
+        "atob": "^2.1.2",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "source-map-support": {
+      "version": "0.5.19",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+      "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+      "dev": true,
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+      "dev": true
+    },
+    "spdx-correct": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+      "dev": true,
+      "requires": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+      "dev": true,
+      "requires": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
+      "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+      "dev": true
+    },
+    "split-lines": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/split-lines/-/split-lines-2.0.0.tgz",
+      "integrity": "sha512-gaIdhbqxkB5/VflPXsJwZvEzh/kdwiRPF9iqpkxX4us+lzB8INedFwjCyo6vwuz5x2Ddlnav2zh270CEjCG8mA==",
+      "dev": true
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.0"
+      }
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+      "dev": true
+    },
+    "sshpk": {
+      "version": "1.16.1",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+      "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+      "dev": true,
+      "requires": {
+        "asn1": "~0.2.3",
+        "assert-plus": "^1.0.0",
+        "bcrypt-pbkdf": "^1.0.0",
+        "dashdash": "^1.12.0",
+        "ecc-jsbn": "~0.1.1",
+        "getpass": "^0.1.1",
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.0.2",
+        "tweetnacl": "~0.14.0"
+      }
+    },
+    "stack-utils": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz",
+      "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^2.0.0"
+      },
+      "dependencies": {
+        "escape-string-regexp": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+          "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+          "dev": true
+        }
+      }
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "dev": true,
+      "requires": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "stats-lite": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/stats-lite/-/stats-lite-2.2.0.tgz",
+      "integrity": "sha512-/Kz55rgUIv2KP2MKphwYT/NCuSfAlbbMRv2ZWw7wyXayu230zdtzhxxuXXcvsc6EmmhS8bSJl3uS1wmMHFumbA==",
+      "dev": true,
+      "requires": {
+        "isnumber": "~1.0.0"
+      }
+    },
+    "stealthy-require": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
+      "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
+      "dev": true
+    },
+    "string-length": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz",
+      "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==",
+      "dev": true,
+      "requires": {
+        "char-regex": "^1.0.2",
+        "strip-ansi": "^6.0.0"
+      }
+    },
+    "string-width": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+      "dev": true,
+      "requires": {
+        "emoji-regex": "^7.0.1",
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^5.1.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
+      }
+    },
+    "string.prototype.trimend": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
+      "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
+      }
+    },
+    "string.prototype.trimstart": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
+      "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
+      }
+    },
+    "strip-ansi": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+      "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^5.0.0"
+      }
+    },
+    "strip-bom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+      "dev": true
+    },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+      "dev": true
+    },
+    "strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true
+    },
+    "strip-indent": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+      "dev": true,
+      "requires": {
+        "get-stdin": "^4.0.1"
+      }
+    },
+    "strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "dev": true
+    },
+    "supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
+    },
+    "supports-hyperlinks": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz",
+      "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==",
+      "dev": true,
+      "requires": {
+        "has-flag": "^4.0.0",
+        "supports-color": "^7.0.0"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "symbol-observable": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
+      "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==",
+      "dev": true
+    },
+    "symbol-tree": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+      "dev": true
+    },
+    "table": {
+      "version": "5.4.6",
+      "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
+      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.10.2",
+        "lodash": "^4.17.14",
+        "slice-ansi": "^2.1.0",
+        "string-width": "^3.0.0"
+      }
+    },
+    "terminal-link": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
+      "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^4.2.1",
+        "supports-hyperlinks": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-escapes": {
+          "version": "4.3.1",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+          "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+          "dev": true,
+          "requires": {
+            "type-fest": "^0.11.0"
+          }
+        },
+        "type-fest": {
+          "version": "0.11.0",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
+          "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+          "dev": true
+        }
+      }
+    },
+    "terser": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.1.0.tgz",
+      "integrity": "sha512-pwC1Jbzahz1ZPU87NQ8B3g5pKbhyJSiHih4gLH6WZiPU8mmS1IlGbB0A2Nuvkj/LCNsgIKctg6GkYwWCeTvXZQ==",
+      "dev": true,
+      "requires": {
+        "commander": "^2.20.0",
+        "source-map": "~0.6.1",
+        "source-map-support": "~0.5.12"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.20.3",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "test-exclude": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+      "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+      "dev": true,
+      "requires": {
+        "@istanbuljs/schema": "^0.1.2",
+        "glob": "^7.1.4",
+        "minimatch": "^3.0.4"
+      }
+    },
+    "text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+      "dev": true
+    },
+    "throat": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
+      "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
+      "dev": true
+    },
+    "tmpl": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
+      "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=",
+      "dev": true
+    },
+    "to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+      "dev": true
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+      "dev": true,
+      "requires": {
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "dev": true,
+      "requires": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      }
+    },
+    "tough-cookie": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
+      "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==",
+      "dev": true,
+      "requires": {
+        "ip-regex": "^2.1.0",
+        "psl": "^1.1.28",
+        "punycode": "^2.1.1"
+      }
+    },
+    "tr46": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz",
+      "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==",
+      "dev": true,
+      "requires": {
+        "punycode": "^2.1.1"
+      }
+    },
+    "tree-kill": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+      "dev": true
+    },
+    "trim-newlines": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+      "dev": true
+    },
+    "ts-jest": {
+      "version": "26.2.0",
+      "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.2.0.tgz",
+      "integrity": "sha512-9+y2qwzXdAImgLSYLXAb/Rhq9+K4rbt0417b8ai987V60g2uoNWBBmMkYgutI7D8Zhu+IbCSHbBtrHxB9d7xyA==",
+      "dev": true,
+      "requires": {
+        "@types/jest": "26.x",
+        "bs-logger": "0.x",
+        "buffer-from": "1.x",
+        "fast-json-stable-stringify": "2.x",
+        "jest-util": "26.x",
+        "json5": "2.x",
+        "lodash.memoize": "4.x",
+        "make-error": "1.x",
+        "mkdirp": "1.x",
+        "semver": "7.x",
+        "yargs-parser": "18.x"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "dev": true
+        },
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        },
+        "yargs-parser": {
+          "version": "18.1.3",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
+    "ts-node": {
+      "version": "8.10.2",
+      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz",
+      "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==",
+      "dev": true,
+      "requires": {
+        "arg": "^4.1.0",
+        "diff": "^4.0.1",
+        "make-error": "^1.1.1",
+        "source-map-support": "^0.5.17",
+        "yn": "3.1.1"
+      }
+    },
+    "ts-node-dev": {
+      "version": "1.0.0-pre.57",
+      "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.0.0-pre.57.tgz",
+      "integrity": "sha512-xxk1d1jAK5hXumW7HtsbWZja1wBte3sy+avZY/mK2RAvD22ezlJI9H4EXicDxiW3rkBO/YqTfS0L+K3HwucA9A==",
+      "dev": true,
+      "requires": {
+        "chokidar": "^3.4.0",
+        "dateformat": "~1.0.4-1.2.3",
+        "dynamic-dedupe": "^0.3.0",
+        "minimist": "^1.2.5",
+        "mkdirp": "^1.0.4",
+        "resolve": "^1.0.0",
+        "rimraf": "^2.6.1",
+        "source-map-support": "^0.5.12",
+        "tree-kill": "^1.2.2",
+        "ts-node": "^8.10.2",
+        "tsconfig": "^7.0.0"
+      },
+      "dependencies": {
+        "anymatch": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+          "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+          "dev": true,
+          "requires": {
+            "normalize-path": "^3.0.0",
+            "picomatch": "^2.0.4"
+          }
+        },
+        "binary-extensions": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+          "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+          "dev": true
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chokidar": {
+          "version": "3.4.2",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
+          "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
+          "dev": true,
+          "requires": {
+            "anymatch": "~3.1.1",
+            "braces": "~3.0.2",
+            "fsevents": "~2.1.2",
+            "glob-parent": "~5.1.0",
+            "is-binary-path": "~2.1.0",
+            "is-glob": "~4.0.1",
+            "normalize-path": "~3.0.0",
+            "readdirp": "~3.4.0"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "fsevents": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+          "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+          "dev": true,
+          "optional": true
+        },
+        "glob-parent": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+          "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "is-binary-path": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+          "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+          "dev": true,
+          "requires": {
+            "binary-extensions": "^2.0.0"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "dev": true
+        },
+        "readdirp": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
+          "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
+          "dev": true,
+          "requires": {
+            "picomatch": "^2.2.1"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "tsconfig": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz",
+      "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==",
+      "dev": true,
+      "requires": {
+        "@types/strip-bom": "^3.0.0",
+        "@types/strip-json-comments": "0.0.30",
+        "strip-bom": "^3.0.0",
+        "strip-json-comments": "^2.0.0"
+      },
+      "dependencies": {
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+          "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+          "dev": true
+        }
+      }
+    },
+    "tsconfig-paths": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz",
+      "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==",
+      "dev": true,
+      "requires": {
+        "@types/json5": "^0.0.29",
+        "json5": "^1.0.1",
+        "minimist": "^1.2.0",
+        "strip-bom": "^3.0.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        }
+      }
+    },
+    "tslib": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz",
+      "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==",
+      "dev": true
+    },
+    "tsutils": {
+      "version": "3.17.1",
+      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz",
+      "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.8.1"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.13.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+          "dev": true
+        }
+      }
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+      "dev": true
+    },
+    "type-check": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "^1.2.1"
+      }
+    },
+    "type-detect": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+      "dev": true
+    },
+    "type-fest": {
+      "version": "0.8.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+      "dev": true
+    },
+    "typedarray-to-buffer": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+      "dev": true,
+      "requires": {
+        "is-typedarray": "^1.0.0"
+      }
+    },
+    "typescript": {
+      "version": "3.9.7",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz",
+      "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==",
+      "dev": true
+    },
+    "union-value": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^2.0.1"
+      }
+    },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "dev": true,
+      "requires": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "dev": true,
+          "requires": {
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "dev": true,
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+          "dev": true
+        }
+      }
+    },
+    "uri-js": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+      "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+      "dev": true,
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+      "dev": true
+    },
+    "use": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+      "dev": true
+    },
+    "uuid": {
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz",
+      "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==",
+      "dev": true,
+      "optional": true
+    },
+    "v8-compile-cache": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
+      "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==",
+      "dev": true
+    },
+    "v8-to-istanbul": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-5.0.1.tgz",
+      "integrity": "sha512-mbDNjuDajqYe3TXFk5qxcQy8L1msXNE37WTlLoqqpBfRsimbNcrlhQlDPntmECEcUvdC+AQ8CyMMf6EUx1r74Q==",
+      "dev": true,
+      "requires": {
+        "@types/istanbul-lib-coverage": "^2.0.1",
+        "convert-source-map": "^1.6.0",
+        "source-map": "^0.7.3"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.7.3",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+          "dev": true
+        }
+      }
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      }
+    },
+    "vlq": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
+      "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
+      "dev": true
+    },
+    "w3c-hr-time": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+      "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+      "dev": true,
+      "requires": {
+        "browser-process-hrtime": "^1.0.0"
+      }
+    },
+    "w3c-xmlserializer": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
+      "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
+      "dev": true,
+      "requires": {
+        "xml-name-validator": "^3.0.0"
+      }
+    },
+    "walker": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
+      "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
+      "dev": true,
+      "requires": {
+        "makeerror": "1.0.x"
+      }
+    },
+    "webidl-conversions": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+      "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+      "dev": true
+    },
+    "whatwg-encoding": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+      "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+      "dev": true,
+      "requires": {
+        "iconv-lite": "0.4.24"
+      }
+    },
+    "whatwg-mimetype": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+      "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+      "dev": true
+    },
+    "whatwg-url": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.1.0.tgz",
+      "integrity": "sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==",
+      "dev": true,
+      "requires": {
+        "lodash.sortby": "^4.7.0",
+        "tr46": "^2.0.2",
+        "webidl-conversions": "^5.0.0"
+      },
+      "dependencies": {
+        "webidl-conversions": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
+          "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
+          "dev": true
+        }
+      }
+    },
+    "which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dev": true,
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "which-module": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+      "dev": true
+    },
+    "word-wrap": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+      "dev": true
+    },
+    "wrap-ansi": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz",
+      "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=",
+      "dev": true,
+      "requires": {
+        "string-width": "^2.1.1",
+        "strip-ansi": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+          "dev": true,
+          "requires": {
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^4.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        }
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "dev": true
+    },
+    "write": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
+      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+      "dev": true,
+      "requires": {
+        "mkdirp": "^0.5.1"
+      }
+    },
+    "write-file-atomic": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+      "dev": true,
+      "requires": {
+        "imurmurhash": "^0.1.4",
+        "is-typedarray": "^1.0.0",
+        "signal-exit": "^3.0.2",
+        "typedarray-to-buffer": "^3.1.5"
+      }
+    },
+    "ws": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
+      "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==",
+      "dev": true
+    },
+    "xml-name-validator": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+      "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
+      "dev": true
+    },
+    "xmlchars": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+      "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+      "dev": true
+    },
+    "xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "dev": true
+    },
+    "y18n": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+      "dev": true
+    },
+    "yargs": {
+      "version": "13.3.2",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+      "dev": true,
+      "requires": {
+        "cliui": "^5.0.0",
+        "find-up": "^3.0.0",
+        "get-caller-file": "^2.0.1",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^2.0.0",
+        "set-blocking": "^2.0.0",
+        "string-width": "^3.0.0",
+        "which-module": "^2.0.0",
+        "y18n": "^4.0.0",
+        "yargs-parser": "^13.1.2"
+      }
+    },
+    "yargs-parser": {
+      "version": "13.1.2",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+      "dev": true,
+      "requires": {
+        "camelcase": "^5.0.0",
+        "decamelize": "^1.2.0"
+      }
+    },
+    "yn": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+      "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+      "dev": true
+    },
+    "zen-observable": {
+      "version": "0.8.15",
+      "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz",
+      "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==",
+      "dev": true
+    }
+  }
+}

+ 69 - 0
package.json

@@ -0,0 +1,69 @@
+{
+  "name": "badidate",
+  "version": "3.0.2",
+  "description": "A library for dates in the Badí' (or Bahá'í) calendar.",
+  "main": "dist/localBadiDate-msm-locales.js",
+  "module": "dist/localBadiDate-msm-locales.m.js",
+  "types": "dist/badiDate.d.ts",
+  "directories": {
+    "test": "test"
+  },
+  "scripts": {
+    "lint": "eslint --ext .js --ext .ts .",
+    "rollup": "fancy-rollup && node ./dist-rename.js",
+    "test": "jest",
+    "build": "npm run lint && npm run test && npm run rollup",
+    "generateYearData": "ts-node-dev --transpile-only res/generateYearData.ts",
+    "calculateUncertainties": "ts-node-dev --transpile-only res/uncertainties.ts"
+  },
+  "dependencies": {
+    "luxon": "^1.24.1"
+  },
+  "devDependencies": {
+    "@rollup/plugin-node-resolve": "^9.0.0",
+    "@rollup/plugin-typescript": "^5.0.2",
+    "@types/jest": "^26.0.10",
+    "@types/luxon": "^1.24.3",
+    "@typescript-eslint/eslint-plugin": "^3.9.0",
+    "@typescript-eslint/parser": "^3.9.0",
+    "eslint": "7.7.0",
+    "eslint-config-standard": "14.1.1",
+    "eslint-plugin-import": "2.22.0",
+    "eslint-plugin-node": "11.1.0",
+    "eslint-plugin-prefer-arrow": "^1.2.2",
+    "eslint-plugin-promise": "4.2.1",
+    "eslint-plugin-standard": "4.0.1",
+    "fancy-rollup": "^0.5.4",
+    "jest": "^26.4.0",
+    "meeussunmoon": "^3.0.2",
+    "rollup": "2.26.0",
+    "rollup-plugin-re": "^1.0.7",
+    "rollup-plugin-terser": "^7.0.0",
+    "ts-jest": "^26.2.0",
+    "ts-node-dev": "1.0.0-pre.57",
+    "tslib": "^2.0.1",
+    "typescript": "^3.9.7"
+  },
+  "engines": {
+    "node": ">= 10.0.0"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/janrg/badiDate.git"
+  },
+  "keywords": [
+    "Badí'",
+    "calendar",
+    "Bahá'í",
+    "calendar"
+  ],
+  "author": "Jan Greis",
+  "contributors": [
+    "Brett Zamir"
+  ],
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/janrg/badiDate/issues"
+  },
+  "homepage": "https://github.com/janrg/badiDate#readme"
+}

+ 1684 - 0
res/badiYearsLongFormat.ts

@@ -0,0 +1,1684 @@
+const badiYears = {
+    172: {
+        ayyamiHaLength: 4,
+        nawRuz: '2015-03-21',
+        twinBirthdays: [13, 10, 13, 11],
+    },
+    173: {
+        ayyamiHaLength: 4,
+        nawRuz: '2016-03-20',
+        twinBirthdays: [12, 18, 12, 19],
+    },
+    174: {
+        ayyamiHaLength: 5,
+        nawRuz: '2017-03-20',
+        twinBirthdays: [12, 7, 12, 8],
+    },
+    175: {
+        ayyamiHaLength: 4,
+        nawRuz: '2018-03-21',
+        twinBirthdays: [13, 6, 13, 7],
+    },
+    176: {
+        ayyamiHaLength: 4,
+        nawRuz: '2019-03-21',
+        twinBirthdays: [12, 14, 12, 15],
+    },
+    177: {
+        ayyamiHaLength: 4,
+        nawRuz: '2020-03-20',
+        twinBirthdays: [12, 4, 12, 5],
+    },
+    178: {
+        ayyamiHaLength: 5,
+        nawRuz: '2021-03-20',
+        twinBirthdays: [13, 4, 13, 5],
+    },
+    179: {
+        ayyamiHaLength: 4,
+        nawRuz: '2022-03-21',
+        twinBirthdays: [12, 11, 12, 12],
+    },
+    180: {
+        ayyamiHaLength: 4,
+        nawRuz: '2023-03-21',
+        twinBirthdays: [12, 1, 12, 2],
+    },
+    181: {
+        ayyamiHaLength: 4,
+        nawRuz: '2024-03-20',
+        twinBirthdays: [12, 19, 13, 1],
+    },
+    182: {
+        ayyamiHaLength: 5,
+        nawRuz: '2025-03-20',
+        twinBirthdays: [12, 8, 12, 9],
+    },
+    183: {
+        ayyamiHaLength: 4,
+        nawRuz: '2026-03-21',
+        twinBirthdays: [13, 7, 13, 8],
+    },
+    184: {
+        ayyamiHaLength: 4,
+        nawRuz: '2027-03-21',
+        twinBirthdays: [12, 15, 12, 16],
+    },
+    185: {
+        ayyamiHaLength: 4,
+        nawRuz: '2028-03-20',
+        twinBirthdays: [12, 5, 12, 6],
+    },
+    186: {
+        ayyamiHaLength: 4,
+        nawRuz: '2029-03-20',
+        twinBirthdays: [13, 5, 13, 6],
+    },
+    187: {
+        ayyamiHaLength: 5,
+        nawRuz: '2030-03-20',
+        twinBirthdays: [12, 14, 12, 15],
+    },
+    188: {
+        ayyamiHaLength: 4,
+        nawRuz: '2031-03-21',
+        twinBirthdays: [12, 2, 12, 3],
+    },
+    189: {
+        ayyamiHaLength: 4,
+        nawRuz: '2032-03-20',
+        twinBirthdays: [13, 2, 13, 3],
+    },
+    190: {
+        ayyamiHaLength: 4,
+        nawRuz: '2033-03-20',
+        twinBirthdays: [12, 10, 12, 11],
+    },
+    191: {
+        ayyamiHaLength: 5,
+        nawRuz: '2034-03-20',
+        twinBirthdays: [13, 10, 13, 11],
+    },
+    192: {
+        ayyamiHaLength: 4,
+        nawRuz: '2035-03-21',
+        twinBirthdays: [12, 17, 12, 18],
+    },
+    193: {
+        ayyamiHaLength: 4,
+        nawRuz: '2036-03-20',
+        twinBirthdays: [12, 6, 12, 7],
+    },
+    194: {
+        ayyamiHaLength: 4,
+        nawRuz: '2037-03-20',
+        twinBirthdays: [13, 6, 13, 7],
+    },
+    195: {
+        ayyamiHaLength: 5,
+        nawRuz: '2038-03-20',
+        twinBirthdays: [12, 15, 12, 16],
+    },
+    196: {
+        ayyamiHaLength: 4,
+        nawRuz: '2039-03-21',
+        twinBirthdays: [12, 4, 12, 5],
+    },
+    197: {
+        ayyamiHaLength: 4,
+        nawRuz: '2040-03-20',
+        twinBirthdays: [13, 4, 13, 5],
+    },
+    198: {
+        ayyamiHaLength: 4,
+        nawRuz: '2041-03-20',
+        twinBirthdays: [12, 12, 12, 13],
+    },
+    199: {
+        ayyamiHaLength: 5,
+        nawRuz: '2042-03-20',
+        twinBirthdays: [12, 1, 12, 2],
+    },
+    200: {
+        ayyamiHaLength: 4,
+        nawRuz: '2043-03-21',
+        twinBirthdays: [12, 19, 13, 1],
+    },
+    201: {
+        ayyamiHaLength: 4,
+        nawRuz: '2044-03-20',
+        twinBirthdays: [12, 8, 12, 9],
+    },
+    202: {
+        ayyamiHaLength: 4,
+        nawRuz: '2045-03-20',
+        twinBirthdays: [13, 8, 13, 9],
+    },
+    203: {
+        ayyamiHaLength: 5,
+        nawRuz: '2046-03-20',
+        twinBirthdays: [12, 16, 12, 17],
+    },
+    204: {
+        ayyamiHaLength: 4,
+        nawRuz: '2047-03-21',
+        twinBirthdays: [12, 5, 12, 6],
+    },
+    205: {
+        ayyamiHaLength: 4,
+        nawRuz: '2048-03-20',
+        twinBirthdays: [13, 5, 13, 6],
+    },
+    206: {
+        ayyamiHaLength: 4,
+        nawRuz: '2049-03-20',
+        twinBirthdays: [12, 14, 12, 15],
+    },
+    207: {
+        ayyamiHaLength: 5,
+        nawRuz: '2050-03-20',
+        twinBirthdays: [12, 3, 12, 4],
+    },
+    208: {
+        ayyamiHaLength: 4,
+        nawRuz: '2051-03-21',
+        twinBirthdays: [13, 2, 13, 3],
+    },
+    209: {
+        ayyamiHaLength: 4,
+        nawRuz: '2052-03-20',
+        twinBirthdays: [12, 10, 12, 11],
+    },
+    210: {
+        ayyamiHaLength: 4,
+        nawRuz: '2053-03-20',
+        twinBirthdays: [13, 9, 13, 10],
+    },
+    211: {
+        ayyamiHaLength: 5,
+        nawRuz: '2054-03-20',
+        twinBirthdays: [12, 18, 12, 19],
+    },
+    212: {
+        ayyamiHaLength: 4,
+        nawRuz: '2055-03-21',
+        twinBirthdays: [12, 6, 12, 7],
+    },
+    213: {
+        ayyamiHaLength: 4,
+        nawRuz: '2056-03-20',
+        twinBirthdays: [13, 6, 13, 7],
+    },
+    214: {
+        ayyamiHaLength: 4,
+        nawRuz: '2057-03-20',
+        twinBirthdays: [12, 15, 12, 16],
+    },
+    215: {
+        ayyamiHaLength: 4,
+        nawRuz: '2058-03-20',
+        twinBirthdays: [12, 4, 12, 5],
+    },
+    216: {
+        ayyamiHaLength: 5,
+        nawRuz: '2059-03-20',
+        twinBirthdays: [13, 4, 13, 5],
+    },
+    217: {
+        ayyamiHaLength: 4,
+        nawRuz: '2060-03-20',
+        twinBirthdays: [12, 11, 12, 12],
+    },
+    218: {
+        ayyamiHaLength: 4,
+        nawRuz: '2061-03-20',
+        twinBirthdays: [11, 19, 12, 1],
+    },
+    219: {
+        ayyamiHaLength: 4,
+        nawRuz: '2062-03-20',
+        twinBirthdays: [12, 19, 13, 1],
+    },
+    220: {
+        ayyamiHaLength: 5,
+        nawRuz: '2063-03-20',
+        twinBirthdays: [12, 9, 12, 10],
+    },
+    221: {
+        ayyamiHaLength: 4,
+        nawRuz: '2064-03-20',
+        twinBirthdays: [13, 8, 13, 9],
+    },
+    222: {
+        ayyamiHaLength: 4,
+        nawRuz: '2065-03-20',
+        twinBirthdays: [12, 16, 12, 17],
+    },
+    223: {
+        ayyamiHaLength: 4,
+        nawRuz: '2066-03-20',
+        twinBirthdays: [12, 6, 12, 7],
+    },
+    224: {
+        ayyamiHaLength: 5,
+        nawRuz: '2067-03-20',
+        twinBirthdays: [13, 6, 13, 7],
+    },
+    225: {
+        ayyamiHaLength: 4,
+        nawRuz: '2068-03-20',
+        twinBirthdays: [12, 13, 12, 14],
+    },
+    226: {
+        ayyamiHaLength: 4,
+        nawRuz: '2069-03-20',
+        twinBirthdays: [12, 2, 12, 3],
+    },
+    227: {
+        ayyamiHaLength: 4,
+        nawRuz: '2070-03-20',
+        twinBirthdays: [13, 2, 13, 3],
+    },
+    228: {
+        ayyamiHaLength: 5,
+        nawRuz: '2071-03-20',
+        twinBirthdays: [12, 10, 12, 11],
+    },
+    229: {
+        ayyamiHaLength: 4,
+        nawRuz: '2072-03-20',
+        twinBirthdays: [13, 9, 13, 10],
+    },
+    230: {
+        ayyamiHaLength: 4,
+        nawRuz: '2073-03-20',
+        twinBirthdays: [12, 18, 12, 19],
+    },
+    231: {
+        ayyamiHaLength: 4,
+        nawRuz: '2074-03-20',
+        twinBirthdays: [12, 7, 12, 8],
+    },
+    232: {
+        ayyamiHaLength: 5,
+        nawRuz: '2075-03-20',
+        twinBirthdays: [13, 7, 13, 8],
+    },
+    233: {
+        ayyamiHaLength: 4,
+        nawRuz: '2076-03-20',
+        twinBirthdays: [12, 15, 12, 16],
+    },
+    234: {
+        ayyamiHaLength: 4,
+        nawRuz: '2077-03-20',
+        twinBirthdays: [12, 4, 12, 5],
+    },
+    235: {
+        ayyamiHaLength: 4,
+        nawRuz: '2078-03-20',
+        twinBirthdays: [13, 4, 13, 5],
+    },
+    236: {
+        ayyamiHaLength: 5,
+        nawRuz: '2079-03-20',
+        twinBirthdays: [12, 12, 12, 13],
+    },
+    237: {
+        ayyamiHaLength: 4,
+        nawRuz: '2080-03-20',
+        twinBirthdays: [11, 19, 12, 1],
+    },
+    238: {
+        ayyamiHaLength: 4,
+        nawRuz: '2081-03-20',
+        twinBirthdays: [12, 19, 13, 1],
+    },
+    239: {
+        ayyamiHaLength: 4,
+        nawRuz: '2082-03-20',
+        twinBirthdays: [12, 9, 12, 10],
+    },
+    240: {
+        ayyamiHaLength: 5,
+        nawRuz: '2083-03-20',
+        twinBirthdays: [13, 9, 13, 10],
+    },
+    241: {
+        ayyamiHaLength: 4,
+        nawRuz: '2084-03-20',
+        twinBirthdays: [12, 16, 12, 17],
+    },
+    242: {
+        ayyamiHaLength: 4,
+        nawRuz: '2085-03-20',
+        twinBirthdays: [12, 6, 12, 7],
+    },
+    243: {
+        ayyamiHaLength: 4,
+        nawRuz: '2086-03-20',
+        twinBirthdays: [13, 5, 13, 6],
+    },
+    244: {
+        ayyamiHaLength: 5,
+        nawRuz: '2087-03-20',
+        twinBirthdays: [12, 13, 12, 14],
+    },
+    245: {
+        ayyamiHaLength: 4,
+        nawRuz: '2088-03-20',
+        twinBirthdays: [12, 2, 12, 3],
+    },
+    246: {
+        ayyamiHaLength: 4,
+        nawRuz: '2089-03-20',
+        twinBirthdays: [13, 1, 13, 2],
+    },
+    247: {
+        ayyamiHaLength: 4,
+        nawRuz: '2090-03-20',
+        twinBirthdays: [12, 10, 12, 11],
+    },
+    248: {
+        ayyamiHaLength: 4,
+        nawRuz: '2091-03-20',
+        twinBirthdays: [13, 10, 13, 11],
+    },
+    249: {
+        ayyamiHaLength: 5,
+        nawRuz: '2092-03-19',
+        twinBirthdays: [12, 19, 13, 1],
+    },
+    250: {
+        ayyamiHaLength: 4,
+        nawRuz: '2093-03-20',
+        twinBirthdays: [12, 7, 12, 8],
+    },
+    251: {
+        ayyamiHaLength: 4,
+        nawRuz: '2094-03-20',
+        twinBirthdays: [13, 7, 13, 8],
+    },
+    252: {
+        ayyamiHaLength: 4,
+        nawRuz: '2095-03-20',
+        twinBirthdays: [12, 15, 12, 16],
+    },
+    253: {
+        ayyamiHaLength: 5,
+        nawRuz: '2096-03-19',
+        twinBirthdays: [12, 4, 12, 5],
+    },
+    254: {
+        ayyamiHaLength: 4,
+        nawRuz: '2097-03-20',
+        twinBirthdays: [13, 3, 13, 4],
+    },
+    255: {
+        ayyamiHaLength: 4,
+        nawRuz: '2098-03-20',
+        twinBirthdays: [12, 11, 12, 12],
+    },
+    256: {
+        ayyamiHaLength: 4,
+        nawRuz: '2099-03-20',
+        twinBirthdays: [12, 1, 12, 2],
+    },
+    257: {
+        ayyamiHaLength: 5,
+        nawRuz: '2100-03-20',
+        twinBirthdays: [13, 1, 13, 2],
+    },
+    258: {
+        ayyamiHaLength: 4,
+        nawRuz: '2101-03-21',
+        twinBirthdays: [12, 9, 12, 10],
+    },
+    259: {
+        ayyamiHaLength: 4,
+        nawRuz: '2102-03-21',
+        twinBirthdays: [13, 9, 13, 10],
+    },
+    260: {
+        ayyamiHaLength: 4,
+        nawRuz: '2103-03-21',
+        twinBirthdays: [12, 17, 12, 18],
+    },
+    261: {
+        ayyamiHaLength: 5,
+        nawRuz: '2104-03-20',
+        twinBirthdays: [12, 6, 12, 7],
+    },
+    262: {
+        ayyamiHaLength: 4,
+        nawRuz: '2105-03-21',
+        twinBirthdays: [13, 5, 13, 6],
+    },
+    263: {
+        ayyamiHaLength: 4,
+        nawRuz: '2106-03-21',
+        twinBirthdays: [12, 13, 12, 14],
+    },
+    264: {
+        ayyamiHaLength: 4,
+        nawRuz: '2107-03-21',
+        twinBirthdays: [12, 2, 12, 3],
+    },
+    265: {
+        ayyamiHaLength: 5,
+        nawRuz: '2108-03-20',
+        twinBirthdays: [13, 2, 13, 3],
+    },
+    266: {
+        ayyamiHaLength: 4,
+        nawRuz: '2109-03-21',
+        twinBirthdays: [12, 10, 12, 11],
+    },
+    267: {
+        ayyamiHaLength: 4,
+        nawRuz: '2110-03-21',
+        twinBirthdays: [13, 10, 13, 11],
+    },
+    268: {
+        ayyamiHaLength: 4,
+        nawRuz: '2111-03-21',
+        twinBirthdays: [12, 19, 13, 1],
+    },
+    269: {
+        ayyamiHaLength: 5,
+        nawRuz: '2112-03-20',
+        twinBirthdays: [12, 8, 12, 9],
+    },
+    270: {
+        ayyamiHaLength: 4,
+        nawRuz: '2113-03-21',
+        twinBirthdays: [13, 7, 13, 8],
+    },
+    271: {
+        ayyamiHaLength: 4,
+        nawRuz: '2114-03-21',
+        twinBirthdays: [12, 15, 12, 16],
+    },
+    272: {
+        ayyamiHaLength: 4,
+        nawRuz: '2115-03-21',
+        twinBirthdays: [12, 4, 12, 5],
+    },
+    273: {
+        ayyamiHaLength: 5,
+        nawRuz: '2116-03-20',
+        twinBirthdays: [13, 4, 13, 5],
+    },
+    274: {
+        ayyamiHaLength: 4,
+        nawRuz: '2117-03-21',
+        twinBirthdays: [12, 11, 12, 12],
+    },
+    275: {
+        ayyamiHaLength: 4,
+        nawRuz: '2118-03-21',
+        twinBirthdays: [12, 1, 12, 2],
+    },
+    276: {
+        ayyamiHaLength: 4,
+        nawRuz: '2119-03-21',
+        twinBirthdays: [13, 1, 13, 2],
+    },
+    277: {
+        ayyamiHaLength: 5,
+        nawRuz: '2120-03-20',
+        twinBirthdays: [12, 9, 12, 10],
+    },
+    278: {
+        ayyamiHaLength: 4,
+        nawRuz: '2121-03-21',
+        twinBirthdays: [13, 8, 13, 9],
+    },
+    279: {
+        ayyamiHaLength: 4,
+        nawRuz: '2122-03-21',
+        twinBirthdays: [12, 16, 12, 17],
+    },
+    280: {
+        ayyamiHaLength: 4,
+        nawRuz: '2123-03-21',
+        twinBirthdays: [12, 5, 12, 6],
+    },
+    281: {
+        ayyamiHaLength: 4,
+        nawRuz: '2124-03-20',
+        twinBirthdays: [13, 5, 13, 6],
+    },
+    282: {
+        ayyamiHaLength: 5,
+        nawRuz: '2125-03-20',
+        twinBirthdays: [12, 14, 12, 15],
+    },
+    283: {
+        ayyamiHaLength: 4,
+        nawRuz: '2126-03-21',
+        twinBirthdays: [12, 2, 12, 3],
+    },
+    284: {
+        ayyamiHaLength: 4,
+        nawRuz: '2127-03-21',
+        twinBirthdays: [13, 2, 13, 3],
+    },
+    285: {
+        ayyamiHaLength: 4,
+        nawRuz: '2128-03-20',
+        twinBirthdays: [12, 11, 12, 12],
+    },
+    286: {
+        ayyamiHaLength: 5,
+        nawRuz: '2129-03-20',
+        twinBirthdays: [13, 11, 13, 12],
+    },
+    287: {
+        ayyamiHaLength: 4,
+        nawRuz: '2130-03-21',
+        twinBirthdays: [12, 18, 12, 19],
+    },
+    288: {
+        ayyamiHaLength: 4,
+        nawRuz: '2131-03-21',
+        twinBirthdays: [12, 7, 12, 8],
+    },
+    289: {
+        ayyamiHaLength: 4,
+        nawRuz: '2132-03-20',
+        twinBirthdays: [13, 7, 13, 8],
+    },
+    290: {
+        ayyamiHaLength: 5,
+        nawRuz: '2133-03-20',
+        twinBirthdays: [12, 15, 12, 16],
+    },
+    291: {
+        ayyamiHaLength: 4,
+        nawRuz: '2134-03-21',
+        twinBirthdays: [12, 4, 12, 5],
+    },
+    292: {
+        ayyamiHaLength: 4,
+        nawRuz: '2135-03-21',
+        twinBirthdays: [13, 4, 13, 5],
+    },
+    293: {
+        ayyamiHaLength: 4,
+        nawRuz: '2136-03-20',
+        twinBirthdays: [12, 12, 12, 13],
+    },
+    294: {
+        ayyamiHaLength: 5,
+        nawRuz: '2137-03-20',
+        twinBirthdays: [12, 2, 12, 3],
+    },
+    295: {
+        ayyamiHaLength: 4,
+        nawRuz: '2138-03-21',
+        twinBirthdays: [13, 1, 13, 2],
+    },
+    296: {
+        ayyamiHaLength: 4,
+        nawRuz: '2139-03-21',
+        twinBirthdays: [12, 9, 12, 10],
+    },
+    297: {
+        ayyamiHaLength: 4,
+        nawRuz: '2140-03-20',
+        twinBirthdays: [13, 9, 13, 10],
+    },
+    298: {
+        ayyamiHaLength: 5,
+        nawRuz: '2141-03-20',
+        twinBirthdays: [12, 17, 12, 18],
+    },
+    299: {
+        ayyamiHaLength: 4,
+        nawRuz: '2142-03-21',
+        twinBirthdays: [12, 5, 12, 6],
+    },
+    300: {
+        ayyamiHaLength: 4,
+        nawRuz: '2143-03-21',
+        twinBirthdays: [13, 5, 13, 6],
+    },
+    301: {
+        ayyamiHaLength: 4,
+        nawRuz: '2144-03-20',
+        twinBirthdays: [12, 14, 12, 15],
+    },
+    302: {
+        ayyamiHaLength: 5,
+        nawRuz: '2145-03-20',
+        twinBirthdays: [12, 3, 12, 4],
+    },
+    303: {
+        ayyamiHaLength: 4,
+        nawRuz: '2146-03-21',
+        twinBirthdays: [13, 2, 13, 3],
+    },
+    304: {
+        ayyamiHaLength: 4,
+        nawRuz: '2147-03-21',
+        twinBirthdays: [12, 11, 12, 12],
+    },
+    305: {
+        ayyamiHaLength: 4,
+        nawRuz: '2148-03-20',
+        twinBirthdays: [13, 10, 13, 11],
+    },
+    306: {
+        ayyamiHaLength: 5,
+        nawRuz: '2149-03-20',
+        twinBirthdays: [12, 18, 12, 19],
+    },
+    307: {
+        ayyamiHaLength: 4,
+        nawRuz: '2150-03-21',
+        twinBirthdays: [12, 6, 12, 7],
+    },
+    308: {
+        ayyamiHaLength: 4,
+        nawRuz: '2151-03-21',
+        twinBirthdays: [13, 6, 13, 7],
+    },
+    309: {
+        ayyamiHaLength: 4,
+        nawRuz: '2152-03-20',
+        twinBirthdays: [12, 15, 12, 16],
+    },
+    310: {
+        ayyamiHaLength: 5,
+        nawRuz: '2153-03-20',
+        twinBirthdays: [12, 5, 12, 6],
+    },
+    311: {
+        ayyamiHaLength: 4,
+        nawRuz: '2154-03-21',
+        twinBirthdays: [13, 4, 13, 5],
+    },
+    312: {
+        ayyamiHaLength: 4,
+        nawRuz: '2155-03-21',
+        twinBirthdays: [12, 12, 12, 13],
+    },
+    313: {
+        ayyamiHaLength: 4,
+        nawRuz: '2156-03-20',
+        twinBirthdays: [12, 1, 12, 2],
+    },
+    314: {
+        ayyamiHaLength: 4,
+        nawRuz: '2157-03-20',
+        twinBirthdays: [13, 1, 13, 2],
+    },
+    315: {
+        ayyamiHaLength: 5,
+        nawRuz: '2158-03-20',
+        twinBirthdays: [12, 9, 12, 10],
+    },
+    316: {
+        ayyamiHaLength: 4,
+        nawRuz: '2159-03-21',
+        twinBirthdays: [13, 8, 13, 9],
+    },
+    317: {
+        ayyamiHaLength: 4,
+        nawRuz: '2160-03-20',
+        twinBirthdays: [12, 16, 12, 17],
+    },
+    318: {
+        ayyamiHaLength: 4,
+        nawRuz: '2161-03-20',
+        twinBirthdays: [12, 6, 12, 7],
+    },
+    319: {
+        ayyamiHaLength: 5,
+        nawRuz: '2162-03-20',
+        twinBirthdays: [13, 6, 13, 7],
+    },
+    320: {
+        ayyamiHaLength: 4,
+        nawRuz: '2163-03-21',
+        twinBirthdays: [12, 14, 12, 15],
+    },
+    321: {
+        ayyamiHaLength: 4,
+        nawRuz: '2164-03-20',
+        twinBirthdays: [12, 3, 12, 4],
+    },
+    322: {
+        ayyamiHaLength: 4,
+        nawRuz: '2165-03-20',
+        twinBirthdays: [13, 3, 13, 4],
+    },
+    323: {
+        ayyamiHaLength: 5,
+        nawRuz: '2166-03-20',
+        twinBirthdays: [12, 11, 12, 12],
+    },
+    324: {
+        ayyamiHaLength: 4,
+        nawRuz: '2167-03-21',
+        twinBirthdays: [13, 10, 13, 11],
+    },
+    325: {
+        ayyamiHaLength: 4,
+        nawRuz: '2168-03-20',
+        twinBirthdays: [12, 18, 12, 19],
+    },
+    326: {
+        ayyamiHaLength: 4,
+        nawRuz: '2169-03-20',
+        twinBirthdays: [12, 7, 12, 8],
+    },
+    327: {
+        ayyamiHaLength: 5,
+        nawRuz: '2170-03-20',
+        twinBirthdays: [13, 7, 13, 8],
+    },
+    328: {
+        ayyamiHaLength: 4,
+        nawRuz: '2171-03-21',
+        twinBirthdays: [12, 15, 12, 16],
+    },
+    329: {
+        ayyamiHaLength: 4,
+        nawRuz: '2172-03-20',
+        twinBirthdays: [12, 5, 12, 6],
+    },
+    330: {
+        ayyamiHaLength: 4,
+        nawRuz: '2173-03-20',
+        twinBirthdays: [13, 5, 13, 6],
+    },
+    331: {
+        ayyamiHaLength: 5,
+        nawRuz: '2174-03-20',
+        twinBirthdays: [12, 13, 12, 14],
+    },
+    332: {
+        ayyamiHaLength: 4,
+        nawRuz: '2175-03-21',
+        twinBirthdays: [12, 1, 12, 2],
+    },
+    333: {
+        ayyamiHaLength: 4,
+        nawRuz: '2176-03-20',
+        twinBirthdays: [12, 19, 13, 1],
+    },
+    334: {
+        ayyamiHaLength: 4,
+        nawRuz: '2177-03-20',
+        twinBirthdays: [12, 9, 12, 10],
+    },
+    335: {
+        ayyamiHaLength: 5,
+        nawRuz: '2178-03-20',
+        twinBirthdays: [13, 9, 13, 10],
+    },
+    336: {
+        ayyamiHaLength: 4,
+        nawRuz: '2179-03-21',
+        twinBirthdays: [12, 16, 12, 17],
+    },
+    337: {
+        ayyamiHaLength: 4,
+        nawRuz: '2180-03-20',
+        twinBirthdays: [12, 6, 12, 7],
+    },
+    338: {
+        ayyamiHaLength: 4,
+        nawRuz: '2181-03-20',
+        twinBirthdays: [13, 6, 13, 7],
+    },
+    339: {
+        ayyamiHaLength: 5,
+        nawRuz: '2182-03-20',
+        twinBirthdays: [12, 14, 12, 15],
+    },
+    340: {
+        ayyamiHaLength: 4,
+        nawRuz: '2183-03-21',
+        twinBirthdays: [12, 3, 12, 4],
+    },
+    341: {
+        ayyamiHaLength: 4,
+        nawRuz: '2184-03-20',
+        twinBirthdays: [13, 2, 13, 3],
+    },
+    342: {
+        ayyamiHaLength: 4,
+        nawRuz: '2185-03-20',
+        twinBirthdays: [12, 10, 12, 11],
+    },
+    343: {
+        ayyamiHaLength: 5,
+        nawRuz: '2186-03-20',
+        twinBirthdays: [11, 19, 12, 1],
+    },
+    344: {
+        ayyamiHaLength: 4,
+        nawRuz: '2187-03-21',
+        twinBirthdays: [12, 18, 12, 19],
+    },
+    345: {
+        ayyamiHaLength: 4,
+        nawRuz: '2188-03-20',
+        twinBirthdays: [12, 7, 12, 8],
+    },
+    346: {
+        ayyamiHaLength: 4,
+        nawRuz: '2189-03-20',
+        twinBirthdays: [13, 7, 13, 8],
+    },
+    347: {
+        ayyamiHaLength: 4,
+        nawRuz: '2190-03-20',
+        twinBirthdays: [12, 16, 12, 17],
+    },
+    348: {
+        ayyamiHaLength: 5,
+        nawRuz: '2191-03-20',
+        twinBirthdays: [12, 5, 12, 6],
+    },
+    349: {
+        ayyamiHaLength: 4,
+        nawRuz: '2192-03-20',
+        twinBirthdays: [13, 4, 13, 5],
+    },
+    350: {
+        ayyamiHaLength: 4,
+        nawRuz: '2193-03-20',
+        twinBirthdays: [12, 12, 12, 13],
+    },
+    351: {
+        ayyamiHaLength: 4,
+        nawRuz: '2194-03-20',
+        twinBirthdays: [12, 1, 12, 2],
+    },
+    352: {
+        ayyamiHaLength: 5,
+        nawRuz: '2195-03-20',
+        twinBirthdays: [13, 1, 13, 2],
+    },
+    353: {
+        ayyamiHaLength: 4,
+        nawRuz: '2196-03-20',
+        twinBirthdays: [12, 9, 12, 10],
+    },
+    354: {
+        ayyamiHaLength: 4,
+        nawRuz: '2197-03-20',
+        twinBirthdays: [13, 9, 13, 10],
+    },
+    355: {
+        ayyamiHaLength: 4,
+        nawRuz: '2198-03-20',
+        twinBirthdays: [12, 17, 12, 18],
+    },
+    356: {
+        ayyamiHaLength: 5,
+        nawRuz: '2199-03-20',
+        twinBirthdays: [12, 7, 12, 8],
+    },
+    357: {
+        ayyamiHaLength: 4,
+        nawRuz: '2200-03-21',
+        twinBirthdays: [13, 6, 13, 7],
+    },
+    358: {
+        ayyamiHaLength: 4,
+        nawRuz: '2201-03-21',
+        twinBirthdays: [12, 14, 12, 15],
+    },
+    359: {
+        ayyamiHaLength: 4,
+        nawRuz: '2202-03-21',
+        twinBirthdays: [12, 3, 12, 4],
+    },
+    360: {
+        ayyamiHaLength: 5,
+        nawRuz: '2203-03-21',
+        twinBirthdays: [13, 3, 13, 4],
+    },
+    361: {
+        ayyamiHaLength: 4,
+        nawRuz: '2204-03-21',
+        twinBirthdays: [12, 10, 12, 11],
+    },
+    362: {
+        ayyamiHaLength: 4,
+        nawRuz: '2205-03-21',
+        twinBirthdays: [13, 10, 13, 11],
+    },
+    363: {
+        ayyamiHaLength: 4,
+        nawRuz: '2206-03-21',
+        twinBirthdays: [12, 19, 13, 1],
+    },
+    364: {
+        ayyamiHaLength: 5,
+        nawRuz: '2207-03-21',
+        twinBirthdays: [12, 8, 12, 9],
+    },
+    365: {
+        ayyamiHaLength: 4,
+        nawRuz: '2208-03-21',
+        twinBirthdays: [13, 7, 13, 8],
+    },
+    366: {
+        ayyamiHaLength: 4,
+        nawRuz: '2209-03-21',
+        twinBirthdays: [12, 16, 12, 17],
+    },
+    367: {
+        ayyamiHaLength: 4,
+        nawRuz: '2210-03-21',
+        twinBirthdays: [12, 5, 12, 6],
+    },
+    368: {
+        ayyamiHaLength: 5,
+        nawRuz: '2211-03-21',
+        twinBirthdays: [13, 4, 13, 5],
+    },
+    369: {
+        ayyamiHaLength: 4,
+        nawRuz: '2212-03-21',
+        twinBirthdays: [12, 11, 12, 12],
+    },
+    370: {
+        ayyamiHaLength: 4,
+        nawRuz: '2213-03-21',
+        twinBirthdays: [12, 1, 12, 2],
+    },
+    371: {
+        ayyamiHaLength: 4,
+        nawRuz: '2214-03-21',
+        twinBirthdays: [13, 1, 13, 2],
+    },
+    372: {
+        ayyamiHaLength: 5,
+        nawRuz: '2215-03-21',
+        twinBirthdays: [12, 10, 12, 11],
+    },
+    373: {
+        ayyamiHaLength: 4,
+        nawRuz: '2216-03-21',
+        twinBirthdays: [13, 9, 13, 10],
+    },
+    374: {
+        ayyamiHaLength: 4,
+        nawRuz: '2217-03-21',
+        twinBirthdays: [12, 17, 12, 18],
+    },
+    375: {
+        ayyamiHaLength: 4,
+        nawRuz: '2218-03-21',
+        twinBirthdays: [12, 6, 12, 7],
+    },
+    376: {
+        ayyamiHaLength: 5,
+        nawRuz: '2219-03-21',
+        twinBirthdays: [13, 6, 13, 7],
+    },
+    377: {
+        ayyamiHaLength: 4,
+        nawRuz: '2220-03-21',
+        twinBirthdays: [12, 13, 12, 14],
+    },
+    378: {
+        ayyamiHaLength: 4,
+        nawRuz: '2221-03-21',
+        twinBirthdays: [12, 2, 12, 3],
+    },
+    379: {
+        ayyamiHaLength: 4,
+        nawRuz: '2222-03-21',
+        twinBirthdays: [13, 2, 13, 3],
+    },
+    380: {
+        ayyamiHaLength: 4,
+        nawRuz: '2223-03-21',
+        twinBirthdays: [12, 11, 12, 12],
+    },
+    381: {
+        ayyamiHaLength: 5,
+        nawRuz: '2224-03-20',
+        twinBirthdays: [12, 1, 12, 2],
+    },
+    382: {
+        ayyamiHaLength: 4,
+        nawRuz: '2225-03-21',
+        twinBirthdays: [12, 19, 13, 1],
+    },
+    383: {
+        ayyamiHaLength: 4,
+        nawRuz: '2226-03-21',
+        twinBirthdays: [12, 8, 12, 9],
+    },
+    384: {
+        ayyamiHaLength: 4,
+        nawRuz: '2227-03-21',
+        twinBirthdays: [13, 8, 13, 9],
+    },
+    385: {
+        ayyamiHaLength: 5,
+        nawRuz: '2228-03-20',
+        twinBirthdays: [12, 16, 12, 17],
+    },
+    386: {
+        ayyamiHaLength: 4,
+        nawRuz: '2229-03-21',
+        twinBirthdays: [12, 4, 12, 5],
+    },
+    387: {
+        ayyamiHaLength: 4,
+        nawRuz: '2230-03-21',
+        twinBirthdays: [13, 4, 13, 5],
+    },
+    388: {
+        ayyamiHaLength: 4,
+        nawRuz: '2231-03-21',
+        twinBirthdays: [12, 12, 12, 13],
+    },
+    389: {
+        ayyamiHaLength: 5,
+        nawRuz: '2232-03-20',
+        twinBirthdays: [12, 2, 12, 3],
+    },
+    390: {
+        ayyamiHaLength: 4,
+        nawRuz: '2233-03-21',
+        twinBirthdays: [13, 1, 13, 2],
+    },
+    391: {
+        ayyamiHaLength: 4,
+        nawRuz: '2234-03-21',
+        twinBirthdays: [12, 10, 12, 11],
+    },
+    392: {
+        ayyamiHaLength: 4,
+        nawRuz: '2235-03-21',
+        twinBirthdays: [13, 10, 13, 11],
+    },
+    393: {
+        ayyamiHaLength: 5,
+        nawRuz: '2236-03-20',
+        twinBirthdays: [12, 18, 12, 19],
+    },
+    394: {
+        ayyamiHaLength: 4,
+        nawRuz: '2237-03-21',
+        twinBirthdays: [12, 6, 12, 7],
+    },
+    395: {
+        ayyamiHaLength: 4,
+        nawRuz: '2238-03-21',
+        twinBirthdays: [13, 5, 13, 6],
+    },
+    396: {
+        ayyamiHaLength: 4,
+        nawRuz: '2239-03-21',
+        twinBirthdays: [12, 14, 12, 15],
+    },
+    397: {
+        ayyamiHaLength: 5,
+        nawRuz: '2240-03-20',
+        twinBirthdays: [12, 3, 12, 4],
+    },
+    398: {
+        ayyamiHaLength: 4,
+        nawRuz: '2241-03-21',
+        twinBirthdays: [13, 2, 13, 3],
+    },
+    399: {
+        ayyamiHaLength: 4,
+        nawRuz: '2242-03-21',
+        twinBirthdays: [12, 11, 12, 12],
+    },
+    400: {
+        ayyamiHaLength: 4,
+        nawRuz: '2243-03-21',
+        twinBirthdays: [13, 11, 13, 12],
+    },
+    401: {
+        ayyamiHaLength: 5,
+        nawRuz: '2244-03-20',
+        twinBirthdays: [12, 19, 13, 1],
+    },
+    402: {
+        ayyamiHaLength: 4,
+        nawRuz: '2245-03-21',
+        twinBirthdays: [12, 8, 12, 9],
+    },
+    403: {
+        ayyamiHaLength: 4,
+        nawRuz: '2246-03-21',
+        twinBirthdays: [13, 7, 13, 8],
+    },
+    404: {
+        ayyamiHaLength: 4,
+        nawRuz: '2247-03-21',
+        twinBirthdays: [12, 15, 12, 16],
+    },
+    405: {
+        ayyamiHaLength: 5,
+        nawRuz: '2248-03-20',
+        twinBirthdays: [12, 5, 12, 6],
+    },
+    406: {
+        ayyamiHaLength: 4,
+        nawRuz: '2249-03-21',
+        twinBirthdays: [13, 4, 13, 5],
+    },
+    407: {
+        ayyamiHaLength: 4,
+        nawRuz: '2250-03-21',
+        twinBirthdays: [12, 12, 12, 13],
+    },
+    408: {
+        ayyamiHaLength: 4,
+        nawRuz: '2251-03-21',
+        twinBirthdays: [12, 2, 12, 3],
+    },
+    409: {
+        ayyamiHaLength: 5,
+        nawRuz: '2252-03-20',
+        twinBirthdays: [13, 2, 13, 3],
+    },
+    410: {
+        ayyamiHaLength: 4,
+        nawRuz: '2253-03-21',
+        twinBirthdays: [12, 9, 12, 10],
+    },
+    411: {
+        ayyamiHaLength: 4,
+        nawRuz: '2254-03-21',
+        twinBirthdays: [13, 9, 13, 10],
+    },
+    412: {
+        ayyamiHaLength: 4,
+        nawRuz: '2255-03-21',
+        twinBirthdays: [12, 17, 12, 18],
+    },
+    413: {
+        ayyamiHaLength: 4,
+        nawRuz: '2256-03-20',
+        twinBirthdays: [12, 6, 12, 7],
+    },
+    414: {
+        ayyamiHaLength: 5,
+        nawRuz: '2257-03-20',
+        twinBirthdays: [13, 6, 13, 7],
+    },
+    415: {
+        ayyamiHaLength: 4,
+        nawRuz: '2258-03-21',
+        twinBirthdays: [12, 14, 12, 15],
+    },
+    416: {
+        ayyamiHaLength: 4,
+        nawRuz: '2259-03-21',
+        twinBirthdays: [12, 3, 12, 4],
+    },
+    417: {
+        ayyamiHaLength: 4,
+        nawRuz: '2260-03-20',
+        twinBirthdays: [13, 3, 13, 4],
+    },
+    418: {
+        ayyamiHaLength: 5,
+        nawRuz: '2261-03-20',
+        twinBirthdays: [12, 12, 12, 13],
+    },
+    419: {
+        ayyamiHaLength: 4,
+        nawRuz: '2262-03-21',
+        twinBirthdays: [13, 11, 13, 12],
+    },
+    420: {
+        ayyamiHaLength: 4,
+        nawRuz: '2263-03-21',
+        twinBirthdays: [12, 19, 13, 1],
+    },
+    421: {
+        ayyamiHaLength: 4,
+        nawRuz: '2264-03-20',
+        twinBirthdays: [12, 8, 12, 9],
+    },
+    422: {
+        ayyamiHaLength: 5,
+        nawRuz: '2265-03-20',
+        twinBirthdays: [13, 8, 13, 9],
+    },
+    423: {
+        ayyamiHaLength: 4,
+        nawRuz: '2266-03-21',
+        twinBirthdays: [12, 15, 12, 16],
+    },
+    424: {
+        ayyamiHaLength: 4,
+        nawRuz: '2267-03-21',
+        twinBirthdays: [12, 4, 12, 5],
+    },
+    425: {
+        ayyamiHaLength: 4,
+        nawRuz: '2268-03-20',
+        twinBirthdays: [13, 5, 13, 6],
+    },
+    426: {
+        ayyamiHaLength: 5,
+        nawRuz: '2269-03-20',
+        twinBirthdays: [12, 13, 12, 14],
+    },
+    427: {
+        ayyamiHaLength: 4,
+        nawRuz: '2270-03-21',
+        twinBirthdays: [12, 2, 12, 3],
+    },
+    428: {
+        ayyamiHaLength: 4,
+        nawRuz: '2271-03-21',
+        twinBirthdays: [13, 2, 13, 3],
+    },
+    429: {
+        ayyamiHaLength: 4,
+        nawRuz: '2272-03-20',
+        twinBirthdays: [12, 10, 12, 11],
+    },
+    430: {
+        ayyamiHaLength: 5,
+        nawRuz: '2273-03-20',
+        twinBirthdays: [13, 9, 13, 10],
+    },
+    431: {
+        ayyamiHaLength: 4,
+        nawRuz: '2274-03-21',
+        twinBirthdays: [12, 16, 12, 17],
+    },
+    432: {
+        ayyamiHaLength: 4,
+        nawRuz: '2275-03-21',
+        twinBirthdays: [12, 6, 12, 7],
+    },
+    433: {
+        ayyamiHaLength: 4,
+        nawRuz: '2276-03-20',
+        twinBirthdays: [13, 6, 13, 7],
+    },
+    434: {
+        ayyamiHaLength: 5,
+        nawRuz: '2277-03-20',
+        twinBirthdays: [12, 15, 12, 16],
+    },
+    435: {
+        ayyamiHaLength: 4,
+        nawRuz: '2278-03-21',
+        twinBirthdays: [12, 3, 12, 4],
+    },
+    436: {
+        ayyamiHaLength: 4,
+        nawRuz: '2279-03-21',
+        twinBirthdays: [13, 3, 13, 4],
+    },
+    437: {
+        ayyamiHaLength: 4,
+        nawRuz: '2280-03-20',
+        twinBirthdays: [12, 11, 12, 12],
+    },
+    438: {
+        ayyamiHaLength: 5,
+        nawRuz: '2281-03-20',
+        twinBirthdays: [11, 19, 12, 1],
+    },
+    439: {
+        ayyamiHaLength: 4,
+        nawRuz: '2282-03-21',
+        twinBirthdays: [12, 18, 12, 19],
+    },
+    440: {
+        ayyamiHaLength: 4,
+        nawRuz: '2283-03-21',
+        twinBirthdays: [12, 7, 12, 8],
+    },
+    441: {
+        ayyamiHaLength: 4,
+        nawRuz: '2284-03-20',
+        twinBirthdays: [13, 7, 13, 8],
+    },
+    442: {
+        ayyamiHaLength: 5,
+        nawRuz: '2285-03-20',
+        twinBirthdays: [12, 16, 12, 17],
+    },
+    443: {
+        ayyamiHaLength: 4,
+        nawRuz: '2286-03-21',
+        twinBirthdays: [12, 5, 12, 6],
+    },
+    444: {
+        ayyamiHaLength: 4,
+        nawRuz: '2287-03-21',
+        twinBirthdays: [13, 5, 13, 6],
+    },
+    445: {
+        ayyamiHaLength: 4,
+        nawRuz: '2288-03-20',
+        twinBirthdays: [12, 13, 12, 14],
+    },
+    446: {
+        ayyamiHaLength: 4,
+        nawRuz: '2289-03-20',
+        twinBirthdays: [12, 2, 12, 3],
+    },
+    447: {
+        ayyamiHaLength: 5,
+        nawRuz: '2290-03-20',
+        twinBirthdays: [13, 2, 13, 3],
+    },
+    448: {
+        ayyamiHaLength: 4,
+        nawRuz: '2291-03-21',
+        twinBirthdays: [12, 9, 12, 10],
+    },
+    449: {
+        ayyamiHaLength: 4,
+        nawRuz: '2292-03-20',
+        twinBirthdays: [13, 9, 13, 10],
+    },
+    450: {
+        ayyamiHaLength: 4,
+        nawRuz: '2293-03-20',
+        twinBirthdays: [12, 17, 12, 18],
+    },
+    451: {
+        ayyamiHaLength: 5,
+        nawRuz: '2294-03-20',
+        twinBirthdays: [12, 7, 12, 8],
+    },
+    452: {
+        ayyamiHaLength: 4,
+        nawRuz: '2295-03-21',
+        twinBirthdays: [13, 6, 13, 7],
+    },
+    453: {
+        ayyamiHaLength: 4,
+        nawRuz: '2296-03-20',
+        twinBirthdays: [12, 15, 12, 16],
+    },
+    454: {
+        ayyamiHaLength: 4,
+        nawRuz: '2297-03-20',
+        twinBirthdays: [12, 4, 12, 5],
+    },
+    455: {
+        ayyamiHaLength: 5,
+        nawRuz: '2298-03-20',
+        twinBirthdays: [13, 4, 13, 5],
+    },
+    456: {
+        ayyamiHaLength: 4,
+        nawRuz: '2299-03-21',
+        twinBirthdays: [12, 11, 12, 12],
+    },
+    457: {
+        ayyamiHaLength: 4,
+        nawRuz: '2300-03-21',
+        twinBirthdays: [11, 19, 12, 1],
+    },
+    458: {
+        ayyamiHaLength: 4,
+        nawRuz: '2301-03-21',
+        twinBirthdays: [12, 19, 13, 1],
+    },
+    459: {
+        ayyamiHaLength: 5,
+        nawRuz: '2302-03-21',
+        twinBirthdays: [12, 8, 12, 9],
+    },
+    460: {
+        ayyamiHaLength: 4,
+        nawRuz: '2303-03-22',
+        twinBirthdays: [13, 7, 13, 8],
+    },
+    461: {
+        ayyamiHaLength: 4,
+        nawRuz: '2304-03-21',
+        twinBirthdays: [12, 16, 12, 17],
+    },
+    462: {
+        ayyamiHaLength: 4,
+        nawRuz: '2305-03-21',
+        twinBirthdays: [12, 5, 12, 6],
+    },
+    463: {
+        ayyamiHaLength: 5,
+        nawRuz: '2306-03-21',
+        twinBirthdays: [13, 5, 13, 6],
+    },
+    464: {
+        ayyamiHaLength: 4,
+        nawRuz: '2307-03-22',
+        twinBirthdays: [12, 12, 12, 13],
+    },
+    465: {
+        ayyamiHaLength: 4,
+        nawRuz: '2308-03-21',
+        twinBirthdays: [12, 1, 12, 2],
+    },
+    466: {
+        ayyamiHaLength: 4,
+        nawRuz: '2309-03-21',
+        twinBirthdays: [13, 1, 13, 2],
+    },
+    467: {
+        ayyamiHaLength: 5,
+        nawRuz: '2310-03-21',
+        twinBirthdays: [12, 10, 12, 11],
+    },
+    468: {
+        ayyamiHaLength: 4,
+        nawRuz: '2311-03-22',
+        twinBirthdays: [13, 9, 13, 10],
+    },
+    469: {
+        ayyamiHaLength: 4,
+        nawRuz: '2312-03-21',
+        twinBirthdays: [12, 17, 12, 18],
+    },
+    470: {
+        ayyamiHaLength: 4,
+        nawRuz: '2313-03-21',
+        twinBirthdays: [12, 7, 12, 8],
+    },
+    471: {
+        ayyamiHaLength: 5,
+        nawRuz: '2314-03-21',
+        twinBirthdays: [13, 7, 13, 8],
+    },
+    472: {
+        ayyamiHaLength: 4,
+        nawRuz: '2315-03-22',
+        twinBirthdays: [12, 14, 12, 15],
+    },
+    473: {
+        ayyamiHaLength: 4,
+        nawRuz: '2316-03-21',
+        twinBirthdays: [12, 3, 12, 4],
+    },
+    474: {
+        ayyamiHaLength: 4,
+        nawRuz: '2317-03-21',
+        twinBirthdays: [13, 3, 13, 4],
+    },
+    475: {
+        ayyamiHaLength: 5,
+        nawRuz: '2318-03-21',
+        twinBirthdays: [12, 11, 12, 12],
+    },
+    476: {
+        ayyamiHaLength: 4,
+        nawRuz: '2319-03-22',
+        twinBirthdays: [11, 18, 11, 19],
+    },
+    477: {
+        ayyamiHaLength: 4,
+        nawRuz: '2320-03-21',
+        twinBirthdays: [12, 18, 12, 19],
+    },
+    478: {
+        ayyamiHaLength: 4,
+        nawRuz: '2321-03-21',
+        twinBirthdays: [12, 8, 12, 9],
+    },
+    479: {
+        ayyamiHaLength: 4,
+        nawRuz: '2322-03-21',
+        twinBirthdays: [13, 8, 13, 9],
+    },
+    480: {
+        ayyamiHaLength: 5,
+        nawRuz: '2323-03-21',
+        twinBirthdays: [12, 17, 12, 18],
+    },
+    481: {
+        ayyamiHaLength: 4,
+        nawRuz: '2324-03-21',
+        twinBirthdays: [12, 5, 12, 6],
+    },
+    482: {
+        ayyamiHaLength: 4,
+        nawRuz: '2325-03-21',
+        twinBirthdays: [13, 5, 13, 6],
+    },
+    483: {
+        ayyamiHaLength: 4,
+        nawRuz: '2326-03-21',
+        twinBirthdays: [12, 13, 12, 14],
+    },
+    484: {
+        ayyamiHaLength: 5,
+        nawRuz: '2327-03-21',
+        twinBirthdays: [12, 2, 12, 3],
+    },
+    485: {
+        ayyamiHaLength: 4,
+        nawRuz: '2328-03-21',
+        twinBirthdays: [13, 1, 13, 2],
+    },
+    486: {
+        ayyamiHaLength: 4,
+        nawRuz: '2329-03-21',
+        twinBirthdays: [12, 9, 12, 10],
+    },
+    487: {
+        ayyamiHaLength: 4,
+        nawRuz: '2330-03-21',
+        twinBirthdays: [13, 10, 13, 11],
+    },
+    488: {
+        ayyamiHaLength: 5,
+        nawRuz: '2331-03-21',
+        twinBirthdays: [12, 18, 12, 19],
+    },
+    489: {
+        ayyamiHaLength: 4,
+        nawRuz: '2332-03-21',
+        twinBirthdays: [12, 7, 12, 8],
+    },
+    490: {
+        ayyamiHaLength: 4,
+        nawRuz: '2333-03-21',
+        twinBirthdays: [13, 7, 13, 8],
+    },
+    491: {
+        ayyamiHaLength: 4,
+        nawRuz: '2334-03-21',
+        twinBirthdays: [12, 15, 12, 16],
+    },
+    492: {
+        ayyamiHaLength: 5,
+        nawRuz: '2335-03-21',
+        twinBirthdays: [12, 4, 12, 5],
+    },
+    493: {
+        ayyamiHaLength: 4,
+        nawRuz: '2336-03-21',
+        twinBirthdays: [13, 2, 13, 3],
+    },
+    494: {
+        ayyamiHaLength: 4,
+        nawRuz: '2337-03-21',
+        twinBirthdays: [12, 11, 12, 12],
+    },
+    495: {
+        ayyamiHaLength: 4,
+        nawRuz: '2338-03-21',
+        twinBirthdays: [11, 19, 12, 1],
+    },
+    496: {
+        ayyamiHaLength: 5,
+        nawRuz: '2339-03-21',
+        twinBirthdays: [13, 1, 13, 2],
+    },
+    497: {
+        ayyamiHaLength: 4,
+        nawRuz: '2340-03-21',
+        twinBirthdays: [12, 8, 12, 9],
+    },
+    498: {
+        ayyamiHaLength: 4,
+        nawRuz: '2341-03-21',
+        twinBirthdays: [13, 8, 13, 9],
+    },
+    499: {
+        ayyamiHaLength: 4,
+        nawRuz: '2342-03-21',
+        twinBirthdays: [12, 16, 12, 17],
+    },
+    500: {
+        ayyamiHaLength: 5,
+        nawRuz: '2343-03-21',
+        twinBirthdays: [12, 5, 12, 6],
+    },
+    501: {
+        ayyamiHaLength: 4,
+        nawRuz: '2344-03-21',
+        twinBirthdays: [13, 4, 13, 5],
+    },
+    502: {
+        ayyamiHaLength: 4,
+        nawRuz: '2345-03-21',
+        twinBirthdays: [12, 12, 12, 13],
+    },
+    503: {
+        ayyamiHaLength: 4,
+        nawRuz: '2346-03-21',
+        twinBirthdays: [12, 2, 12, 3],
+    },
+    504: {
+        ayyamiHaLength: 5,
+        nawRuz: '2347-03-21',
+        twinBirthdays: [13, 2, 13, 3],
+    },
+    505: {
+        ayyamiHaLength: 4,
+        nawRuz: '2348-03-21',
+        twinBirthdays: [12, 9, 12, 10],
+    },
+    506: {
+        ayyamiHaLength: 4,
+        nawRuz: '2349-03-21',
+        twinBirthdays: [13, 10, 13, 11],
+    },
+    507: {
+        ayyamiHaLength: 4,
+        nawRuz: '2350-03-21',
+        twinBirthdays: [12, 18, 12, 19],
+    },
+};
+
+export { badiYears };

+ 390 - 0
res/equinoxes.ts

@@ -0,0 +1,390 @@
+/* eslint-disable line-comment-position, max-len */
+const equinoxes = [
+    '2015-03-20T22:45:05Z', // Times until 2200 use the JPL DE405 Ephemeris
+    '2016-03-20T04:30:41Z',
+    '2017-03-20T10:28:24Z',
+    '2018-03-20T16:16:00Z',
+    '2019-03-20T21:57:43Z',
+    '2020-03-20T03:49:36Z',
+    '2021-03-20T09:37:06Z',
+    '2022-03-20T15:33:17Z',
+    '2023-03-20T21:24:52Z',
+    '2024-03-20T03:05:56Z',
+    '2025-03-20T09:02:02Z',
+    '2026-03-20T15:45:31Z', // Added 1 hour to force 2026 Naw-Rúz to agree with UHJ list, otherwise sunset is calculated to be 21 seconds after the equinox
+    '2027-03-20T20:24:43Z',
+    '2028-03-20T02:17:08Z',
+    '2029-03-20T08:01:23Z',
+    '2030-03-20T13:52:27Z',
+    '2031-03-20T19:40:08Z',
+    '2032-03-20T01:22:12Z',
+    '2033-03-20T07:22:27Z',
+    '2034-03-20T13:17:30Z',
+    '2035-03-20T19:02:45Z',
+    '2036-03-20T01:01:59Z',
+    '2037-03-20T06:50:11Z',
+    '2038-03-20T12:39:52Z',
+    '2039-03-20T18:32:10Z',
+    '2040-03-20T00:11:35Z',
+    '2041-03-20T06:06:44Z',
+    '2042-03-20T11:53:32Z',
+    '2043-03-20T17:26:51Z',
+    '2044-03-19T23:20:38Z',
+    '2045-03-20T05:06:44Z',
+    '2046-03-20T10:57:53Z',
+    '2047-03-20T16:52:23Z',
+    '2048-03-19T22:33:18Z',
+    '2049-03-20T04:28:52Z',
+    '2050-03-20T10:18:49Z',
+    '2051-03-20T15:59:27Z',
+    '2052-03-19T21:55:33Z',
+    '2053-03-20T03:47:01Z',
+    '2054-03-20T09:34:22Z',
+    '2055-03-20T15:27:46Z',
+    '2056-03-19T21:11:22Z',
+    '2057-03-20T03:07:26Z',
+    '2058-03-20T09:05:23Z',
+    '2059-03-20T14:43:45Z', // Close, but only to within 2 minutes, so should be safe
+    '2060-03-19T20:37:55Z',
+    '2061-03-20T02:25:53Z',
+    '2062-03-20T08:06:33Z',
+    '2063-03-20T13:59:22Z',
+    '2064-03-19T19:38:02Z',
+    '2065-03-20T01:28:20Z',
+    '2066-03-20T07:19:32Z',
+    '2067-03-20T12:52:58Z',
+    '2068-03-19T18:48:59Z',
+    '2069-03-20T00:44:05Z',
+    '2070-03-20T06:35:13Z',
+    '2071-03-20T12:33:51Z',
+    '2072-03-19T18:20:46Z',
+    '2073-03-20T00:13:14Z',
+    '2074-03-20T06:08:13Z',
+    '2075-03-20T11:46:45Z',
+    '2076-03-19T17:37:59Z',
+    '2077-03-19T23:30:54Z',
+    '2078-03-20T05:09:58Z',
+    '2079-03-20T10:59:59Z',
+    '2080-03-19T16:44:00Z',
+    '2081-03-19T22:33:42Z',
+    '2082-03-20T04:31:03Z',
+    '2083-03-20T10:09:43Z',
+    '2084-03-19T15:59:17Z',
+    '2085-03-19T21:52:51Z',
+    '2086-03-20T03:34:47Z',
+    '2087-03-20T09:28:23Z',
+    '2088-03-19T15:16:24Z',
+    '2089-03-19T21:07:05Z',
+    '2090-03-20T03:01:12Z',
+    '2091-03-20T08:41:39Z',
+    '2092-03-19T14:33:19Z',
+    '2093-03-19T20:33:47Z',
+    '2094-03-20T02:21:43Z',
+    '2095-03-20T08:13:54Z',
+    '2096-03-19T14:02:54Z',
+    '2097-03-19T19:47:51Z',
+    '2098-03-20T01:40:21Z',
+    '2099-03-20T07:17:46Z',
+    '2100-03-20T13:03:02Z',
+    '2101-03-20T18:56:37Z',
+    '2102-03-21T00:34:57Z',
+    '2103-03-21T06:22:51Z',
+    '2104-03-20T12:13:43Z',
+    '2105-03-20T18:06:19Z',
+    '2106-03-21T00:04:19Z',
+    '2107-03-21T05:49:10Z',
+    '2108-03-20T11:38:59Z',
+    '2109-03-20T17:34:57Z',
+    '2110-03-20T23:21:24Z',
+    '2111-03-21T05:10:13Z',
+    '2112-03-20T11:02:14Z',
+    '2113-03-20T16:51:02Z',
+    '2114-03-20T22:38:03Z',
+    '2115-03-21T04:22:19Z',
+    '2116-03-20T10:07:55Z',
+    '2117-03-20T16:05:46Z',
+    '2118-03-20T21:52:36Z',
+    '2119-03-21T03:37:37Z',
+    '2120-03-20T09:28:21Z',
+    '2121-03-20T15:14:34Z',
+    '2122-03-20T21:03:35Z',
+    '2123-03-21T02:48:05Z',
+    '2124-03-20T08:34:47Z',
+    '2125-03-20T14:28:52Z',
+    '2126-03-20T20:14:01Z',
+    '2127-03-21T02:02:13Z',
+    '2128-03-20T07:57:10Z',
+    '2129-03-20T13:54:39Z',
+    '2130-03-20T19:48:21Z',
+    '2131-03-21T01:35:45Z',
+    '2132-03-20T07:23:46Z',
+    '2133-03-20T13:13:56Z',
+    '2134-03-20T19:00:59Z',
+    '2135-03-21T00:43:34Z',
+    '2136-03-20T06:32:16Z',
+    '2137-03-20T12:20:38Z',
+    '2138-03-20T18:02:23Z',
+    '2139-03-20T23:47:34Z',
+    '2140-03-20T05:36:08Z',
+    '2141-03-20T11:31:24Z',
+    '2142-03-20T17:22:52Z',
+    '2143-03-20T23:09:39Z',
+    '2144-03-20T05:00:32Z',
+    '2145-03-20T10:55:32Z',
+    '2146-03-20T16:43:04Z',
+    '2147-03-20T22:31:24Z',
+    '2148-03-20T04:23:00Z',
+    '2149-03-20T10:11:50Z',
+    '2150-03-20T16:00:09Z',
+    '2151-03-20T21:46:24Z',
+    '2152-03-20T03:36:29Z',
+    '2153-03-20T09:35:36Z',
+    '2154-03-20T15:20:33Z',
+    '2155-03-20T21:04:45Z',
+    '2156-03-20T02:52:35Z',
+    '2157-03-20T08:37:44Z',
+    '2158-03-20T14:25:24Z',
+    '2159-03-20T20:09:55Z',
+    '2160-03-20T01:56:47Z',
+    '2161-03-20T07:50:09Z',
+    '2162-03-20T13:36:08Z',
+    '2163-03-20T19:22:11Z',
+    '2164-03-20T01:20:23Z',
+    '2165-03-20T07:15:26Z',
+    '2166-03-20T13:07:38Z',
+    '2167-03-20T18:58:59Z',
+    '2168-03-20T00:44:48Z',
+    '2169-03-20T06:42:04Z',
+    '2170-03-20T12:27:17Z',
+    '2171-03-20T18:07:40Z',
+    '2172-03-20T00:00:28Z',
+    '2173-03-20T05:41:57Z',
+    '2174-03-20T11:26:20Z',
+    '2175-03-20T17:14:19Z',
+    '2176-03-19T23:00:22Z',
+    '2177-03-20T05:02:04Z',
+    '2178-03-20T10:48:00Z',
+    '2179-03-20T16:30:48Z',
+    '2180-03-19T22:25:33Z',
+    '2181-03-20T04:14:02Z',
+    '2182-03-20T10:01:53Z',
+    '2183-03-20T15:54:51Z',
+    '2184-03-19T21:41:31Z',
+    '2185-03-20T03:37:19Z',
+    '2186-03-20T09:26:07Z',
+    '2187-03-20T15:07:35Z',
+    '2188-03-19T21:08:00Z',
+    '2189-03-20T02:59:07Z',
+    '2190-03-20T08:42:04Z',
+    '2191-03-20T14:33:35Z',
+    '2192-03-19T20:13:49Z',
+    '2193-03-20T02:06:47Z',
+    '2194-03-20T07:54:29Z',
+    '2195-03-20T13:30:46Z',
+    '2196-03-19T19:25:56Z',
+    '2197-03-20T01:11:10Z',
+    '2198-03-20T06:53:15Z',
+    '2199-03-20T12:49:30Z',
+    '2200-03-20T18:40:26Z',
+    '2201-03-21T00:40:47Z', // Times from here calculated using the VSOP87 which is slightly less accurate but only on the order of few seconds
+    '2202-03-21T06:35:01Z',
+    '2203-03-21T12:15:51Z',
+    '2204-03-20T18:12:36Z',
+    '2205-03-21T00:03:48Z',
+    '2206-03-21T05:43:44Z',
+    '2207-03-21T11:37:58Z',
+    '2208-03-20T17:20:13Z',
+    '2209-03-20T23:09:38Z',
+    '2210-03-21T04:59:31Z',
+    '2211-03-21T10:37:06Z',
+    '2212-03-20T16:36:03Z',
+    '2213-03-20T22:28:29Z',
+    '2214-03-21T04:06:58Z',
+    '2215-03-21T10:00:49Z',
+    '2216-03-20T15:45:34Z',
+    '2217-03-20T21:37:20Z',
+    '2218-03-21T03:30:44Z',
+    '2219-03-21T09:11:13Z',
+    '2220-03-20T15:05:49Z',
+    '2221-03-20T20:58:47Z',
+    '2222-03-21T02:38:46Z',
+    '2223-03-21T08:36:10Z',
+    '2224-03-20T14:30:56Z',
+    '2225-03-20T20:21:38Z',
+    '2226-03-21T02:17:04Z',
+    '2227-03-21T07:54:23Z',
+    '2228-03-20T13:44:49Z',
+    '2229-03-20T19:38:01Z',
+    '2230-03-21T01:11:55Z',
+    '2231-03-21T07:03:54Z',
+    '2232-03-20T12:49:11Z',
+    '2233-03-20T18:33:28Z',
+    '2234-03-21T00:27:08Z',
+    '2235-03-21T06:09:42Z',
+    '2236-03-20T12:07:41Z',
+    '2237-03-20T18:06:11Z',
+    '2238-03-20T23:46:40Z',
+    '2239-03-21T05:40:15Z',
+    '2240-03-20T11:32:22Z',
+    '2241-03-20T17:22:33Z',
+    '2242-03-20T23:15:47Z',
+    '2243-03-21T04:59:09Z',
+    '2244-03-20T10:46:52Z',
+    '2245-03-20T16:40:51Z',
+    '2246-03-20T22:17:52Z',
+    '2247-03-21T04:09:43Z',
+    '2248-03-20T10:05:56Z',
+    '2249-03-20T15:51:02Z',
+    '2250-03-20T21:42:02Z',
+    '2251-03-21T03:22:32Z',
+    '2252-03-20T09:09:46Z',
+    '2253-03-20T15:05:23Z',
+    '2254-03-20T20:43:24Z',
+    '2255-03-21T02:33:30Z',
+    '2256-03-20T08:27:38Z',
+    '2257-03-20T14:14:09Z',
+    '2258-03-20T20:08:29Z',
+    '2259-03-21T02:00:01Z',
+    '2260-03-20T07:55:23Z',
+    '2261-03-20T13:53:22Z',
+    '2262-03-20T19:34:41Z',
+    '2263-03-21T01:20:53Z',
+    '2264-03-20T07:15:07Z',
+    '2265-03-20T12:59:14Z',
+    '2266-03-20T18:45:53Z',
+    '2267-03-21T00:30:13Z',
+    '2268-03-20T06:13:21Z',
+    '2269-03-20T12:04:35Z',
+    '2270-03-20T17:44:48Z',
+    '2271-03-20T23:35:30Z',
+    '2272-03-20T05:34:16Z',
+    '2273-03-20T11:24:19Z',
+    '2274-03-20T17:13:57Z',
+    '2275-03-20T23:03:02Z',
+    '2276-03-20T04:54:37Z',
+    '2277-03-20T10:48:37Z',
+    '2278-03-20T16:33:28Z',
+    '2279-03-20T22:20:17Z',
+    '2280-03-20T04:13:10Z',
+    '2281-03-20T10:01:14Z',
+    '2282-03-20T15:47:28Z',
+    '2283-03-20T21:40:45Z',
+    '2284-03-20T03:31:29Z',
+    '2285-03-20T09:21:03Z',
+    '2286-03-20T15:03:00Z',
+    '2287-03-20T20:44:32Z',
+    '2288-03-20T02:38:29Z',
+    '2289-03-20T08:25:06Z',
+    '2290-03-20T14:10:30Z',
+    '2291-03-20T19:59:27Z',
+    '2292-03-20T01:48:37Z',
+    '2293-03-20T07:39:44Z',
+    '2294-03-20T13:28:05Z',
+    '2295-03-20T19:22:13Z',
+    '2296-03-20T01:19:55Z',
+    '2297-03-20T07:13:22Z',
+    '2298-03-20T12:59:03Z',
+    '2299-03-20T18:47:32Z',
+    '2300-03-21T00:40:14Z',
+    '2301-03-21T06:25:30Z',
+    '2302-03-21T12:09:46Z',
+    '2303-03-21T17:53:30Z',
+    '2304-03-20T23:39:04Z',
+    '2305-03-21T05:29:17Z',
+    '2306-03-21T11:13:08Z',
+    '2307-03-21T17:05:58Z',
+    '2308-03-20T23:01:32Z',
+    '2309-03-21T04:48:45Z',
+    '2310-03-21T10:34:25Z',
+    '2311-03-21T16:22:44Z',
+    '2312-03-20T22:14:25Z',
+    '2313-03-21T04:07:31Z',
+    '2314-03-21T09:54:36Z',
+    '2315-03-21T15:41:57Z',
+    '2316-03-20T21:37:05Z',
+    '2317-03-21T03:23:49Z',
+    '2318-03-21T09:11:55Z',
+    '2319-03-21T15:06:01Z',
+    '2320-03-20T20:56:14Z',
+    '2321-03-21T02:47:42Z',
+    '2322-03-21T08:30:01Z',
+    '2323-03-21T14:13:24Z',
+    '2324-03-20T20:08:18Z',
+    '2325-03-21T01:50:53Z',
+    '2326-03-21T07:33:57Z',
+    '2327-03-21T13:22:08Z',
+    '2328-03-20T19:08:06Z',
+    '2329-03-21T01:00:42Z',
+    '2330-03-21T06:51:56Z',
+    '2331-03-21T12:43:38Z',
+    '2332-03-20T18:45:18Z',
+    '2333-03-21T00:33:59Z',
+    '2334-03-21T06:16:48Z',
+    '2335-03-21T12:12:24Z',
+    '2336-03-20T17:58:55Z',
+    '2337-03-20T23:49:45Z',
+    '2338-03-21T05:36:54Z',
+    '2339-03-21T11:16:11Z',
+    '2340-03-20T17:11:59Z',
+    '2341-03-20T22:55:44Z',
+    '2342-03-21T04:38:39Z',
+    '2343-03-21T10:36:01Z',
+    '2344-03-20T16:21:59Z',
+    '2345-03-20T22:11:17Z',
+    '2346-03-21T03:58:30Z',
+    '2347-03-21T09:41:59Z',
+    '2348-03-20T15:40:18Z',
+    '2349-03-20T21:28:30Z',
+    '2350-03-21T03:10:22Z',
+    '2351-03-21T09:04:39Z', // Stopping here as next Naw-Rúz potentially to close to call given the uncertainty in delta T
+    '2352-03-20T14:54:29Z',
+    '2353-03-20T20:44:15Z',
+    '2354-03-21T02:41:39Z',
+    '2355-03-21T08:29:11Z',
+    '2356-03-20T14:27:29Z',
+    '2357-03-20T20:15:24Z',
+    '2358-03-21T01:50:17Z',
+    '2359-03-21T07:45:05Z',
+    '2360-03-20T13:29:36Z',
+    '2361-03-20T19:12:54Z',
+    '2362-03-21T01:03:04Z',
+    '2363-03-21T06:41:00Z',
+    '2364-03-20T12:36:02Z',
+    '2365-03-20T18:26:10Z',
+    '2366-03-21T00:08:34Z',
+    '2367-03-21T06:10:50Z',
+    '2368-03-20T12:02:20Z',
+    '2369-03-20T17:48:58Z',
+    '2370-03-20T23:43:44Z',
+    '2371-03-21T05:29:42Z',
+    '2372-03-20T11:25:11Z',
+    '2373-03-20T17:17:37Z',
+    '2374-03-20T22:53:27Z',
+    '2375-03-21T04:45:54Z',
+    '2376-03-20T10:34:31Z',
+    '2377-03-20T16:16:02Z',
+    '2378-03-20T22:13:36Z',
+    '2379-03-21T03:58:42Z',
+    '2380-03-20T09:50:42Z',
+    '2381-03-20T15:40:47Z',
+    '2382-03-20T21:15:54Z',
+    '2383-03-21T03:09:21Z',
+    '2384-03-20T09:00:54Z',
+    '2385-03-20T14:42:56Z',
+    '2386-03-20T20:37:04Z',
+    '2387-03-21T02:23:15Z',
+    '2388-03-20T08:16:52Z',
+    '2389-03-20T14:14:41Z',
+    '2390-03-20T19:59:40Z',
+    '2391-03-21T01:56:23Z',
+    '2392-03-20T07:51:45Z',
+    '2393-03-20T13:30:17Z',
+    '2394-03-20T19:22:15Z',
+    '2395-03-21T01:08:02Z',
+    '2396-03-20T06:54:39Z',
+    '2397-03-20T12:46:57Z',
+    '2398-03-20T18:19:51Z',
+    '2399-03-21T00:08:50Z',
+    '2400-03-20T06:01:18Z'];
+
+export { equinoxes };

+ 81 - 0
res/generateYearData.ts

@@ -0,0 +1,81 @@
+import * as MeeusSunMoon from 'meeussunmoon';
+import * as luxon from 'luxon';
+import { equinoxes } from './equinoxes';
+import * as fs from 'fs';
+
+const latitudeTihran = 35.68;
+const longitudeTihran = 51.42;
+
+const nawRuzEndTihranUTC = (equinox: string): luxon.DateTime => {
+    const vernalEquinox = luxon.DateTime.fromISO(equinox, { zone: 'UTC' });
+    let nawRuzTihran = MeeusSunMoon.sunset(vernalEquinox, latitudeTihran, longitudeTihran) as luxon.DateTime;
+    if (vernalEquinox > nawRuzTihran) {
+        nawRuzTihran = MeeusSunMoon.sunset(
+            vernalEquinox.plus({ days: 1 }), latitudeTihran, longitudeTihran) as luxon.DateTime;
+    }
+    return nawRuzTihran;
+};
+
+const calculateTwinBirthdays = (nawRuzTihran: luxon.DateTime): number[] => {
+    let eighthNewMoon: luxon.DateTime;
+    const nawRuzEnd = MeeusSunMoon.sunset(nawRuzTihran, latitudeTihran, longitudeTihran);
+    const newMoons = MeeusSunMoon.yearMoonPhases(nawRuzTihran.year, 0);
+    let index = 0;
+    // Count the new moons since Naw-Rúz and keep the eighth one
+    for (let i = 0; i < newMoons.length; i++) {
+        if (newMoons[i] > nawRuzEnd) {
+            index++;
+        }
+        if (index === 8) {
+            eighthNewMoon = newMoons[i];
+            break;
+        }
+    }
+    // Convert to the proper timezone and calculate sunset.
+    eighthNewMoon.setZone('Asia/Tehran');
+    const newMoonSunset = MeeusSunMoon.sunset(eighthNewMoon, latitudeTihran, longitudeTihran);
+    // If sunset is before the new moon, the new moon is on the next Badí' date.
+    // Then we add another day because it's the day after the occurence of the
+    // eighth new moon.
+    if (newMoonSunset < eighthNewMoon) {
+        eighthNewMoon = eighthNewMoon.plus({ days: 1 });
+    }
+    eighthNewMoon = eighthNewMoon.plus({ days: 1 });
+    const dayOfBadiYear = eighthNewMoon.ordinal - nawRuzTihran.ordinal + 1;
+    const day2OfBadiYear = dayOfBadiYear + 1;
+    return [Math.floor((dayOfBadiYear - 1) / 19 + 1), (dayOfBadiYear - 1) % 19 + 1,
+        Math.floor((day2OfBadiYear - 1) / 19 + 1), (day2OfBadiYear - 1) % 19 + 1];
+};
+
+const yearList = () => {
+    let longList = 'const badiYears = {';
+    let shortList = 'const badiYears = [\n';
+    // Stop at end of 2350 AD / 507 BE as the Naw-Rúz 509 BE is potentially too
+    // close to call
+    const equinoxesLength = 337;
+    for (let i = 0; i < equinoxesLength - 1; i++) {
+        const nawRuzTihran = nawRuzEndTihranUTC(equinoxes[i]);
+        const nextNawRuzTihran = nawRuzEndTihranUTC(equinoxes[i + 1]);
+        const ayyamiHaLength = Math.round(nextNawRuzTihran.diff(nawRuzTihran).as('days') - 361);
+        const twinBirthdays = calculateTwinBirthdays(nawRuzTihran);
+        longList += `
+    ${(i + 172).toString()}: {
+        ayyamiHaLength: ${ayyamiHaLength},
+        nawRuz: '${nawRuzTihran.toFormat('yyyy-MM-dd')}',
+        twinBirthdays: [${twinBirthdays[0]}, ${twinBirthdays[1]}, ${twinBirthdays[2]}, ${twinBirthdays[3]}],
+    },`;
+        shortList += `${i % 14 === 0 ? '    ' : ''}'${shortListString(
+            nawRuzTihran, ayyamiHaLength, twinBirthdays)}',${i % 14 === 13 ? '\n' : ' '}`;
+    }
+    shortList += '];\n\nexport { badiYears };\n';
+    longList += '\n};\n\nexport { badiYears };\n';
+    fs.writeFileSync('./res/badiYearsLongFormat.ts', longList, 'utf8');
+    fs.writeFileSync('./src/badiYears.ts', shortList, 'utf8');
+};
+
+const shortListString = (nawRuz, ayyamiHaLength, twinBirthdays) => `${nawRuz.day.toString(36)}${
+    ayyamiHaLength.toString(36)}${twinBirthdays[0].toString(36)}${twinBirthdays[1].toString(36)}`;
+
+yearList();
+
+export { latitudeTihran, longitudeTihran, nawRuzEndTihranUTC, calculateTwinBirthdays, yearList };

+ 138 - 0
res/uncertainties.ts

@@ -0,0 +1,138 @@
+/* eslint-disable */
+import * as MeeusSunMoon from 'meeussunmoon';
+import * as luxon from 'luxon';
+import { latitudeTihran, longitudeTihran, nawRuzEndTihranUTC, calculateTwinBirthdays } from './generateYearData';
+import { BadiDate, badiDateSettings } from '../dist/badiDate-locales';
+import { equinoxes } from './equinoxes';
+import * as fs from 'fs';
+
+const nearestSunset = (datetime: luxon.DateTime): luxon.DateTime => {
+    const sunset1 = MeeusSunMoon.sunset(datetime.minus({ days: 1 }), latitudeTihran, longitudeTihran) as luxon.DateTime;
+    const sunset2 = MeeusSunMoon.sunset(datetime, latitudeTihran, longitudeTihran) as luxon.DateTime;
+    const sunset3 = MeeusSunMoon.sunset(datetime.plus({ days: 1 }), latitudeTihran, longitudeTihran) as luxon.DateTime;
+
+    let sunset = sunset1;
+    if (Math.abs(datetime.diff(sunset2).valueOf()) < Math.abs(datetime.diff(sunset).valueOf())) {
+        sunset = sunset2;
+    }
+    if (Math.abs(datetime.diff(sunset3).valueOf()) < Math.abs(datetime.diff(sunset).valueOf())) {
+        sunset = sunset3;
+    }
+    return sunset;
+};
+
+const nearestNewMoon = (datetime: luxon.DateTime): luxon.DateTime => {
+    const newMoons = MeeusSunMoon.yearMoonPhases(datetime.year, 0);
+    let newMoonBefore;
+    let newMoonAfter;
+    for (let i = 0; ; i++) {
+        if (newMoons[i] > datetime) {
+            newMoonBefore = newMoons[i - 1];
+            newMoonAfter = newMoons[i];
+            break;
+        }
+    }
+    if (Math.abs(datetime.diff(newMoonBefore).valueOf()) <
+        Math.abs(datetime.diff(newMoonAfter).valueOf())) {
+        return newMoonBefore;
+    }
+    return newMoonAfter;
+};
+
+/**
+ * Generate a list to determine uncertainties that could lead to incorrect dates
+ * in the calculation Columns generated are (all times in UTC, location where
+ * applicable Tihran):
+ * Gregorian Year,
+ * estimated delta T,
+ * uncertainty in delta T,
+ * time of the March Equinox,
+ * time of nearest sunset,
+ * difference in seconds,
+ * time of end of Naw-Rúz,
+ * time of nearest New Moon,
+ * difference in seconds,
+ * time of eighth New Moon after Naw-Rúz,
+ * time of nearest sunset,
+ * difference in seconds,
+ * Gregorian Date of March Equinox,
+ * Badí' date of the Birth of the Báb commemoration,
+ * corresponding Gregorian date,
+ * length of Ayyám-i-Há in days
+ */
+const uncertaintyTable = () => {
+    badiDateSettings({ underlineFormat: 'none' });
+    let output = 'Gregorian Year, Badíʻ Year, ΔT, σ(ΔT), March equinox, nearest sunset in Tihran, difference [s], ' +
+        'end of Naw-Rúz in Tihran, nearest new moon, difference [s], eighth new moon after Naw-Rúz, ' +
+        'nearest sunset in Tihran, difference [s], date of Naw-Rúz, date of Birth of the Báb (Badíʻ), ' +
+        'date of Birth of the Báb (Gregorian), length of Ayyám-i-Há\n';
+    for (let i = 0; i < 336; i++) {
+        const N = i + 10;
+        const errorDeltaT = Math.round(365.25 * N * Math.sqrt((N * 0.058 / 3) * (1 + N / 2500)) / 1000);
+        const equinox = luxon.DateTime.fromISO(equinoxes[i], { zone: 'UTC'});
+        let deltaT;
+        let t;
+        if (i < 36) {
+            t = i + 15;
+            deltaT = Math.round(62.92 + 0.32217 * t + 0.005589 * t * t);
+        } else if (i < 136) {
+            t = i + 2015;
+            deltaT = Math.round(-20 +
+                32 * ((t - 1820) / 100) * ((t - 1820) / 100) - 0.5628 * (2150 - t));
+        } else {
+            t = (i + 195) / 100;
+            deltaT = Math.round(-20 + 32 * t * t);
+        }
+        const sunset = nearestSunset(equinox);
+        let nawRuzEnd = nawRuzEndTihranUTC(equinox.toISO());
+        const nawRuzNewMoon = nearestNewMoon(nawRuzEnd);
+        const newMoons = MeeusSunMoon.yearMoonPhases(nawRuzEnd.year, 0);
+        let index = 0;
+        // Count the new moons since Naw-Rúz and keep the eighth one
+        let eighthNewMoon;
+        for (let j = 0; j < newMoons.length; j++) {
+            if (newMoons[j] > nawRuzEnd) {
+                index++;
+            }
+            if (index === 8) {
+                eighthNewMoon = newMoons[j];
+                break;
+            }
+        }
+        const TBSunset = nearestSunset(eighthNewMoon);
+        const twinBirth = calculateTwinBirthdays(nawRuzEndTihranUTC(equinox.toISO()));
+        const BoB = new BadiDate({ year: i + 172, month: twinBirth[0], day: twinBirth[1] });
+        output += `${equinox.year},`;
+        output += `${equinox.year - 1843},`;
+        output += `${deltaT},`;
+        output += `${errorDeltaT},`;
+        output += equinox.toFormat(`yyyy-MM-dd'T'HH:mm:ss','`);
+        output += sunset.toFormat(`yyyy-MM-dd'T'HH:mm:ss','`);
+        if (Math.abs(equinox.diff(sunset).as('seconds')) < 3 * errorDeltaT + 90) {
+            output += '#';
+        }
+        output += `${equinox.diff(sunset).as('seconds')},`;
+        output += nawRuzEnd.toFormat(`yyyy-MM-dd'T'HH:mm:ss','`);
+        output += nawRuzNewMoon.toFormat(`yyyy-MM-dd'T'HH:mm:ss','`);
+        if (Math.abs(nawRuzEnd.diff(nawRuzNewMoon).as('seconds')) <
+            3 * errorDeltaT + 60) {
+            output += '#';
+        }
+        output += `${nawRuzEnd.diff(nawRuzNewMoon).as('seconds')},`;
+        output += eighthNewMoon.toFormat(`yyyy-MM-dd'T'HH:mm:ss','`);
+        output += TBSunset.toFormat(`yyyy-MM-dd'T'HH:mm:ss','`);
+        if (Math.abs(eighthNewMoon.diff(TBSunset).as('seconds')) <
+            3 * errorDeltaT + 60) {
+            output += '#';
+        }
+        output += `${eighthNewMoon.diff(TBSunset).as('seconds')},`;
+        output += nawRuzEnd.toFormat(`dd MMM','`);
+        output += BoB.format('d MM,');
+        output += BoB.gregorianDate.toFormat(`dd MMM','`);
+        output += BoB.ayyamiHaLength;
+        output += '\n';
+    }
+    fs.writeFileSync('./res/uncertainties.csv', output, 'utf8');
+};
+
+uncertaintyTable();

+ 68 - 0
rollup.config.js

@@ -0,0 +1,68 @@
+/* eslint-disable max-depth */
+import { terser } from 'rollup-plugin-terser';
+import resolve from '@rollup/plugin-node-resolve';
+import typescript from '@rollup/plugin-typescript';
+import replace from 'rollup-plugin-re';
+
+const copyrightNotice = `/**
+ * @license BadiDate v3.0.2
+ * (c) 2018 Jan Greis
+ * licensed under MIT
+ */
+`;
+
+const localeRegex = languageCodes => {
+    const locales = ['ar', 'de', 'es', 'fa', 'fr', 'lv', 'nl', 'pt', 'ru', 'sv',
+        'zh', 'en-us'].filter(entry => !languageCodes.includes(entry));
+    const regexString = `( '?(${locales.join('|')})('?: \\S*)?,)`;
+    return RegExp(regexString, 'g');
+};
+
+const rollupConfig = (root, msm, locales, minify, format, filename) => {
+    if (filename === undefined) {
+        filename = `dist/${root.slice(0, -3)}${msm ? '-msm' : ''}${locales === true ? '-locales' : ''}${
+            minify ? '.min' : ''}.${format === 'es' ? 'm.' : ''}js`;
+    }
+    const config = {
+        external: ['luxon'],
+        input: `src/${root}`,
+        output: {
+            banner: copyrightNotice,
+            extend: format !== 'es',
+            file: filename,
+            format,
+            name: format === 'es' ? 'badiDate' : 'window',
+            globals: format === 'es' ? {} : { luxon: 'luxon', meeussunmoon: 'MeeusSunMoon' },
+        },
+        plugins: [resolve({ modulesOnly: true }), typescript()],
+    };
+    if (locales !== true) {
+        const replacePatterns = [{ match: 'src/badiLocale.ts', replace: '', test: localeRegex(locales) }];
+        config.plugins.splice(1, 0, replace({ patterns: replacePatterns }));
+    }
+    if (!msm) {
+        config.external.push('meeussunmoon');
+    }
+    if (minify) {
+        config.plugins.push(terser());
+        config.output.sourcemap = true;
+    }
+    return config;
+};
+
+const configs = [];
+for (const root of ['badiDate.ts', 'localBadiDate.ts']) {
+    for (const msm of [true, false]) {
+        for (const locales of [true, []]) {
+            for (const minify of [true, false]) {
+                for (const format of ['es', 'umd']) {
+                    if (!msm || root === 'localBadiDate.ts') {
+                        configs.push(rollupConfig(root, msm, locales, minify, format));
+                    }
+                }
+            }
+        }
+    }
+}
+
+export default configs;

+ 390 - 0
src/badiDate.ts

@@ -0,0 +1,390 @@
+import * as luxon from 'luxon';
+import { badiLocale, setDefaultLanguage, setUnderlineFormat } from './badiLocale';
+import { formatBadiDate, formatItemFallback } from './formatter';
+import { BadiDateSettings, BadiYearInfo, HolyDay, InputDate, YearHolyDayNumber, YearMonthDay } from './types';
+import { badiYears } from './badiYears';
+
+class BadiDate {
+    private _gregorianDate: luxon.DateTime;
+    private _year: number;
+    private _month: number;
+    private _day: number;
+    private _nawRuz: luxon.DateTime;
+    private _ayyamiHaLength: number;
+    private _yearTwinBirthdays: Array<number>;
+    private _holyDay?: HolyDay = undefined;
+    private _valid: boolean = true;
+    private _invalidReason: string = undefined;
+
+    constructor(date: InputDate) {
+        try {
+            if (this._isDateObject(date)) {
+                this._gregorianDate = luxon.DateTime.fromObject(
+                    { year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate(), zone: 'UTC' });
+            } else if (luxon.DateTime.isDateTime(date)) {
+                this._gregorianDate = luxon.DateTime.fromObject(
+                    { year: date.year, month: date.month, day: date.day, zone: 'UTC' });
+            } else if (this._isYearMonthDay(date) || this._isYearHolyDayNumber(date)) {
+                this._setFromBadiDate(date);
+            } else {
+                throw new TypeError('Unrecognized input format');
+            }
+            if (this._year === undefined) {
+                // We haven't set the Badí' date yet
+                this._setFromGregorianDate();
+            }
+            this._setHolyDay();
+        } catch (err) {
+            this._setInvalid(err);
+        }
+        Object.freeze(this);
+    }
+
+    format(formatString?: string, language?: string): string {
+        return formatBadiDate(this, formatString, language);
+    }
+
+    _isDateObject(arg: any): arg is Date {
+        return Object.prototype.toString.call(arg) === '[object Date]';
+    }
+
+    _isYearMonthDay(arg: any): arg is YearMonthDay {
+        return typeof arg.year === 'number' && typeof arg.month === 'number' &&
+            typeof arg.day === 'number';
+    }
+
+    _isYearHolyDayNumber(arg: any): arg is YearHolyDayNumber {
+        return typeof arg.year === 'number' && arg.month === undefined &&
+            arg.day === undefined && typeof arg.holyDayNumber === 'number';
+    }
+
+    _notInValidGregorianDateRange(datetime: luxon.DateTime): boolean {
+        const lowerBound = luxon.DateTime.fromObject({ year: 1844, month: 3, day: 21, zone: 'UTC' });
+        const upperBound = luxon.DateTime.fromObject({ year: 2351, month: 3, day: 20, zone: 'UTC' });
+        return datetime < lowerBound || datetime > upperBound;
+    }
+
+    _setFromGregorianDate() {
+        if (this._notInValidGregorianDateRange(this._gregorianDate)) {
+            throw new RangeError('Input date outside of valid range (1844-03-21 - 2351-03-20)');
+        }
+        const gregorianYear = this._gregorianDate.year;
+        const oldImplementationCutoff = luxon.DateTime.fromObject({ year: 2015, month: 3, day: 21, zone: 'UTC' });
+        if (this._gregorianDate < oldImplementationCutoff) {
+            const { month, day } = this._gregorianDate;
+            if (month < 3 || (month === 3 && day < 21)) {
+                this._nawRuz = luxon.DateTime.fromObject({ year: gregorianYear - 1, month: 3, day: 21, zone: 'UTC' });
+                this._year = gregorianYear - 1844;
+            } else {
+                this._nawRuz = luxon.DateTime.fromObject({ year: gregorianYear, month: 3, day: 21, zone: 'UTC' });
+                this._year = gregorianYear - 1843;
+            }
+            this._setOldAyyamiHaLength();
+            this._yearTwinBirthdays = [12, 5, 13, 9];
+        } else {
+            this._year = gregorianYear - 1843;
+            this._setBadiYearInfo(true);
+        }
+        this._setBadiMonthAndDay();
+    }
+
+    /**
+     * Set Badí' month and day from Gregorian date
+     */
+    _setBadiMonthAndDay() {
+        const dayOfBadiYear = this._dayOfYear(this._gregorianDate);
+        if (dayOfBadiYear < 343) {
+            this._month = Math.floor((dayOfBadiYear - 1) / 19 + 1);
+            this._day = (dayOfBadiYear - 1) % 19 + 1;
+        } else if (dayOfBadiYear < 343 + this._ayyamiHaLength) {
+            this._month = 20;
+            this._day = dayOfBadiYear - 342;
+        } else {
+            this._month = 19;
+            this._day = dayOfBadiYear - (342 + this._ayyamiHaLength);
+        }
+    }
+
+    _setFromBadiDate(date: YearMonthDay | YearHolyDayNumber) { // eslint-disable-line complexity
+        this._year = date.year;
+        if (this._year < 1 || this._year > 507) {
+            throw new RangeError('Input date outside of valid range (1 - 507 B.E.)');
+        } else if (this._year < 172) {
+            this._nawRuz = luxon.DateTime.fromObject({ year: 1843 + this._year, month: 3, day: 21, zone: 'UTC' });
+            this._setOldAyyamiHaLength();
+            this._yearTwinBirthdays = [12, 5, 13, 9];
+        } else {
+            this._setBadiYearInfo();
+        }
+        if (this._isYearMonthDay(date)) {
+            this._month = date.month;
+            this._day = date.day;
+            if (this._month === 20 && this._day > this._ayyamiHaLength) {
+                // If only off by one day, we'll bubble up so that 5th Ayyám-i-Há in a year with only 4 days of
+                // Ayyám-i-Há can be salvaged
+                if (this._day - this._ayyamiHaLength === 1) {
+                    this._month = 19;
+                    this._day = 1;
+                } else {
+                    throw new TypeError('Input numbers do not designate a valid date');
+                }
+            }
+            if (this._month < 1 || this._month > 20 || this._day < 1 || this.day > 19) {
+                throw new TypeError('Input numbers do not designate a valid date');
+            }
+        } else {
+            if (date.holyDayNumber < 1 || date.holyDayNumber > 11) {
+                throw new TypeError('Input numbers do not designate a valid Holy Day');
+            }
+            this._holyDay = date.holyDayNumber;
+            [this._month, this._day] = this._holyDayMapping()[this._holyDay];
+        }
+        this._gregorianDate = this._nawRuz.plus(luxon.Duration.fromObject(
+            { days: this._dayOfYear([this._year, this._month, this._day]) - 1 }));
+    }
+
+    _setOldAyyamiHaLength() {
+        if (luxon.DateTime.fromObject({ year: this._nawRuz.year + 1 }).isInLeapYear) {
+            this._ayyamiHaLength = 5;
+        } else {
+            this._ayyamiHaLength = 4;
+        }
+    }
+
+    _setBadiYearInfo(fromGregorianDate: boolean = false) {
+        let yearData = this._extractBadiYearInfo();
+        if (fromGregorianDate && this._gregorianDate < yearData.nawRuz) {
+            this._year -= 1;
+            yearData = this._extractBadiYearInfo();
+        }
+        this._nawRuz = yearData.nawRuz;
+        this._ayyamiHaLength = yearData.ayyamiHaLength;
+        this._yearTwinBirthdays = yearData.twinBirthdays;
+    }
+
+    _extractBadiYearInfo(): BadiYearInfo {
+        let nawRuz, ayyamiHaLength, twinBirthdays;
+        // Check whether data needs to be unpacked or exists in the verbose version
+        // istanbul ignore else
+        if (badiYears[0] === 'l4da') {
+            const components = badiYears[this._year - 172].split('');
+            nawRuz = luxon.DateTime.fromObject(
+                { year: this._year - 172 + 2015, month: 3, day: parseInt(components[0], 36), zone: 'UTC' });
+            ayyamiHaLength = parseInt(components[1], 36);
+            const TB1 = [parseInt(components[2], 36), parseInt(components[3], 36)];
+            const TB2 = TB1[1] < 19 ? [TB1[0], TB1[1] + 1] : [TB1[0] + 1, 1];
+            twinBirthdays = [TB1[0], TB1[1], TB2[0], TB2[1]];
+        } else {
+            ({ nawRuz, ayyamiHaLength, twinBirthdays } = badiYears[this._year] as any);
+            nawRuz = luxon.DateTime.fromISO(nawRuz, { zone: 'UTC' });
+        }
+        return { nawRuz, ayyamiHaLength, twinBirthdays };
+    }
+
+    _dayOfYear(date: Array<number> | luxon.DateTime): number {
+        // Naw-Rúz is day 1
+        if (Array.isArray(date)) {
+            // We have a Badí' date
+            if (date[1] < 19) {
+                return 19 * (date[1] - 1) + date[2];
+            } else if (date[1] === 20) {
+                return 342 + date[2];
+            }
+            // date[1] === 19
+            return 342 + this._ayyamiHaLength + date[2];
+        }
+        return (date as luxon.DateTime).diff(this._nawRuz).as('days') + 1;
+    }
+
+    _setInvalid(invalidReason: string) {
+        this._gregorianDate = luxon.DateTime.invalid('Not a valid Badí‘ date');
+        this._year = NaN;
+        this._month = NaN;
+        this._day = NaN;
+        this._ayyamiHaLength = NaN;
+        this._nawRuz = luxon.DateTime.invalid('Not a valid Badí‘ date');
+        this._valid = false;
+        this._invalidReason = invalidReason;
+    }
+
+    _setHolyDay() {
+        const mapping = this._holyDayMapping();
+        this._holyDay = parseInt(Object.keys(mapping)
+            .find(key => mapping[key][0] === this._month && mapping[key][1] === this._day), 10);
+    }
+
+    _holyDayMapping(): object {
+        return {
+            [HolyDay.NawRuz]: [1, 1],
+            [HolyDay.FirstRidvan]: [2, 13],
+            [HolyDay.NinthRidvan]: [3, 2],
+            [HolyDay.TwelfthRidvan]: [3, 5],
+            [HolyDay.DeclarationOfTheBab]: [4, this._year < 172 ? 7 : 8],
+            [HolyDay.AscensionOfBahaullah]: [4, 13],
+            [HolyDay.MartyrdomOfTheBab]: [6, this._year < 172 ? 16 : 17],
+            [HolyDay.BirthOfTheBab]: [this._yearTwinBirthdays[0], this._yearTwinBirthdays[1]],
+            [HolyDay.BirthOfBahaullah]: [this._yearTwinBirthdays[2], this._yearTwinBirthdays[3]],
+            [HolyDay.DayOfTheCovenant]: [14, 4],
+            [HolyDay.AscensionOfAbdulBaha]: [14, 6],
+        };
+    }
+
+    _leapYearsBefore(): number {
+        let leapYearsBefore = Math.floor(Math.min(this.year - 1, 171) / 4);
+        if (this.year > 172) {
+            // istanbul ignore else
+            if (badiYears[0] === 'l4da') {
+                leapYearsBefore += badiYears.slice(0, this.year - 172).filter(entry => entry[1] === '5').length;
+            } else {
+                leapYearsBefore += Object.entries(badiYears)
+                    .filter(([year, data]) => parseInt(year, 10) < this.year &&
+                        (data as any).ayyamiHaLength === 5).length;
+            }
+        }
+        return leapYearsBefore;
+    }
+
+    holyDay(language: string = undefined): string {
+        if (!this._holyDay) {
+            return '';
+        }
+        if (language === undefined || badiLocale[language] === undefined) {
+            language = 'default';
+        }
+        return formatItemFallback(language, 'holyDay', this._holyDay);
+    }
+
+    valueOf() {
+        return this._dayOfYear([this.year, this.month, this.day]) + this._leapYearsBefore() + (this.year - 1) * 365;
+    }
+
+    equals(other: BadiDate) {
+        return this.isValid && other.isValid && this.valueOf() === other.valueOf();
+    }
+
+    get isValid(): boolean {
+        return this._valid;
+    }
+
+    get invalidReason(): string | undefined {
+        return this._invalidReason;
+    }
+
+    get day(): number {
+        return this._day;
+    }
+
+    get month(): number {
+        return this._month;
+    }
+
+    get year(): number {
+        return this._year;
+    }
+
+    // number of the Badí' weekday between 1 (Jalál ~> Saturday) and 7 (Istiqlál ~> Friday).
+    get weekday(): number {
+        return (this._gregorianDate.weekday + 1) % 7 + 1;
+    }
+
+    get yearInVahid(): number {
+        return (this._year - 1) % 19 + 1;
+    }
+
+    get vahid(): number {
+        return (Math.floor((this._year - 1) / 19) % 19) + 1;
+    }
+
+    get kullIShay(): number {
+        return Math.floor((this._year - 1) / 361) + 1;
+    }
+
+    // Gregorian date on whose sunset the Badí' date ends.
+    get gregorianDate(): luxon.DateTime {
+        return this._gregorianDate;
+    }
+
+    get ayyamiHaLength(): number {
+        return this._ayyamiHaLength;
+    }
+
+    get holyDayNumber(): number | undefined {
+        return this._holyDay ? this._holyDay : undefined;
+    }
+
+    get workSuspended(): boolean | undefined {
+        return this._holyDay ? this.holyDayNumber < 10 : undefined;
+    }
+
+    get nextMonth(): BadiDate {
+        let { year, month } = this;
+        switch (month) {
+            case 18:
+                month = 20;
+                break;
+            case 19:
+                month = 1;
+                year += 1;
+                break;
+            case 20:
+                month = 19;
+                break;
+            default:
+                month += 1;
+        }
+        return new BadiDate({ year, month, day: 1 });
+    }
+
+    get previousMonth(): BadiDate {
+        let { year, month } = this;
+        switch (month) {
+            case 1:
+                month = 19;
+                year -= 1;
+                break;
+            case 19:
+                month = 20;
+                break;
+            case 20:
+                month = 18;
+                break;
+            default:
+                month -= 1;
+        }
+        return new BadiDate({ year, month, day: 1 });
+    }
+
+    get nextDay(): BadiDate {
+        if (this._day === 19 || (this._month === 20 && this._day === this._ayyamiHaLength)) {
+            return this.nextMonth;
+        }
+        return new BadiDate({ year: this._year, month: this._month, day: this._day + 1 });
+    }
+
+    get previousDay(): BadiDate {
+        if (this._day === 1) {
+            const { previousMonth } = this;
+            let day = 19;
+            if (this._month === 19) {
+                day = this._ayyamiHaLength;
+            }
+            return new BadiDate({
+                year: previousMonth.year,
+                month: previousMonth.month,
+                day,
+            });
+        }
+        return new BadiDate({ year: this._year, month: this._month, day: this._day - 1 });
+    }
+}
+
+const badiDateSettings = (settings: BadiDateSettings) => {
+    if (settings.defaultLanguage) {
+        setDefaultLanguage(settings.defaultLanguage);
+    }
+    if (settings.underlineFormat) {
+        setUnderlineFormat(settings.underlineFormat);
+    }
+};
+
+export { BadiDate, badiDateSettings };

+ 40 - 0
src/badiLocale.ts

@@ -0,0 +1,40 @@
+/* eslint-disable dot-notation, line-comment-position, camelcase, sort-imports */
+import * as en from './locale/en';
+import * as ar from './locale/ar';
+import * as de from './locale/de';
+import * as es from './locale/es';
+import * as fa from './locale/fa';
+import * as fr from './locale/fr';
+import * as lv from './locale/lv';
+import * as nl from './locale/nl';
+import * as pt from './locale/pt';
+import * as ru from './locale/ru';
+import * as sv from './locale/sv';
+import * as zh from './locale/zh';
+import * as en_us from './locale/en-us';
+import { UnderlineFormat } from './types';
+
+const badiLocale = { en, ar, de, es, fa, fr, lv, nl, pt, ru, sv, zh, 'en-us': en_us, default: en };
+
+const setDefaultLanguage = (language: string) => {
+    if (badiLocale[language] === undefined) {
+        // eslint-disable-next-line no-console
+        console.log('Chosen language does not exist. Setting has not been changed.');
+    } else {
+        badiLocale['default'] = badiLocale[language];
+    }
+};
+
+let underlineFormat = 'css';
+
+const setUnderlineFormat = (format: UnderlineFormat) => {
+    if (['css', 'u', 'diacritic', 'none'].includes(format)) {
+        underlineFormat = format;
+    } else {
+        // eslint-disable-next-line no-console
+        console.log('Invalid underline format. Choose one of ["css", "u", "diacritic", "none"]. ' +
+            'Setting has not been changed.');
+    }
+};
+
+export { badiLocale, setDefaultLanguage, setUnderlineFormat, underlineFormat };

+ 28 - 0
src/badiYears.ts

@@ -0,0 +1,28 @@
+const badiYears = [
+    'l4da', 'k4ci', 'k5c7', 'l4d6', 'l4ce', 'k4c4', 'k5d4', 'l4cb', 'l4c1', 'k4cj', 'k5c8', 'l4d7', 'l4cf', 'k4c5',
+    'k4d5', 'k5ce', 'l4c2', 'k4d2', 'k4ca', 'k5da', 'l4ch', 'k4c6', 'k4d6', 'k5cf', 'l4c4', 'k4d4', 'k4cc', 'k5c1',
+    'l4cj', 'k4c8', 'k4d8', 'k5cg', 'l4c5', 'k4d5', 'k4ce', 'k5c3', 'l4d2', 'k4ca', 'k4d9', 'k5ci', 'l4c6', 'k4d6',
+    'k4cf', 'k4c4', 'k5d4', 'k4cb', 'k4bj', 'k4cj', 'k5c9', 'k4d8', 'k4cg', 'k4c6', 'k5d6', 'k4cd', 'k4c2', 'k4d2',
+    'k5ca', 'k4d9', 'k4ci', 'k4c7', 'k5d7', 'k4cf', 'k4c4', 'k4d4', 'k5cc', 'k4bj', 'k4cj', 'k4c9', 'k5d9', 'k4cg',
+    'k4c6', 'k4d5', 'k5cd', 'k4c2', 'k4d1', 'k4ca', 'k4da', 'j5cj', 'k4c7', 'k4d7', 'k4cf', 'j5c4', 'k4d3', 'k4cb',
+    'k4c1', 'k5d1', 'l4c9', 'l4d9', 'l4ch', 'k5c6', 'l4d5', 'l4cd', 'l4c2', 'k5d2', 'l4ca', 'l4da', 'l4cj', 'k5c8',
+    'l4d7', 'l4cf', 'l4c4', 'k5d4', 'l4cb', 'l4c1', 'l4d1', 'k5c9', 'l4d8', 'l4cg', 'l4c5', 'k4d5', 'k5ce', 'l4c2',
+    'l4d2', 'k4cb', 'k5db', 'l4ci', 'l4c7', 'k4d7', 'k5cf', 'l4c4', 'l4d4', 'k4cc', 'k5c2', 'l4d1', 'l4c9', 'k4d9',
+    'k5ch', 'l4c5', 'l4d5', 'k4ce', 'k5c3', 'l4d2', 'l4cb', 'k4da', 'k5ci', 'l4c6', 'l4d6', 'k4cf', 'k5c5', 'l4d4',
+    'l4cc', 'k4c1', 'k4d1', 'k5c9', 'l4d8', 'k4cg', 'k4c6', 'k5d6', 'l4ce', 'k4c3', 'k4d3', 'k5cb', 'l4da', 'k4ci',
+    'k4c7', 'k5d7', 'l4cf', 'k4c5', 'k4d5', 'k5cd', 'l4c1', 'k4cj', 'k4c9', 'k5d9', 'l4cg', 'k4c6', 'k4d6', 'k5ce',
+    'l4c3', 'k4d2', 'k4ca', 'k5bj', 'l4ci', 'k4c7', 'k4d7', 'k4cg', 'k5c5', 'k4d4', 'k4cc', 'k4c1', 'k5d1', 'k4c9',
+    'k4d9', 'k4ch', 'k5c7', 'l4d6', 'l4ce', 'l4c3', 'l5d3', 'l4ca', 'l4da', 'l4cj', 'l5c8', 'l4d7', 'l4cg', 'l4c5',
+    'l5d4', 'l4cb', 'l4c1', 'l4d1', 'l5ca', 'l4d9', 'l4ch', 'l4c6', 'l5d6', 'l4cd', 'l4c2', 'l4d2', 'l4cb', 'k5c1',
+    'l4cj', 'l4c8', 'l4d8', 'k5cg', 'l4c4', 'l4d4', 'l4cc', 'k5c2', 'l4d1', 'l4ca', 'l4da', 'k5ci', 'l4c6', 'l4d5',
+    'l4ce', 'k5c3', 'l4d2', 'l4cb', 'l4db', 'k5cj', 'l4c8', 'l4d7', 'l4cf', 'k5c5', 'l4d4', 'l4cc', 'l4c2', 'k5d2',
+    'l4c9', 'l4d9', 'l4ch', 'k4c6', 'k5d6', 'l4ce', 'l4c3', 'k4d3', 'k5cc', 'l4db', 'l4cj', 'k4c8', 'k5d8', 'l4cf',
+    'l4c4', 'k4d5', 'k5cd', 'l4c2', 'l4d2', 'k4ca', 'k5d9', 'l4cg', 'l4c6', 'k4d6', 'k5cf', 'l4c3', 'l4d3', 'k4cb',
+    'k5bj', 'l4ci', 'l4c7', 'k4d7', 'k5cg', 'l4c5', 'l4d5', 'k4cd', 'k4c2', 'k5d2', 'l4c9', 'k4d9', 'k4ch', 'k5c7',
+    'l4d6', 'k4cf', 'k4c4', 'k5d4', 'l4cb', 'l4bj', 'l4cj', 'l5c8', 'm4d7', 'l4cg', 'l4c5', 'l5d5', 'm4cc', 'l4c1',
+    'l4d1', 'l5ca', 'm4d9', 'l4ch', 'l4c7', 'l5d7', 'm4ce', 'l4c3', 'l4d3', 'l5cb', 'm4bi', 'l4ci', 'l4c8', 'l4d8',
+    'l5ch', 'l4c5', 'l4d5', 'l4cd', 'l5c2', 'l4d1', 'l4c9', 'l4da', 'l5ci', 'l4c7', 'l4d7', 'l4cf', 'l5c4', 'l4d2',
+    'l4cb', 'l4bj', 'l5d1', 'l4c8', 'l4d8', 'l4cg', 'l5c5', 'l4d4', 'l4cc', 'l4c2', 'l5d2', 'l4c9', 'l4da', 'l4ci',
+];
+
+export { badiYears };

Plik diff jest za duży
+ 3 - 0
src/clockLocations.ts


+ 220 - 0
src/formatter.ts

@@ -0,0 +1,220 @@
+import { badiLocale, underlineFormat } from './badiLocale';
+import { BadiDate } from './badiDate';
+
+const formatTokens: Array<Array<string>> = [
+    ['DDL', 'DD+', 'MML', 'MM+', 'WWL', 'yyv', 'KiS'],
+    ['dd', 'DD', 'mm', 'MM', 'ww', 'WW', 'yv', 'YV', 'vv', 'kk', 'yy', 'BE', 'BC', 'Va'],
+    ['d', 'D', 'm', 'M', 'W', 'v', 'k', 'y']];
+
+// eslint-disable-next-line complexity
+const formatBadiDate = (badiDate: BadiDate, formatString?: string, language?: string): string => {
+    if (!badiDate.isValid) {
+        return 'Not a valid Badí‘ date';
+    }
+    if (typeof language === 'string' && badiLocale[language] === undefined && language.includes('-')) {
+        language = language.split('-')[0];
+    }
+    if (language === undefined || badiLocale[language] === undefined) {
+        language = 'default';
+    }
+    formatString = formatString ?? formatItemFallback(language, 'defaultFormat');
+    let formattedDate = '';
+    const length = formatString.length;
+    for (let i = 0; i < length; i++) {
+        // Text wrapped in {} is output as-is. A '{' without a matching '}'
+        // results in invalid input
+        if (formatString[i] === '{' && i < length - 1) {
+            for (let j = i + 1; j <= length; j++) {
+                if (j === length) {
+                    return 'Invalid formatting string.';
+                }
+                if (formatString[j] === '}') {
+                    i = j;
+                    break;
+                }
+                formattedDate += formatString[j];
+            }
+        } else {
+            const next1 = formatString[i];
+            const next2 = next1 + formatString[i + 1];
+            const next3 = next2 + formatString[i + 2];
+            if (formatTokens[0].includes(next3)) {
+                formattedDate += getFormatItem(badiDate, next3, language);
+                i += 2;
+            } else if (formatTokens[1].includes(next2)) {
+                formattedDate += getFormatItem(badiDate, next2, language);
+                i += 1;
+            } else if (formatTokens[2].includes(next1)) {
+                formattedDate += getFormatItem(badiDate, next1, language);
+            } else {
+                formattedDate += next1;
+            }
+        }
+    }
+    return formattedDate;
+};
+
+// eslint-disable-next-line complexity
+const getFormatItem = (badiDate: BadiDate, token: string, language: string): string => {
+    switch (token) {
+        // Single character tokens
+        case 'd':
+            return digitRewrite(badiDate.day, language);
+        case 'D':
+            return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.day), 3);
+        case 'm':
+            return digitRewrite(badiDate.month, language);
+        case 'M':
+            return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.month), 3);
+        case 'W':
+            return formatItemFallback(language, 'weekdayAbbr3', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+        case 'y':
+            return digitRewrite(badiDate.year, language);
+        case 'v':
+            return digitRewrite((Math.floor((badiDate.year - 1) / 19) % 19) + 1, language);
+        case 'k':
+            return digitRewrite(Math.floor((badiDate.year - 1) / 361) + 1, language);
+        // Two character tokens
+        case 'dd':
+            return digitRewrite((`0${String(badiDate.day)}`).slice(-2), language);
+        case 'DD':
+            return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.day));
+        case 'mm':
+            return digitRewrite((`0${String(badiDate.month)}`).slice(-2), language);
+        case 'MM':
+            return postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.month));
+        case 'ww':
+            return formatItemFallback(language, 'weekdayAbbr2', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+        case 'WW':
+            return formatItemFallback(language, 'weekday', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+        case 'yy':
+            return digitRewrite((`00${String(badiDate.year)}`).slice(-3), language);
+        case 'yv':
+            return digitRewrite((badiDate.year - 1) % 19 + 1, language);
+        case 'YV':
+            return formatItemFallback(language, 'yearInVahid', (badiDate.year - 1) % 19 + 1);
+        case 'vv':
+            return digitRewrite(
+                (`0${String((Math.floor((badiDate.year - 1) / 19) + 2) % 19 - 1)}`).slice(-2), language);
+        case 'kk':
+            return digitRewrite((`0${String(Math.floor((badiDate.year - 1) / 361) + 1)}`).slice(-2), language);
+        case 'Va':
+            return formatItemFallback(language, 'vahid');
+        case 'BE':
+            return formatItemFallback(language, 'BE');
+        case 'BC':
+            return formatItemFallback(language, 'badiCalendar');
+        // Three character tokens
+        case 'DDL':
+            return formatItemFallback(language, 'monthL', badiDate.day);
+        case 'DD+': {
+            const day = postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.day));
+            const dayL = formatItemFallback(language, 'monthL', badiDate.day);
+            if (day === dayL) {
+                return day;
+            }
+            if (badiLocale[language] === badiLocale.fa) {
+                return `<span dir="rtl">${day} (${dayL})</span>`;
+            }
+            return `${day} (${dayL})`;
+        }
+        case 'MML':
+            return formatItemFallback(language, 'monthL', badiDate.month);
+        case 'MM+': {
+            const month = postProcessLocaleItem(formatItemFallback(language, 'month', badiDate.month));
+            const monthL = formatItemFallback(language, 'monthL', badiDate.month);
+            if (month === monthL) {
+                return month;
+            }
+            if (badiLocale[language] === badiLocale.fa) {
+                return `<span dir="rtl">${month} (${monthL})</span>`;
+            }
+            return `${month} (${monthL})`;
+        }
+        case 'WWL':
+            return formatItemFallback(language, 'weekdayL', (badiDate.gregorianDate.weekday + 1) % 7 + 1);
+        case 'yyv':
+            return digitRewrite((`0${String((badiDate.year - 1) % 19 + 1)}`).slice(-2), language);
+        case 'KiS':
+            return postProcessLocaleItem(formatItemFallback(language, 'kulliShay'));
+        // istanbul ignore next
+        default:
+            return '';
+    }
+};
+
+const postProcessLocaleItem = (item: string, crop?: number): string => {
+    if (crop && crop < item.length) {
+        let char = 0;
+        let counter = 0;
+        while (counter < crop) {
+            if (!'_’‘'.includes(item[char])) {
+                counter++;
+            }
+            char++;
+        }
+        if ('_’‘'.includes(item[char])) {
+            char++;
+        }
+        item = item.slice(0, char);
+        if (item.split('_').length % 2 === 0) {
+            item += '_';
+        }
+    }
+    const stringComponents = item.split('_');
+    for (let i = 1; i < stringComponents.length; i += 2) {
+        stringComponents[i] = underlineString(stringComponents[i]);
+    }
+    return stringComponents.join('');
+};
+
+const underlineString = (str: string): string => {
+    switch (underlineFormat) {
+        case 'css':
+            return `<span style="text-decoration:underline">${str}</span>`;
+        case 'diacritic':
+            return str.split('').map(char => `${char}\u0332`).join('');
+        case 'u':
+            return `<u>${str}</u>`;
+        case 'none':
+            return str;
+        // istanbul ignore next
+        default:
+            throw new TypeError('Unexpected underlineFormat');
+    }
+};
+
+const digitRewrite = (number: number | string, language: string): string => {
+    number = String(number);
+    const unicodeOffset = formatItemFallback(language, 'unicodeCharForZero').charCodeAt(0) - '0'.charCodeAt(0);
+    if (unicodeOffset === 0) {
+        return number;
+    }
+    const codePoints = [...number].map(num => num.charCodeAt(0) + unicodeOffset);
+    return String.fromCharCode(...codePoints);
+};
+
+const formatItemFallback = (language: string, category: string, index?: number): string => {
+    if (index === undefined) {
+        while (badiLocale[language][category] === undefined) {
+            language = languageFallback(language);
+        }
+        return badiLocale[language][category];
+    }
+    while (badiLocale[language][category]?.[index] === undefined) {
+        language = languageFallback(language);
+    }
+    return badiLocale[language][category][index];
+};
+
+const languageFallback = (languageCode: string): string => {
+    if (languageCode.includes('-')) {
+        return languageCode.split('-')[0];
+        // eslint-disable-next-line no-negated-condition
+    } else if (languageCode !== 'default') {
+        return 'default';
+    }
+    return 'en';
+};
+
+export { formatBadiDate, formatItemFallback };

+ 163 - 0
src/localBadiDate.ts

@@ -0,0 +1,163 @@
+import * as MeeusSunMoon from 'meeussunmoon';
+import * as luxon from 'luxon';
+import { BadiDate, badiDateSettings as badiDateBaseSettings } from './badiDate';
+import { clockLocationFromPolygons, useClockLocations } from './clockLocations';
+import { BadiDateSettings, InputDate } from './types';
+
+/* eslint-disable complexity */
+
+class LocalBadiDate {
+    private _badiDate: BadiDate;
+    private _start: luxon.DateTime;
+    private _sunrise: luxon.DateTime;
+    private _solarNoon: luxon.DateTime;
+    private _end: luxon.DateTime;
+    private _clockLocation: string | undefined;
+    private _holyDayCommemoration: luxon.DateTime | undefined;
+    private _latitude: number;
+    private _longitude: number;
+    private _timezoneId: string;
+
+    constructor(date: InputDate, latitude: number, longitude: number, timezoneId: string) {
+        this._latitude = latitude;
+        this._longitude = longitude;
+        this._timezoneId = timezoneId;
+        // If a datetime object is being passed, we use date and time, not just the
+        // date. For a JS Date object, we can't assume it's in the correct timezone,
+        // so in that case we use the date information only.
+        this._badiDate = new BadiDate(this._setInputDateToCorrectDay(date, latitude, longitude));
+        const gregDate = this._badiDate.gregorianDate.setZone(timezoneId, { keepLocalTime: true });
+        this._clockLocation = clockLocationFromPolygons(latitude, longitude);
+        if (!this._clockLocation ||
+            (this._clockLocation === 'Finland' &&
+                this._badiDate.month === 19)) {
+            this._end = MeeusSunMoon.sunset(gregDate, latitude, longitude) as luxon.DateTime;
+            this._solarNoon = MeeusSunMoon.solarNoon(gregDate, longitude);
+            this._sunrise = MeeusSunMoon.sunrise(gregDate, latitude, longitude) as luxon.DateTime;
+            this._start = MeeusSunMoon.sunset(gregDate.minus({ days: 1 }), latitude, longitude) as luxon.DateTime;
+        } else {
+            // First we set times to 18:00, 06:00, 12:00, 18:00, modifications are
+            // then made depending on the region.
+            this._start = gregDate.minus({ days: 1 }).set({ hour: 18 });
+            this._solarNoon = gregDate.set({ hour: 12 });
+            this._sunrise = gregDate.set({ hour: 6 });
+            this._end = gregDate.set({ hour: 18 });
+            if (this._clockLocation === 'Canada') {
+                this._sunrise = this._sunrise.plus({ minutes: 30 });
+            } else if (this._clockLocation === 'Iceland') {
+                this._solarNoon = this._solarNoon.plus({ hours: 1 });
+            } else if (this._clockLocation === 'Finland' ||
+                this._clockLocation === 'USA') {
+                if (this._end.isInDST) {
+                    this._sunrise = this._sunrise.plus({ hours: 1 });
+                    this._solarNoon = this._solarNoon.plus({ hours: 1 });
+                    this._end = this._end.plus({ hours: 1 });
+                }
+                if (this._start.isInDST) {
+                    this._start = this._start.plus({ hours: 1 });
+                }
+            }
+        }
+        switch (this._badiDate.holyDayNumber) {
+            case 2:
+                // First Day of Ridvan: 15:00 local standard time
+                this._holyDayCommemoration = gregDate.set({ hour: gregDate.isInDST ? 16 : 15 });
+                break;
+            case 5:
+                // Declaration of the Báb: 2 hours 11 minutes after sunset
+                this._holyDayCommemoration = this._start.plus({ minutes: 131 });
+                break;
+            case 6:
+                // Ascension of Bahá'u'lláh: 03:00 local standard time
+                this._holyDayCommemoration = gregDate.set({ hour: gregDate.isInDST ? 4 : 3 });
+                break;
+            case 7:
+                // Martyrdom of the Báb: solar noon
+                this._holyDayCommemoration = this._solarNoon;
+                break;
+            case 11:
+                // Ascension of 'Abdu'l-Bahá: 01:00 local standard time
+                this._holyDayCommemoration = gregDate.set({ hour: gregDate.isInDST ? 2 : 1 });
+                break;
+            // skip default
+        }
+    }
+
+    _setInputDateToCorrectDay(date: InputDate, latitude, longitude): InputDate {
+        if (luxon.DateTime.isDateTime(date)) {
+            const sunset = MeeusSunMoon.sunset(date, latitude, longitude);
+            return (date > sunset) ? date.plus({ days: 1 }) : date;
+        }
+        return date;
+    }
+
+    get badiDate(): BadiDate {
+        return this._badiDate;
+    }
+
+    get start(): luxon.DateTime {
+        return this._start;
+    }
+
+    get sunrise(): luxon.DateTime {
+        return this._sunrise;
+    }
+
+    get solarNoon(): luxon.DateTime {
+        return this._solarNoon;
+    }
+
+    get end(): luxon.DateTime {
+        return this._end;
+    }
+
+    get holyDayCommemoration(): luxon.DateTime | undefined {
+        return this._holyDayCommemoration;
+    }
+
+    get clockLocation(): string | undefined {
+        return this._clockLocation;
+    }
+
+    get latitude(): number {
+        return this._latitude;
+    }
+
+    get longitude(): number {
+        return this._longitude;
+    }
+
+    get timezoneId(): string {
+        return this._timezoneId;
+    }
+
+    get nextMonth(): LocalBadiDate {
+        return new LocalBadiDate(this.badiDate.nextMonth, this._latitude, this._longitude, this._timezoneId);
+    }
+
+    get previousMonth(): LocalBadiDate {
+        return new LocalBadiDate(this.badiDate.previousMonth, this._latitude, this._longitude, this._timezoneId);
+    }
+
+    get nextDay(): LocalBadiDate {
+        return new LocalBadiDate(this.badiDate.nextDay, this._latitude, this._longitude, this._timezoneId);
+    }
+
+    get previousDay(): LocalBadiDate {
+        return new LocalBadiDate(this.badiDate.previousDay, this._latitude, this._longitude, this._timezoneId);
+    }
+}
+
+const badiDateSettings = (settings: BadiDateSettings) => {
+    if (typeof settings.defaultLanguage === 'string' ||
+        typeof settings.underlineFormat === 'string') {
+        badiDateBaseSettings(settings);
+    }
+    if (typeof settings.useClockLocations === 'boolean') {
+        useClockLocations(settings.useClockLocations);
+    }
+};
+
+MeeusSunMoon.settings({ returnTimeForNoEventCase: true, roundToNearestMinute: true });
+
+export { BadiDate, LocalBadiDate, badiDateSettings };

+ 110 - 0
src/locale/ar.ts

@@ -0,0 +1,110 @@
+const month = {
+    1: 'البهاء',
+    2: 'الجلال',
+    3: 'الجمال',
+    4: 'العظمة',
+    5: 'النور',
+    6: 'الرحمة',
+    7: 'الكلمات',
+    8: 'الكمال',
+    9: 'الأسماء',
+    10: 'العزّة',
+    11: 'المشية',
+    12: 'العلم',
+    13: 'القدرة',
+    14: 'القول',
+    15: 'المسائل',
+    16: 'الشرف',
+    17: 'السلطان',
+    18: 'الملك',
+    19: 'العلاء',
+    20: 'ايام الهاء',
+};
+
+const monthL = month;
+
+const holyDay = {
+    1: 'عيد النَّيروز',
+    2: 'اليوم الأول من عيد الرِّضوان',
+    3: 'اليوم التاسع من عيد الرِّضوان',
+    4: 'اليوم الثاني عشر من عيد الرِّضوان',
+    5: 'يوم إعلان دعوة حضرة الباب',
+    6: 'يوم صعود حضرة بهاء الله',
+    7: 'يوم استشهاد حضرة الباب',
+    8: 'يوم ولادة حضرة الباب',
+    9: 'يوم ولادة حضرة بهاء الله',
+    10: 'يوم الميثاق',
+    11: 'يوم صعود حضرة عبد البهاء',
+};
+
+const weekday = {
+    1: 'الجلال',
+    2: 'الجمال',
+    3: 'الكمال',
+    4: 'الفضّال',
+    5: 'العدّال',
+    6: 'الأستجلال',
+    7: 'الاستقلال',
+};
+
+const weekdayAbbr3 = {
+    1: 'جلا',
+    2: 'جما',
+    3: 'كما',
+    4: 'فضّا',
+    5: 'عدّا',
+    6: 'اسج',
+    7: 'اسق',
+};
+
+const weekdayAbbr2 = {
+    1: 'جل',
+    2: 'جم',
+    3: 'كم',
+    4: 'فض',
+    5: 'عد',
+    6: 'اج',
+    7: 'اق',
+};
+
+const weekdayL = {
+    1: 'الجلال',
+    2: 'الجمال',
+    3: 'الكمال',
+    4: 'الفضّال',
+    5: 'العدّال',
+    6: 'الأستجلال',
+    7: 'أستقلال',
+};
+
+const yearInVahid = {
+    1: 'ألف',
+    2: 'باء',
+    3: 'أب',
+    4: 'دﺍﻝ',
+    5: 'باب',
+    6: 'وﺍو',
+    7: 'أبد',
+    8: 'جاد',
+    9: 'بهاء',
+    10: 'حب',
+    11: 'بهاج',
+    12: 'جواب',
+    13: 'احد',
+    14: 'وﻫﺎب',
+    15: 'وداد',
+    16: 'بدیع',
+    17: 'بهي',
+    18: 'ابهى',
+    19: 'واحد',
+};
+
+const vahid = 'واحد';
+const kulliShay = 'كل شيء';
+const BE = 'بديع';
+const badiCalendar = 'تقويم بديع';
+const unicodeCharForZero = '٠';
+const defaultFormat = '&#8207;d MM y BE&#8207;';
+
+export { month, monthL, holyDay, weekday, weekdayAbbr3, weekdayAbbr2, weekdayL, yearInVahid, vahid, kulliShay, BE,
+    badiCalendar, unicodeCharForZero, defaultFormat };

+ 51 - 0
src/locale/de.ts

@@ -0,0 +1,51 @@
+const monthL = {
+    1: 'Herrlichkeit',
+    2: 'Ruhm',
+    3: 'Schönheit',
+    4: 'Größe',
+    5: 'Licht',
+    6: 'Barmherzigkeit',
+    7: 'Worte',
+    8: 'Vollkommenheit',
+    9: 'Namen',
+    10: 'Macht',
+    11: 'Wille',
+    12: 'Wissen',
+    13: 'Kraft',
+    14: 'Sprache',
+    15: 'Fragen',
+    16: 'Ehre',
+    17: 'Souveränität',
+    18: 'Herrschaft',
+    19: 'Erhabenheit',
+    20: 'Ayyám-i-Há',
+};
+
+const holyDay = {
+    1: 'Naw-Rúz',
+    2: 'Erster Riḍván-Tag',
+    3: 'Neunter Riḍván-Tag',
+    4: 'Zwölfter Riḍván-Tag',
+    5: 'Erklärung des Báb',
+    6: 'Hinscheiden Bahá’u’lláhs',
+    7: 'Märtyrertod des Báb',
+    8: 'Geburt des Báb',
+    9: 'Geburt Bahá’u’lláhs',
+    10: 'Tag des Bundes',
+    11: 'Hinscheiden ‘Abdu’l-Bahás',
+};
+
+const weekdayL = {
+    1: 'Ruhm',
+    2: 'Schönheit',
+    3: 'Vollkommenheit',
+    4: 'Gnade',
+    5: 'Gerechtigkeit',
+    6: 'Majestät',
+    7: 'Unabhängigkeit',
+};
+
+const BE = 'B.E.';
+const badiCalendar = 'Badí‘ Kalender';
+
+export { monthL, holyDay, weekdayL, BE, badiCalendar };

+ 6 - 0
src/locale/en-us.ts

@@ -0,0 +1,6 @@
+const monthL = {
+    1: 'Splendor',
+    16: 'Honor',
+};
+
+export { monthL };

+ 132 - 0
src/locale/en.ts

@@ -0,0 +1,132 @@
+const month = {
+    1: 'Bahá',
+    2: 'Jalál',
+    3: 'Jamál',
+    4: '‘Aẓamat',
+    5: 'Núr',
+    6: 'Raḥmat',
+    7: 'Kalimát',
+    8: 'Kamál',
+    9: 'Asmá’',
+    10: '‘Izzat',
+    11: 'Ma_sh_íyyat',
+    12: '‘Ilm',
+    13: 'Qudrat',
+    14: 'Qawl',
+    15: 'Masá’il',
+    16: '_Sh_araf',
+    17: 'Sulṭán',
+    18: 'Mulk',
+    19: '‘Alá’',
+    20: 'Ayyám-i-Há',
+};
+
+const monthL = {
+    1: 'Splendour',
+    2: 'Glory',
+    3: 'Beauty',
+    4: 'Grandeur',
+    5: 'Light',
+    6: 'Mercy',
+    7: 'Words',
+    8: 'Perfection',
+    9: 'Names',
+    10: 'Might',
+    11: 'Will',
+    12: 'Knowledge',
+    13: 'Power',
+    14: 'Speech',
+    15: 'Questions',
+    16: 'Honour',
+    17: 'Sovereignty',
+    18: 'Dominion',
+    19: 'Loftiness',
+    20: 'Ayyám-i-Há',
+};
+
+const holyDay = {
+    1: 'Naw-Rúz',
+    2: 'First day of Riḍván',
+    3: 'Ninth day of Riḍván',
+    4: 'Twelfth day of Riḍván',
+    5: 'Declaration of the Báb',
+    6: 'Ascension of Bahá’u’lláh',
+    7: 'Martyrdom of the Báb',
+    8: 'Birth of the Báb',
+    9: 'Birth of Bahá’u’lláh',
+    10: 'Day of the Covenant',
+    11: 'Ascension of ‘Abdu’l-Bahá',
+};
+
+// CAREFUL: Numbering corresponds to Badí' week, i.e. 1 is Jalál (-> Saturday)
+const weekday = {
+    1: 'Jalál',
+    2: 'Jamál',
+    3: 'Kamál',
+    4: 'Fiḍál',
+    5: '‘Idál',
+    6: 'Istijlál',
+    7: 'Istiqlál',
+};
+
+const weekdayAbbr3 = {
+    1: 'Jal',
+    2: 'Jam',
+    3: 'Kam',
+    4: 'Fiḍ',
+    5: '‘Idá',
+    6: 'Isj',
+    7: 'Isq',
+};
+
+const weekdayAbbr2 = {
+    1: 'Jl',
+    2: 'Jm',
+    3: 'Ka',
+    4: 'Fi',
+    5: '‘Id',
+    6: 'Ij',
+    7: 'Iq',
+};
+
+const weekdayL = {
+    1: 'Glory',
+    2: 'Beauty',
+    3: 'Perfection',
+    4: 'Grace',
+    5: 'Justice',
+    6: 'Majesty',
+    7: 'Independence',
+};
+
+const yearInVahid = {
+    1: 'Alif',
+    2: 'Bá’',
+    3: 'Ab',
+    4: 'Dál',
+    5: 'Báb',
+    6: 'Váv',
+    7: 'Abad',
+    8: 'Jád',
+    9: 'Bahá',
+    10: 'Ḥubb',
+    11: 'Bahháj',
+    12: 'Javáb',
+    13: 'Aḥad',
+    14: 'Vahháb',
+    15: 'Vidád',
+    16: 'Badí‘',
+    17: 'Bahí',
+    18: 'Abhá',
+    19: 'Váḥid',
+};
+
+const vahid = 'Váḥid';
+const kulliShay = 'Kull-i-_Sh_ay’';
+const BE = 'B.E.';
+const badiCalendar = 'Badí‘ Calendar';
+const unicodeCharForZero = '0';
+const defaultFormat = 'd MM+ y BE';
+
+export { month, monthL, holyDay, weekday, weekdayAbbr3, weekdayAbbr2, weekdayL, yearInVahid, vahid, kulliShay, BE,
+    badiCalendar, unicodeCharForZero, defaultFormat };

+ 51 - 0
src/locale/es.ts

@@ -0,0 +1,51 @@
+const monthL = {
+    1: 'Esplendor',
+    2: 'Gloria',
+    3: 'Belleza',
+    4: 'Grandeza',
+    5: 'Luz',
+    6: 'Misericordia',
+    7: 'Palabras',
+    8: 'Perfección',
+    9: 'Nombres',
+    10: 'Fuerza',
+    11: 'Voluntad',
+    12: 'Conocimiento',
+    13: 'Poder',
+    14: 'Discurso',
+    15: 'Preguntas',
+    16: 'Honor',
+    17: 'Soberanía',
+    18: 'Dominio',
+    19: 'Sublimidad',
+    20: 'Ayyám-i-Há',
+};
+
+const holyDay = {
+    1: 'Naw-Rúz',
+    2: 'Primer día de Riḍván',
+    3: 'Noveno día de Riḍván',
+    4: 'Duodécimo día de Riḍván',
+    5: 'Declaración del Báb',
+    6: 'Ascensión de Bahá’u’lláh',
+    7: 'Martirio del Báb',
+    8: 'Nacimiento del Báb',
+    9: 'Nacimiento de Bahá’u’lláh',
+    10: 'Día de la Alianza',
+    11: 'Fallecimiento de ‘Abdu’l-Bahá',
+};
+
+const weekdayL = {
+    1: 'Gloria',
+    2: 'Belleza',
+    3: 'Perfección',
+    4: 'Gracia',
+    5: 'Justicia',
+    6: 'Majestuosidad',
+    7: 'Independencia',
+};
+
+const BE = 'E.B.';
+const badiCalendar = 'Calendario Badí‘';
+
+export { monthL, holyDay, weekdayL, BE, badiCalendar };

+ 131 - 0
src/locale/fa.ts

@@ -0,0 +1,131 @@
+const month = {
+    1: 'البهاء',
+    2: 'الجلال',
+    3: 'الجمال',
+    4: 'العظمة',
+    5: 'النور',
+    6: 'الرحمة',
+    7: 'الكلمات',
+    8: 'الكمال',
+    9: 'الأسماء',
+    10: 'العزّة',
+    11: 'المشية',
+    12: 'العلم',
+    13: 'القدرة',
+    14: 'القول',
+    15: 'المسائل',
+    16: 'الشرف',
+    17: 'السلطان',
+    18: 'الملك',
+    19: 'العلاء',
+    20: 'ايام الهاء',
+};
+
+const monthL = {
+    1: 'بهاء',
+    2: 'جلال',
+    3: 'جمال',
+    4: 'عظمت',
+    5: 'نور',
+    6: 'رحمت',
+    7: 'كلمات',
+    8: 'كمال',
+    9: 'أسماء',
+    10: 'عزّت',
+    11: 'مشيت',
+    12: 'علم',
+    13: 'قدرت',
+    14: 'قول',
+    15: 'مسائل',
+    16: 'شرف',
+    17: 'سلطان',
+    18: 'ملك',
+    19: 'علاء',
+    20: 'ايام ها',
+};
+
+const holyDay = {
+    1: 'عید نوروز',
+    2: 'روز اوّل عید رضوان',
+    3: 'روز نهم عید رضوان',
+    4: 'روز دوازدهم عید رضوان',
+    5: 'بعثت حضرت باب',
+    6: 'صعود حضرت بهاالله',
+    7: 'شهادت حضرت اعلی',
+    8: 'تولّد حضرت اعلی',
+    9: 'تولّد حضرت بهالله',
+    10: 'روز عهد و میثاق',
+    11: 'صعود حضرت عبدالبها',
+};
+
+const weekday = {
+    1: 'یوم الجلال',
+    2: 'یوم الجمال',
+    3: 'یوم الكمال',
+    4: 'یوم الفضّال',
+    5: 'یوم العدّال',
+    6: 'یوم الأستجلال',
+    7: 'یوم الاستقلال',
+};
+
+const weekdayAbbr3 = {
+    1: 'جلا',
+    2: 'جما',
+    3: 'كما',
+    4: 'فضّا',
+    5: 'عدّا',
+    6: 'اسج',
+    7: 'اسق',
+};
+
+const weekdayAbbr2 = {
+    1: 'جل',
+    2: 'جم',
+    3: 'كم',
+    4: 'فض',
+    5: 'عد',
+    6: 'اج',
+    7: 'اق',
+};
+
+const weekdayL = {
+    1: 'جلال',
+    2: 'جمال',
+    3: 'كمال',
+    4: 'فضّال',
+    5: 'عدّال',
+    6: 'استجلال',
+    7: 'استقلال',
+};
+
+const yearInVahid = {
+    1: 'ألف',
+    2: 'باء',
+    3: 'أب',
+    4: 'دﺍﻝ',
+    5: 'باب',
+    6: 'وﺍو',
+    7: 'أبد',
+    8: 'جاد',
+    9: 'بهاء',
+    10: 'حب',
+    11: 'بهاج',
+    12: 'جواب',
+    13: 'احد',
+    14: 'وﻫﺎب',
+    15: 'وداد',
+    16: 'بدیع',
+    17: 'بهي',
+    18: 'ابهى',
+    19: 'واحد',
+};
+
+const vahid = 'واحد';
+const kulliShay = 'كل شيء';
+const BE = 'بديع';
+const badiCalendar = 'تقويم بديع';
+const unicodeCharForZero = '۰';
+const defaultFormat = '&#8207;d MML y BE&#8207;';
+
+export { month, monthL, holyDay, weekday, weekdayAbbr3, weekdayAbbr2, weekdayL, yearInVahid, vahid, kulliShay, BE,
+    badiCalendar, unicodeCharForZero, defaultFormat };

+ 51 - 0
src/locale/fr.ts

@@ -0,0 +1,51 @@
+const monthL = {
+    1: 'Splendeur',
+    2: 'Gloire',
+    3: 'Beauté',
+    4: 'Grandeur',
+    5: 'Lumière',
+    6: 'Miséricorde',
+    7: 'Paroles',
+    8: 'Perfection',
+    9: 'Noms',
+    10: 'Puissance',
+    11: 'Volonté',
+    12: 'Connaissance',
+    13: 'Pouvoir',
+    14: 'Discours',
+    15: 'Questions',
+    16: 'Honneur',
+    17: 'Souveraineté',
+    18: 'Empire',
+    19: 'Élévation',
+    20: 'Ayyám-i-Há',
+};
+
+const holyDay = {
+    1: 'Naw-Rúz',
+    2: 'Premier jour de Riḍván',
+    3: 'Neuvième jour de Riḍván',
+    4: 'Douzième jour de Riḍván',
+    5: 'Déclaration du Báb',
+    6: 'Ascension de Bahá’u’lláh',
+    7: 'Martyre du Báb',
+    8: 'Naissance du Báb',
+    9: 'Naissance de Bahá’u’lláh',
+    10: 'Jour de l’Alliance',
+    11: 'Ascension de ‘Abdu’l-Bahá',
+};
+
+const weekdayL = {
+    1: 'Gloire',
+    2: 'Beauté',
+    3: 'Perfection',
+    4: 'Grâce',
+    5: 'Justice',
+    6: 'Majesté',
+    7: 'Indépendance',
+};
+
+const BE = 'E.B.';
+const badiCalendar = 'Calendrier Badí‘';
+
+export { monthL, holyDay, weekdayL, BE, badiCalendar };

+ 51 - 0
src/locale/lv.ts

@@ -0,0 +1,51 @@
+const monthL = {
+    1: 'Spožums',
+    2: 'Slava',
+    3: 'Skaistums',
+    4: 'Dižums',
+    5: 'Gaisma',
+    6: 'Žēlastība',
+    7: 'Vārdi',
+    8: 'Pilnība',
+    9: 'Nosaukumi',
+    10: 'Varenība',
+    11: 'Griba',
+    12: 'Zināšanas',
+    13: 'Vara',
+    14: 'Runa',
+    15: 'Jautājumi',
+    16: 'Gods',
+    17: 'Suverenitāte',
+    18: 'Valdīšana',
+    19: 'Cēlums',
+    20: 'Ayyám-i-Há',
+};
+
+const holyDay = {
+    1: 'Naw-Rúz',
+    2: 'Riḍván pirmā diena',
+    3: 'Riḍván devītā diena',
+    4: 'Riḍván divpadsmitā diena',
+    5: 'Bába paziņojums',
+    6: 'Bahá’u’lláh Debessbraukšana',
+    7: 'Bába mocekļa nāve',
+    8: 'Bába dzimšanas diena',
+    9: 'Bahá’u’lláh dzimšanas diena',
+    10: 'Derības diena',
+    11: '‘Abdu’l-Bahá Debessbraukšana',
+};
+
+const weekdayL = {
+    1: 'Slava',
+    2: 'Skaistums',
+    3: 'Pilnība',
+    4: 'Žēlastība',
+    5: 'Taisnīgums',
+    6: 'Majestātiskums',
+    7: 'Neatkarība',
+};
+
+const BE = 'B.Ē.';
+const badiCalendar = 'Badí‘ kalendārs';
+
+export { monthL, holyDay, weekdayL, BE, badiCalendar };

+ 51 - 0
src/locale/nl.ts

@@ -0,0 +1,51 @@
+const monthL = {
+    1: 'Pracht',
+    2: 'Heerlijkheid',
+    3: 'Schoonheid',
+    4: 'Grootheid',
+    5: 'Licht',
+    6: 'Barmhartigheid',
+    7: 'Woorden',
+    8: 'Volmaaktheid',
+    9: 'Namen',
+    10: 'Macht',
+    11: 'Wil',
+    12: 'Kennis',
+    13: 'Kracht',
+    14: 'Spraak',
+    15: 'Vragen',
+    16: 'Eer',
+    17: 'Soevereiniteit',
+    18: 'Heerschappij',
+    19: 'Verhevenheid',
+    20: 'Ayyám-i-Há',
+};
+
+const holyDay = {
+    1: 'Naw-Rúz',
+    2: 'Eerste dag van Riḍván',
+    3: 'Negende dag van Riḍván',
+    4: 'Twaalfde dag van Riḍván',
+    5: 'Verkondiging van de Báb',
+    6: 'Heengaan van Bahá’u’lláh',
+    7: 'Marteldood van de Báb',
+    8: 'Geboortedag van de Báb',
+    9: 'Geboortedag van Bahá’u’lláh',
+    10: 'Dag van het Verbond',
+    11: 'Heengaan van ‘Abdu’l-Bahá',
+};
+
+const weekdayL = {
+    1: 'Heerlijkheid',
+    2: 'Schoonheid',
+    3: 'Volmaaktheid',
+    4: 'Genade',
+    5: 'Gerechtigheid',
+    6: 'Majesteit',
+    7: 'Onafhankelijkheid',
+};
+
+const BE = 'B.E.';
+const badiCalendar = 'Badí‘-Kalender';
+
+export { monthL, holyDay, weekdayL, BE, badiCalendar };

+ 51 - 0
src/locale/pt.ts

@@ -0,0 +1,51 @@
+const monthL = {
+    1: 'Esplendor',
+    2: 'Glória',
+    3: 'Beleza',
+    4: 'Grandeza',
+    5: 'Luz',
+    6: 'Miséricórdia',
+    7: 'Palavras',
+    8: 'Perfeição',
+    9: 'Nomes',
+    10: 'Potência',
+    11: 'Vontade',
+    12: 'Conhecimento',
+    13: 'Poder',
+    14: 'Discurso',
+    15: 'Perguntas',
+    16: 'Honra',
+    17: 'Soberania',
+    18: 'Domínio',
+    19: 'Sublimidade',
+    20: 'Ayyám-i-Há',
+};
+
+const holyDay = {
+    1: 'Naw-Rúz',
+    2: '1º dia do Riḍván',
+    3: '9º dia do Riḍván',
+    4: '12º dia do Riḍván',
+    5: 'Declaração do Báb',
+    6: 'Ascensão de Bahá’u’lláh',
+    7: 'Martírio do Báb',
+    8: 'Aniversário do Báb',
+    9: 'Aniversário de Bahá’u’lláh',
+    10: 'Dia do Convênio',
+    11: 'Ascensão de ‘Abdu’l-Bahá',
+};
+
+const weekdayL = {
+    1: 'Glória',
+    2: 'Beleza',
+    3: 'Perfeição',
+    4: 'Graça',
+    5: 'Justiça',
+    6: 'Majestade',
+    7: 'Independência',
+};
+
+const BE = 'E.B.';
+const badiCalendar = 'Calendário Badí‘';
+
+export { monthL, holyDay, weekdayL, BE, badiCalendar };

+ 129 - 0
src/locale/ru.ts

@@ -0,0 +1,129 @@
+const month = {
+    1: 'Бахā',
+    2: 'Джалāл',
+    3: 'Джамāл',
+    4: '‘Аз̣амат',
+    5: 'Нӯр',
+    6: 'Рах̣мат',
+    7: 'Калимāт',
+    8: 'Камāл',
+    9: 'Асмā’',
+    10: '‘Иззат',
+    11: 'Машӣййат',
+    12: '‘Илм',
+    13: 'К̣удрат',
+    14: 'К̣аул',
+    15: 'Масā’ил',
+    16: 'Шараф',
+    17: 'Султ̣ан',
+    18: 'Мулк',
+    19: '‘Алā’',
+    20: 'Аййāм-и Хā',
+};
+
+const monthL = {
+    1: 'Великолепие',
+    2: 'Слава',
+    3: 'Красота',
+    4: 'Величие',
+    5: 'Свет',
+    6: 'Милость',
+    7: 'Слова',
+    8: 'Совершенство',
+    9: 'Имена',
+    10: 'Мощь',
+    11: 'Воля',
+    12: 'Знание',
+    13: 'Могущество',
+    14: 'Речь',
+    15: 'Вопросы',
+    16: 'Честь',
+    17: 'Владычество',
+    18: 'Господство',
+    19: 'Возвышенность',
+    20: 'Аййāм-и Хā',
+};
+
+const holyDay = {
+    1: 'Нау-Рӯз',
+    2: '1-й день Рид̣вāна',
+    3: '9-й день Рид̣вāна',
+    4: '12-й день Рид̣вāна',
+    5: 'Возвещение Баба',
+    6: 'Вознесение Бахауллы',
+    7: 'Мученическая Баба',
+    8: 'рождения Баба',
+    9: 'рождения Бахауллы',
+    10: 'День Завета',
+    11: 'Вознесение Абдул-Баха',
+};
+
+const weekday = {
+    1: 'Джалāл',
+    2: 'Джамāл',
+    3: 'Камāл',
+    4: 'Фид̣āл',
+    5: '‘Идāл',
+    6: 'Истиджлāл',
+    7: 'Истик̣лāл',
+};
+
+const weekdayAbbr3 = {
+    1: 'Джл',
+    2: 'Джм',
+    3: 'Кам',
+    4: 'Фид̣',
+    5: '‘Идā',
+    6: 'Исд',
+    7: 'Иск̣',
+};
+
+const weekdayAbbr2 = {
+    1: 'Дл',
+    2: 'Дм',
+    3: 'Ка',
+    4: 'Фи',
+    5: '‘Ид',
+    6: 'Ид',
+    7: 'Ик̣',
+};
+
+const weekdayL = {
+    1: 'Слава',
+    2: 'Красота',
+    3: 'Совершенство',
+    4: 'Благодать',
+    5: 'Справедливость',
+    6: 'Величие',
+    7: 'Независимость',
+};
+
+const yearInVahid = {
+    1: 'Алиф',
+    2: 'Бā’',
+    3: 'Аб',
+    4: 'Дāл',
+    5: 'Бāб',
+    6: 'Вāв',
+    7: 'Абад',
+    8: 'Джāд',
+    9: 'Бахā',
+    10: 'Х̣убб',
+    11: 'Баххāдж',
+    12: 'Джавāб',
+    13: 'Ах̣ад',
+    14: 'Ваххāб',
+    15: 'Видāд',
+    16: 'Бадӣ‘',
+    17: 'Бахӣ',
+    18: 'Абхā',
+    19: 'Вāх̣ид',
+};
+
+const vahid = 'Вāх̣ид';
+const kulliShay = 'кулл-и шай’';
+const BE = 'Э.Б.';
+const badiCalendar = 'Календарь Бадӣ‘';
+
+export { month, monthL, holyDay, weekday, weekdayAbbr3, weekdayAbbr2, weekdayL, yearInVahid, vahid, kulliShay, BE,
+    badiCalendar };

+ 51 - 0
src/locale/sv.ts

@@ -0,0 +1,51 @@
+const monthL = {
+    1: 'Praktfullhet',
+    2: 'Härlighet',
+    3: 'Skönhet',
+    4: 'Storhet',
+    5: 'Ljus',
+    6: 'Barmhärtighet',
+    7: 'Ord',
+    8: 'Fullkomlighet',
+    9: 'Namn',
+    10: 'Makt',
+    11: 'Vilja',
+    12: 'Kunskap',
+    13: 'Kraft',
+    14: 'Tal',
+    15: 'Frågor',
+    16: 'Ära',
+    17: 'Överhöghet',
+    18: 'Herravälde',
+    19: 'Upphöjdhet',
+    20: 'Ayyám-i-Há',
+};
+
+const holyDay = {
+    1: 'Naw-Rúz',
+    2: 'Första Riḍván',
+    3: 'Nionde Riḍván',
+    4: 'Tolfte Riḍván',
+    5: 'Bábs Deklaration',
+    6: 'Bahá’u’lláhs Bortgång',
+    7: 'Bábs Martyrskap',
+    8: 'Bábs Födelse',
+    9: 'Bahá’u’lláhs Födelse',
+    10: 'Förbundets dag',
+    11: '‘Abdu’l-Bahás Bortgång',
+};
+
+const weekdayL = {
+    1: 'Härlighet',
+    2: 'Skönhet',
+    3: 'Fullkomlighet',
+    4: 'Nåd',
+    5: 'Rättvisa',
+    6: 'Majestät',
+    7: 'Oberoende',
+};
+
+const BE = 'B.E.';
+const badiCalendar = 'Badí‘kalendern';
+
+export { monthL, holyDay, weekdayL, BE, badiCalendar };

+ 129 - 0
src/locale/zh.ts

@@ -0,0 +1,129 @@
+const month = {
+    1: '巴哈',
+    2: '贾拉勒',
+    3: '贾迈勒',
+    4: '阿泽迈特',
+    5: '努尔',
+    6: '拉赫迈特',
+    7: '凯利马特',
+    8: '卡迈勒',
+    9: '艾斯玛',
+    10: '伊扎特',
+    11: '迈希耶特',
+    12: '伊勒姆',
+    13: '古德雷特',
+    14: '高勒',
+    15: '迈萨伊勒',
+    16: '谢拉夫',
+    17: '苏丹',
+    18: '穆勒克',
+    19: '阿拉',
+    20: '阿亚米哈',
+};
+
+const monthL = {
+    1: '耀',
+    2: '辉',
+    3: '美',
+    4: '宏',
+    5: '光',
+    6: '仁',
+    7: '言',
+    8: '完',
+    9: '名',
+    10: '能',
+    11: '意',
+    12: '知',
+    13: '力',
+    14: '语',
+    15: '问',
+    16: '尊',
+    17: '权',
+    18: '统',
+    19: '崇',
+    20: '哈之日',
+};
+
+const holyDay = {
+    1: '诺鲁孜节',
+    2: '里兹万节第一日',
+    3: '里兹万节第九日',
+    4: '里兹万节第十二日',
+    5: '巴孛宣示日',
+    6: '巴哈欧拉升天日',
+    7: '巴孛殉道日',
+    8: '巴孛诞辰',
+    9: '巴哈欧拉诞辰',
+    10: '圣约日',
+    11: '阿博都-巴哈升天日',
+};
+
+const weekday = {
+    1: '贾拉勒',
+    2: '贾迈勒',
+    3: '卡迈勒',
+    4: '菲达勒',
+    5: '伊达勒',
+    6: '伊斯提杰拉勒',
+    7: '伊斯提格拉勒',
+};
+
+const weekdayAbbr3 = {
+    1: '贾拉勒',
+    2: '贾迈勒',
+    3: '卡迈勒',
+    4: '菲达勒',
+    5: '伊达勒',
+    6: '伊斯杰',
+    7: '伊斯格',
+};
+
+const weekdayAbbr2 = {
+    1: '贾拉',
+    2: '贾迈',
+    3: '卡迈',
+    4: '菲达',
+    5: '伊达',
+    6: '伊杰',
+    7: '伊格',
+};
+
+const weekdayL = {
+    1: '辉日',
+    2: '美日',
+    3: '完日',
+    4: '恩日',
+    5: '正日',
+    6: '威日',
+    7: '独日',
+};
+
+const yearInVahid = {
+    1: '艾利夫',
+    2: '巴',
+    3: '艾卜',
+    4: '达勒',
+    5: '巴卜',
+    6: '瓦乌',
+    7: '阿巴德',
+    8: '贾德',
+    9: '巴哈',
+    10: '胡卜',
+    11: '巴哈杰',
+    12: '贾瓦卜',
+    13: '阿哈德',
+    14: '瓦哈卜',
+    15: '维达德',
+    16: '巴迪',
+    17: '巴希',
+    18: '阿卜哈',
+    19: '瓦希德',
+};
+
+const vahid = '瓦希德';
+const kulliShay = '库里沙伊';
+const BE = 'BE';
+const badiCalendar = '巴迪历';
+
+export { month, monthL, holyDay, weekday, weekdayAbbr3, weekdayAbbr2, weekdayL, yearInVahid, vahid, kulliShay, BE,
+    badiCalendar };

+ 13 - 0
src/settings.ts

@@ -0,0 +1,13 @@
+import { BadiDateSettings } from './types';
+import { setDefaultLanguage, setUnderlineFormat } from './badiLocale';
+
+const badiDateSettings = (settings: BadiDateSettings) => {
+    if (settings.defaultLanguage) {
+        setDefaultLanguage(settings.defaultLanguage);
+    }
+    if (settings.underlineFormat) {
+        setUnderlineFormat(settings.underlineFormat);
+    }
+};
+
+export { badiDateSettings };

+ 42 - 0
src/types.d.ts

@@ -0,0 +1,42 @@
+import * as luxon from 'luxon';
+
+export interface BadiYearInfo {
+    nawRuz: luxon.DateTime;
+    ayyamiHaLength: 4 | 5;
+    twinBirthdays: [number, number, number, number];
+}
+
+export interface BadiDateSettings {
+    defaultLanguage?: string;
+    underlineFormat?: UnderlineFormat;
+    useClockLocations?: boolean;
+}
+
+export interface YearMonthDay {
+    year: number;
+    month: number;
+    day: number;
+}
+
+export interface YearHolyDayNumber {
+    year: number;
+    holyDayNumber: number;
+}
+
+export type UnderlineFormat = 'css' | 'u' | 'diacritic' | 'none';
+
+export type InputDate = luxon.DateTime | Date | YearMonthDay | YearHolyDayNumber;
+
+export const enum HolyDay {
+    NawRuz = 1,
+    FirstRidvan = 2,
+    NinthRidvan = 3,
+    TwelfthRidvan = 4,
+    DeclarationOfTheBab = 5,
+    AscensionOfBahaullah = 6,
+    MartyrdomOfTheBab = 7,
+    BirthOfTheBab = 8,
+    BirthOfBahaullah = 9,
+    DayOfTheCovenant = 10,
+    AscensionOfAbdulBaha = 11,
+}

+ 383 - 0
test/badiDate.test.ts

@@ -0,0 +1,383 @@
+import { BadiDate } from '../src/badiDate';
+import { ayyamiHaLengths, UHJListDates } from './testData';
+import * as luxon from 'luxon';
+import { badiDateSettings } from '../src/localBadiDate';
+import { HolyDay } from '../src/types';
+
+describe('Dates for Naw-Rúz and the Twin Holy Days should agree with the UHJ List 172-221', () => {
+    for (let i = 0; i < 50; i++) {
+        it(`should produce the correct dates for ${172 + i} B.E.`, () => {
+            const nawRuz = new BadiDate({ year: i + 172, holyDayNumber: 1 });
+            const birthOfTheBab = new BadiDate({ year: i + 172, holyDayNumber: 8 });
+            const birthOfBahaullah = new BadiDate({ year: i + 172, holyDayNumber: 9 });
+
+            expect(nawRuz.gregorianDate.toFormat('yyyy-MM-dd')).toEqual(UHJListDates[i][0]);
+            expect([birthOfTheBab.month, birthOfTheBab.day])
+                .toEqual((UHJListDates[i][2] as number[]).slice(0, 2));
+            expect([birthOfBahaullah.month, birthOfBahaullah.day])
+                .toEqual((UHJListDates[i][2] as number[]).slice(2, 4));
+        });
+    }
+});
+
+describe('BadiDate conversions', () => {
+    for (let i = 0; i < 1000; i++) {
+        const dayOfYear = Math.floor((Math.random() * 365) + 1);
+        const year = Math.floor((Math.random() * 506) + 1845);
+        const initDate = luxon.DateTime.fromObject({ year, ordinal: dayOfYear, zone: 'UTC' });
+        it(`should be stable when re-creating with diff. constructors: ${initDate.toFormat('yyyy-MM-dd')}`, () => {
+            const badiDate1 = new BadiDate(initDate);
+            const badiDate2 = new BadiDate({ year: badiDate1.year, month: badiDate1.month, day: badiDate1.day });
+            const badiDate3 = new BadiDate(badiDate2.gregorianDate.toJSDate());
+            const badiDate4 = new BadiDate(badiDate3.gregorianDate);
+            expect(badiDate4.isValid).toEqual(true);
+            expect(badiDate4.gregorianDate.toISO()).toEqual(initDate.toISO());
+        });
+    }
+});
+
+it('the date should bubble up if set to 5 Ayyám-i-Há for year with only 4', () => {
+    const badiDate = new BadiDate({ year: 173, month: 20, day: 5 });
+
+    expect(badiDate.month).toEqual(19);
+    expect(badiDate.day).toEqual(1);
+});
+
+describe('the date component getters', () => {
+    for (let badiYear = 1; badiYear < 508; badiYear++) {
+        const badiMonth = Math.floor((Math.random() * 19) + 1);
+        const badiDay = Math.floor((Math.random() * 19) + 1);
+        const badiDate = new BadiDate({ year: badiYear, month: badiMonth, day: badiDay });
+
+        it(`should return the correct day for [${badiYear}, ${badiMonth}, ${badiDay}]`, () => {
+            expect(badiDate.day).toEqual(badiDay);
+        });
+
+        it(`should return the correct month for [${badiYear}, ${badiMonth}, ${badiDay}]`, () => {
+            expect(badiDate.month).toEqual(badiMonth);
+        });
+
+        it(`should return the correct year for [${badiYear}, ${badiMonth}, ${badiDay}]`, () => {
+            expect(badiDate.year).toEqual(badiYear);
+        });
+
+        it(`should return the correct year in Vahid for [${badiYear}, ${badiMonth}, ${badiDay}]`, () => {
+            expect(badiDate.yearInVahid).toEqual(((badiYear - 1) % 19) + 1);
+        });
+
+        it(`should return the correct Vahid for [${badiYear}, ${badiMonth}, ${badiDay}]`, () => {
+            expect(badiDate.vahid).toEqual((Math.floor((badiYear - 1) / 19) % 19) + 1);
+        });
+
+        it(`should return the correct Kull-i-Shay for [${badiYear}, ${badiMonth}, ${badiDay}]`, () => {
+            expect(badiDate.kullIShay).toEqual((badiYear < 362) ? 1 : 2);
+        });
+
+        it(`should return the correct Ayyam-i-Há length for [${badiYear}, ${badiMonth}, ${badiDay}]`, () => {
+            expect(badiDate.ayyamiHaLength).toEqual(ayyamiHaLengths[badiYear]);
+        });
+
+        it(`should return the correct weekday for [${badiYear}, ${badiMonth}, ${badiDay}]`, () => {
+            expect(badiDate.weekday).toEqual((badiDate.gregorianDate.weekday + 1) % 7 + 1);
+        });
+    }
+});
+
+describe('`equals`', () => {
+    it('should compare dates', () => {
+        const invalidBadiDate1 = new BadiDate('someString' as any);
+        const invalidBadiDate2 = new BadiDate('someString' as any);
+        const validBadiDate1 = new BadiDate({ year: 172, holyDayNumber: 10 });
+        const validBadiDate2 = new BadiDate({ year: 172, holyDayNumber: 10 });
+        const validBadiDate3 = new BadiDate({ year: 172, holyDayNumber: 11 });
+        const validBadiDate4 = new BadiDate({ year: 173, holyDayNumber: 10 });
+        const validBadiDate5 = new BadiDate({ year: 173, holyDayNumber: 10 });
+
+        expect(invalidBadiDate1.equals(invalidBadiDate2)).toEqual(false);
+        expect(validBadiDate1.equals(invalidBadiDate2)).toEqual(false);
+        expect(validBadiDate1.equals(validBadiDate2)).toEqual(true);
+        expect(validBadiDate1.equals(validBadiDate3)).toEqual(false);
+        expect(validBadiDate4.equals(validBadiDate5)).toEqual(true);
+    });
+});
+
+describe('Holy Days', () => {
+    afterEach(() => {
+        badiDateSettings({ defaultLanguage: 'en' });
+    });
+
+    const holyDays = [
+        { date: { year: 172, holyDayNumber: HolyDay.NawRuz },
+            expectedOutput: 'Naw-Rúz',
+            workSuspended: true,
+        },
+        { date: { year: 172, holyDayNumber: HolyDay.FirstRidvan },
+            expectedOutput: 'First day of Riḍván',
+            workSuspended: true,
+        },
+        { date: { year: 172, holyDayNumber: HolyDay.NinthRidvan },
+            expectedOutput: 'Ninth day of Riḍván',
+            workSuspended: true,
+        },
+        { date: { year: 172, holyDayNumber: HolyDay.TwelfthRidvan },
+            expectedOutput: 'Twelfth day of Riḍván',
+            workSuspended: true,
+        },
+        { date: { year: 172, holyDayNumber: HolyDay.DeclarationOfTheBab },
+            expectedOutput: 'Declaration of the Báb',
+            workSuspended: true,
+        },
+        { date: { year: 172, holyDayNumber: HolyDay.AscensionOfBahaullah },
+            expectedOutput: 'Ascension of Bahá’u’lláh',
+            workSuspended: true,
+        },
+        { date: { year: 172, holyDayNumber: HolyDay.MartyrdomOfTheBab },
+            expectedOutput: 'Martyrdom of the Báb',
+            workSuspended: true,
+        },
+        { date: { year: 172, holyDayNumber: HolyDay.BirthOfTheBab },
+            expectedOutput: 'Birth of the Báb',
+            workSuspended: true,
+        },
+        { date: { year: 172, holyDayNumber: HolyDay.BirthOfBahaullah },
+            expectedOutput: 'Birth of Bahá’u’lláh',
+            workSuspended: true,
+        },
+        { date: { year: 172, holyDayNumber: HolyDay.DayOfTheCovenant },
+            expectedOutput: 'Day of the Covenant',
+            workSuspended: false,
+        },
+        { date: { year: 172, holyDayNumber: HolyDay.AscensionOfAbdulBaha },
+            expectedOutput: 'Ascension of ‘Abdu’l-Bahá',
+            workSuspended: false,
+        },
+        { date: { year: 172, month: 1, day: 2 },
+            expectedOutput: '',
+            workSuspended: undefined,
+        },
+    ];
+
+    holyDays.forEach(({ date, expectedOutput }) => {
+        it('should output Holy Days correctly', () => {
+            const badiDate = new BadiDate(date);
+
+            expect(badiDate.holyDay()).toEqual(expectedOutput);
+        });
+    });
+
+    holyDays.forEach(({ date, workSuspended }) => {
+        it('should get work suspended info for Holy Days or not correctly', () => {
+            const badiDate = new BadiDate(date);
+
+            expect(badiDate.workSuspended).toEqual(workSuspended);
+        });
+    });
+
+    it('should be shown in the default language', () => {
+        badiDateSettings({ defaultLanguage: 'es' });
+        const badiDate = new BadiDate({ year: 172, holyDayNumber: 10 });
+
+        expect(badiDate.holyDay()).toEqual('Día de la Alianza');
+    });
+
+    it('should be shown in the selected language', () => {
+        const badiDate = new BadiDate({ year: 172, holyDayNumber: 10 });
+
+        expect(badiDate.holyDay('fr')).toEqual('Jour de l’Alliance');
+    });
+
+    it('should fall back', () => {
+        const badiDate = new BadiDate({ year: 172, holyDayNumber: 10 });
+
+        expect(badiDate.holyDay('xyz')).toEqual('Day of the Covenant');
+    });
+});
+
+describe('Invalid input', () => {
+    const invalidInputDates = [
+        'someString',
+        luxon.DateTime.fromISO('2360-01-01', { zone: 'UTC' }),
+        { year: 508, month: 10, day: 10 },
+        { year: 172, month: 20, day: 6 },
+        { year: 172, month: 10, day: 25 },
+        { year: 172, holyDayNumber: 12 },
+    ];
+
+    invalidInputDates.forEach(inputDate => {
+        it('should produce an invalid Badí date', () => {
+            const badiDate = new BadiDate(inputDate as any);
+
+            expect(badiDate.isValid).toEqual(false);
+            expect(badiDate.year).toBeNaN();
+            expect(badiDate.month).toBeNaN();
+            expect(badiDate.day).toBeNaN();
+            expect(badiDate.ayyamiHaLength).toBeNaN();
+            expect(badiDate.gregorianDate.isValid).toEqual(false);
+            expect(badiDate.invalidReason).toBeDefined();
+            expect(badiDate.format()).toEqual('Not a valid Badí‘ date');
+        });
+    });
+});
+
+describe('the string formatter', () => {
+    afterAll(() => {
+        badiDateSettings({ underlineFormat: 'css' });
+    });
+
+    it('should use a default format if no format string is defined', () => {
+        const badiDate = new BadiDate({ year: 172, month: 1, day: 1 });
+
+        expect(badiDate.format()).toEqual('1 Bahá (Splendour) 172 B.E.');
+    });
+
+    it('should parse all tokens in the format string', () => {
+        badiDateSettings({ underlineFormat: 'diacritic' });
+        const badiDate = new BadiDate({ year: 50, month: 1, day: 16 });
+        const formatStr = 'd dd D DD DDL DD+ m mm M MM MML MM+ y yy ww W WW WWL yv yyv YV v vv Va k kk KiS BE BC';
+        const expectedResult = '16 16 S̲h̲a S̲h̲araf Honour S̲h̲araf (Honour) 1 01 Bah Bahá Splendour ' +
+            'Bahá (Splendour) 50 050 ‘Id ‘Idá ‘Idál Justice 12 12 Javáb 3 03 Váḥid 1 01 Kull-i-S̲h̲ay’ B.E. ' +
+            'Badí‘ Calendar';
+
+        expect(badiDate.format(formatStr)).toEqual(expectedResult);
+    });
+
+    it('should include non-tokens as is in the output', () => {
+        const badiDate = new BadiDate({ year: 172, month: 1, day: 1 });
+
+        expect(badiDate.format('d XYZMML yy BE')).toEqual('1 XYZSplendour 172 B.E.');
+    });
+
+    it('should include everything in curly braces as is in the output', () => {
+        const badiDate = new BadiDate({ year: 172, month: 1, day: 1 });
+
+        expect(badiDate.format('d { MML M}M yy BE')).toEqual('1  MML MBah 172 B.E.');
+    });
+
+    const croppedFormatData = [
+        { month: 4, croppedCss: '‘Aẓa', croppedUTag: '‘Aẓa', croppedDiacritic: '‘Aẓa' },
+        { month: 10, croppedCss: '‘Izz', croppedUTag: '‘Izz', croppedDiacritic: '‘Izz' },
+        {
+            month: 11,
+            croppedCss: 'Ma<span style="text-decoration:underline">s</span>',
+            croppedUTag: 'Ma<u>s</u>',
+            croppedDiacritic: 'Mas̲',
+        },
+        { month: 12, croppedCss: '‘Ilm', croppedUTag: '‘Ilm', croppedDiacritic: '‘Ilm' },
+        {
+            month: 16,
+            croppedCss: '<span style="text-decoration:underline">Sh</span>a',
+            croppedUTag: '<u>Sh</u>a',
+            croppedDiacritic: 'S̲h̲a',
+        },
+        { month: 19, croppedCss: '‘Alá’', croppedUTag: '‘Alá’', croppedDiacritic: '‘Alá’' },
+    ];
+
+    croppedFormatData.forEach(({ month, croppedCss }) => {
+        it('should crop the output appropriately with css underlining', () => {
+            badiDateSettings({ underlineFormat: 'css' });
+            const badiDate = new BadiDate({ year: 172, month, day: 1 });
+
+            expect(badiDate.format('M')).toEqual(croppedCss);
+        });
+    });
+
+    croppedFormatData.forEach(({ month, croppedUTag }) => {
+        it('should crop the output appropriately with u-tag underlining', () => {
+            badiDateSettings({ underlineFormat: 'u' });
+            const badiDate = new BadiDate({ year: 172, month, day: 1 });
+
+            expect(badiDate.format('M')).toEqual(croppedUTag);
+        });
+    });
+
+    croppedFormatData.forEach(({ month, croppedDiacritic }) => {
+        it('should crop the output appropriately with diacritic underlining', () => {
+            badiDateSettings({ underlineFormat: 'diacritic' });
+            const badiDate = new BadiDate({ year: 172, month, day: 1 });
+
+            expect(badiDate.format('M')).toEqual(croppedDiacritic);
+        });
+    });
+
+    it('should omit underlining if underlineFormat is "none"', () => {
+        badiDateSettings({ underlineFormat: 'none' });
+        const badiDate = new BadiDate({ year: 172, month: 16, day: 1 });
+
+        expect(badiDate.format('MM')).toEqual('Sharaf');
+    });
+
+    it('should not change the underlineFormat if new setting is invalid', () => {
+        badiDateSettings({ underlineFormat: 'diacritic' });
+        badiDateSettings({ underlineFormat: 'invalid' } as any);
+        const badiDate = new BadiDate({ year: 172, month: 16, day: 1 });
+
+        expect(badiDate.format('MM')).toEqual('S̲h̲araf');
+    });
+
+    it('should output an error if the formatting string has non-matching braces', () => {
+        const badiDate = new BadiDate({ year: 172, month: 16, day: 1 });
+
+        expect(badiDate.format('MM {XYZ')).toEqual('Invalid formatting string.');
+    });
+
+    it('should only render one item each for DD+ and MM+ if both items would be identical', () => {
+        const badiDate = new BadiDate({ year: 172, month: 1, day: 2 });
+        const expectedOutput = 'الجلال البهاء';
+
+        expect(badiDate.format('DD+ MM+', 'ar')).toEqual(expectedOutput);
+    });
+
+    it('should render the DD+ and MM+ tokens appropriately in rtl languages', () => {
+        const badiDate = new BadiDate({ year: 172, month: 1, day: 2 });
+        const expectedOutput = '<span dir="rtl">الجلال (جلال)</span> <span dir="rtl">البهاء (بهاء)</span>';
+
+        expect(badiDate.format('DD+ MM+', 'fa')).toEqual(expectedOutput);
+    });
+
+    it('should render digits as different unicode characters where appropriate', () => {
+        const badiDate = new BadiDate({ year: 172, month: 17, day: 5 });
+
+        expect(badiDate.format('dd mm', 'ar')).toEqual('٠٥ ١٧');
+    });
+});
+
+describe('the language selection', () => {
+    afterEach(() => {
+        badiDateSettings({ defaultLanguage: 'en' });
+    });
+
+    const badiDate = new BadiDate({ year: 172, month: 1, day: 2 });
+
+    it('should format the date in the given language if passed as parameter', () => {
+        expect(badiDate.format('MML', 'es')).toEqual('Esplendor');
+    });
+
+    it('should format the date in the given language if set as default', () => {
+        badiDateSettings({ defaultLanguage: 'es' });
+
+        expect(badiDate.format('MML')).toEqual('Esplendor');
+    });
+
+    it('should fall back to English if given an invalid language code', () => {
+        expect(badiDate.format('MML', 'invalidLanguage')).toEqual('Splendour');
+    });
+
+    it('should keep the current default language if set to an invalid language', () => {
+        badiDateSettings({ defaultLanguage: 'es' });
+        badiDateSettings({ defaultLanguage: 'invalidLanguage' });
+
+        expect(badiDate.format('MML')).toEqual('Esplendor');
+    });
+
+    it('should fall back to the primary language if an unknown extended language subtag is present', () => {
+        expect(badiDate.format('MML', 'fr-ch')).toEqual('Splendeur');
+    });
+
+    it('should fall back to the primary language on a per-token basis', () => {
+        expect(badiDate.format('MML BE', 'en-us')).toEqual('Splendor B.E.');
+    });
+
+    it('should use a fallback if the given key is not present in the locale file', () => {
+        expect(badiDate.format('MM BE', 'sv')).toEqual('Bahá B.E.');
+    });
+});

+ 297 - 0
test/localBadiDate.test.ts

@@ -0,0 +1,297 @@
+import { BadiDate, badiDateSettings, LocalBadiDate } from '../src/localBadiDate';
+import { BadiDate as BadiDateOrig } from '../src/badiDate';
+import { clockLocationFromPolygons } from '../src/clockLocations';
+import * as luxon from 'luxon';
+import { clockMap } from './testData';
+import { BadiDateSettings } from '../src/types';
+
+const timesString = localBadiDate => (
+    `${localBadiDate.start.toFormat('HH:mm:ss')}|${
+        localBadiDate.sunrise.toFormat('HH:mm:ss')}|${
+        localBadiDate.solarNoon.toFormat('HH:mm:ss')}|${
+        localBadiDate.end.toFormat('HH:mm:ss')}`);
+
+const bahjiLat = 32.943;
+const bahjiLng = 35.092;
+
+describe('API', () => {
+    expect(BadiDateOrig).toEqual(BadiDate);
+});
+
+describe('timestamps for start, sunrise, solar noon, and sunrise', () => {
+    const badiDate = new LocalBadiDate({ year: 172, month: 1, day: 1 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
+
+    it('should have the correct timestamp for start', () => {
+        expect(badiDate.start.toISO()).toEqual('2015-03-20T17:51:00.000+02:00');
+    });
+
+    it('should have the correct timestamp for sunrise', () => {
+        expect(badiDate.sunrise.toISO()).toEqual('2015-03-21T05:43:00.000+02:00');
+    });
+
+    it('should have the correct timestamp for solar noon', () => {
+        expect(badiDate.solarNoon.toISO()).toEqual('2015-03-21T11:47:00.000+02:00');
+    });
+
+    it('should have the correct timestamp for end', () => {
+        expect(badiDate.end.toISO()).toEqual('2015-03-21T17:52:00.000+02:00');
+    });
+});
+
+describe('Getters', () => {
+    it('should return values from geographic getters', () => {
+        const badiDate = new LocalBadiDate({ year: 172, month: 1, day: 1 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
+        expect(badiDate.latitude).toEqual(bahjiLat);
+        expect(badiDate.longitude).toEqual(bahjiLng);
+        expect(badiDate.timezoneId).toEqual('Asia/Jerusalem');
+    });
+
+    it('should return appropriate relative `LocalBadiDate` instances', () => {
+        const badiDate1 = new LocalBadiDate({ year: 172, month: 1, day: 1 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
+        expect(badiDate1.nextMonth.badiDate.month).toEqual(2);
+        expect(badiDate1.nextMonth.badiDate.day).toEqual(1);
+        expect(badiDate1.previousMonth.badiDate.month).toEqual(19);
+        expect(badiDate1.previousMonth.badiDate.day).toEqual(1);
+        expect(badiDate1.nextDay.badiDate.month).toEqual(1);
+        expect(badiDate1.nextDay.badiDate.day).toEqual(2);
+        expect(badiDate1.previousDay.badiDate.month).toEqual(19);
+        expect(badiDate1.previousDay.badiDate.day).toEqual(19);
+
+        const badiDate2 = new LocalBadiDate({ year: 172, month: 9, day: 5 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
+        expect(badiDate2.nextMonth.badiDate.month).toEqual(10);
+        expect(badiDate2.nextMonth.badiDate.day).toEqual(1);
+        expect(badiDate2.previousMonth.badiDate.month).toEqual(8);
+        expect(badiDate2.previousMonth.badiDate.day).toEqual(1);
+        expect(badiDate2.nextDay.badiDate.month).toEqual(9);
+        expect(badiDate2.nextDay.badiDate.day).toEqual(6);
+        expect(badiDate2.previousDay.badiDate.month).toEqual(9);
+        expect(badiDate2.previousDay.badiDate.day).toEqual(4);
+
+        const badiDate3 = new LocalBadiDate({ year: 172, month: 19, day: 19 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
+        expect(badiDate3.nextMonth.badiDate.month).toEqual(1);
+        expect(badiDate3.nextMonth.badiDate.day).toEqual(1);
+        expect(badiDate3.previousMonth.badiDate.month).toEqual(20);
+        expect(badiDate3.previousMonth.badiDate.day).toEqual(1);
+        expect(badiDate3.nextDay.badiDate.month).toEqual(1);
+        expect(badiDate3.nextDay.badiDate.day).toEqual(1);
+        expect(badiDate3.previousDay.badiDate.month).toEqual(19);
+        expect(badiDate3.previousDay.badiDate.day).toEqual(18);
+
+        const badiDate4 = new LocalBadiDate({ year: 172, month: 19, day: 1 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
+        expect(badiDate4.nextMonth.badiDate.month).toEqual(1);
+        expect(badiDate4.nextMonth.badiDate.day).toEqual(1);
+        expect(badiDate4.previousMonth.badiDate.month).toEqual(20);
+        expect(badiDate4.previousMonth.badiDate.day).toEqual(1);
+        expect(badiDate4.nextDay.badiDate.month).toEqual(19);
+        expect(badiDate4.nextDay.badiDate.day).toEqual(2);
+        expect(badiDate4.previousDay.badiDate.month).toEqual(20);
+        expect(badiDate4.previousDay.badiDate.day).toEqual(4);
+
+        const badiDate5 = new LocalBadiDate({ year: 178, month: 19, day: 1 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
+        expect(badiDate5.nextMonth.badiDate.month).toEqual(1);
+        expect(badiDate5.nextMonth.badiDate.day).toEqual(1);
+        expect(badiDate5.previousMonth.badiDate.month).toEqual(20);
+        expect(badiDate5.previousMonth.badiDate.day).toEqual(1);
+        expect(badiDate5.nextDay.badiDate.month).toEqual(19);
+        expect(badiDate5.nextDay.badiDate.day).toEqual(2);
+        expect(badiDate5.previousDay.badiDate.month).toEqual(20);
+        expect(badiDate5.previousDay.badiDate.day).toEqual(5);
+
+        const badiDate6 = new LocalBadiDate({ year: 172, month: 20, day: 4 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
+        expect(badiDate6.nextMonth.badiDate.month).toEqual(19);
+        expect(badiDate6.nextMonth.badiDate.day).toEqual(1);
+        expect(badiDate6.previousMonth.badiDate.month).toEqual(18);
+        expect(badiDate6.previousMonth.badiDate.day).toEqual(1);
+        expect(badiDate6.nextDay.badiDate.month).toEqual(19);
+        expect(badiDate6.nextDay.badiDate.day).toEqual(1);
+        expect(badiDate6.previousDay.badiDate.month).toEqual(20);
+        expect(badiDate6.previousDay.badiDate.day).toEqual(3);
+
+        const badiDate7 = new LocalBadiDate({ year: 172, month: 18, day: 1 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
+        expect(badiDate7.nextMonth.badiDate.month).toEqual(20);
+        expect(badiDate7.nextMonth.badiDate.day).toEqual(1);
+        expect(badiDate7.previousMonth.badiDate.month).toEqual(17);
+        expect(badiDate7.previousMonth.badiDate.day).toEqual(1);
+        expect(badiDate7.nextDay.badiDate.month).toEqual(18);
+        expect(badiDate7.nextDay.badiDate.day).toEqual(2);
+        expect(badiDate7.previousDay.badiDate.month).toEqual(17);
+        expect(badiDate7.previousDay.badiDate.day).toEqual(19);
+    });
+});
+
+it('should use the following day as input for the BadiDate if the input datetime is after sunset', () => {
+    const badiDate1 = new LocalBadiDate(luxon.DateTime.fromISO('2015-03-21T12:00:00', { zone: 'Asia/Jerusalem' }),
+        bahjiLat, bahjiLng, 'Asia/Jerusalem');
+    const badiDate2 = new LocalBadiDate(luxon.DateTime.fromISO('2015-03-21T20:00:00', { zone: 'Asia/Jerusalem' }),
+        bahjiLat, bahjiLng, 'Asia/Jerusalem');
+
+    expect(badiDate1.badiDate.gregorianDate.day).toEqual(21);
+    expect(badiDate2.badiDate.gregorianDate.day).toEqual(22);
+});
+
+describe('the BadiDate settings', () => {
+    const settingsData = [
+        {
+            settings: { defaultLanguage: 'en', underlineFormat: 'css' },
+            expectedOutput: 'Ma<span style="text-decoration:underline">sh</span>íyyat (Will)',
+        }, {
+            settings: { defaultLanguage: 'es', underlineFormat: 'css' },
+            expectedOutput: 'Ma<span style="text-decoration:underline">sh</span>íyyat (Voluntad)',
+        }, {
+            settings: { defaultLanguage: 'en', underlineFormat: 'diacritic' },
+            expectedOutput: 'Mas̲h̲íyyat (Will)',
+        }, {
+            settings: { defaultLanguage: 'es', underlineFormat: 'diacritic' },
+            expectedOutput: 'Mas̲h̲íyyat (Voluntad)',
+        },
+    ];
+    const badiDate = new LocalBadiDate({ year: 172, month: 11, day: 1 }, bahjiLat, bahjiLng, 'Asia/Jerusalem');
+
+    settingsData.forEach(({ settings, expectedOutput }) => {
+        it('should pass on the settings to the BadiDate class', () => {
+            badiDateSettings(settings as BadiDateSettings);
+
+            expect(badiDate.badiDate.format('MM+')).toEqual(expectedOutput);
+        });
+    });
+});
+
+describe('the useClockLocationSettings', () => {
+    afterAll(() => {
+        badiDateSettings({ useClockLocations: true });
+    });
+
+    const clockLocationDates = [
+        {
+            date: { year: 172, month: 1, day: 1 },
+            latitude: 65.0,
+            longitude: -150.0,
+            timezone: 'America/Anchorage',
+            fixedTimes: '19:00:00|07:00:00|13:00:00|19:00:00',
+            solarTimes: '20:16:00|07:57:00|14:07:00|20:19:00',
+            clockLocation: 'USA',
+        }, {
+            date: { year: 172, month: 1, day: 1 },
+            latitude: 62.0,
+            longitude: -120.0,
+            timezone: 'America/Edmonton',
+            fixedTimes: '18:00:00|06:30:00|12:00:00|18:00:00',
+            solarTimes: '20:15:00|07:58:00|14:07:00|20:18:00',
+            clockLocation: 'Canada',
+        }, {
+            date: { year: 172, month: 1, day: 1 },
+            latitude: 65.0,
+            longitude: -19.0,
+            timezone: 'Atlantic/Reykjavik',
+            fixedTimes: '18:00:00|06:00:00|13:00:00|18:00:00',
+            solarTimes: '19:31:00|07:14:00|13:23:00|19:34:00',
+            clockLocation: 'Iceland',
+        }, {
+            date: { year: 172, month: 1, day: 1 },
+            latitude: 60.0,
+            longitude: 10.0,
+            timezone: 'Europe/Oslo',
+            fixedTimes: '18:00:00|06:00:00|12:00:00|18:00:00',
+            solarTimes: '18:34:00|06:20:00|12:27:00|18:36:00',
+            clockLocation: 'Norway',
+        }, {
+            date: { year: 172, month: 1, day: 1 },
+            latitude: 65.0,
+            longitude: 17.0,
+            timezone: 'Europe/Stockholm',
+            fixedTimes: '18:00:00|06:00:00|12:00:00|18:00:00',
+            solarTimes: '18:07:00|05:51:00|11:59:00|18:10:00',
+            clockLocation: 'Sweden',
+        }, {
+            date: { year: 172, month: 1, day: 1 },
+            latitude: 65.0,
+            longitude: 28.0,
+            timezone: 'Europe/Helsinki',
+            fixedTimes: '18:00:00|06:00:00|12:00:00|18:00:00',
+            solarTimes: '18:23:00|06:07:00|12:15:00|18:26:00',
+            clockLocation: 'Finland',
+        }, {
+            date: { year: 172, month: 19, day: 19 },
+            latitude: 65.0,
+            longitude: 28.0,
+            timezone: 'Europe/Helsinki',
+            fixedTimes: '18:19:00|06:11:00|12:16:00|18:22:00',
+            solarTimes: '18:19:00|06:11:00|12:16:00|18:22:00',
+            clockLocation: 'Finland',
+        },
+    ];
+
+    clockLocationDates.forEach(({ date, latitude, longitude, timezone, fixedTimes, clockLocation }) => {
+        it('should output the appropriate time for areas where fixed times are used', () => {
+            const badiDate = new LocalBadiDate(date, latitude, longitude, timezone);
+
+            expect(timesString(badiDate)).toEqual(fixedTimes);
+            expect(badiDate.clockLocation).toEqual(clockLocation);
+        });
+    });
+
+    clockLocationDates.forEach(({ date, latitude, longitude, timezone, solarTimes }) => {
+        it('should not output fixed times if useClockLocations if false', () => {
+            badiDateSettings({ useClockLocations: false });
+            const badiDate = new LocalBadiDate(date, latitude, longitude, timezone);
+
+            expect(timesString(badiDate)).toEqual(solarTimes);
+            expect(badiDate.clockLocation).toBeUndefined();
+        });
+    });
+
+    describe('should determine the correct region for the given coordinates', () => {
+        beforeEach(() => {
+            badiDateSettings({ useClockLocations: true });
+        });
+
+        const valueMapping = [undefined, 'USA', 'Canada', 'Iceland', 'Norway', 'Sweden', 'Finland'];
+        for (let i = 0; i < 40; i++) {
+            const lat = 90 - i;
+            for (let j = 0; j < 360; j++) {
+                const lng = -180 + j;
+                it(`latitude: ${lat}, longitude: ${lng}`, () => {
+                    expect(clockLocationFromPolygons(lat, lng)).toEqual(valueMapping[clockMap[i][j]]);
+                });
+            }
+        }
+    });
+});
+
+describe('the Holy Day commemoration times', () => {
+    const holyDayDates = [
+        { date: { year: 172, holyDayNumber: 1 }, commemorationTime: undefined },
+        { date: { year: 172, holyDayNumber: 2 }, commemorationTime: '16:00:00' },
+        { date: { year: 172, holyDayNumber: 3 }, commemorationTime: undefined },
+        { date: { year: 172, holyDayNumber: 4 }, commemorationTime: undefined },
+        { date: { year: 172, holyDayNumber: 5 }, commemorationTime: '21:48:00' },
+        { date: { year: 172, holyDayNumber: 6 }, commemorationTime: '04:00:00' },
+        { date: { year: 172, holyDayNumber: 7 }, commemorationTime: '12:45:00' },
+        { date: { year: 172, holyDayNumber: 8 }, commemorationTime: undefined },
+        { date: { year: 172, holyDayNumber: 9 }, commemorationTime: undefined },
+        { date: { year: 172, holyDayNumber: 10 }, commemorationTime: undefined },
+        { date: { year: 172, holyDayNumber: 11 }, commemorationTime: '01:00:00' },
+    ];
+
+    holyDayDates.forEach(({ date, commemorationTime }) => {
+        it('should show the correct comemmoration time where appropriate', () => {
+            const badiDate = new LocalBadiDate(date, bahjiLat, bahjiLng, 'Asia/Jerusalem');
+
+            expect(badiDate.holyDayCommemoration?.toFormat?.('HH:mm:ss')).toEqual(commemorationTime);
+        });
+    });
+
+    const southernHemisphereCommemorationTimes = [
+        { date: { year: 172, holyDayNumber: 2 }, commemorationTime: '15:00:00' },
+        { date: { year: 172, holyDayNumber: 6 }, commemorationTime: '03:00:00' },
+        { date: { year: 172, holyDayNumber: 11 }, commemorationTime: '02:00:00' },
+    ];
+
+    southernHemisphereCommemorationTimes.forEach(({ date, commemorationTime }) => {
+        it('should show the correct commemoration time in the southern hemisphere with DST', () => {
+            const badiDate = new LocalBadiDate(date, 33.8, 151.2, 'Australia/Sydney');
+
+            expect(badiDate.holyDayCommemoration.toFormat?.('HH:mm:ss')).toEqual(commemorationTime);
+        });
+    });
+});

+ 116 - 0
test/testData.ts

@@ -0,0 +1,116 @@
+/* eslint-disable indent */
+const UHJListDates = [
+    ['2015-03-21', 4, [13, 10, 13, 11]],
+    ['2016-03-20', 4, [12, 18, 12, 19]],
+    ['2017-03-20', 5, [12, 7, 12, 8]],
+    ['2018-03-21', 4, [13, 6, 13, 7]],
+    ['2019-03-21', 4, [12, 14, 12, 15]],
+    ['2020-03-20', 4, [12, 4, 12, 5]],
+    ['2021-03-20', 5, [13, 4, 13, 5]],
+    ['2022-03-21', 4, [12, 11, 12, 12]],
+    ['2023-03-21', 4, [12, 1, 12, 2]],
+    ['2024-03-20', 4, [12, 19, 13, 1]],
+    ['2025-03-20', 5, [12, 8, 12, 9]],
+    ['2026-03-21', 4, [13, 7, 13, 8]],
+    ['2027-03-21', 4, [12, 15, 12, 16]],
+    ['2028-03-20', 4, [12, 5, 12, 6]],
+    ['2029-03-20', 4, [13, 5, 13, 6]],
+    ['2030-03-20', 5, [12, 14, 12, 15]],
+    ['2031-03-21', 4, [12, 2, 12, 3]],
+    ['2032-03-20', 4, [13, 2, 13, 3]],
+    ['2033-03-20', 4, [12, 10, 12, 11]],
+    ['2034-03-20', 5, [13, 10, 13, 11]],
+    ['2035-03-21', 4, [12, 17, 12, 18]],
+    ['2036-03-20', 4, [12, 6, 12, 7]],
+    ['2037-03-20', 4, [13, 6, 13, 7]],
+    ['2038-03-20', 5, [12, 15, 12, 16]],
+    ['2039-03-21', 4, [12, 4, 12, 5]],
+    ['2040-03-20', 4, [13, 4, 13, 5]],
+    ['2041-03-20', 4, [12, 12, 12, 13]],
+    ['2042-03-20', 5, [12, 1, 12, 2]],
+    ['2043-03-21', 4, [12, 19, 13, 1]],
+    ['2044-03-20', 4, [12, 8, 12, 9]],
+    ['2045-03-20', 4, [13, 8, 13, 9]],
+    ['2046-03-20', 5, [12, 16, 12, 17]],
+    ['2047-03-21', 4, [12, 5, 12, 6]],
+    ['2048-03-20', 4, [13, 5, 13, 6]],
+    ['2049-03-20', 4, [12, 14, 12, 15]],
+    ['2050-03-20', 5, [12, 3, 12, 4]],
+    ['2051-03-21', 4, [13, 2, 13, 3]],
+    ['2052-03-20', 4, [12, 10, 12, 11]],
+    ['2053-03-20', 4, [13, 9, 13, 10]],
+    ['2054-03-20', 5, [12, 18, 12, 19]],
+    ['2055-03-21', 4, [12, 6, 12, 7]],
+    ['2056-03-20', 4, [13, 6, 13, 7]],
+    ['2057-03-20', 4, [12, 15, 12, 16]],
+    ['2058-03-20', 4, [12, 4, 12, 5]],
+    ['2059-03-20', 5, [13, 4, 13, 5]],
+    ['2060-03-20', 4, [12, 11, 12, 12]],
+    ['2061-03-20', 4, [11, 19, 12, 1]],
+    ['2062-03-20', 4, [12, 19, 13, 1]],
+    ['2063-03-20', 5, [12, 9, 12, 10]],
+    ['2064-03-20', 4, [13, 8, 13, 9]],
+];
+
+/* eslint-disable comma-spacing, max-len */
+const clockMap = [
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 6, 6, 4, 4, 4, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 0, 5, 5, 5, 5, 5, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 5, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+    [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0],
+    [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0],
+    [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+];
+
+const ayyamiHaLengths =
+    [0, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4,
+     5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4,
+     5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4,
+     5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4,
+     5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 4, 4, 5, 4, 4, 4, 5, 4,
+     4, 4, 5, 4, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 4,
+     5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 4, 5, 4, 4,
+     4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 4, 5, 4, 4, 4, 5, 4,
+     4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5,
+     4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4,
+     5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4,
+     4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4,
+     4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5,
+     4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 4, 4,
+     5, 4, 4, 4];
+
+export { UHJListDates, clockMap, ayyamiHaLengths };

+ 8 - 0
tsconfig.json

@@ -0,0 +1,8 @@
+{
+  "compilerOptions": {
+    "target": "es2017",
+    "esModuleInterop": true,
+    "moduleResolution": "Node",
+  },
+  "include": ["./src/**/*"]
+}

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików