summaryrefslogtreecommitdiff
path: root/src/node_modules/validator
diff options
context:
space:
mode:
Diffstat (limited to 'src/node_modules/validator')
-rw-r--r--src/node_modules/validator/CHANGELOG.md683
-rw-r--r--src/node_modules/validator/LICENSE20
-rw-r--r--src/node_modules/validator/README.md256
-rw-r--r--src/node_modules/validator/es/index.js181
-rw-r--r--src/node_modules/validator/es/lib/alpha.js100
-rw-r--r--src/node_modules/validator/es/lib/blacklist.js5
-rw-r--r--src/node_modules/validator/es/lib/contains.js6
-rw-r--r--src/node_modules/validator/es/lib/equals.js5
-rw-r--r--src/node_modules/validator/es/lib/escape.js5
-rw-r--r--src/node_modules/validator/es/lib/isAfter.js9
-rw-r--r--src/node_modules/validator/es/lib/isAlpha.js13
-rw-r--r--src/node_modules/validator/es/lib/isAlphanumeric.js13
-rw-r--r--src/node_modules/validator/es/lib/isAscii.js10
-rw-r--r--src/node_modules/validator/es/lib/isBIC.js6
-rw-r--r--src/node_modules/validator/es/lib/isBase32.js12
-rw-r--r--src/node_modules/validator/es/lib/isBase64.js13
-rw-r--r--src/node_modules/validator/es/lib/isBefore.js9
-rw-r--r--src/node_modules/validator/es/lib/isBoolean.js5
-rw-r--r--src/node_modules/validator/es/lib/isBtcAddress.js7
-rw-r--r--src/node_modules/validator/es/lib/isByteLength.js22
-rw-r--r--src/node_modules/validator/es/lib/isCreditCard.js40
-rw-r--r--src/node_modules/validator/es/lib/isCurrency.js75
-rw-r--r--src/node_modules/validator/es/lib/isDataURI.js40
-rw-r--r--src/node_modules/validator/es/lib/isDecimal.js26
-rw-r--r--src/node_modules/validator/es/lib/isDivisibleBy.js6
-rw-r--r--src/node_modules/validator/es/lib/isEAN.js67
-rw-r--r--src/node_modules/validator/es/lib/isEmail.js180
-rw-r--r--src/node_modules/validator/es/lib/isEmpty.js10
-rw-r--r--src/node_modules/validator/es/lib/isEthereumAddress.js6
-rw-r--r--src/node_modules/validator/es/lib/isFQDN.js60
-rw-r--r--src/node_modules/validator/es/lib/isFloat.js16
-rw-r--r--src/node_modules/validator/es/lib/isFullWidth.js6
-rw-r--r--src/node_modules/validator/es/lib/isHSL.js7
-rw-r--r--src/node_modules/validator/es/lib/isHalfWidth.js6
-rw-r--r--src/node_modules/validator/es/lib/isHash.js21
-rw-r--r--src/node_modules/validator/es/lib/isHexColor.js6
-rw-r--r--src/node_modules/validator/es/lib/isHexadecimal.js6
-rw-r--r--src/node_modules/validator/es/lib/isIBAN.js133
-rw-r--r--src/node_modules/validator/es/lib/isIP.js124
-rw-r--r--src/node_modules/validator/es/lib/isIPRange.js22
-rw-r--r--src/node_modules/validator/es/lib/isISBN.js51
-rw-r--r--src/node_modules/validator/es/lib/isISIN.js38
-rw-r--r--src/node_modules/validator/es/lib/isISO31661Alpha2.js8
-rw-r--r--src/node_modules/validator/es/lib/isISO31661Alpha3.js8
-rw-r--r--src/node_modules/validator/es/lib/isISO8601.js45
-rw-r--r--src/node_modules/validator/es/lib/isISRC.js7
-rw-r--r--src/node_modules/validator/es/lib/isISSN.js23
-rw-r--r--src/node_modules/validator/es/lib/isIdentityCard.js113
-rw-r--r--src/node_modules/validator/es/lib/isIn.js28
-rw-r--r--src/node_modules/validator/es/lib/isInt.js16
-rw-r--r--src/node_modules/validator/es/lib/isJSON.js15
-rw-r--r--src/node_modules/validator/es/lib/isJWT.js6
-rw-r--r--src/node_modules/validator/es/lib/isLatLong.js10
-rw-r--r--src/node_modules/validator/es/lib/isLength.js23
-rw-r--r--src/node_modules/validator/es/lib/isLocale.js11
-rw-r--r--src/node_modules/validator/es/lib/isLowercase.js5
-rw-r--r--src/node_modules/validator/es/lib/isMACAddress.js15
-rw-r--r--src/node_modules/validator/es/lib/isMD5.js6
-rw-r--r--src/node_modules/validator/es/lib/isMagnetURI.js6
-rw-r--r--src/node_modules/validator/es/lib/isMimeType.js39
-rw-r--r--src/node_modules/validator/es/lib/isMobilePhone.js140
-rw-r--r--src/node_modules/validator/es/lib/isMongoId.js6
-rw-r--r--src/node_modules/validator/es/lib/isMultibyte.js10
-rw-r--r--src/node_modules/validator/es/lib/isNumeric.js12
-rw-r--r--src/node_modules/validator/es/lib/isOctal.js6
-rw-r--r--src/node_modules/validator/es/lib/isPassportNumber.js104
-rw-r--r--src/node_modules/validator/es/lib/isPort.js7
-rw-r--r--src/node_modules/validator/es/lib/isPostalCode.js84
-rw-r--r--src/node_modules/validator/es/lib/isRFC3339.js20
-rw-r--r--src/node_modules/validator/es/lib/isRgbColor.js15
-rw-r--r--src/node_modules/validator/es/lib/isSemVer.js14
-rw-r--r--src/node_modules/validator/es/lib/isSlug.js6
-rw-r--r--src/node_modules/validator/es/lib/isSurrogatePair.js6
-rw-r--r--src/node_modules/validator/es/lib/isURL.js147
-rw-r--r--src/node_modules/validator/es/lib/isUUID.js13
-rw-r--r--src/node_modules/validator/es/lib/isUppercase.js5
-rw-r--r--src/node_modules/validator/es/lib/isVariableWidth.js7
-rw-r--r--src/node_modules/validator/es/lib/isWhitelisted.js12
-rw-r--r--src/node_modules/validator/es/lib/ltrim.js7
-rw-r--r--src/node_modules/validator/es/lib/matches.js10
-rw-r--r--src/node_modules/validator/es/lib/normalizeEmail.js138
-rw-r--r--src/node_modules/validator/es/lib/rtrim.js7
-rw-r--r--src/node_modules/validator/es/lib/stripLow.js7
-rw-r--r--src/node_modules/validator/es/lib/toBoolean.js10
-rw-r--r--src/node_modules/validator/es/lib/toDate.js6
-rw-r--r--src/node_modules/validator/es/lib/toFloat.js5
-rw-r--r--src/node_modules/validator/es/lib/toInt.js5
-rw-r--r--src/node_modules/validator/es/lib/trim.js5
-rw-r--r--src/node_modules/validator/es/lib/unescape.js5
-rw-r--r--src/node_modules/validator/es/lib/util/assertString.js23
-rw-r--r--src/node_modules/validator/es/lib/util/includes.js7
-rw-r--r--src/node_modules/validator/es/lib/util/merge.js12
-rw-r--r--src/node_modules/validator/es/lib/util/multilineRegex.js13
-rw-r--r--src/node_modules/validator/es/lib/util/toString.js15
-rw-r--r--src/node_modules/validator/es/lib/whitelist.js5
-rw-r--r--src/node_modules/validator/index.js284
-rw-r--r--src/node_modules/validator/lib/alpha.js113
-rw-r--r--src/node_modules/validator/lib/blacklist.js18
-rw-r--r--src/node_modules/validator/lib/contains.js20
-rw-r--r--src/node_modules/validator/lib/equals.js18
-rw-r--r--src/node_modules/validator/lib/escape.js18
-rw-r--r--src/node_modules/validator/lib/isAfter.js23
-rw-r--r--src/node_modules/validator/lib/isAlpha.js27
-rw-r--r--src/node_modules/validator/lib/isAlphanumeric.js27
-rw-r--r--src/node_modules/validator/lib/isAscii.js22
-rw-r--r--src/node_modules/validator/lib/isBIC.js20
-rw-r--r--src/node_modules/validator/lib/isBase32.js26
-rw-r--r--src/node_modules/validator/lib/isBase64.js27
-rw-r--r--src/node_modules/validator/lib/isBefore.js23
-rw-r--r--src/node_modules/validator/lib/isBoolean.js18
-rw-r--r--src/node_modules/validator/lib/isBtcAddress.js21
-rw-r--r--src/node_modules/validator/lib/isByteLength.js34
-rw-r--r--src/node_modules/validator/lib/isCreditCard.js52
-rw-r--r--src/node_modules/validator/lib/isCurrency.js89
-rw-r--r--src/node_modules/validator/lib/isDataURI.js54
-rw-r--r--src/node_modules/validator/lib/isDecimal.js42
-rw-r--r--src/node_modules/validator/lib/isDivisibleBy.js20
-rw-r--r--src/node_modules/validator/lib/isEAN.js80
-rw-r--r--src/node_modules/validator/lib/isEmail.js197
-rw-r--r--src/node_modules/validator/lib/isEmpty.js25
-rw-r--r--src/node_modules/validator/lib/isEthereumAddress.js20
-rw-r--r--src/node_modules/validator/lib/isFQDN.js75
-rw-r--r--src/node_modules/validator/lib/isFloat.js29
-rw-r--r--src/node_modules/validator/lib/isFullWidth.js19
-rw-r--r--src/node_modules/validator/lib/isHSL.js21
-rw-r--r--src/node_modules/validator/lib/isHalfWidth.js19
-rw-r--r--src/node_modules/validator/lib/isHash.js35
-rw-r--r--src/node_modules/validator/lib/isHexColor.js20
-rw-r--r--src/node_modules/validator/lib/isHexadecimal.js20
-rw-r--r--src/node_modules/validator/lib/isIBAN.js145
-rw-r--r--src/node_modules/validator/lib/isIP.js137
-rw-r--r--src/node_modules/validator/lib/isIPRange.js37
-rw-r--r--src/node_modules/validator/lib/isISBN.js65
-rw-r--r--src/node_modules/validator/lib/isISIN.js52
-rw-r--r--src/node_modules/validator/lib/isISO31661Alpha2.js23
-rw-r--r--src/node_modules/validator/lib/isISO31661Alpha3.js23
-rw-r--r--src/node_modules/validator/lib/isISO8601.js57
-rw-r--r--src/node_modules/validator/lib/isISRC.js21
-rw-r--r--src/node_modules/validator/lib/isISSN.js37
-rw-r--r--src/node_modules/validator/lib/isIdentityCard.js127
-rw-r--r--src/node_modules/validator/lib/isIn.js42
-rw-r--r--src/node_modules/validator/lib/isInt.js30
-rw-r--r--src/node_modules/validator/lib/isJSON.js28
-rw-r--r--src/node_modules/validator/lib/isJWT.js20
-rw-r--r--src/node_modules/validator/lib/isLatLong.js24
-rw-r--r--src/node_modules/validator/lib/isLength.js35
-rw-r--r--src/node_modules/validator/lib/isLocale.js25
-rw-r--r--src/node_modules/validator/lib/isLowercase.js18
-rw-r--r--src/node_modules/validator/lib/isMACAddress.js29
-rw-r--r--src/node_modules/validator/lib/isMD5.js20
-rw-r--r--src/node_modules/validator/lib/isMagnetURI.js20
-rw-r--r--src/node_modules/validator/lib/isMimeType.js51
-rw-r--r--src/node_modules/validator/lib/isMobilePhone.js153
-rw-r--r--src/node_modules/validator/lib/isMongoId.js20
-rw-r--r--src/node_modules/validator/lib/isMultibyte.js22
-rw-r--r--src/node_modules/validator/lib/isNumeric.js26
-rw-r--r--src/node_modules/validator/lib/isOctal.js20
-rw-r--r--src/node_modules/validator/lib/isPassportNumber.js114
-rw-r--r--src/node_modules/validator/lib/isPort.js20
-rw-r--r--src/node_modules/validator/lib/isPostalCode.js97
-rw-r--r--src/node_modules/validator/lib/isRFC3339.js33
-rw-r--r--src/node_modules/validator/lib/isRgbColor.js29
-rw-r--r--src/node_modules/validator/lib/isSemVer.js28
-rw-r--r--src/node_modules/validator/lib/isSlug.js20
-rw-r--r--src/node_modules/validator/lib/isSurrogatePair.js20
-rw-r--r--src/node_modules/validator/lib/isURL.js162
-rw-r--r--src/node_modules/validator/lib/isUUID.js27
-rw-r--r--src/node_modules/validator/lib/isUppercase.js18
-rw-r--r--src/node_modules/validator/lib/isVariableWidth.js22
-rw-r--r--src/node_modules/validator/lib/isWhitelisted.js25
-rw-r--r--src/node_modules/validator/lib/ltrim.js20
-rw-r--r--src/node_modules/validator/lib/matches.js23
-rw-r--r--src/node_modules/validator/lib/normalizeEmail.js151
-rw-r--r--src/node_modules/validator/lib/rtrim.js20
-rw-r--r--src/node_modules/validator/lib/stripLow.js21
-rw-r--r--src/node_modules/validator/lib/toBoolean.js23
-rw-r--r--src/node_modules/validator/lib/toDate.js19
-rw-r--r--src/node_modules/validator/lib/toFloat.js18
-rw-r--r--src/node_modules/validator/lib/toInt.js18
-rw-r--r--src/node_modules/validator/lib/trim.js19
-rw-r--r--src/node_modules/validator/lib/unescape.js18
-rw-r--r--src/node_modules/validator/lib/util/assertString.js33
-rw-r--r--src/node_modules/validator/lib/util/includes.js17
-rw-r--r--src/node_modules/validator/lib/util/merge.js22
-rw-r--r--src/node_modules/validator/lib/util/multilineRegex.js23
-rw-r--r--src/node_modules/validator/lib/util/toString.js25
-rw-r--r--src/node_modules/validator/lib/whitelist.js18
-rw-r--r--src/node_modules/validator/package.json76
-rw-r--r--src/node_modules/validator/validator.js2597
-rw-r--r--src/node_modules/validator/validator.min.js23
190 files changed, 10266 insertions, 0 deletions
diff --git a/src/node_modules/validator/CHANGELOG.md b/src/node_modules/validator/CHANGELOG.md
new file mode 100644
index 0000000..79c907e
--- /dev/null
+++ b/src/node_modules/validator/CHANGELOG.md
@@ -0,0 +1,683 @@
+#### 13.0.0
+
+- Added `isEthereumAddress()` validator
+ to validate [Ethereum addresses](https://en.wikipedia.org/wiki/Ethereum#Addresses)
+ ([#1117](https://github.com/chriso/validator.js/pull/1117))
+- Added `isBtcAddress()` validator
+ to validate [Bitcoin addresses](https://en.bitcoin.it/wiki/Address)
+ ([#1163](https://github.com/chriso/validator.js/pull/1163))
+- Added `isIBAN()` validator
+ to validate [International Bank Account Numbers](https://en.wikipedia.org/wiki/International_Bank_Account_Number)
+ ([#1243](https://github.com/chriso/validator.js/pull/1243))
+- Added `isEAN()` validator
+ to validate [International Article Numbers](https://en.wikipedia.org/wiki/International_Article_Number)
+ ([#1244](https://github.com/chriso/validator.js/pull/1244))
+- Added `isSemVer()` validator
+ to validate [Semantic Version Numbers](https://semver.org)
+ ([#1246](https://github.com/chriso/validator.js/pull/1246))
+- Added `isPassportNumber()` validator
+ ([#1250](https://github.com/chriso/validator.js/pull/1250))
+- Added `isRgbColor()` validator
+ ([#1141](https://github.com/chriso/validator.js/pull/1141))
+- Added `isHSL()` validator
+ ([#1159](https://github.com/chriso/validator.js/pull/1159))
+- Added `isLocale()` validator
+ ([#1072](https://github.com/chriso/validator.js/pull/1072))
+- Improved the `isIP()` validator
+ ([#1211](https://github.com/chriso/validator.js/pull/1211))
+- Improved the `isMACAddress()` validator
+ ([#1267](https://github.com/chriso/validator.js/pull/1267))
+- New and improved locales
+ ([#1238](https://github.com/chriso/validator.js/pull/1238),
+ [#1265](https://github.com/chriso/validator.js/pull/1265))
+
+#### 12.2.0
+
+- Support CSS Colors Level 4 spec
+ ([#1233](https://github.com/chriso/validator.js/pull/1233))
+- Improve the `toFloat()` sanitizer
+ ([#1227](https://github.com/chriso/validator.js/pull/1227))
+- New and improved locales
+ ([#1200](https://github.com/chriso/validator.js/pull/1200),
+ [#1207](https://github.com/chriso/validator.js/pull/1207),
+ [#1213](https://github.com/chriso/validator.js/pull/1213),
+ [#1217](https://github.com/chriso/validator.js/pull/1217),
+ [#1234](https://github.com/chriso/validator.js/pull/1234))
+
+#### 12.1.0
+
+- ES module for webpack tree shaking
+ ([#1015](https://github.com/chriso/validator.js/pull/1015))
+- Updated `isIP()` to accept scoped IPv6 addresses
+ ([#1160](https://github.com/chriso/validator.js/pull/1160))
+- New and improved locales
+ ([#1162](https://github.com/chriso/validator.js/pull/1162),
+ [#1183](https://github.com/chriso/validator.js/pull/1183),
+ [#1187](https://github.com/chriso/validator.js/pull/1187),
+ [#1191](https://github.com/chriso/validator.js/pull/1191))
+
+#### 12.0.0
+
+- Added `isOctal()` validator
+ ([#1153](https://github.com/chriso/validator.js/pull/1153))
+- Added `isSlug()` validator
+ ([#1096](https://github.com/chriso/validator.js/pull/1096))
+- Added `isBIC()` validator for bank identification codes
+ ([#1071](https://github.com/chriso/validator.js/pull/1071))
+- Allow uppercase chars in `isHash()`
+ ([#1062](https://github.com/chriso/validator.js/pull/1062))
+- Allow additional prefixes in `isHexadecimal()`
+ ([#1147](https://github.com/chriso/validator.js/pull/1147))
+- Allow additional separators in `isMACAddress()`
+ ([#1065](https://github.com/chriso/validator.js/pull/1065))
+- Better defaults for `isLength()`
+ ([#1070](https://github.com/chriso/validator.js/pull/1070))
+- Bug fixes
+ ([#1074](https://github.com/chriso/validator.js/pull/1074))
+- New and improved locales
+ ([#1059](https://github.com/chriso/validator.js/pull/1059),
+ [#1060](https://github.com/chriso/validator.js/pull/1060),
+ [#1069](https://github.com/chriso/validator.js/pull/1069),
+ [#1073](https://github.com/chriso/validator.js/pull/1073),
+ [#1082](https://github.com/chriso/validator.js/pull/1082),
+ [#1092](https://github.com/chriso/validator.js/pull/1092),
+ [#1121](https://github.com/chriso/validator.js/pull/1121),
+ [#1125](https://github.com/chriso/validator.js/pull/1125),
+ [#1132](https://github.com/chriso/validator.js/pull/1132),
+ [#1152](https://github.com/chriso/validator.js/pull/1152),
+ [#1165](https://github.com/chriso/validator.js/pull/1165),
+ [#1166](https://github.com/chriso/validator.js/pull/1166),
+ [#1174](https://github.com/chriso/validator.js/pull/1174))
+
+#### 11.1.0
+
+- Code coverage improvements
+ ([#1024](https://github.com/chriso/validator.js/pull/1024))
+- New and improved locales
+ ([#1035](https://github.com/chriso/validator.js/pull/1035),
+ [#1040](https://github.com/chriso/validator.js/pull/1040),
+ [#1041](https://github.com/chriso/validator.js/pull/1041),
+ [#1048](https://github.com/chriso/validator.js/pull/1048),
+ [#1049](https://github.com/chriso/validator.js/pull/1049),
+ [#1052](https://github.com/chriso/validator.js/pull/1052),
+ [#1054](https://github.com/chriso/validator.js/pull/1054),
+ [#1055](https://github.com/chriso/validator.js/pull/1055),
+ [#1056](https://github.com/chriso/validator.js/pull/1056),
+ [#1057](https://github.com/chriso/validator.js/pull/1057))
+
+#### 11.0.0
+
+- Added a `isBase32()` validator
+ ([#1023](https://github.com/chriso/validator.js/pull/1023))
+- Updated `isEmail()` to validate display names according to RFC2822
+ ([#1004](https://github.com/chriso/validator.js/pull/1004))
+- Updated `isEmail()` to check total email length
+ ([#1007](https://github.com/chriso/validator.js/pull/1007))
+- The internal `toString()` util is no longer exported
+ ([0277eb](https://github.com/chriso/validator.js/commit/0277eb00d245a3479af52adf7d927d4036895650))
+- New and improved locales
+ ([#999](https://github.com/chriso/validator.js/pull/999),
+ [#1010](https://github.com/chriso/validator.js/pull/1010),
+ [#1017](https://github.com/chriso/validator.js/pull/1017),
+ [#1022](https://github.com/chriso/validator.js/pull/1022),
+ [#1031](https://github.com/chriso/validator.js/pull/1031),
+ [#1032](https://github.com/chriso/validator.js/pull/1032))
+
+#### 10.11.0
+
+- Fix imports like `import .. from "validator/lib/.."`
+ ([#961](https://github.com/chriso/validator.js/pull/961))
+- New locale
+ ([#958](https://github.com/chriso/validator.js/pull/958))
+
+#### 10.10.0
+
+- `isISO8601()` strict mode now works in the browser
+ ([#932](https://github.com/chriso/validator.js/pull/932))
+- New and improved locales
+ ([#931](https://github.com/chriso/validator.js/pull/931),
+ [#933](https://github.com/chriso/validator.js/pull/933),
+ [#947](https://github.com/chriso/validator.js/pull/947),
+ [#950](https://github.com/chriso/validator.js/pull/950))
+
+#### 10.9.0
+
+- Added an option to `isURL()` to reject email-like URLs
+ ([#901](https://github.com/chriso/validator.js/pull/901))
+- Added a `strict` option to `isISO8601()`
+ ([#910](https://github.com/chriso/validator.js/pull/910))
+- Relaxed `isJWT()` signature requirements
+ ([#906](https://github.com/chriso/validator.js/pull/906))
+- New and improved locales
+ ([#899](https://github.com/chriso/validator.js/pull/899),
+ [#904](https://github.com/chriso/validator.js/pull/904),
+ [#913](https://github.com/chriso/validator.js/pull/913),
+ [#916](https://github.com/chriso/validator.js/pull/916),
+ [#925](https://github.com/chriso/validator.js/pull/925),
+ [#928](https://github.com/chriso/validator.js/pull/928))
+
+#### 10.8.0
+
+- Added `isIdentityCard()`
+ ([#846](https://github.com/chriso/validator.js/pull/846))
+- Better error when validators are passed an invalid type
+ ([#895](https://github.com/chriso/validator.js/pull/895))
+- Locales are now exported
+ ([#890](https://github.com/chriso/validator.js/pull/890),
+ [#892](https://github.com/chriso/validator.js/pull/892))
+- New locale
+ ([#896](https://github.com/chriso/validator.js/pull/896))
+
+#### 10.7.1
+
+- Ignore case when checking URL protocol
+ ([#887](https://github.com/chriso/validator.js/issues/887))
+- Locale fix
+ ([#889](https://github.com/chriso/validator.js/pull/889))
+
+#### 10.7.0
+
+- Added `isMagnetURI()` to validate [magnet URIs](https://en.wikipedia.org/wiki/Magnet_URI_scheme)
+ ([#884](https://github.com/chriso/validator.js/pull/884))
+- Added `isJWT()` to validate [JSON web tokens](https://en.wikipedia.org/wiki/JSON_Web_Token)
+ ([#885](https://github.com/chriso/validator.js/pull/885))
+
+#### 10.6.0
+
+- Updated `isMobilePhone()` to match any locale's pattern by default
+ ([#874](https://github.com/chriso/validator.js/pull/874))
+- Added an option to ignore whitespace in `isEmpty()`
+ ([#880](https://github.com/chriso/validator.js/pull/880))
+- New and improved locales
+ ([#878](https://github.com/chriso/validator.js/pull/878),
+ [#879](https://github.com/chriso/validator.js/pull/879))
+
+#### 10.5.0
+
+- Disabled domain-specific email validation
+ ([#873](https://github.com/chriso/validator.js/pull/873))
+- Added support for IP hostnames in `isEmail()`
+ ([#845](https://github.com/chriso/validator.js/pull/845))
+- Added a `no_symbols` option to `isNumeric()`
+ ([#848](https://github.com/chriso/validator.js/pull/848))
+- Added a `no_colons` option to `isMACAddress()`
+ ([#849](https://github.com/chriso/validator.js/pull/849))
+- Updated `isURL()` to reject protocol relative URLs unless a flag is set
+ ([#860](https://github.com/chriso/validator.js/issues/860))
+- New and improved locales
+ ([#801](https://github.com/chriso/validator.js/pull/801),
+ [#856](https://github.com/chriso/validator.js/pull/856),
+ [#859](https://github.com/chriso/validator.js/issues/859),
+ [#861](https://github.com/chriso/validator.js/pull/861),
+ [#862](https://github.com/chriso/validator.js/pull/862),
+ [#863](https://github.com/chriso/validator.js/pull/863),
+ [#864](https://github.com/chriso/validator.js/pull/864),
+ [#870](https://github.com/chriso/validator.js/pull/870),
+ [#872](https://github.com/chriso/validator.js/pull/872))
+
+#### 10.4.0
+
+- Added an `isIPRange()` validator
+ ([#842](https://github.com/chriso/validator.js/pull/842))
+- Accept an array of locales in `isMobilePhone()`
+ ([#742](https://github.com/chriso/validator.js/pull/742))
+- New locale
+ ([#843](https://github.com/chriso/validator.js/pull/843))
+
+#### 10.3.0
+
+- Strict Gmail validation in `isEmail()`
+ ([#832](https://github.com/chriso/validator.js/pull/832))
+- New locales
+ ([#831](https://github.com/chriso/validator.js/pull/831),
+ [#835](https://github.com/chriso/validator.js/pull/835),
+ [#836](https://github.com/chriso/validator.js/pull/836))
+
+#### 10.2.0
+
+- Export the list of supported locales in `isPostalCode()`
+ ([#830](https://github.com/chriso/validator.js/pull/830))
+
+#### 10.1.0
+
+- Added an `isISO31661Alpha3()` validator
+ ([#809](https://github.com/chriso/validator.js/pull/809))
+
+#### 10.0.0
+
+- Allow floating points in `isNumeric()`
+ ([#810](https://github.com/chriso/validator.js/pull/810))
+- Disallow GMail addresses with multiple consecutive dots, or leading/trailing dots
+ ([#820](https://github.com/chriso/validator.js/pull/820))
+- Added an `isRFC3339()` validator
+ ([#816](https://github.com/chriso/validator.js/pull/816))
+- Reject domain parts longer than 63 octets in `isFQDN()`, `isURL()` and `isEmail()`
+ ([bb3e542](https://github.com/chriso/validator.js/commit/bb3e542))
+- Added a new Amex prefix to `isCreditCard()`
+ ([#805](https://github.com/chriso/validator.js/pull/805))
+- Fixed `isFloat()` min/max/gt/lt filters when a locale with a comma decimal is used
+ ([2b70821](https://github.com/chriso/validator.js/commit/2b70821))
+- Normalize Yandex emails
+ ([#807](https://github.com/chriso/validator.js/pull/807))
+- New locales
+ ([#803](https://github.com/chriso/validator.js/pull/803))
+
+#### 9.4.1
+
+- Patched a [REDOS](https://en.wikipedia.org/wiki/ReDoS) vulnerability in `isDataURI`
+- New and improved locales
+ ([#788](https://github.com/chriso/validator.js/pull/788))
+
+#### 9.4.0
+
+- Added an option to `isMobilePhone` to require a country code
+ ([#769](https://github.com/chriso/validator.js/pull/769))
+- New and improved locales
+ ([#785](https://github.com/chriso/validator.js/pull/785))
+
+#### 9.3.0
+
+- New and improved locales
+ ([#763](https://github.com/chriso/validator.js/pull/763),
+ [#768](https://github.com/chriso/validator.js/pull/768),
+ [#774](https://github.com/chriso/validator.js/pull/774),
+ [#777](https://github.com/chriso/validator.js/pull/777),
+ [#779](https://github.com/chriso/validator.js/pull/779))
+
+#### 9.2.0
+
+- Added an `isMimeType()` validator
+ ([#760](https://github.com/chriso/validator.js/pull/760))
+- New and improved locales
+ ([#753](https://github.com/chriso/validator.js/pull/753),
+ [#755](https://github.com/chriso/validator.js/pull/755),
+ [#764](https://github.com/chriso/validator.js/pull/764))
+
+#### 9.1.2
+
+- Fixed a bug with the `isFloat` validator
+ ([#752](https://github.com/chriso/validator.js/pull/752))
+
+#### 9.1.1
+
+- Locale fixes
+ ([#738](https://github.com/chriso/validator.js/pull/738),
+ [#739](https://github.com/chriso/validator.js/pull/739))
+
+#### 9.1.0
+
+- Added an `isISO31661Alpha2()` validator
+ ([#734](https://github.com/chriso/validator.js/pull/734))
+- New locales
+ ([#735](https://github.com/chriso/validator.js/pull/735),
+ [#737](https://github.com/chriso/validator.js/pull/737))
+
+#### 9.0.0
+
+- `normalizeEmail()` no longer validates the email address
+ ([#725](https://github.com/chriso/validator.js/pull/725))
+- Added locale-aware validation to `isFloat()` and `isDecimal()`
+ ([#721](https://github.com/chriso/validator.js/pull/721))
+- Added an `isPort()` validator
+ ([#733](https://github.com/chriso/validator.js/pull/733))
+- New locales
+ ([#731](https://github.com/chriso/validator.js/pull/731))
+
+#### 8.2.0
+
+- Added an `isHash()` validator
+ ([#711](https://github.com/chriso/validator.js/pull/711))
+- Control decimal places in `isCurrency()`
+ ([#713](https://github.com/chriso/validator.js/pull/713))
+- New and improved locales
+ ([#700](https://github.com/chriso/validator.js/pull/700),
+ [#701](https://github.com/chriso/validator.js/pull/701),
+ [#714](https://github.com/chriso/validator.js/pull/714),
+ [#715](https://github.com/chriso/validator.js/pull/715),
+ [#718](https://github.com/chriso/validator.js/pull/718))
+
+#### 8.1.0
+
+- Fix `require('validator/lib/isIS8601')` calls
+ ([#688](https://github.com/chriso/validator.js/issues/688))
+- Added an `isLatLong()` and `isPostalCode()` validator
+ ([#684](https://github.com/chriso/validator.js/pull/684))
+- Allow comma in email display names
+ ([#692](https://github.com/chriso/validator.js/pull/692))
+- Add missing string to `unescape()`
+ ([#690](https://github.com/chriso/validator.js/pull/690))
+- Fix `isMobilePhone()` with Node <= 6.x
+ ([#681](https://github.com/chriso/validator.js/issues/681))
+- New locales
+ ([#695](https://github.com/chriso/validator.js/pull/695))
+
+#### 8.0.0
+
+- `isURL()` now requires the `require_tld: false` option to validate `localhost`
+ ([#675](https://github.com/chriso/validator.js/issues/675))
+- `isURL()` now rejects URLs that are protocol only
+ ([#642](https://github.com/chriso/validator.js/issues/642))
+- Fixed a bug where `isMobilePhone()` would silently return false if the locale was invalid or unsupported
+ ([#657](https://github.com/chriso/validator.js/issues/657))
+
+#### 7.2.0
+
+- Added an option to validate any phone locale
+ ([#663](https://github.com/chriso/validator.js/pull/663))
+- Fixed a bug in credit card validation
+ ([#672](https://github.com/chriso/validator.js/pull/672))
+- Disallow whitespace, including unicode whitespace, in TLDs
+ ([#677](https://github.com/chriso/validator.js/pull/677))
+- New locales
+ ([#673](https://github.com/chriso/validator.js/pull/673),
+ [#676](https://github.com/chriso/validator.js/pull/676))
+
+#### 7.1.0
+
+- Added an `isISRC()` validator for [ISRC](https://en.wikipedia.org/wiki/International_Standard_Recording_Code)
+ ([#660](https://github.com/chriso/validator.js/pull/660))
+- Fixed a bug in credit card validation
+ ([#670](https://github.com/chriso/validator.js/pull/670))
+- Reduced the maximum allowed address in `isEmail()` based on
+ [RFC3696 errata](http://www.rfc-editor.org/errata_search.php?rfc=3696&eid=1690)
+ ([#655](https://github.com/chriso/validator.js/issues/655))
+- New locales
+ ([#647](https://github.com/chriso/validator.js/pull/647),
+ [#667](https://github.com/chriso/validator.js/pull/667),
+ [#667](https://github.com/chriso/validator.js/pull/667),
+ [#671](https://github.com/chriso/validator.js/pull/671))
+
+#### 7.0.0
+
+- Remove `isDate()`
+
+#### 6.3.0
+
+- Allow values like `-.01` in `isFloat()`
+ ([#618](https://github.com/chriso/validator.js/issues/618))
+- New locales
+ ([#616](https://github.com/chriso/validator.js/pull/616),
+ [#622](https://github.com/chriso/validator.js/pull/622),
+ [#627](https://github.com/chriso/validator.js/pull/627),
+ [#630](https://github.com/chriso/validator.js/pull/630))
+
+#### 6.2.1
+
+- Disallow `<` and `>` in URLs
+ ([#613](https://github.com/chriso/validator.js/issues/613))
+- New locales
+ ([#610](https://github.com/chriso/validator.js/pull/610))
+
+#### 6.2.0
+
+- Added an option to require an email display name
+ ([#607](https://github.com/chriso/validator.js/pull/607))
+- Added support for `lt` and `gt` to `isInt()`
+ ([#588](https://github.com/chriso/validator.js/pull/588))
+- New locales
+ ([#601](https://github.com/chriso/validator.js/pull/601))
+
+#### 6.1.0
+
+- Added support for greater or less than in `isFloat()`
+ ([#544](https://github.com/chriso/validator.js/issues/544))
+- Added support for ISSN validation via `isISSN()`
+ ([#593](https://github.com/chriso/validator.js/pull/593))
+- Fixed a bug in `normalizeEmail()`
+ ([#594](https://github.com/chriso/validator.js/issues/594))
+- New locales
+ ([#585](https://github.com/chriso/validator.js/pull/585))
+
+#### 6.0.0
+
+- Renamed `isNull()` to `isEmpty()`
+ ([#574](https://github.com/chriso/validator.js/issues/574))
+- Backslash is now escaped in `escape()`
+ ([#516](https://github.com/chriso/validator.js/issues/516))
+- Improved `normalizeEmail()`
+ ([#583](https://github.com/chriso/validator.js/pull/583))
+- Allow leading zeroes by default in `isInt()`
+ ([#532](https://github.com/chriso/validator.js/pull/532))
+
+#### 5.7.0
+
+- Added support for IPv6 in `isURL()`
+ ([#564](https://github.com/chriso/validator.js/issues/564))
+- Added support for urls without a host (e.g. `file:///foo.txt`) in `isURL()`
+ ([#563](https://github.com/chriso/validator.js/issues/563))
+- Added support for regular expressions in the `isURL()` host whitelist and blacklist
+ ([#562](https://github.com/chriso/validator.js/issues/562))
+- Added support for MasterCard 2-Series BIN
+ ([#576](https://github.com/chriso/validator.js/pull/576))
+- New locales
+ ([#575](https://github.com/chriso/validator.js/pull/575),
+ [#552](https://github.com/chriso/validator.js/issues/552))
+
+#### 5.6.0
+
+- Added an `isMD5()` validator
+ ([#557](https://github.com/chriso/validator.js/pull/557))
+- Fixed an exceptional case in `isDate()`
+ ([#566](https://github.com/chriso/validator.js/pull/566))
+- New locales
+ ([#559](https://github.com/chriso/validator.js/pull/559),
+ [#568](https://github.com/chriso/validator.js/pull/568),
+ [#571](https://github.com/chriso/validator.js/pull/571),
+ [#573](https://github.com/chriso/validator.js/pull/573))
+
+#### 5.5.0
+
+- Fixed a regex denial of service in `trim()` and `rtrim()`
+ ([#556](https://github.com/chriso/validator.js/pull/556))
+- Added an Algerian locale to `isMobilePhone()`
+ ([#540](https://github.com/chriso/validator.js/pull/540))
+- Fixed the Hungarian locale in `isAlpha()` and `isAlphanumeric()`
+ ([#541](https://github.com/chriso/validator.js/pull/541))
+- Added a Polish locale to `isMobilePhone()`
+ ([#545](https://github.com/chriso/validator.js/pull/545))
+
+#### 5.4.0
+
+- Accept Union Pay credit cards in `isCreditCard()`
+ ([#539](https://github.com/chriso/validator.js/pull/539))
+- Added Danish locale to `isMobilePhone()`
+ ([#538](https://github.com/chriso/validator.js/pull/538))
+- Added Hungarian locales to `isAlpha()`, `isAlphanumeric()` and `isMobilePhone()`
+ ([#537](https://github.com/chriso/validator.js/pull/537))
+
+#### 5.3.0
+
+- Added an `allow_leading_zeroes` option to `isInt()`
+ ([#532](https://github.com/chriso/validator.js/pull/532))
+- Adjust Chinese mobile phone validation
+ ([#523](https://github.com/chriso/validator.js/pull/523))
+- Added a Canadian locale to `isMobilePhone()`
+ ([#524](https://github.com/chriso/validator.js/issues/524))
+
+#### 5.2.0
+
+- Added a `isDataURI()` validator
+ ([#521](https://github.com/chriso/validator.js/pull/521))
+- Added Czech locales
+ ([#522](https://github.com/chriso/validator.js/pull/522))
+- Fixed a bug with `isURL()` when protocol was missing and "://" appeared in the query
+ ([#518](https://github.com/chriso/validator.js/issues/518))
+
+#### 5.1.0
+
+- Added a `unescape()` HTML function
+ ([#509](https://github.com/chriso/validator.js/pull/509))
+- Added a Malaysian locale to `isMobilePhone()`
+ ([#507](https://github.com/chriso/validator.js/pull/507))
+- Added Polish locales to `isAlpha()` and `isAlphanumeric()`
+ ([#506](https://github.com/chriso/validator.js/pull/506))
+- Added Turkish locales to `isAlpha()`, `isAlphanumeric()` and `isMobilePhone()`
+ ([#512](https://github.com/chriso/validator.js/pull/512))
+- Allow >1 underscore in hostnames when using `allow_underscores`
+ ([#510](https://github.com/chriso/validator.js/issues/510))
+
+#### 5.0.0
+
+- Migrate to ES6
+ ([#496](https://github.com/chriso/validator.js/pull/496))
+- Break the library up so that individual functions can be imported
+ ([#496](https://github.com/chriso/validator.js/pull/496))
+- Remove auto-coercion of input to a string
+ ([#496](https://github.com/chriso/validator.js/pull/496))
+- Remove the `extend()` function
+ ([#496](https://github.com/chriso/validator.js/pull/496))
+- Added Arabic locales to `isAlpha()` and `isAlphanumeric()`
+ ([#496](https://github.com/chriso/validator.js/pull/496#issuecomment-184781730))
+- Fix validation of very large base64 strings
+ ([#503](https://github.com/chriso/validator.js/pull/503))
+
+#### 4.9.0
+
+- Added a Russian locale to `isAlpha()` and `isAlphanumeric()`
+ ([#499](https://github.com/chriso/validator.js/pull/499))
+- Remove the restriction on adjacent hyphens in hostnames
+ ([#500](https://github.com/chriso/validator.js/issues/500))
+
+#### 4.8.0
+
+- Added Spanish, French, Portuguese and Dutch support for `isAlpha()` and `isAlphanumeric()`
+ ([#492](https://github.com/chriso/validator.js/pull/492))
+- Added a Brazilian locale to `isMobilePhone()`
+ ([#489](https://github.com/chriso/validator.js/pull/489))
+- Reject IPv4 addresses with invalid zero padding
+ ([#490](https://github.com/chriso/validator.js/pull/490))
+- Fix the client-side version when used with RequireJS
+ ([#494](https://github.com/chriso/validator.js/issues/494))
+
+#### 4.7.1
+
+- Use [node-depd](https://github.com/dougwilson/nodejs-depd) to print deprecation notices
+ ([#487](https://github.com/chriso/validator.js/issues/487))
+
+#### 4.7.0
+
+- Print a deprecation warning if validator input is not a string
+ ([1f67e1e](https://github.com/chriso/validator.js/commit/1f67e1e15198c0ae735151290dc8dc2bf14da254)).
+ Note that this will be an error in v5.
+- Added a German locale to `isMobilePhone()`, `isAlpha()` and `isAlphanumeric()`
+ ([#477](https://github.com/chriso/validator.js/pull/477))
+- Added a Finnish locale to `isMobilePhone()`
+ ([#455](https://github.com/chriso/validator.js/pull/455))
+
+#### 4.6.1
+
+- Fix coercion of objects: `Object.toString()` is `[object Object]` not `""`
+ ([a57f3c8](https://github.com/chriso/validator.js/commit/a57f3c843c715fba2664ee22ec80e9e28e88e0a6))
+
+#### 4.6.0
+
+- Added a Spanish locale to `isMobilePhone()`
+ ([#481](https://github.com/chriso/validator.js/pull/481))
+- Fix string coercion of objects created with `Object.create(null)`
+ ([#484](https://github.com/chriso/validator.js/issues/484))
+
+#### 4.5.2
+
+- Fix a timezone issue with short-form ISO 8601 dates, e.g.
+ `validator.isDate('2011-12-21')`
+ ([#480](https://github.com/chriso/validator.js/issues/480))
+
+#### 4.5.1
+
+- Make `isLength()` / `isByteLength()` accept `{min, max}` as options object.
+ ([#474](https://github.com/chriso/validator.js/issues/474))
+
+#### 4.5.0
+
+- Add validation for Indian mobile phone numbers
+ ([#471](https://github.com/chriso/validator.js/pull/471))
+- Tweak Greek and Chinese mobile phone validation
+ ([#467](https://github.com/chriso/validator.js/pull/467),
+ [#468](https://github.com/chriso/validator.js/pull/468))
+- Fixed a bug in `isDate()` when validating ISO 8601 dates without a timezone
+ ([#472](https://github.com/chriso/validator.js/issues/472))
+
+#### 4.4.1
+
+- Allow triple hyphens in IDNA hostnames
+ ([#466](https://github.com/chriso/validator.js/issues/466))
+
+#### 4.4.0
+
+- Added `isMACAddress()` validator
+ ([#458](https://github.com/chriso/validator.js/pull/458))
+- Added `isWhitelisted()` validator
+ ([#462](https://github.com/chriso/validator.js/pull/462))
+- Added a New Zealand locale to `isMobilePhone()`
+ ([#452](https://github.com/chriso/validator.js/pull/452))
+- Added options to control GMail address normalization
+ ([#460](https://github.com/chriso/validator.js/pull/460))
+
+#### 4.3.0
+
+- Support Ember CLI module definitions
+ ([#448](https://github.com/chriso/validator.js/pull/448))
+- Added a Vietnam locale to `isMobilePhone()`
+ ([#451](https://github.com/chriso/validator.js/pull/451))
+
+#### 4.2.1
+
+- Fix `isDate()` handling of RFC2822 timezones
+ ([#447](https://github.com/chriso/validator.js/pull/447))
+
+#### 4.2.0
+
+- Fix `isDate()` handling of ISO8601 timezones
+ ([#444](https://github.com/chriso/validator.js/pull/444))
+- Fix the incorrect `isFloat('.') === true`
+ ([#443](https://github.com/chriso/validator.js/pull/443))
+- Added a Norwegian locale to `isMobilePhone()`
+ ([#439](https://github.com/chriso/validator.js/pull/439))
+
+#### 4.1.0
+
+- General `isDate()` improvements
+ ([#431](https://github.com/chriso/validator.js/pull/431))
+- Tests now require node 4.0+
+ ([#438](https://github.com/chriso/validator.js/pull/438))
+
+#### 4.0.6
+
+- Added a Taiwan locale to `isMobilePhone()`
+ ([#432](https://github.com/chriso/validator.js/pull/432))
+- Fixed a bug in `isBefore()` where it would return `null`
+ ([#436](https://github.com/chriso/validator.js/pull/436))
+
+#### 4.0.5
+
+- Fixed a denial of service vulnerability in the `isEmail()` regex
+ ([#152](https://github.com/chriso/validator.js/issues/152#issuecomment-131874928))
+
+#### 4.0.4
+
+- Reverted the leap year validation in `isDate()` as it introduced some regressions
+ ([#422](https://github.com/chriso/validator.js/issues/422), [#423](https://github.com/chriso/validator.js/issues/423))
+
+#### 4.0.3
+
+- Added leap year validation to `isDate()`
+ ([#418](https://github.com/chriso/validator.js/pull/418))
+
+#### 4.0.2
+
+- Fixed `isDecimal()` with an empty string
+ ([#419](https://github.com/chriso/validator.js/issues/419))
+
+#### 4.0.1
+
+- Fixed `isByteLength()` with certain strings
+ ([09f0c6d](https://github.com/chriso/validator.js/commit/09f0c6d2321f0c78af6a7de42e91b63955e4c01e))
+- Put length restrictions on email parts
+ ([#258](https://github.com/chriso/validator.js/issues/258#issuecomment-127173612))
+
+#### 4.0.0
+
+- Simplified the `isEmail()` regex and fixed some edge cases
+ ([#258](https://github.com/chriso/validator.js/issues/258#issuecomment-127173612))
+- Added ISO 8601 date validation via `isISO8601()`
+ ([#373](https://github.com/chriso/validator.js/issues/373))
diff --git a/src/node_modules/validator/LICENSE b/src/node_modules/validator/LICENSE
new file mode 100644
index 0000000..4e49a38
--- /dev/null
+++ b/src/node_modules/validator/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2018 Chris O'Hara <cohara87@gmail.com>
+
+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.
diff --git a/src/node_modules/validator/README.md b/src/node_modules/validator/README.md
new file mode 100644
index 0000000..4c456ad
--- /dev/null
+++ b/src/node_modules/validator/README.md
@@ -0,0 +1,256 @@
+# validator.js
+
+[![NPM version][npm-image]][npm-url]
+[![Build Status](https://travis-ci.org/validatorjs/validator.js.svg?branch=master)](https://travis-ci.org/validatorjs/validator.js)
+[![Coverage Status](https://coveralls.io/repos/github/validatorjs/validator.js/badge.svg?branch=master)](https://coveralls.io/github/validatorjs/validator.js?branch=master)
+[![Downloads][downloads-image]][npm-url]
+[![Backers on Open Collective](https://opencollective.com/validatorjs/backers/badge.svg)](#backers)
+[![Sponsors on Open Collective](https://opencollective.com/validatorjs/sponsors/badge.svg)](#sponsors)
+
+A library of string validators and sanitizers.
+
+## Strings only
+
+**This library validates and sanitizes strings only.**
+
+If you're not sure if your input is a string, coerce it using `input + ''`.
+Passing anything other than a string is an error.
+
+## Installation and Usage
+
+### Server-side usage
+
+Install the library with `npm install validator`
+
+#### No ES6
+
+```javascript
+var validator = require('validator');
+
+validator.isEmail('foo@bar.com'); //=> true
+```
+
+#### ES6
+
+```javascript
+import validator from 'validator';
+```
+
+Or, import only a subset of the library:
+
+```javascript
+import isEmail from 'validator/lib/isEmail';
+```
+
+#### Tree-shakeable ES imports
+
+```javascript
+import isEmail from 'validator/es/lib/isEmail';
+```
+
+### Client-side usage
+
+The library can be loaded either as a standalone script, or through an [AMD][amd]-compatible loader
+
+```html
+<script type="text/javascript" src="validator.min.js"></script>
+<script type="text/javascript">
+ validator.isEmail('foo@bar.com'); //=> true
+</script>
+```
+
+The library can also be installed through [bower][bower]
+
+```bash
+$ bower install validator-js
+```
+
+## Contributors
+
+[Become a backer](https://opencollective.com/validatorjs#backer)
+
+[Become a sponsor](https://opencollective.com/validatorjs#sponsor)
+
+Thank you to the people who have already contributed:
+
+<a href="https://github.com/validatorjs/validator.js/graphs/contributors"><img src="https://opencollective.com/validatorjs/contributors.svg?width=890" /></a>
+
+## Validators
+
+Here is a list of the validators currently available.
+
+Validator | Description
+--------------------------------------- | --------------------------------------
+***contains(str, seed)*** | check if the string contains the seed.
+**equals(str, comparison)** | check if the string matches the comparison.
+**isAfter(str [, date])** | check if the string is a date that's after the specified date (defaults to now).
+**isAlpha(str [, locale])** | check if the string contains only letters (a-zA-Z).<br/><br/>Locale is one of `['ar', 'ar-AE', 'ar-BH', 'ar-DZ', 'ar-EG', 'ar-IQ', 'ar-JO', 'ar-KW', 'ar-LB', 'ar-LY', 'ar-MA', 'ar-QA', 'ar-QM', 'ar-SA', 'ar-SD', 'ar-SY', 'ar-TN', 'ar-YE', 'bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-AU', 'en-GB', 'en-HK', 'en-IN', 'en-NZ', 'en-US', 'en-ZA', 'en-ZM', 'es-ES', 'fr-FR', 'fa-IR', 'he', 'hu-HU', 'it-IT', 'ku-IQ', 'nb-NO', 'nl-NL', 'nn-NO', 'pl-PL', 'pt-BR', 'pt-PT', 'ru-RU', 'sl-SI', 'sk-SK', 'sr-RS', 'sr-RS@latin', 'sv-SE', 'tr-TR', 'uk-UA']`) and defaults to `en-US`. Locale list is `validator.isAlphaLocales`.
+**isAlphanumeric(str [, locale])** | check if the string contains only letters and numbers.<br/><br/>Locale is one of `['ar', 'ar-AE', 'ar-BH', 'ar-DZ', 'ar-EG', 'ar-IQ', 'ar-JO', 'ar-KW', 'ar-LB', 'ar-LY', 'ar-MA', 'ar-QA', 'ar-QM', 'ar-SA', 'ar-SD', 'ar-SY', 'ar-TN', 'ar-YE', 'bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-AU', 'en-GB', 'en-HK', 'en-IN', 'en-NZ', 'en-US', 'en-ZA', 'en-ZM', 'es-ES', 'fr-FR', 'fa-IR', 'he', 'hu-HU', 'it-IT', 'ku-IQ', 'nb-NO', 'nl-NL', 'nn-NO', 'pl-PL', 'pt-BR', 'pt-PT', 'ru-RU', 'sl-SI', 'sk-SK', 'sr-RS', 'sr-RS@latin', 'sv-SE', 'tr-TR', 'uk-UA']`) and defaults to `en-US`. Locale list is `validator.isAlphanumericLocales`.
+**isAscii(str)** | check if the string contains ASCII chars only.
+**isBase32(str)** | check if a string is base32 encoded.
+**isBase64(str)** | check if a string is base64 encoded.
+**isBefore(str [, date])** | check if the string is a date that's before the specified date.
+**isIBAN(str)** | check if a string is a IBAN (International Bank Account Number).
+**isBIC(str)** | check if a string is a BIC (Bank Identification Code) or SWIFT code.
+**isBoolean(str)** | check if a string is a boolean.
+**isByteLength(str [, options])** | check if the string's length (in UTF-8 bytes) falls in a range.<br/><br/>`options` is an object which defaults to `{min:0, max: undefined}`.
+**isCreditCard(str)** | check if the string is a credit card.
+**isCurrency(str [, options])** | check if the string is a valid currency amount.<br/><br/>`options` is an object which defaults to `{symbol: '$', require_symbol: false, allow_space_after_symbol: false, symbol_after_digits: false, allow_negatives: true, parens_for_negatives: false, negative_sign_before_digits: false, negative_sign_after_digits: false, allow_negative_sign_placeholder: false, thousands_separator: ',', decimal_separator: '.', allow_decimal: true, require_decimal: false, digits_after_decimal: [2], allow_space_after_digits: false}`.<br/>**Note:** The array `digits_after_decimal` is filled with the exact number of digits allowed not a range, for example a range 1 to 3 will be given as [1, 2, 3].
+**isEthereumAddress(str)** | check if the string is an [Ethereum](https://ethereum.org/) address using basic regex. Does not validate address checksums.
+**isBtcAddress(str)** | check if the string is a valid BTC address.
+**isDataURI(str)** | check if the string is a [data uri format](https://developer.mozilla.org/en-US/docs/Web/HTTP/data_URIs).
+**isDecimal(str [, options])** | check if the string represents a decimal number, such as 0.1, .3, 1.1, 1.00003, 4.0, etc.<br/><br/>`options` is an object which defaults to `{force_decimal: false, decimal_digits: '1,', locale: 'en-US'}`<br/><br/>`locale` determine the decimal separator and is one of `['ar', 'ar-AE', 'ar-BH', 'ar-DZ', 'ar-EG', 'ar-IQ', 'ar-JO', 'ar-KW', 'ar-LB', 'ar-LY', 'ar-MA', 'ar-QA', 'ar-QM', 'ar-SA', 'ar-SD', 'ar-SY', 'ar-TN', 'ar-YE', 'bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'en-AU', 'en-GB', 'en-HK', 'en-IN', 'en-NZ', 'en-US', 'en-ZA', 'en-ZM', 'es-ES', 'fr-FR', 'hu-HU', 'it-IT', 'ku-IQ', nb-NO', 'nl-NL', 'nn-NO', 'pl-PL', 'pt-BR', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS', 'sr-RS@latin', 'sv-SE', 'tr-TR', 'uk-UA']`.<br/>**Note:** `decimal_digits` is given as a range like '1,3', a specific value like '3' or min like '1,'.
+**isDivisibleBy(str, number)** | check if the string is a number that's divisible by another.
+**isEmail(str [, options])** | check if the string is an email.<br/><br/>`options` is an object which defaults to `{ allow_display_name: false, require_display_name: false, allow_utf8_local_part: true, require_tld: true, allow_ip_domain: false, domain_specific_validation: false }`. If `allow_display_name` is set to true, the validator will also match `Display Name <email-address>`. If `require_display_name` is set to true, the validator will reject strings without the format `Display Name <email-address>`. If `allow_utf8_local_part` is set to false, the validator will not allow any non-English UTF8 character in email address' local part. If `require_tld` is set to false, e-mail addresses without having TLD in their domain will also be matched. If `ignore_max_length` is set to true, the validator will not check for the standard max length of an email. If `allow_ip_domain` is set to true, the validator will allow IP addresses in the host part. If `domain_specific_validation` is true, some additional validation will be enabled, e.g. disallowing certain syntactically valid email addresses that are rejected by GMail.
+**isEmpty(str [, options])** | check if the string has a length of zero.<br/><br/>`options` is an object which defaults to `{ ignore_whitespace:false }`.
+**isFloat(str [, options])** | check if the string is a float.<br/><br/>`options` is an object which can contain the keys `min`, `max`, `gt`, and/or `lt` to validate the float is within boundaries (e.g. `{ min: 7.22, max: 9.55 }`) it also has `locale` as an option.<br/><br/>`min` and `max` are equivalent to 'greater or equal' and 'less or equal', respectively while `gt` and `lt` are their strict counterparts.<br/><br/>`locale` determine the decimal separator and is one of `['ar', 'ar-AE', 'ar-BH', 'ar-DZ', 'ar-EG', 'ar-IQ', 'ar-JO', 'ar-KW', 'ar-LB', 'ar-LY', 'ar-MA', 'ar-QA', 'ar-QM', 'ar-SA', 'ar-SD', 'ar-SY', 'ar-TN', 'ar-YE', 'bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'en-AU', 'en-GB', 'en-HK', 'en-IN', 'en-NZ', 'en-US', 'en-ZA', 'en-ZM', 'es-ES', 'fr-FR', 'hu-HU', 'it-IT', 'nb-NO', 'nl-NL', 'nn-NO', 'pl-PL', 'pt-BR', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS', 'sr-RS@latin', 'sv-SE', 'tr-TR', 'uk-UA']`. Locale list is `validator.isFloatLocales`.
+**isFQDN(str [, options])** | check if the string is a fully qualified domain name (e.g. domain.com).<br/><br/>`options` is an object which defaults to `{ require_tld: true, allow_underscores: false, allow_trailing_dot: false }`.
+**isFullWidth(str)** | check if the string contains any full-width chars.
+**isHalfWidth(str)** | check if the string contains any half-width chars.
+**isHash(str, algorithm)** | check if the string is a hash of type algorithm.<br/><br/>Algorithm is one of `['md4', 'md5', 'sha1', 'sha256', 'sha384', 'sha512', 'ripemd128', 'ripemd160', 'tiger128', 'tiger160', 'tiger192', 'crc32', 'crc32b']`
+**isHexadecimal(str)** | check if the string is a hexadecimal number.
+**isHexColor(str)** | check if the string is a hexadecimal color.
+**isHSL(str)** | check if the string is an HSL (hue, saturation, lightness, optional alpha) color based on [CSS Colors Level 4 specification](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value).<br/><br/>Comma-separated format supported. Space-separated format supported with the exception of a few edge cases (ex: `hsl(200grad+.1%62%/1)`).
+**isRgbColor(str, [, includePercentValues])** | check if the string is a rgb or rgba color.<br/><br/>`includePercentValues` defaults to `true`. If you don't want to allow to set `rgb` or `rgba` values with percents, like `rgb(5%,5%,5%)`, or `rgba(90%,90%,90%,.3)`, then set it to false.
+**isIdentityCard(str [, locale])** | check if the string is a valid identity card code.<br/><br/>`locale` is one of `['ES', 'zh-TW', 'he-IL']` OR `'any'`. If 'any' is used, function will check if any of the locals match.<br/><br/>Defaults to 'any'.
+**isIn(str, values)** | check if the string is in a array of allowed values.
+**isInt(str [, options])** | check if the string is an integer.<br/><br/>`options` is an object which can contain the keys `min` and/or `max` to check the integer is within boundaries (e.g. `{ min: 10, max: 99 }`). `options` can also contain the key `allow_leading_zeroes`, which when set to false will disallow integer values with leading zeroes (e.g. `{ allow_leading_zeroes: false }`). Finally, `options` can contain the keys `gt` and/or `lt` which will enforce integers being greater than or less than, respectively, the value provided (e.g. `{gt: 1, lt: 4}` for a number between 1 and 4).
+**isIP(str [, version])** | check if the string is an IP (version 4 or 6).
+**isIPRange(str)** | check if the string is an IP Range(version 4 only).
+**isISBN(str [, version])** | check if the string is an ISBN (version 10 or 13).
+**isEAN(str)** | check if the string is an EAN (European Article Number).
+**isISIN(str)** | check if the string is an [ISIN][ISIN] (stock/security identifier).
+**isISO31661Alpha2(str)** | check if the string is a valid [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) officially assigned country code.
+**isISO31661Alpha3(str)** | check if the string is a valid [ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) officially assigned country code.
+**isISO8601(str)** | check if the string is a valid [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date; for additional checks for valid dates, e.g. invalidates dates like `2009-02-29`, pass `options` object as a second parameter with `options.strict = true`.
+**isISSN(str [, options])** | check if the string is an [ISSN](https://en.wikipedia.org/wiki/International_Standard_Serial_Number).<br/><br/>`options` is an object which defaults to `{ case_sensitive: false, require_hyphen: false }`. If `case_sensitive` is true, ISSNs with a lowercase `'x'` as the check digit are rejected.
+**isISRC(str)** | check if the string is a [ISRC](https://en.wikipedia.org/wiki/International_Standard_Recording_Code).
+**isRFC3339(str)** | check if the string is a valid [RFC 3339](https://tools.ietf.org/html/rfc3339) date.
+**isJSON(str)** | check if the string is valid JSON (note: uses JSON.parse).
+**isJWT(str)** | check if the string is valid JWT token.
+**isLatLong(str)**                     | check if the string is a valid latitude-longitude coordinate in the format `lat,long` or `lat, long`.
+**isLength(str [, options])** | check if the string's length falls in a range.<br/><br/>`options` is an object which defaults to `{min:0, max: undefined}`. Note: this function takes into account surrogate pairs.
+**isLocale(str)** | check if the string is a locale
+**isLowercase(str)** | check if the string is lowercase.
+**isMACAddress(str)** | check if the string is a MAC address.<br/><br/>`options` is an object which defaults to `{no_colons: false}`. If `no_colons` is true, the validator will allow MAC addresses without the colons. Also, it allows the use of hyphens, spaces or dots e.g '01 02 03 04 05 ab', '01-02-03-04-05-ab' or '0102.0304.05ab'.
+**isMagnetURI(str)** | check if the string is a [magnet uri format](https://en.wikipedia.org/wiki/Magnet_URI_scheme).
+**isMD5(str)** | check if the string is a MD5 hash.<br/><br/>Please note that you can also use the `isHash(str, 'md5')` function. Keep in mind that MD5 has some collision weaknesses compared to other algorithms (e.g., SHA).
+**isMimeType(str)** | check if the string matches to a valid [MIME type](https://en.wikipedia.org/wiki/Media_type) format
+**isMobilePhone(str [, locale [, options]])** | check if the string is a mobile phone number,<br/><br/>(locale is either an array of locales (e.g `['sk-SK', 'sr-RS']`) OR one of `['ar-AE', 'ar-BH', 'ar-DZ', 'ar-EG', 'ar-IQ', ar-JO', 'ar-KW', 'ar-SA', 'ar-SY', 'ar-TN', 'be-BY', 'bg-BG', 'bn-BD', 'cs-CZ', 'de-DE', 'de-AT', 'da-DK', 'el-GR', 'en-AU', 'en-CA', 'en-GB', 'en-GG', 'en-GH', 'en-HK', 'en-MO', 'en-IE', 'en-IN', 'en-KE', 'en-MT', 'en-MU', 'en-NG', 'en-NZ', 'en-RW', 'en-SG', 'en-UG', 'en-US', 'en-TZ', 'en-ZA', 'en-ZM', 'en-PK', 'es-EC', 'es-ES', 'es-MX', 'es-PA', 'es-PY', 'es-UY', 'et-EE', 'fa-IR', 'fi-FI', 'fj-FJ', 'fr-FR', 'fr-GF', 'fr-GP', 'fr-MQ', 'fr-RE', 'he-IL', 'hu-HU', 'id-ID', 'it-IT', 'ja-JP', 'kk-KZ', 'ko-KR', 'lt-LT', 'ms-MY', 'nb-NO', 'ne-NP', 'nl-BE', 'nl-NL', 'nn-NO', 'pl-PL', 'pt-PT', 'pt-BR', 'ro-RO', 'ru-RU', 'sl-SI', 'sk-SK', 'sr-RS', 'sv-SE', 'th-TH', 'tr-TR', 'uk-UA', 'vi-VN', 'zh-CN', 'zh-HK', 'zh-MO', 'zh-TW']` OR defaults to 'any'. If 'any' or a falsey value is used, function will check if any of the locales match).<br/><br/>`options` is an optional object that can be supplied with the following keys: `strictMode`, if this is set to `true`, the mobile phone number must be supplied with the country code and therefore must start with `+`. Locale list is `validator.isMobilePhoneLocales`.
+**isMongoId(str)** | check if the string is a valid hex-encoded representation of a [MongoDB ObjectId][mongoid].
+**isMultibyte(str)** | check if the string contains one or more multibyte chars.
+**isNumeric(str [, options])** | check if the string contains only numbers.<br/><br/>`options` is an object which defaults to `{no_symbols: false}`. If `no_symbols` is true, the validator will reject numeric strings that feature a symbol (e.g. `+`, `-`, or `.`).
+**isOctal(str)** | check if the string is a valid octal number.
+**isPassportNumber(str, countryCode)** | check if the string is a valid passport number relative to a specific country code.
+**isPort(str)** | check if the string is a valid port number.
+**isPostalCode(str, locale)** | check if the string is a postal code,<br/><br/>(locale is one of `[ 'AD', 'AT', 'AU', 'BE', 'BG', 'BR', 'CA', 'CH', 'CZ', 'DE', 'DK', 'DZ', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'HR', 'HU', 'ID', 'IE' 'IL', 'IN', 'IR', 'IS', 'IT', 'JP', 'KE', 'LI', 'LT', 'LU', 'LV', 'MT', 'MX', 'NL', 'NO', 'NZ', 'PL', 'PR', 'PT', 'RO', 'RU', 'SA', 'SE', 'SI', 'TN', 'TW', 'UA', 'US', 'ZA', 'ZM' ]` OR 'any'. If 'any' is used, function will check if any of the locals match. Locale list is `validator.isPostalCodeLocales`.).
+**isSemVer(str)** | check if the string is a Semantic Versioning Specification (SemVer).
+**isSurrogatePair(str)** | check if the string contains any surrogate pairs chars.
+**isURL(str [, options])** | check if the string is an URL.<br/><br/>`options` is an object which defaults to `{ protocols: ['http','https','ftp'], require_tld: true, require_protocol: false, require_host: true, require_valid_protocol: true, allow_underscores: false, host_whitelist: false, host_blacklist: false, allow_trailing_dot: false, allow_protocol_relative_urls: false, disallow_auth: false }`.<br/><br/>require_protocol - if set as true isURL will return false if protocol is not present in the URL.<br/>require_valid_protocol - isURL will check if the URL's protocol is present in the protocols option.<br/>protocols - valid protocols can be modified with this option.<br/>require_host - if set as false isURL will not check if host is present in the URL.<br/>allow_protocol_relative_urls - if set as true protocol relative URLs will be allowed.
+**isUppercase(str)** | check if the string is uppercase.
+**isUUID(str [, version])** | check if the string is a UUID (version 3, 4 or 5).
+**isVariableWidth(str)** | check if the string contains a mixture of full and half-width chars.
+**isWhitelisted(str, chars)** | checks characters if they appear in the whitelist.
+**matches(str, pattern [, modifiers])** | check if string matches the pattern.<br/><br/>Either `matches('foo', /foo/i)` or `matches('foo', 'foo', 'i')`.
+
+## Sanitizers
+
+Here is a list of the sanitizers currently available.
+
+Sanitizer | Description
+-------------------------------------- | -------------------------------
+**blacklist(input, chars)** | remove characters that appear in the blacklist. The characters are used in a RegExp and so you will need to escape some chars, e.g. `blacklist(input, '\\[\\]')`.
+**escape(input)** | replace `<`, `>`, `&`, `'`, `"` and `/` with HTML entities.
+**unescape(input)** | replaces HTML encoded entities with `<`, `>`, `&`, `'`, `"` and `/`.
+**ltrim(input [, chars])** | trim characters from the left-side of the input.
+**normalizeEmail(email [, options])** | canonicalizes an email address. (This doesn't validate that the input is an email, if you want to validate the email use isEmail beforehand)<br/><br/>`options` is an object with the following keys and default values:<br/><ul><li>*all_lowercase: true* - Transforms the local part (before the @ symbol) of all email addresses to lowercase. Please note that this may violate RFC 5321, which gives providers the possibility to treat the local part of email addresses in a case sensitive way (although in practice most - yet not all - providers don't). The domain part of the email address is always lowercased, as it's case insensitive per RFC 1035.</li><li>*gmail_lowercase: true* - GMail addresses are known to be case-insensitive, so this switch allows lowercasing them even when *all_lowercase* is set to false. Please note that when *all_lowercase* is true, GMail addresses are lowercased regardless of the value of this setting.</li><li>*gmail_remove_dots: true*: Removes dots from the local part of the email address, as GMail ignores them (e.g. "john.doe" and "johndoe" are considered equal).</li><li>*gmail_remove_subaddress: true*: Normalizes addresses by removing "sub-addresses", which is the part following a "+" sign (e.g. "foo+bar@gmail.com" becomes "foo@gmail.com").</li><li>*gmail_convert_googlemaildotcom: true*: Converts addresses with domain @googlemail.com to @gmail.com, as they're equivalent.</li><li>*outlookdotcom_lowercase: true* - Outlook.com addresses (including Windows Live and Hotmail) are known to be case-insensitive, so this switch allows lowercasing them even when *all_lowercase* is set to false. Please note that when *all_lowercase* is true, Outlook.com addresses are lowercased regardless of the value of this setting.</li><li>*outlookdotcom_remove_subaddress: true*: Normalizes addresses by removing "sub-addresses", which is the part following a "+" sign (e.g. "foo+bar@outlook.com" becomes "foo@outlook.com").</li><li>*yahoo_lowercase: true* - Yahoo Mail addresses are known to be case-insensitive, so this switch allows lowercasing them even when *all_lowercase* is set to false. Please note that when *all_lowercase* is true, Yahoo Mail addresses are lowercased regardless of the value of this setting.</li><li>*yahoo_remove_subaddress: true*: Normalizes addresses by removing "sub-addresses", which is the part following a "-" sign (e.g. "foo-bar@yahoo.com" becomes "foo@yahoo.com").</li><li>*icloud_lowercase: true* - iCloud addresses (including MobileMe) are known to be case-insensitive, so this switch allows lowercasing them even when *all_lowercase* is set to false. Please note that when *all_lowercase* is true, iCloud addresses are lowercased regardless of the value of this setting.</li><li>*icloud_remove_subaddress: true*: Normalizes addresses by removing "sub-addresses", which is the part following a "+" sign (e.g. "foo+bar@icloud.com" becomes "foo@icloud.com").</li></ul>
+**rtrim(input [, chars])** | trim characters from the right-side of the input.
+**stripLow(input [, keep_new_lines])** | remove characters with a numerical value < 32 and 127, mostly control characters. If `keep_new_lines` is `true`, newline characters are preserved (`\n` and `\r`, hex `0xA` and `0xD`). Unicode-safe in JavaScript.
+**toBoolean(input [, strict])** | convert the input string to a boolean. Everything except for `'0'`, `'false'` and `''` returns `true`. In strict mode only `'1'` and `'true'` return `true`.
+**toDate(input)** | convert the input string to a date, or `null` if the input is not a date.
+**toFloat(input)** | convert the input string to a float, or `NaN` if the input is not a float.
+**toInt(input [, radix])** | convert the input string to an integer, or `NaN` if the input is not an integer.
+**trim(input [, chars])** | trim characters (whitespace by default) from both sides of the input.
+**whitelist(input, chars)** | remove characters that do not appear in the whitelist. The characters are used in a RegExp and so you will need to escape some chars, e.g. `whitelist(input, '\\[\\]')`.
+**isSlug** | Check if the string is of type slug. `Options` allow a single hyphen between string. e.g. [`cn-cn`, `cn-c-c`]
+
+### XSS Sanitization
+
+XSS sanitization was removed from the library in [2d5d6999](https://github.com/chriso/validator.js/commit/2d5d6999541add350fb396ef02dc42ca3215049e).
+
+For an alternative, have a look at Yahoo's [xss-filters library](https://github.com/yahoo/xss-filters) or at [DOMPurify](https://github.com/cure53/DOMPurify).
+
+## Contributing
+
+In general, we follow the "fork-and-pull" Git workflow.
+
+1. Fork the repo on GitHub
+2. Clone the project to your own machine
+3. Work on your fork
+ 1. Make your changes and additions
+ - Most of your changes should be focused on `src/` and `test/` folders and/or `README.md`.
+ - Files such as `validator.js`, `validator.min.js` and files in `lib/` folder are autogenerated when running tests (`npm test`) and need not to be changed **manually**.
+ 2. Change or add tests if needed
+ 3. Run tests and make sure they pass
+ 4. Add changes to README.md if needed
+4. Commit changes to your own branch
+5. **Make sure** you merge the latest from "upstream" and resolve conflicts if there is any
+6. Repeat step 3(3) above
+7. Push your work back up to your fork
+8. Submit a Pull request so that we can review your changes
+
+## Tests
+
+Tests are using mocha, to run the tests use:
+
+```sh
+$ npm test
+```
+
+## Maintainers
+
+- [chriso](https://github.com/chriso) - **Chris O'Hara** (author)
+- [profnandaa](https://github.com/profnandaa) - **Anthony Nandaa**
+
+## Reading
+
+Remember, validating can be troublesome sometimes. See [A list of articles about programming assumptions commonly made that aren't true](https://github.com/jameslk/awesome-falsehoods).
+
+## License (MIT)
+
+```
+Copyright (c) 2018 Chris O'Hara <cohara87@gmail.com>
+
+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.
+```
+
+[downloads-image]: http://img.shields.io/npm/dm/validator.svg
+
+[npm-url]: https://npmjs.org/package/validator
+[npm-image]: http://img.shields.io/npm/v/validator.svg
+
+[travis-url]: https://travis-ci.org/chriso/validator.js
+[travis-image]: http://img.shields.io/travis/chriso/validator.js.svg
+
+[amd]: http://requirejs.org/docs/whyamd.html
+[bower]: http://bower.io/
+
+[mongoid]: http://docs.mongodb.org/manual/reference/object-id/
+[ISIN]: https://en.wikipedia.org/wiki/International_Securities_Identification_Number
diff --git a/src/node_modules/validator/es/index.js b/src/node_modules/validator/es/index.js
new file mode 100644
index 0000000..61b55fc
--- /dev/null
+++ b/src/node_modules/validator/es/index.js
@@ -0,0 +1,181 @@
+import toDate from './lib/toDate';
+import toFloat from './lib/toFloat';
+import toInt from './lib/toInt';
+import toBoolean from './lib/toBoolean';
+import equals from './lib/equals';
+import contains from './lib/contains';
+import matches from './lib/matches';
+import isEmail from './lib/isEmail';
+import isURL from './lib/isURL';
+import isMACAddress from './lib/isMACAddress';
+import isIP from './lib/isIP';
+import isIPRange from './lib/isIPRange';
+import isFQDN from './lib/isFQDN';
+import isBoolean from './lib/isBoolean';
+import isLocale from './lib/isLocale';
+import isAlpha, { locales as isAlphaLocales } from './lib/isAlpha';
+import isAlphanumeric, { locales as isAlphanumericLocales } from './lib/isAlphanumeric';
+import isNumeric from './lib/isNumeric';
+import isPassportNumber from './lib/isPassportNumber';
+import isPort from './lib/isPort';
+import isLowercase from './lib/isLowercase';
+import isUppercase from './lib/isUppercase';
+import isAscii from './lib/isAscii';
+import isFullWidth from './lib/isFullWidth';
+import isHalfWidth from './lib/isHalfWidth';
+import isVariableWidth from './lib/isVariableWidth';
+import isMultibyte from './lib/isMultibyte';
+import isSemVer from './lib/isSemVer';
+import isSurrogatePair from './lib/isSurrogatePair';
+import isInt from './lib/isInt';
+import isFloat, { locales as isFloatLocales } from './lib/isFloat';
+import isDecimal from './lib/isDecimal';
+import isHexadecimal from './lib/isHexadecimal';
+import isOctal from './lib/isOctal';
+import isDivisibleBy from './lib/isDivisibleBy';
+import isHexColor from './lib/isHexColor';
+import isRgbColor from './lib/isRgbColor';
+import isHSL from './lib/isHSL';
+import isISRC from './lib/isISRC';
+import isIBAN from './lib/isIBAN';
+import isBIC from './lib/isBIC';
+import isMD5 from './lib/isMD5';
+import isHash from './lib/isHash';
+import isJWT from './lib/isJWT';
+import isJSON from './lib/isJSON';
+import isEmpty from './lib/isEmpty';
+import isLength from './lib/isLength';
+import isByteLength from './lib/isByteLength';
+import isUUID from './lib/isUUID';
+import isMongoId from './lib/isMongoId';
+import isAfter from './lib/isAfter';
+import isBefore from './lib/isBefore';
+import isIn from './lib/isIn';
+import isCreditCard from './lib/isCreditCard';
+import isIdentityCard from './lib/isIdentityCard';
+import isEAN from './lib/isEAN';
+import isISIN from './lib/isISIN';
+import isISBN from './lib/isISBN';
+import isISSN from './lib/isISSN';
+import isMobilePhone, { locales as isMobilePhoneLocales } from './lib/isMobilePhone';
+import isEthereumAddress from './lib/isEthereumAddress';
+import isCurrency from './lib/isCurrency';
+import isBtcAddress from './lib/isBtcAddress';
+import isISO8601 from './lib/isISO8601';
+import isRFC3339 from './lib/isRFC3339';
+import isISO31661Alpha2 from './lib/isISO31661Alpha2';
+import isISO31661Alpha3 from './lib/isISO31661Alpha3';
+import isBase32 from './lib/isBase32';
+import isBase64 from './lib/isBase64';
+import isDataURI from './lib/isDataURI';
+import isMagnetURI from './lib/isMagnetURI';
+import isMimeType from './lib/isMimeType';
+import isLatLong from './lib/isLatLong';
+import isPostalCode, { locales as isPostalCodeLocales } from './lib/isPostalCode';
+import ltrim from './lib/ltrim';
+import rtrim from './lib/rtrim';
+import trim from './lib/trim';
+import escape from './lib/escape';
+import unescape from './lib/unescape';
+import stripLow from './lib/stripLow';
+import whitelist from './lib/whitelist';
+import blacklist from './lib/blacklist';
+import isWhitelisted from './lib/isWhitelisted';
+import normalizeEmail from './lib/normalizeEmail';
+import isSlug from './lib/isSlug';
+var version = '13.0.0';
+var validator = {
+ version: version,
+ toDate: toDate,
+ toFloat: toFloat,
+ toInt: toInt,
+ toBoolean: toBoolean,
+ equals: equals,
+ contains: contains,
+ matches: matches,
+ isEmail: isEmail,
+ isURL: isURL,
+ isMACAddress: isMACAddress,
+ isIP: isIP,
+ isIPRange: isIPRange,
+ isFQDN: isFQDN,
+ isBoolean: isBoolean,
+ isIBAN: isIBAN,
+ isBIC: isBIC,
+ isAlpha: isAlpha,
+ isAlphaLocales: isAlphaLocales,
+ isAlphanumeric: isAlphanumeric,
+ isAlphanumericLocales: isAlphanumericLocales,
+ isNumeric: isNumeric,
+ isPassportNumber: isPassportNumber,
+ isPort: isPort,
+ isLowercase: isLowercase,
+ isUppercase: isUppercase,
+ isAscii: isAscii,
+ isFullWidth: isFullWidth,
+ isHalfWidth: isHalfWidth,
+ isVariableWidth: isVariableWidth,
+ isMultibyte: isMultibyte,
+ isSemVer: isSemVer,
+ isSurrogatePair: isSurrogatePair,
+ isInt: isInt,
+ isFloat: isFloat,
+ isFloatLocales: isFloatLocales,
+ isDecimal: isDecimal,
+ isHexadecimal: isHexadecimal,
+ isOctal: isOctal,
+ isDivisibleBy: isDivisibleBy,
+ isHexColor: isHexColor,
+ isRgbColor: isRgbColor,
+ isHSL: isHSL,
+ isISRC: isISRC,
+ isMD5: isMD5,
+ isHash: isHash,
+ isJWT: isJWT,
+ isJSON: isJSON,
+ isEmpty: isEmpty,
+ isLength: isLength,
+ isLocale: isLocale,
+ isByteLength: isByteLength,
+ isUUID: isUUID,
+ isMongoId: isMongoId,
+ isAfter: isAfter,
+ isBefore: isBefore,
+ isIn: isIn,
+ isCreditCard: isCreditCard,
+ isIdentityCard: isIdentityCard,
+ isEAN: isEAN,
+ isISIN: isISIN,
+ isISBN: isISBN,
+ isISSN: isISSN,
+ isMobilePhone: isMobilePhone,
+ isMobilePhoneLocales: isMobilePhoneLocales,
+ isPostalCode: isPostalCode,
+ isPostalCodeLocales: isPostalCodeLocales,
+ isEthereumAddress: isEthereumAddress,
+ isCurrency: isCurrency,
+ isBtcAddress: isBtcAddress,
+ isISO8601: isISO8601,
+ isRFC3339: isRFC3339,
+ isISO31661Alpha2: isISO31661Alpha2,
+ isISO31661Alpha3: isISO31661Alpha3,
+ isBase32: isBase32,
+ isBase64: isBase64,
+ isDataURI: isDataURI,
+ isMagnetURI: isMagnetURI,
+ isMimeType: isMimeType,
+ isLatLong: isLatLong,
+ ltrim: ltrim,
+ rtrim: rtrim,
+ trim: trim,
+ escape: escape,
+ unescape: unescape,
+ stripLow: stripLow,
+ whitelist: whitelist,
+ blacklist: blacklist,
+ isWhitelisted: isWhitelisted,
+ normalizeEmail: normalizeEmail,
+ toString: toString,
+ isSlug: isSlug
+};
+export default validator; \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/alpha.js b/src/node_modules/validator/es/lib/alpha.js
new file mode 100644
index 0000000..38d385b
--- /dev/null
+++ b/src/node_modules/validator/es/lib/alpha.js
@@ -0,0 +1,100 @@
+export var alpha = {
+ 'en-US': /^[A-Z]+$/i,
+ 'bg-BG': /^[А-Я]+$/i,
+ 'cs-CZ': /^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,
+ 'da-DK': /^[A-ZÆØÅ]+$/i,
+ 'de-DE': /^[A-ZÄÖÜß]+$/i,
+ 'el-GR': /^[Α-ώ]+$/i,
+ 'es-ES': /^[A-ZÁÉÍÑÓÚÜ]+$/i,
+ 'fr-FR': /^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,
+ 'it-IT': /^[A-ZÀÉÈÌÎÓÒÙ]+$/i,
+ 'nb-NO': /^[A-ZÆØÅ]+$/i,
+ 'nl-NL': /^[A-ZÁÉËÏÓÖÜÚ]+$/i,
+ 'nn-NO': /^[A-ZÆØÅ]+$/i,
+ 'hu-HU': /^[A-ZÁÉÍÓÖŐÚÜŰ]+$/i,
+ 'pl-PL': /^[A-ZĄĆĘŚŁŃÓŻŹ]+$/i,
+ 'pt-PT': /^[A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,
+ 'ru-RU': /^[А-ЯЁ]+$/i,
+ 'sl-SI': /^[A-ZČĆĐŠŽ]+$/i,
+ 'sk-SK': /^[A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,
+ 'sr-RS@latin': /^[A-ZČĆŽŠĐ]+$/i,
+ 'sr-RS': /^[А-ЯЂЈЉЊЋЏ]+$/i,
+ 'sv-SE': /^[A-ZÅÄÖ]+$/i,
+ 'tr-TR': /^[A-ZÇĞİıÖŞÜ]+$/i,
+ 'uk-UA': /^[А-ЩЬЮЯЄIЇҐі]+$/i,
+ 'ku-IQ': /^[ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,
+ ar: /^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,
+ he: /^[א-ת]+$/,
+ 'fa-IR': /^['آابپتثجچهخدذرزژسشصضطظعغفقکگلمنوهی']+$/i
+};
+export var alphanumeric = {
+ 'en-US': /^[0-9A-Z]+$/i,
+ 'bg-BG': /^[0-9А-Я]+$/i,
+ 'cs-CZ': /^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,
+ 'da-DK': /^[0-9A-ZÆØÅ]+$/i,
+ 'de-DE': /^[0-9A-ZÄÖÜß]+$/i,
+ 'el-GR': /^[0-9Α-ω]+$/i,
+ 'es-ES': /^[0-9A-ZÁÉÍÑÓÚÜ]+$/i,
+ 'fr-FR': /^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,
+ 'it-IT': /^[0-9A-ZÀÉÈÌÎÓÒÙ]+$/i,
+ 'hu-HU': /^[0-9A-ZÁÉÍÓÖŐÚÜŰ]+$/i,
+ 'nb-NO': /^[0-9A-ZÆØÅ]+$/i,
+ 'nl-NL': /^[0-9A-ZÁÉËÏÓÖÜÚ]+$/i,
+ 'nn-NO': /^[0-9A-ZÆØÅ]+$/i,
+ 'pl-PL': /^[0-9A-ZĄĆĘŚŁŃÓŻŹ]+$/i,
+ 'pt-PT': /^[0-9A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,
+ 'ru-RU': /^[0-9А-ЯЁ]+$/i,
+ 'sl-SI': /^[0-9A-ZČĆĐŠŽ]+$/i,
+ 'sk-SK': /^[0-9A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,
+ 'sr-RS@latin': /^[0-9A-ZČĆŽŠĐ]+$/i,
+ 'sr-RS': /^[0-9А-ЯЂЈЉЊЋЏ]+$/i,
+ 'sv-SE': /^[0-9A-ZÅÄÖ]+$/i,
+ 'tr-TR': /^[0-9A-ZÇĞİıÖŞÜ]+$/i,
+ 'uk-UA': /^[0-9А-ЩЬЮЯЄIЇҐі]+$/i,
+ 'ku-IQ': /^[٠١٢٣٤٥٦٧٨٩0-9ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,
+ ar: /^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,
+ he: /^[0-9א-ת]+$/,
+ 'fa-IR': /^['0-9آابپتثجچهخدذرزژسشصضطظعغفقکگلمنوهی۱۲۳۴۵۶۷۸۹۰']+$/i
+};
+export var decimal = {
+ 'en-US': '.',
+ ar: '٫'
+};
+export var englishLocales = ['AU', 'GB', 'HK', 'IN', 'NZ', 'ZA', 'ZM'];
+
+for (var locale, i = 0; i < englishLocales.length; i++) {
+ locale = "en-".concat(englishLocales[i]);
+ alpha[locale] = alpha['en-US'];
+ alphanumeric[locale] = alphanumeric['en-US'];
+ decimal[locale] = decimal['en-US'];
+} // Source: http://www.localeplanet.com/java/
+
+
+export var arabicLocales = ['AE', 'BH', 'DZ', 'EG', 'IQ', 'JO', 'KW', 'LB', 'LY', 'MA', 'QM', 'QA', 'SA', 'SD', 'SY', 'TN', 'YE'];
+
+for (var _locale, _i = 0; _i < arabicLocales.length; _i++) {
+ _locale = "ar-".concat(arabicLocales[_i]);
+ alpha[_locale] = alpha.ar;
+ alphanumeric[_locale] = alphanumeric.ar;
+ decimal[_locale] = decimal.ar;
+} // Source: https://en.wikipedia.org/wiki/Decimal_mark
+
+
+export var dotDecimal = ['ar-EG', 'ar-LB', 'ar-LY'];
+export var commaDecimal = ['bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-ZM', 'es-ES', 'fr-FR', 'it-IT', 'ku-IQ', 'hu-HU', 'nb-NO', 'nn-NO', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS@latin', 'sr-RS', 'sv-SE', 'tr-TR', 'uk-UA'];
+
+for (var _i2 = 0; _i2 < dotDecimal.length; _i2++) {
+ decimal[dotDecimal[_i2]] = decimal['en-US'];
+}
+
+for (var _i3 = 0; _i3 < commaDecimal.length; _i3++) {
+ decimal[commaDecimal[_i3]] = ',';
+}
+
+alpha['pt-BR'] = alpha['pt-PT'];
+alphanumeric['pt-BR'] = alphanumeric['pt-PT'];
+decimal['pt-BR'] = decimal['pt-PT']; // see #862
+
+alpha['pl-Pl'] = alpha['pl-PL'];
+alphanumeric['pl-Pl'] = alphanumeric['pl-PL'];
+decimal['pl-Pl'] = decimal['pl-PL']; \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/blacklist.js b/src/node_modules/validator/es/lib/blacklist.js
new file mode 100644
index 0000000..77c0e5c
--- /dev/null
+++ b/src/node_modules/validator/es/lib/blacklist.js
@@ -0,0 +1,5 @@
+import assertString from './util/assertString';
+export default function blacklist(str, chars) {
+ assertString(str);
+ return str.replace(new RegExp("[".concat(chars, "]+"), 'g'), '');
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/contains.js b/src/node_modules/validator/es/lib/contains.js
new file mode 100644
index 0000000..10bd668
--- /dev/null
+++ b/src/node_modules/validator/es/lib/contains.js
@@ -0,0 +1,6 @@
+import assertString from './util/assertString';
+import toString from './util/toString';
+export default function contains(str, elem) {
+ assertString(str);
+ return str.indexOf(toString(elem)) >= 0;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/equals.js b/src/node_modules/validator/es/lib/equals.js
new file mode 100644
index 0000000..87a9ded
--- /dev/null
+++ b/src/node_modules/validator/es/lib/equals.js
@@ -0,0 +1,5 @@
+import assertString from './util/assertString';
+export default function equals(str, comparison) {
+ assertString(str);
+ return str === comparison;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/escape.js b/src/node_modules/validator/es/lib/escape.js
new file mode 100644
index 0000000..e9bb6de
--- /dev/null
+++ b/src/node_modules/validator/es/lib/escape.js
@@ -0,0 +1,5 @@
+import assertString from './util/assertString';
+export default function escape(str) {
+ assertString(str);
+ return str.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\//g, '&#x2F;').replace(/\\/g, '&#x5C;').replace(/`/g, '&#96;');
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isAfter.js b/src/node_modules/validator/es/lib/isAfter.js
new file mode 100644
index 0000000..b99cfa4
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isAfter.js
@@ -0,0 +1,9 @@
+import assertString from './util/assertString';
+import toDate from './toDate';
+export default function isAfter(str) {
+ var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String(new Date());
+ assertString(str);
+ var comparison = toDate(date);
+ var original = toDate(str);
+ return !!(original && comparison && original > comparison);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isAlpha.js b/src/node_modules/validator/es/lib/isAlpha.js
new file mode 100644
index 0000000..2b30d14
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isAlpha.js
@@ -0,0 +1,13 @@
+import assertString from './util/assertString';
+import { alpha } from './alpha';
+export default function isAlpha(str) {
+ var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
+ assertString(str);
+
+ if (locale in alpha) {
+ return alpha[locale].test(str);
+ }
+
+ throw new Error("Invalid locale '".concat(locale, "'"));
+}
+export var locales = Object.keys(alpha); \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isAlphanumeric.js b/src/node_modules/validator/es/lib/isAlphanumeric.js
new file mode 100644
index 0000000..4bbca75
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isAlphanumeric.js
@@ -0,0 +1,13 @@
+import assertString from './util/assertString';
+import { alphanumeric } from './alpha';
+export default function isAlphanumeric(str) {
+ var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
+ assertString(str);
+
+ if (locale in alphanumeric) {
+ return alphanumeric[locale].test(str);
+ }
+
+ throw new Error("Invalid locale '".concat(locale, "'"));
+}
+export var locales = Object.keys(alphanumeric); \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isAscii.js b/src/node_modules/validator/es/lib/isAscii.js
new file mode 100644
index 0000000..e322121
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isAscii.js
@@ -0,0 +1,10 @@
+import assertString from './util/assertString';
+/* eslint-disable no-control-regex */
+
+var ascii = /^[\x00-\x7F]+$/;
+/* eslint-enable no-control-regex */
+
+export default function isAscii(str) {
+ assertString(str);
+ return ascii.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isBIC.js b/src/node_modules/validator/es/lib/isBIC.js
new file mode 100644
index 0000000..a51944b
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isBIC.js
@@ -0,0 +1,6 @@
+import assertString from './util/assertString';
+var isBICReg = /^[A-z]{4}[A-z]{2}\w{2}(\w{3})?$/;
+export default function isBIC(str) {
+ assertString(str);
+ return isBICReg.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isBase32.js b/src/node_modules/validator/es/lib/isBase32.js
new file mode 100644
index 0000000..5150b36
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isBase32.js
@@ -0,0 +1,12 @@
+import assertString from './util/assertString';
+var base32 = /^[A-Z2-7]+=*$/;
+export default function isBase32(str) {
+ assertString(str);
+ var len = str.length;
+
+ if (len > 0 && len % 8 === 0 && base32.test(str)) {
+ return true;
+ }
+
+ return false;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isBase64.js b/src/node_modules/validator/es/lib/isBase64.js
new file mode 100644
index 0000000..de9e4e3
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isBase64.js
@@ -0,0 +1,13 @@
+import assertString from './util/assertString';
+var notBase64 = /[^A-Z0-9+\/=]/i;
+export default function isBase64(str) {
+ assertString(str);
+ var len = str.length;
+
+ if (!len || len % 4 !== 0 || notBase64.test(str)) {
+ return false;
+ }
+
+ var firstPaddingChar = str.indexOf('=');
+ return firstPaddingChar === -1 || firstPaddingChar === len - 1 || firstPaddingChar === len - 2 && str[len - 1] === '=';
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isBefore.js b/src/node_modules/validator/es/lib/isBefore.js
new file mode 100644
index 0000000..794dbab
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isBefore.js
@@ -0,0 +1,9 @@
+import assertString from './util/assertString';
+import toDate from './toDate';
+export default function isBefore(str) {
+ var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String(new Date());
+ assertString(str);
+ var comparison = toDate(date);
+ var original = toDate(str);
+ return !!(original && comparison && original < comparison);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isBoolean.js b/src/node_modules/validator/es/lib/isBoolean.js
new file mode 100644
index 0000000..d50092f
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isBoolean.js
@@ -0,0 +1,5 @@
+import assertString from './util/assertString';
+export default function isBoolean(str) {
+ assertString(str);
+ return ['true', 'false', '1', '0'].indexOf(str) >= 0;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isBtcAddress.js b/src/node_modules/validator/es/lib/isBtcAddress.js
new file mode 100644
index 0000000..bd2141a
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isBtcAddress.js
@@ -0,0 +1,7 @@
+import assertString from './util/assertString'; // supports Bech32 addresses
+
+var btc = /^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}$/;
+export default function isBtcAddress(str) {
+ assertString(str);
+ return btc.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isByteLength.js b/src/node_modules/validator/es/lib/isByteLength.js
new file mode 100644
index 0000000..eee2543
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isByteLength.js
@@ -0,0 +1,22 @@
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+import assertString from './util/assertString';
+/* eslint-disable prefer-rest-params */
+
+export default function isByteLength(str, options) {
+ assertString(str);
+ var min;
+ var max;
+
+ if (_typeof(options) === 'object') {
+ min = options.min || 0;
+ max = options.max;
+ } else {
+ // backwards compatibility: isByteLength(str, min [, max])
+ min = arguments[1];
+ max = arguments[2];
+ }
+
+ var len = encodeURI(str).split(/%..|./).length - 1;
+ return len >= min && (typeof max === 'undefined' || len <= max);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isCreditCard.js b/src/node_modules/validator/es/lib/isCreditCard.js
new file mode 100644
index 0000000..7f14736
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isCreditCard.js
@@ -0,0 +1,40 @@
+import assertString from './util/assertString';
+/* eslint-disable max-len */
+
+var creditCard = /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11}|6[27][0-9]{14})$/;
+/* eslint-enable max-len */
+
+export default function isCreditCard(str) {
+ assertString(str);
+ var sanitized = str.replace(/[- ]+/g, '');
+
+ if (!creditCard.test(sanitized)) {
+ return false;
+ }
+
+ var sum = 0;
+ var digit;
+ var tmpNum;
+ var shouldDouble;
+
+ for (var i = sanitized.length - 1; i >= 0; i--) {
+ digit = sanitized.substring(i, i + 1);
+ tmpNum = parseInt(digit, 10);
+
+ if (shouldDouble) {
+ tmpNum *= 2;
+
+ if (tmpNum >= 10) {
+ sum += tmpNum % 10 + 1;
+ } else {
+ sum += tmpNum;
+ }
+ } else {
+ sum += tmpNum;
+ }
+
+ shouldDouble = !shouldDouble;
+ }
+
+ return !!(sum % 10 === 0 ? sanitized : false);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isCurrency.js b/src/node_modules/validator/es/lib/isCurrency.js
new file mode 100644
index 0000000..a95020b
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isCurrency.js
@@ -0,0 +1,75 @@
+import merge from './util/merge';
+import assertString from './util/assertString';
+
+function currencyRegex(options) {
+ var decimal_digits = "\\d{".concat(options.digits_after_decimal[0], "}");
+ options.digits_after_decimal.forEach(function (digit, index) {
+ if (index !== 0) decimal_digits = "".concat(decimal_digits, "|\\d{").concat(digit, "}");
+ });
+ var symbol = "(\\".concat(options.symbol.replace(/\./g, '\\.'), ")").concat(options.require_symbol ? '' : '?'),
+ negative = '-?',
+ whole_dollar_amount_without_sep = '[1-9]\\d*',
+ whole_dollar_amount_with_sep = "[1-9]\\d{0,2}(\\".concat(options.thousands_separator, "\\d{3})*"),
+ valid_whole_dollar_amounts = ['0', whole_dollar_amount_without_sep, whole_dollar_amount_with_sep],
+ whole_dollar_amount = "(".concat(valid_whole_dollar_amounts.join('|'), ")?"),
+ decimal_amount = "(\\".concat(options.decimal_separator, "(").concat(decimal_digits, "))").concat(options.require_decimal ? '' : '?');
+ var pattern = whole_dollar_amount + (options.allow_decimal || options.require_decimal ? decimal_amount : ''); // default is negative sign before symbol, but there are two other options (besides parens)
+
+ if (options.allow_negatives && !options.parens_for_negatives) {
+ if (options.negative_sign_after_digits) {
+ pattern += negative;
+ } else if (options.negative_sign_before_digits) {
+ pattern = negative + pattern;
+ }
+ } // South African Rand, for example, uses R 123 (space) and R-123 (no space)
+
+
+ if (options.allow_negative_sign_placeholder) {
+ pattern = "( (?!\\-))?".concat(pattern);
+ } else if (options.allow_space_after_symbol) {
+ pattern = " ?".concat(pattern);
+ } else if (options.allow_space_after_digits) {
+ pattern += '( (?!$))?';
+ }
+
+ if (options.symbol_after_digits) {
+ pattern += symbol;
+ } else {
+ pattern = symbol + pattern;
+ }
+
+ if (options.allow_negatives) {
+ if (options.parens_for_negatives) {
+ pattern = "(\\(".concat(pattern, "\\)|").concat(pattern, ")");
+ } else if (!(options.negative_sign_before_digits || options.negative_sign_after_digits)) {
+ pattern = negative + pattern;
+ }
+ } // ensure there's a dollar and/or decimal amount, and that
+ // it doesn't start with a space or a negative sign followed by a space
+
+
+ return new RegExp("^(?!-? )(?=.*\\d)".concat(pattern, "$"));
+}
+
+var default_currency_options = {
+ symbol: '$',
+ require_symbol: false,
+ allow_space_after_symbol: false,
+ symbol_after_digits: false,
+ allow_negatives: true,
+ parens_for_negatives: false,
+ negative_sign_before_digits: false,
+ negative_sign_after_digits: false,
+ allow_negative_sign_placeholder: false,
+ thousands_separator: ',',
+ decimal_separator: '.',
+ allow_decimal: true,
+ require_decimal: false,
+ digits_after_decimal: [2],
+ allow_space_after_digits: false
+};
+export default function isCurrency(str, options) {
+ assertString(str);
+ options = merge(options, default_currency_options);
+ return currencyRegex(options).test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isDataURI.js b/src/node_modules/validator/es/lib/isDataURI.js
new file mode 100644
index 0000000..781be5b
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isDataURI.js
@@ -0,0 +1,40 @@
+import assertString from './util/assertString';
+var validMediaType = /^[a-z]+\/[a-z0-9\-\+]+$/i;
+var validAttribute = /^[a-z\-]+=[a-z0-9\-]+$/i;
+var validData = /^[a-z0-9!\$&'\(\)\*\+,;=\-\._~:@\/\?%\s]*$/i;
+export default function isDataURI(str) {
+ assertString(str);
+ var data = str.split(',');
+
+ if (data.length < 2) {
+ return false;
+ }
+
+ var attributes = data.shift().trim().split(';');
+ var schemeAndMediaType = attributes.shift();
+
+ if (schemeAndMediaType.substr(0, 5) !== 'data:') {
+ return false;
+ }
+
+ var mediaType = schemeAndMediaType.substr(5);
+
+ if (mediaType !== '' && !validMediaType.test(mediaType)) {
+ return false;
+ }
+
+ for (var i = 0; i < attributes.length; i++) {
+ if (i === attributes.length - 1 && attributes[i].toLowerCase() === 'base64') {// ok
+ } else if (!validAttribute.test(attributes[i])) {
+ return false;
+ }
+ }
+
+ for (var _i = 0; _i < data.length; _i++) {
+ if (!validData.test(data[_i])) {
+ return false;
+ }
+ }
+
+ return true;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isDecimal.js b/src/node_modules/validator/es/lib/isDecimal.js
new file mode 100644
index 0000000..597f42c
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isDecimal.js
@@ -0,0 +1,26 @@
+import merge from './util/merge';
+import assertString from './util/assertString';
+import includes from './util/includes';
+import { decimal } from './alpha';
+
+function decimalRegExp(options) {
+ var regExp = new RegExp("^[-+]?([0-9]+)?(\\".concat(decimal[options.locale], "[0-9]{").concat(options.decimal_digits, "})").concat(options.force_decimal ? '' : '?', "$"));
+ return regExp;
+}
+
+var default_decimal_options = {
+ force_decimal: false,
+ decimal_digits: '1,',
+ locale: 'en-US'
+};
+var blacklist = ['', '-', '+'];
+export default function isDecimal(str, options) {
+ assertString(str);
+ options = merge(options, default_decimal_options);
+
+ if (options.locale in decimal) {
+ return !includes(blacklist, str.replace(/ /g, '')) && decimalRegExp(options).test(str);
+ }
+
+ throw new Error("Invalid locale '".concat(options.locale, "'"));
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isDivisibleBy.js b/src/node_modules/validator/es/lib/isDivisibleBy.js
new file mode 100644
index 0000000..f71d5f4
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isDivisibleBy.js
@@ -0,0 +1,6 @@
+import assertString from './util/assertString';
+import toFloat from './toFloat';
+export default function isDivisibleBy(str, num) {
+ assertString(str);
+ return toFloat(str) % parseInt(num, 10) === 0;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isEAN.js b/src/node_modules/validator/es/lib/isEAN.js
new file mode 100644
index 0000000..aae665c
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isEAN.js
@@ -0,0 +1,67 @@
+/**
+ * The most commonly used EAN standard is
+ * the thirteen-digit EAN-13, while the
+ * less commonly used 8-digit EAN-8 barcode was
+ * introduced for use on small packages.
+ * EAN consists of:
+ * GS1 prefix, manufacturer code, product code and check digit
+ * Reference: https://en.wikipedia.org/wiki/International_Article_Number
+ */
+import assertString from './util/assertString';
+/**
+ * Define EAN Lenghts; 8 for EAN-8; 13 for EAN-13
+ * and Regular Expression for valid EANs (EAN-8, EAN-13),
+ * with exact numberic matching of 8 or 13 digits [0-9]
+ */
+
+var LENGTH_EAN_8 = 8;
+var validEanRegex = /^(\d{8}|\d{13})$/;
+/**
+ * Get position weight given:
+ * EAN length and digit index/position
+ *
+ * @param {number} length
+ * @param {number} index
+ * @return {number}
+ */
+
+function getPositionWeightThroughLengthAndIndex(length, index) {
+ if (length === LENGTH_EAN_8) {
+ return index % 2 === 0 ? 3 : 1;
+ }
+
+ return index % 2 === 0 ? 1 : 3;
+}
+/**
+ * Calculate EAN Check Digit
+ * Reference: https://en.wikipedia.org/wiki/International_Article_Number#Calculation_of_checksum_digit
+ *
+ * @param {string} ean
+ * @return {number}
+ */
+
+
+function calculateCheckDigit(ean) {
+ var checksum = ean.slice(0, -1).split('').map(function (_char, index) {
+ return Number(_char) * getPositionWeightThroughLengthAndIndex(ean.length, index);
+ }).reduce(function (acc, partialSum) {
+ return acc + partialSum;
+ }, 0);
+ var remainder = 10 - checksum % 10;
+ return remainder < 10 ? remainder : 0;
+}
+/**
+ * Check if string is valid EAN:
+ * Matches EAN-8/EAN-13 regex
+ * Has valid check digit.
+ *
+ * @param {string} str
+ * @return {boolean}
+ */
+
+
+export default function isEAN(str) {
+ assertString(str);
+ var actualCheckDigit = Number(str.slice(-1));
+ return validEanRegex.test(str) && actualCheckDigit === calculateCheckDigit(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isEmail.js b/src/node_modules/validator/es/lib/isEmail.js
new file mode 100644
index 0000000..2ebdb1b
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isEmail.js
@@ -0,0 +1,180 @@
+function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
+
+function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
+
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+
+function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
+
+import assertString from './util/assertString';
+import merge from './util/merge';
+import isByteLength from './isByteLength';
+import isFQDN from './isFQDN';
+import isIP from './isIP';
+var default_email_options = {
+ allow_display_name: false,
+ require_display_name: false,
+ allow_utf8_local_part: true,
+ require_tld: true
+};
+/* eslint-disable max-len */
+
+/* eslint-disable no-control-regex */
+
+var splitNameAddress = /^([^\x00-\x1F\x7F-\x9F\cX]+)<(.+)>$/i;
+var emailUserPart = /^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~]+$/i;
+var gmailUserPart = /^[a-z\d]+$/;
+var quotedEmailUser = /^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f]))*$/i;
+var emailUserUtf8Part = /^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+$/i;
+var quotedEmailUserUtf8 = /^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*$/i;
+var defaultMaxEmailLength = 254;
+/* eslint-enable max-len */
+
+/* eslint-enable no-control-regex */
+
+/**
+ * Validate display name according to the RFC2822: https://tools.ietf.org/html/rfc2822#appendix-A.1.2
+ * @param {String} display_name
+ */
+
+function validateDisplayName(display_name) {
+ var trim_quotes = display_name.match(/^"(.+)"$/i);
+ var display_name_without_quotes = trim_quotes ? trim_quotes[1] : display_name; // display name with only spaces is not valid
+
+ if (!display_name_without_quotes.trim()) {
+ return false;
+ } // check whether display name contains illegal character
+
+
+ var contains_illegal = /[\.";<>]/.test(display_name_without_quotes);
+
+ if (contains_illegal) {
+ // if contains illegal characters,
+ // must to be enclosed in double-quotes, otherwise it's not a valid display name
+ if (!trim_quotes) {
+ return false;
+ } // the quotes in display name must start with character symbol \
+
+
+ var all_start_with_back_slash = display_name_without_quotes.split('"').length === display_name_without_quotes.split('\\"').length;
+
+ if (!all_start_with_back_slash) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+export default function isEmail(str, options) {
+ assertString(str);
+ options = merge(options, default_email_options);
+
+ if (options.require_display_name || options.allow_display_name) {
+ var display_email = str.match(splitNameAddress);
+
+ if (display_email) {
+ var display_name;
+
+ var _display_email = _slicedToArray(display_email, 3);
+
+ display_name = _display_email[1];
+ str = _display_email[2];
+
+ // sometimes need to trim the last space to get the display name
+ // because there may be a space between display name and email address
+ // eg. myname <address@gmail.com>
+ // the display name is `myname` instead of `myname `, so need to trim the last space
+ if (display_name.endsWith(' ')) {
+ display_name = display_name.substr(0, display_name.length - 1);
+ }
+
+ if (!validateDisplayName(display_name)) {
+ return false;
+ }
+ } else if (options.require_display_name) {
+ return false;
+ }
+ }
+
+ if (!options.ignore_max_length && str.length > defaultMaxEmailLength) {
+ return false;
+ }
+
+ var parts = str.split('@');
+ var domain = parts.pop();
+ var user = parts.join('@');
+ var lower_domain = domain.toLowerCase();
+
+ if (options.domain_specific_validation && (lower_domain === 'gmail.com' || lower_domain === 'googlemail.com')) {
+ /*
+ Previously we removed dots for gmail addresses before validating.
+ This was removed because it allows `multiple..dots@gmail.com`
+ to be reported as valid, but it is not.
+ Gmail only normalizes single dots, removing them from here is pointless,
+ should be done in normalizeEmail
+ */
+ user = user.toLowerCase(); // Removing sub-address from username before gmail validation
+
+ var username = user.split('+')[0]; // Dots are not included in gmail length restriction
+
+ if (!isByteLength(username.replace('.', ''), {
+ min: 6,
+ max: 30
+ })) {
+ return false;
+ }
+
+ var _user_parts = username.split('.');
+
+ for (var i = 0; i < _user_parts.length; i++) {
+ if (!gmailUserPart.test(_user_parts[i])) {
+ return false;
+ }
+ }
+ }
+
+ if (!isByteLength(user, {
+ max: 64
+ }) || !isByteLength(domain, {
+ max: 254
+ })) {
+ return false;
+ }
+
+ if (!isFQDN(domain, {
+ require_tld: options.require_tld
+ })) {
+ if (!options.allow_ip_domain) {
+ return false;
+ }
+
+ if (!isIP(domain)) {
+ if (!domain.startsWith('[') || !domain.endsWith(']')) {
+ return false;
+ }
+
+ var noBracketdomain = domain.substr(1, domain.length - 2);
+
+ if (noBracketdomain.length === 0 || !isIP(noBracketdomain)) {
+ return false;
+ }
+ }
+ }
+
+ if (user[0] === '"') {
+ user = user.slice(1, user.length - 1);
+ return options.allow_utf8_local_part ? quotedEmailUserUtf8.test(user) : quotedEmailUser.test(user);
+ }
+
+ var pattern = options.allow_utf8_local_part ? emailUserUtf8Part : emailUserPart;
+ var user_parts = user.split('.');
+
+ for (var _i2 = 0; _i2 < user_parts.length; _i2++) {
+ if (!pattern.test(user_parts[_i2])) {
+ return false;
+ }
+ }
+
+ return true;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isEmpty.js b/src/node_modules/validator/es/lib/isEmpty.js
new file mode 100644
index 0000000..79e29f7
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isEmpty.js
@@ -0,0 +1,10 @@
+import assertString from './util/assertString';
+import merge from './util/merge';
+var default_is_empty_options = {
+ ignore_whitespace: false
+};
+export default function isEmpty(str, options) {
+ assertString(str);
+ options = merge(options, default_is_empty_options);
+ return (options.ignore_whitespace ? str.trim().length : str.length) === 0;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isEthereumAddress.js b/src/node_modules/validator/es/lib/isEthereumAddress.js
new file mode 100644
index 0000000..9c70f64
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isEthereumAddress.js
@@ -0,0 +1,6 @@
+import assertString from './util/assertString';
+var eth = /^(0x)[0-9a-f]{40}$/i;
+export default function isEthereumAddress(str) {
+ assertString(str);
+ return eth.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isFQDN.js b/src/node_modules/validator/es/lib/isFQDN.js
new file mode 100644
index 0000000..8a64bf2
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isFQDN.js
@@ -0,0 +1,60 @@
+import assertString from './util/assertString';
+import merge from './util/merge';
+var default_fqdn_options = {
+ require_tld: true,
+ allow_underscores: false,
+ allow_trailing_dot: false
+};
+export default function isFQDN(str, options) {
+ assertString(str);
+ options = merge(options, default_fqdn_options);
+ /* Remove the optional trailing dot before checking validity */
+
+ if (options.allow_trailing_dot && str[str.length - 1] === '.') {
+ str = str.substring(0, str.length - 1);
+ }
+
+ var parts = str.split('.');
+
+ for (var i = 0; i < parts.length; i++) {
+ if (parts[i].length > 63) {
+ return false;
+ }
+ }
+
+ if (options.require_tld) {
+ var tld = parts.pop();
+
+ if (!parts.length || !/^([a-z\u00a1-\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) {
+ return false;
+ } // disallow spaces
+
+
+ if (/[\s\u2002-\u200B\u202F\u205F\u3000\uFEFF\uDB40\uDC20]/.test(tld)) {
+ return false;
+ }
+ }
+
+ for (var part, _i = 0; _i < parts.length; _i++) {
+ part = parts[_i];
+
+ if (options.allow_underscores) {
+ part = part.replace(/_/g, '');
+ }
+
+ if (!/^[a-z\u00a1-\uffff0-9-]+$/i.test(part)) {
+ return false;
+ } // disallow full-width chars
+
+
+ if (/[\uff01-\uff5e]/.test(part)) {
+ return false;
+ }
+
+ if (part[0] === '-' || part[part.length - 1] === '-') {
+ return false;
+ }
+ }
+
+ return true;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isFloat.js b/src/node_modules/validator/es/lib/isFloat.js
new file mode 100644
index 0000000..069873b
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isFloat.js
@@ -0,0 +1,16 @@
+import assertString from './util/assertString';
+import { decimal } from './alpha';
+export default function isFloat(str, options) {
+ assertString(str);
+ options = options || {};
+
+ var _float = new RegExp("^(?:[-+])?(?:[0-9]+)?(?:\\".concat(options.locale ? decimal[options.locale] : '.', "[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$"));
+
+ if (str === '' || str === '.' || str === '-' || str === '+') {
+ return false;
+ }
+
+ var value = parseFloat(str.replace(',', '.'));
+ return _float.test(str) && (!options.hasOwnProperty('min') || value >= options.min) && (!options.hasOwnProperty('max') || value <= options.max) && (!options.hasOwnProperty('lt') || value < options.lt) && (!options.hasOwnProperty('gt') || value > options.gt);
+}
+export var locales = Object.keys(decimal); \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isFullWidth.js b/src/node_modules/validator/es/lib/isFullWidth.js
new file mode 100644
index 0000000..ae54629
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isFullWidth.js
@@ -0,0 +1,6 @@
+import assertString from './util/assertString';
+export var fullWidth = /[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;
+export default function isFullWidth(str) {
+ assertString(str);
+ return fullWidth.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isHSL.js b/src/node_modules/validator/es/lib/isHSL.js
new file mode 100644
index 0000000..ce8b1ae
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isHSL.js
@@ -0,0 +1,7 @@
+import assertString from './util/assertString';
+var hslcomma = /^(hsl)a?\(\s*((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn|\s*)(\s*,\s*(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}\s*(,\s*((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?)\s*)?\)$/i;
+var hslspace = /^(hsl)a?\(\s*((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn|\s)(\s*(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}\s*(\/\s*((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?)\s*)?\)$/i;
+export default function isHSL(str) {
+ assertString(str);
+ return hslcomma.test(str) || hslspace.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isHalfWidth.js b/src/node_modules/validator/es/lib/isHalfWidth.js
new file mode 100644
index 0000000..b0c8795
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isHalfWidth.js
@@ -0,0 +1,6 @@
+import assertString from './util/assertString';
+export var halfWidth = /[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;
+export default function isHalfWidth(str) {
+ assertString(str);
+ return halfWidth.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isHash.js b/src/node_modules/validator/es/lib/isHash.js
new file mode 100644
index 0000000..3495486
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isHash.js
@@ -0,0 +1,21 @@
+import assertString from './util/assertString';
+var lengths = {
+ md5: 32,
+ md4: 32,
+ sha1: 40,
+ sha256: 64,
+ sha384: 96,
+ sha512: 128,
+ ripemd128: 32,
+ ripemd160: 40,
+ tiger128: 32,
+ tiger160: 40,
+ tiger192: 48,
+ crc32: 8,
+ crc32b: 8
+};
+export default function isHash(str, algorithm) {
+ assertString(str);
+ var hash = new RegExp("^[a-fA-F0-9]{".concat(lengths[algorithm], "}$"));
+ return hash.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isHexColor.js b/src/node_modules/validator/es/lib/isHexColor.js
new file mode 100644
index 0000000..72eab2c
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isHexColor.js
@@ -0,0 +1,6 @@
+import assertString from './util/assertString';
+var hexcolor = /^#?([0-9A-F]{3}|[0-9A-F]{4}|[0-9A-F]{6}|[0-9A-F]{8})$/i;
+export default function isHexColor(str) {
+ assertString(str);
+ return hexcolor.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isHexadecimal.js b/src/node_modules/validator/es/lib/isHexadecimal.js
new file mode 100644
index 0000000..6654de4
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isHexadecimal.js
@@ -0,0 +1,6 @@
+import assertString from './util/assertString';
+var hexadecimal = /^(0x|0h)?[0-9A-F]+$/i;
+export default function isHexadecimal(str) {
+ assertString(str);
+ return hexadecimal.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isIBAN.js b/src/node_modules/validator/es/lib/isIBAN.js
new file mode 100644
index 0000000..12f4d6d
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isIBAN.js
@@ -0,0 +1,133 @@
+import assertString from './util/assertString';
+/**
+ * List of country codes with
+ * corresponding IBAN regular expression
+ * Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number
+ */
+
+var ibanRegexThroughCountryCode = {
+ AD: /^(AD[0-9]{2})\d{8}[A-Z0-9]{12}$/,
+ AE: /^(AE[0-9]{2})\d{3}\d{16}$/,
+ AL: /^(AL[0-9]{2})\d{8}[A-Z0-9]{16}$/,
+ AT: /^(AT[0-9]{2})\d{16}$/,
+ AZ: /^(AZ[0-9]{2})[A-Z0-9]{4}\d{20}$/,
+ BA: /^(BA[0-9]{2})\d{16}$/,
+ BE: /^(BE[0-9]{2})\d{12}$/,
+ BG: /^(BG[0-9]{2})[A-Z]{4}\d{6}[A-Z0-9]{8}$/,
+ BH: /^(BH[0-9]{2})[A-Z]{4}[A-Z0-9]{14}$/,
+ BR: /^(BR[0-9]{2})\d{23}[A-Z]{1}[A-Z0-9]{1}$/,
+ BY: /^(BY[0-9]{2})[A-Z0-9]{4}\d{20}$/,
+ CH: /^(CH[0-9]{2})\d{5}[A-Z0-9]{12}$/,
+ CR: /^(CR[0-9]{2})\d{18}$/,
+ CY: /^(CY[0-9]{2})\d{8}[A-Z0-9]{16}$/,
+ CZ: /^(CZ[0-9]{2})\d{20}$/,
+ DE: /^(DE[0-9]{2})\d{18}$/,
+ DK: /^(DK[0-9]{2})\d{14}$/,
+ DO: /^(DO[0-9]{2})[A-Z]{4}\d{20}$/,
+ EE: /^(EE[0-9]{2})\d{16}$/,
+ ES: /^(ES[0-9]{2})\d{20}$/,
+ FI: /^(FI[0-9]{2})\d{14}$/,
+ FO: /^(FO[0-9]{2})\d{14}$/,
+ FR: /^(FR[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,
+ GB: /^(GB[0-9]{2})[A-Z]{4}\d{14}$/,
+ GE: /^(GE[0-9]{2})[A-Z0-9]{2}\d{16}$/,
+ GI: /^(GI[0-9]{2})[A-Z]{4}[A-Z0-9]{15}$/,
+ GL: /^(GL[0-9]{2})\d{14}$/,
+ GR: /^(GR[0-9]{2})\d{7}[A-Z0-9]{16}$/,
+ GT: /^(GT[0-9]{2})[A-Z0-9]{4}[A-Z0-9]{20}$/,
+ HR: /^(HR[0-9]{2})\d{17}$/,
+ HU: /^(HU[0-9]{2})\d{24}$/,
+ IE: /^(IE[0-9]{2})[A-Z0-9]{4}\d{14}$/,
+ IL: /^(IL[0-9]{2})\d{19}$/,
+ IQ: /^(IQ[0-9]{2})[A-Z]{4}\d{15}$/,
+ IS: /^(IS[0-9]{2})\d{22}$/,
+ IT: /^(IT[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,
+ JO: /^(JO[0-9]{2})[A-Z]{4}\d{22}$/,
+ KW: /^(KW[0-9]{2})[A-Z]{4}[A-Z0-9]{22}$/,
+ KZ: /^(KZ[0-9]{2})\d{3}[A-Z0-9]{13}$/,
+ LB: /^(LB[0-9]{2})\d{4}[A-Z0-9]{20}$/,
+ LC: /^(LC[0-9]{2})[A-Z]{4}[A-Z0-9]{24}$/,
+ LI: /^(LI[0-9]{2})\d{5}[A-Z0-9]{12}$/,
+ LT: /^(LT[0-9]{2})\d{16}$/,
+ LU: /^(LU[0-9]{2})\d{3}[A-Z0-9]{13}$/,
+ LV: /^(LV[0-9]{2})[A-Z]{4}[A-Z0-9]{13}$/,
+ MC: /^(MC[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,
+ MD: /^(MD[0-9]{2})[A-Z0-9]{20}$/,
+ ME: /^(ME[0-9]{2})\d{18}$/,
+ MK: /^(MK[0-9]{2})\d{3}[A-Z0-9]{10}\d{2}$/,
+ MR: /^(MR[0-9]{2})\d{23}$/,
+ MT: /^(MT[0-9]{2})[A-Z]{4}\d{5}[A-Z0-9]{18}$/,
+ MU: /^(MU[0-9]{2})[A-Z]{4}\d{19}[A-Z]{3}$/,
+ NL: /^(NL[0-9]{2})[A-Z]{4}\d{10}$/,
+ NO: /^(NO[0-9]{2})\d{11}$/,
+ PK: /^(PK[0-9]{2})[A-Z0-9]{4}\d{16}$/,
+ PL: /^(PL[0-9]{2})\d{24}$/,
+ PS: /^(PS[0-9]{2})[A-Z0-9]{4}\d{21}$/,
+ PT: /^(PT[0-9]{2})\d{21}$/,
+ QA: /^(QA[0-9]{2})[A-Z]{4}[A-Z0-9]{21}$/,
+ RO: /^(RO[0-9]{2})[A-Z]{4}[A-Z0-9]{16}$/,
+ RS: /^(RS[0-9]{2})\d{18}$/,
+ SA: /^(SA[0-9]{2})\d{2}[A-Z0-9]{18}$/,
+ SC: /^(SC[0-9]{2})[A-Z]{4}\d{20}[A-Z]{3}$/,
+ SE: /^(SE[0-9]{2})\d{20}$/,
+ SI: /^(SI[0-9]{2})\d{15}$/,
+ SK: /^(SK[0-9]{2})\d{20}$/,
+ SM: /^(SM[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,
+ TL: /^(TL[0-9]{2})\d{19}$/,
+ TN: /^(TN[0-9]{2})\d{20}$/,
+ TR: /^(TR[0-9]{2})\d{5}[A-Z0-9]{17}$/,
+ UA: /^(UA[0-9]{2})\d{6}[A-Z0-9]{19}$/,
+ VA: /^(VA[0-9]{2})\d{18}$/,
+ VG: /^(VG[0-9]{2})[A-Z0-9]{4}\d{16}$/,
+ XK: /^(XK[0-9]{2})\d{16}$/
+};
+/**
+ * Check whether string has correct universal IBAN format
+ * The IBAN consists of up to 34 alphanumeric characters, as follows:
+ * Country Code using ISO 3166-1 alpha-2, two letters
+ * check digits, two digits and
+ * Basic Bank Account Number (BBAN), up to 30 alphanumeric characters.
+ * NOTE: Permitted IBAN characters are: digits [0-9] and the 26 latin alphabetic [A-Z]
+ *
+ * @param {string} str - string under validation
+ * @return {boolean}
+ */
+
+function hasValidIbanFormat(str) {
+ // Strip white spaces and hyphens
+ var strippedStr = str.replace(/[\s\-]+/gi, '').toUpperCase();
+ var isoCountryCode = strippedStr.slice(0, 2).toUpperCase();
+ return isoCountryCode in ibanRegexThroughCountryCode && ibanRegexThroughCountryCode[isoCountryCode].test(strippedStr);
+}
+/**
+ * Check whether string has valid IBAN Checksum
+ * by performing basic mod-97 operation and
+ * the remainder should equal 1
+ * -- Start by rearranging the IBAN by moving the four initial characters to the end of the string
+ * -- Replace each letter in the string with two digits, A -> 10, B = 11, Z = 35
+ * -- Interpret the string as a decimal integer and
+ * -- compute the remainder on division by 97 (mod 97)
+ * Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number
+ *
+ * @param {string} str
+ * @return {boolean}
+ */
+
+
+function hasValidIbanChecksum(str) {
+ var strippedStr = str.replace(/[^A-Z0-9]+/gi, '').toUpperCase(); // Keep only digits and A-Z latin alphabetic
+
+ var rearranged = strippedStr.slice(4) + strippedStr.slice(0, 4);
+ var alphaCapsReplacedWithDigits = rearranged.replace(/[A-Z]/g, function (_char) {
+ return _char.charCodeAt(0) - 55;
+ });
+ var remainder = alphaCapsReplacedWithDigits.match(/\d{1,7}/g).reduce(function (acc, value) {
+ return Number(acc + value) % 97;
+ }, '');
+ return remainder === 1;
+}
+
+export default function isIBAN(str) {
+ assertString(str);
+ return hasValidIbanFormat(str) && hasValidIbanChecksum(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isIP.js b/src/node_modules/validator/es/lib/isIP.js
new file mode 100644
index 0000000..9280d87
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isIP.js
@@ -0,0 +1,124 @@
+import assertString from './util/assertString';
+/**
+11.3. Examples
+
+ The following addresses
+
+ fe80::1234 (on the 1st link of the node)
+ ff02::5678 (on the 5th link of the node)
+ ff08::9abc (on the 10th organization of the node)
+
+ would be represented as follows:
+
+ fe80::1234%1
+ ff02::5678%5
+ ff08::9abc%10
+
+ (Here we assume a natural translation from a zone index to the
+ <zone_id> part, where the Nth zone of any scope is translated into
+ "N".)
+
+ If we use interface names as <zone_id>, those addresses could also be
+ represented as follows:
+
+ fe80::1234%ne0
+ ff02::5678%pvc1.3
+ ff08::9abc%interface10
+
+ where the interface "ne0" belongs to the 1st link, "pvc1.3" belongs
+ to the 5th link, and "interface10" belongs to the 10th organization.
+ * * */
+
+var ipv4Maybe = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/;
+var ipv6Block = /^[0-9A-F]{1,4}$/i;
+export default function isIP(str) {
+ var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ assertString(str);
+ version = String(version);
+
+ if (!version) {
+ return isIP(str, 4) || isIP(str, 6);
+ } else if (version === '4') {
+ if (!ipv4Maybe.test(str)) {
+ return false;
+ }
+
+ var parts = str.split('.').sort(function (a, b) {
+ return a - b;
+ });
+ return parts[3] <= 255;
+ } else if (version === '6') {
+ var addressAndZone = [str]; // ipv6 addresses could have scoped architecture
+ // according to https://tools.ietf.org/html/rfc4007#section-11
+
+ if (str.includes('%')) {
+ addressAndZone = str.split('%');
+
+ if (addressAndZone.length !== 2) {
+ // it must be just two parts
+ return false;
+ }
+
+ if (!addressAndZone[0].includes(':')) {
+ // the first part must be the address
+ return false;
+ }
+
+ if (addressAndZone[1] === '') {
+ // the second part must not be empty
+ return false;
+ }
+ }
+
+ var blocks = addressAndZone[0].split(':');
+ var foundOmissionBlock = false; // marker to indicate ::
+ // At least some OS accept the last 32 bits of an IPv6 address
+ // (i.e. 2 of the blocks) in IPv4 notation, and RFC 3493 says
+ // that '::ffff:a.b.c.d' is valid for IPv4-mapped IPv6 addresses,
+ // and '::a.b.c.d' is deprecated, but also valid.
+
+ var foundIPv4TransitionBlock = isIP(blocks[blocks.length - 1], 4);
+ var expectedNumberOfBlocks = foundIPv4TransitionBlock ? 7 : 8;
+
+ if (blocks.length > expectedNumberOfBlocks) {
+ return false;
+ } // initial or final ::
+
+
+ if (str === '::') {
+ return true;
+ } else if (str.substr(0, 2) === '::') {
+ blocks.shift();
+ blocks.shift();
+ foundOmissionBlock = true;
+ } else if (str.substr(str.length - 2) === '::') {
+ blocks.pop();
+ blocks.pop();
+ foundOmissionBlock = true;
+ }
+
+ for (var i = 0; i < blocks.length; ++i) {
+ // test for a :: which can not be at the string start/end
+ // since those cases have been handled above
+ if (blocks[i] === '' && i > 0 && i < blocks.length - 1) {
+ if (foundOmissionBlock) {
+ return false; // multiple :: in address
+ }
+
+ foundOmissionBlock = true;
+ } else if (foundIPv4TransitionBlock && i === blocks.length - 1) {// it has been checked before that the last
+ // block is a valid IPv4 address
+ } else if (!ipv6Block.test(blocks[i])) {
+ return false;
+ }
+ }
+
+ if (foundOmissionBlock) {
+ return blocks.length >= 1;
+ }
+
+ return blocks.length === expectedNumberOfBlocks;
+ }
+
+ return false;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isIPRange.js b/src/node_modules/validator/es/lib/isIPRange.js
new file mode 100644
index 0000000..feb6c55
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isIPRange.js
@@ -0,0 +1,22 @@
+import assertString from './util/assertString';
+import isIP from './isIP';
+var subnetMaybe = /^\d{1,2}$/;
+export default function isIPRange(str) {
+ assertString(str);
+ var parts = str.split('/'); // parts[0] -> ip, parts[1] -> subnet
+
+ if (parts.length !== 2) {
+ return false;
+ }
+
+ if (!subnetMaybe.test(parts[1])) {
+ return false;
+ } // Disallow preceding 0 i.e. 01, 02, ...
+
+
+ if (parts[1].length > 1 && parts[1].startsWith('0')) {
+ return false;
+ }
+
+ return isIP(parts[0], 4) && parts[1] <= 32 && parts[1] >= 0;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isISBN.js b/src/node_modules/validator/es/lib/isISBN.js
new file mode 100644
index 0000000..da2c435
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isISBN.js
@@ -0,0 +1,51 @@
+import assertString from './util/assertString';
+var isbn10Maybe = /^(?:[0-9]{9}X|[0-9]{10})$/;
+var isbn13Maybe = /^(?:[0-9]{13})$/;
+var factor = [1, 3];
+export default function isISBN(str) {
+ var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ assertString(str);
+ version = String(version);
+
+ if (!version) {
+ return isISBN(str, 10) || isISBN(str, 13);
+ }
+
+ var sanitized = str.replace(/[\s-]+/g, '');
+ var checksum = 0;
+ var i;
+
+ if (version === '10') {
+ if (!isbn10Maybe.test(sanitized)) {
+ return false;
+ }
+
+ for (i = 0; i < 9; i++) {
+ checksum += (i + 1) * sanitized.charAt(i);
+ }
+
+ if (sanitized.charAt(9) === 'X') {
+ checksum += 10 * 10;
+ } else {
+ checksum += 10 * sanitized.charAt(9);
+ }
+
+ if (checksum % 11 === 0) {
+ return !!sanitized;
+ }
+ } else if (version === '13') {
+ if (!isbn13Maybe.test(sanitized)) {
+ return false;
+ }
+
+ for (i = 0; i < 12; i++) {
+ checksum += factor[i % 2] * sanitized.charAt(i);
+ }
+
+ if (sanitized.charAt(12) - (10 - checksum % 10) % 10 === 0) {
+ return !!sanitized;
+ }
+ }
+
+ return false;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isISIN.js b/src/node_modules/validator/es/lib/isISIN.js
new file mode 100644
index 0000000..c93c580
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isISIN.js
@@ -0,0 +1,38 @@
+import assertString from './util/assertString';
+var isin = /^[A-Z]{2}[0-9A-Z]{9}[0-9]$/;
+export default function isISIN(str) {
+ assertString(str);
+
+ if (!isin.test(str)) {
+ return false;
+ }
+
+ var checksumStr = str.replace(/[A-Z]/g, function (character) {
+ return parseInt(character, 36);
+ });
+ var sum = 0;
+ var digit;
+ var tmpNum;
+ var shouldDouble = true;
+
+ for (var i = checksumStr.length - 2; i >= 0; i--) {
+ digit = checksumStr.substring(i, i + 1);
+ tmpNum = parseInt(digit, 10);
+
+ if (shouldDouble) {
+ tmpNum *= 2;
+
+ if (tmpNum >= 10) {
+ sum += tmpNum + 1;
+ } else {
+ sum += tmpNum;
+ }
+ } else {
+ sum += tmpNum;
+ }
+
+ shouldDouble = !shouldDouble;
+ }
+
+ return parseInt(str.substr(str.length - 1), 10) === (10000 - sum) % 10;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isISO31661Alpha2.js b/src/node_modules/validator/es/lib/isISO31661Alpha2.js
new file mode 100644
index 0000000..219a511
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isISO31661Alpha2.js
@@ -0,0 +1,8 @@
+import assertString from './util/assertString';
+import includes from './util/includes'; // from https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
+
+var validISO31661Alpha2CountriesCodes = ['AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM', 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW', 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW'];
+export default function isISO31661Alpha2(str) {
+ assertString(str);
+ return includes(validISO31661Alpha2CountriesCodes, str.toUpperCase());
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isISO31661Alpha3.js b/src/node_modules/validator/es/lib/isISO31661Alpha3.js
new file mode 100644
index 0000000..f51ab59
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isISO31661Alpha3.js
@@ -0,0 +1,8 @@
+import assertString from './util/assertString';
+import includes from './util/includes'; // from https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3
+
+var validISO31661Alpha3CountriesCodes = ['AFG', 'ALA', 'ALB', 'DZA', 'ASM', 'AND', 'AGO', 'AIA', 'ATA', 'ATG', 'ARG', 'ARM', 'ABW', 'AUS', 'AUT', 'AZE', 'BHS', 'BHR', 'BGD', 'BRB', 'BLR', 'BEL', 'BLZ', 'BEN', 'BMU', 'BTN', 'BOL', 'BES', 'BIH', 'BWA', 'BVT', 'BRA', 'IOT', 'BRN', 'BGR', 'BFA', 'BDI', 'KHM', 'CMR', 'CAN', 'CPV', 'CYM', 'CAF', 'TCD', 'CHL', 'CHN', 'CXR', 'CCK', 'COL', 'COM', 'COG', 'COD', 'COK', 'CRI', 'CIV', 'HRV', 'CUB', 'CUW', 'CYP', 'CZE', 'DNK', 'DJI', 'DMA', 'DOM', 'ECU', 'EGY', 'SLV', 'GNQ', 'ERI', 'EST', 'ETH', 'FLK', 'FRO', 'FJI', 'FIN', 'FRA', 'GUF', 'PYF', 'ATF', 'GAB', 'GMB', 'GEO', 'DEU', 'GHA', 'GIB', 'GRC', 'GRL', 'GRD', 'GLP', 'GUM', 'GTM', 'GGY', 'GIN', 'GNB', 'GUY', 'HTI', 'HMD', 'VAT', 'HND', 'HKG', 'HUN', 'ISL', 'IND', 'IDN', 'IRN', 'IRQ', 'IRL', 'IMN', 'ISR', 'ITA', 'JAM', 'JPN', 'JEY', 'JOR', 'KAZ', 'KEN', 'KIR', 'PRK', 'KOR', 'KWT', 'KGZ', 'LAO', 'LVA', 'LBN', 'LSO', 'LBR', 'LBY', 'LIE', 'LTU', 'LUX', 'MAC', 'MKD', 'MDG', 'MWI', 'MYS', 'MDV', 'MLI', 'MLT', 'MHL', 'MTQ', 'MRT', 'MUS', 'MYT', 'MEX', 'FSM', 'MDA', 'MCO', 'MNG', 'MNE', 'MSR', 'MAR', 'MOZ', 'MMR', 'NAM', 'NRU', 'NPL', 'NLD', 'NCL', 'NZL', 'NIC', 'NER', 'NGA', 'NIU', 'NFK', 'MNP', 'NOR', 'OMN', 'PAK', 'PLW', 'PSE', 'PAN', 'PNG', 'PRY', 'PER', 'PHL', 'PCN', 'POL', 'PRT', 'PRI', 'QAT', 'REU', 'ROU', 'RUS', 'RWA', 'BLM', 'SHN', 'KNA', 'LCA', 'MAF', 'SPM', 'VCT', 'WSM', 'SMR', 'STP', 'SAU', 'SEN', 'SRB', 'SYC', 'SLE', 'SGP', 'SXM', 'SVK', 'SVN', 'SLB', 'SOM', 'ZAF', 'SGS', 'SSD', 'ESP', 'LKA', 'SDN', 'SUR', 'SJM', 'SWZ', 'SWE', 'CHE', 'SYR', 'TWN', 'TJK', 'TZA', 'THA', 'TLS', 'TGO', 'TKL', 'TON', 'TTO', 'TUN', 'TUR', 'TKM', 'TCA', 'TUV', 'UGA', 'UKR', 'ARE', 'GBR', 'USA', 'UMI', 'URY', 'UZB', 'VUT', 'VEN', 'VNM', 'VGB', 'VIR', 'WLF', 'ESH', 'YEM', 'ZMB', 'ZWE'];
+export default function isISO31661Alpha3(str) {
+ assertString(str);
+ return includes(validISO31661Alpha3CountriesCodes, str.toUpperCase());
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isISO8601.js b/src/node_modules/validator/es/lib/isISO8601.js
new file mode 100644
index 0000000..42af39d
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isISO8601.js
@@ -0,0 +1,45 @@
+import assertString from './util/assertString';
+/* eslint-disable max-len */
+// from http://goo.gl/0ejHHW
+
+var iso8601 = /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;
+/* eslint-enable max-len */
+
+var isValidDate = function isValidDate(str) {
+ // str must have passed the ISO8601 check
+ // this check is meant to catch invalid dates
+ // like 2009-02-31
+ // first check for ordinal dates
+ var ordinalMatch = str.match(/^(\d{4})-?(\d{3})([ T]{1}\.*|$)/);
+
+ if (ordinalMatch) {
+ var oYear = Number(ordinalMatch[1]);
+ var oDay = Number(ordinalMatch[2]); // if is leap year
+
+ if (oYear % 4 === 0 && oYear % 100 !== 0 || oYear % 400 === 0) return oDay <= 366;
+ return oDay <= 365;
+ }
+
+ var match = str.match(/(\d{4})-?(\d{0,2})-?(\d*)/).map(Number);
+ var year = match[1];
+ var month = match[2];
+ var day = match[3];
+ var monthString = month ? "0".concat(month).slice(-2) : month;
+ var dayString = day ? "0".concat(day).slice(-2) : day; // create a date object and compare
+
+ var d = new Date("".concat(year, "-").concat(monthString || '01', "-").concat(dayString || '01'));
+
+ if (month && day) {
+ return d.getUTCFullYear() === year && d.getUTCMonth() + 1 === month && d.getUTCDate() === day;
+ }
+
+ return true;
+};
+
+export default function isISO8601(str, options) {
+ assertString(str);
+ var check = iso8601.test(str);
+ if (!options) return check;
+ if (check && options.strict) return isValidDate(str);
+ return check;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isISRC.js b/src/node_modules/validator/es/lib/isISRC.js
new file mode 100644
index 0000000..275c10a
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isISRC.js
@@ -0,0 +1,7 @@
+import assertString from './util/assertString'; // see http://isrc.ifpi.org/en/isrc-standard/code-syntax
+
+var isrc = /^[A-Z]{2}[0-9A-Z]{3}\d{2}\d{5}$/;
+export default function isISRC(str) {
+ assertString(str);
+ return isrc.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isISSN.js b/src/node_modules/validator/es/lib/isISSN.js
new file mode 100644
index 0000000..bebfa9e
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isISSN.js
@@ -0,0 +1,23 @@
+import assertString from './util/assertString';
+var issn = '^\\d{4}-?\\d{3}[\\dX]$';
+export default function isISSN(str) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ assertString(str);
+ var testIssn = issn;
+ testIssn = options.require_hyphen ? testIssn.replace('?', '') : testIssn;
+ testIssn = options.case_sensitive ? new RegExp(testIssn) : new RegExp(testIssn, 'i');
+
+ if (!testIssn.test(str)) {
+ return false;
+ }
+
+ var digits = str.replace('-', '').toUpperCase();
+ var checksum = 0;
+
+ for (var i = 0; i < digits.length; i++) {
+ var digit = digits[i];
+ checksum += (digit === 'X' ? 10 : +digit) * (8 - i);
+ }
+
+ return checksum % 11 === 0;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isIdentityCard.js b/src/node_modules/validator/es/lib/isIdentityCard.js
new file mode 100644
index 0000000..44a416b
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isIdentityCard.js
@@ -0,0 +1,113 @@
+import assertString from './util/assertString';
+var validators = {
+ ES: function ES(str) {
+ assertString(str);
+ var DNI = /^[0-9X-Z][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/;
+ var charsValue = {
+ X: 0,
+ Y: 1,
+ Z: 2
+ };
+ var controlDigits = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E']; // sanitize user input
+
+ var sanitized = str.trim().toUpperCase(); // validate the data structure
+
+ if (!DNI.test(sanitized)) {
+ return false;
+ } // validate the control digit
+
+
+ var number = sanitized.slice(0, -1).replace(/[X,Y,Z]/g, function (_char) {
+ return charsValue[_char];
+ });
+ return sanitized.endsWith(controlDigits[number % 23]);
+ },
+ 'he-IL': function heIL(str) {
+ var DNI = /^\d{9}$/; // sanitize user input
+
+ var sanitized = str.trim(); // validate the data structure
+
+ if (!DNI.test(sanitized)) {
+ return false;
+ }
+
+ var id = sanitized;
+ var sum = 0,
+ incNum;
+
+ for (var i = 0; i < id.length; i++) {
+ incNum = Number(id[i]) * (i % 2 + 1); // Multiply number by 1 or 2
+
+ sum += incNum > 9 ? incNum - 9 : incNum; // Sum the digits up and add to total
+ }
+
+ return sum % 10 === 0;
+ },
+ 'zh-TW': function zhTW(str) {
+ var ALPHABET_CODES = {
+ A: 10,
+ B: 11,
+ C: 12,
+ D: 13,
+ E: 14,
+ F: 15,
+ G: 16,
+ H: 17,
+ I: 34,
+ J: 18,
+ K: 19,
+ L: 20,
+ M: 21,
+ N: 22,
+ O: 35,
+ P: 23,
+ Q: 24,
+ R: 25,
+ S: 26,
+ T: 27,
+ U: 28,
+ V: 29,
+ W: 32,
+ X: 30,
+ Y: 31,
+ Z: 33
+ };
+ var sanitized = str.trim().toUpperCase();
+ if (!/^[A-Z][0-9]{9}$/.test(sanitized)) return false;
+ return Array.from(sanitized).reduce(function (sum, number, index) {
+ if (index === 0) {
+ var code = ALPHABET_CODES[number];
+ return code % 10 * 9 + Math.floor(code / 10);
+ }
+
+ if (index === 9) {
+ return (10 - sum % 10 - Number(number)) % 10 === 0;
+ }
+
+ return sum + Number(number) * (9 - index);
+ }, 0);
+ }
+};
+export default function isIdentityCard(str, locale) {
+ assertString(str);
+
+ if (locale in validators) {
+ return validators[locale](str);
+ } else if (locale === 'any') {
+ for (var key in validators) {
+ // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
+ // istanbul ignore else
+ if (validators.hasOwnProperty(key)) {
+ var validator = validators[key];
+
+ if (validator(str)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ throw new Error("Invalid locale '".concat(locale, "'"));
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isIn.js b/src/node_modules/validator/es/lib/isIn.js
new file mode 100644
index 0000000..452429d
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isIn.js
@@ -0,0 +1,28 @@
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+import assertString from './util/assertString';
+import toString from './util/toString';
+export default function isIn(str, options) {
+ assertString(str);
+ var i;
+
+ if (Object.prototype.toString.call(options) === '[object Array]') {
+ var array = [];
+
+ for (i in options) {
+ // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
+ // istanbul ignore else
+ if ({}.hasOwnProperty.call(options, i)) {
+ array[i] = toString(options[i]);
+ }
+ }
+
+ return array.indexOf(str) >= 0;
+ } else if (_typeof(options) === 'object') {
+ return options.hasOwnProperty(str);
+ } else if (options && typeof options.indexOf === 'function') {
+ return options.indexOf(str) >= 0;
+ }
+
+ return false;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isInt.js b/src/node_modules/validator/es/lib/isInt.js
new file mode 100644
index 0000000..b58dab4
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isInt.js
@@ -0,0 +1,16 @@
+import assertString from './util/assertString';
+var _int = /^(?:[-+]?(?:0|[1-9][0-9]*))$/;
+var intLeadingZeroes = /^[-+]?[0-9]+$/;
+export default function isInt(str, options) {
+ assertString(str);
+ options = options || {}; // Get the regex to use for testing, based on whether
+ // leading zeroes are allowed or not.
+
+ var regex = options.hasOwnProperty('allow_leading_zeroes') && !options.allow_leading_zeroes ? _int : intLeadingZeroes; // Check min/max/lt/gt
+
+ var minCheckPassed = !options.hasOwnProperty('min') || str >= options.min;
+ var maxCheckPassed = !options.hasOwnProperty('max') || str <= options.max;
+ var ltCheckPassed = !options.hasOwnProperty('lt') || str < options.lt;
+ var gtCheckPassed = !options.hasOwnProperty('gt') || str > options.gt;
+ return regex.test(str) && minCheckPassed && maxCheckPassed && ltCheckPassed && gtCheckPassed;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isJSON.js b/src/node_modules/validator/es/lib/isJSON.js
new file mode 100644
index 0000000..1735888
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isJSON.js
@@ -0,0 +1,15 @@
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+import assertString from './util/assertString';
+export default function isJSON(str) {
+ assertString(str);
+
+ try {
+ var obj = JSON.parse(str);
+ return !!obj && _typeof(obj) === 'object';
+ } catch (e) {
+ /* ignore */
+ }
+
+ return false;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isJWT.js b/src/node_modules/validator/es/lib/isJWT.js
new file mode 100644
index 0000000..41a6ece
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isJWT.js
@@ -0,0 +1,6 @@
+import assertString from './util/assertString';
+var jwt = /^([A-Za-z0-9\-_~+\/]+[=]{0,2})\.([A-Za-z0-9\-_~+\/]+[=]{0,2})(?:\.([A-Za-z0-9\-_~+\/]+[=]{0,2}))?$/;
+export default function isJWT(str) {
+ assertString(str);
+ return jwt.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isLatLong.js b/src/node_modules/validator/es/lib/isLatLong.js
new file mode 100644
index 0000000..e081755
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isLatLong.js
@@ -0,0 +1,10 @@
+import assertString from './util/assertString';
+var lat = /^\(?[+-]?(90(\.0+)?|[1-8]?\d(\.\d+)?)$/;
+var _long = /^\s?[+-]?(180(\.0+)?|1[0-7]\d(\.\d+)?|\d{1,2}(\.\d+)?)\)?$/;
+export default function (str) {
+ assertString(str);
+ if (!str.includes(',')) return false;
+ var pair = str.split(',');
+ if (pair[0].startsWith('(') && !pair[1].endsWith(')') || pair[1].endsWith(')') && !pair[0].startsWith('(')) return false;
+ return lat.test(pair[0]) && _long.test(pair[1]);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isLength.js b/src/node_modules/validator/es/lib/isLength.js
new file mode 100644
index 0000000..3b1a5fd
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isLength.js
@@ -0,0 +1,23 @@
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+import assertString from './util/assertString';
+/* eslint-disable prefer-rest-params */
+
+export default function isLength(str, options) {
+ assertString(str);
+ var min;
+ var max;
+
+ if (_typeof(options) === 'object') {
+ min = options.min || 0;
+ max = options.max;
+ } else {
+ // backwards compatibility: isLength(str, min [, max])
+ min = arguments[1] || 0;
+ max = arguments[2];
+ }
+
+ var surrogatePairs = str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g) || [];
+ var len = str.length - surrogatePairs.length;
+ return len >= min && (typeof max === 'undefined' || len <= max);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isLocale.js b/src/node_modules/validator/es/lib/isLocale.js
new file mode 100644
index 0000000..a7d6d2e
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isLocale.js
@@ -0,0 +1,11 @@
+import assertString from './util/assertString';
+var localeReg = /^[A-z]{2,4}([_-]([A-z]{4}|[\d]{3}))?([_-]([A-z]{2}|[\d]{3}))?$/;
+export default function isLocale(str) {
+ assertString(str);
+
+ if (str === 'en_US_POSIX' || str === 'ca_ES_VALENCIA') {
+ return true;
+ }
+
+ return localeReg.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isLowercase.js b/src/node_modules/validator/es/lib/isLowercase.js
new file mode 100644
index 0000000..0347856
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isLowercase.js
@@ -0,0 +1,5 @@
+import assertString from './util/assertString';
+export default function isLowercase(str) {
+ assertString(str);
+ return str === str.toLowerCase();
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isMACAddress.js b/src/node_modules/validator/es/lib/isMACAddress.js
new file mode 100644
index 0000000..9447d7d
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isMACAddress.js
@@ -0,0 +1,15 @@
+import assertString from './util/assertString';
+var macAddress = /^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$/;
+var macAddressNoColons = /^([0-9a-fA-F]){12}$/;
+var macAddressWithHyphen = /^([0-9a-fA-F][0-9a-fA-F]-){5}([0-9a-fA-F][0-9a-fA-F])$/;
+var macAddressWithSpaces = /^([0-9a-fA-F][0-9a-fA-F]\s){5}([0-9a-fA-F][0-9a-fA-F])$/;
+var macAddressWithDots = /^([0-9a-fA-F]{4}).([0-9a-fA-F]{4}).([0-9a-fA-F]{4})$/;
+export default function isMACAddress(str, options) {
+ assertString(str);
+
+ if (options && options.no_colons) {
+ return macAddressNoColons.test(str);
+ }
+
+ return macAddress.test(str) || macAddressWithHyphen.test(str) || macAddressWithSpaces.test(str) || macAddressWithDots.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isMD5.js b/src/node_modules/validator/es/lib/isMD5.js
new file mode 100644
index 0000000..701ed7b
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isMD5.js
@@ -0,0 +1,6 @@
+import assertString from './util/assertString';
+var md5 = /^[a-f0-9]{32}$/;
+export default function isMD5(str) {
+ assertString(str);
+ return md5.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isMagnetURI.js b/src/node_modules/validator/es/lib/isMagnetURI.js
new file mode 100644
index 0000000..e341665
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isMagnetURI.js
@@ -0,0 +1,6 @@
+import assertString from './util/assertString';
+var magnetURI = /^magnet:\?xt=urn:[a-z0-9]+:[a-z0-9]{32,40}&dn=.+&tr=.+$/i;
+export default function isMagnetURI(url) {
+ assertString(url);
+ return magnetURI.test(url.trim());
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isMimeType.js b/src/node_modules/validator/es/lib/isMimeType.js
new file mode 100644
index 0000000..cddaf00
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isMimeType.js
@@ -0,0 +1,39 @@
+import assertString from './util/assertString';
+/*
+ Checks if the provided string matches to a correct Media type format (MIME type)
+
+ This function only checks is the string format follows the
+ etablished rules by the according RFC specifications.
+ This function supports 'charset' in textual media types
+ (https://tools.ietf.org/html/rfc6657).
+
+ This function does not check against all the media types listed
+ by the IANA (https://www.iana.org/assignments/media-types/media-types.xhtml)
+ because of lightness purposes : it would require to include
+ all these MIME types in this librairy, which would weigh it
+ significantly. This kind of effort maybe is not worth for the use that
+ this function has in this entire librairy.
+
+ More informations in the RFC specifications :
+ - https://tools.ietf.org/html/rfc2045
+ - https://tools.ietf.org/html/rfc2046
+ - https://tools.ietf.org/html/rfc7231#section-3.1.1.1
+ - https://tools.ietf.org/html/rfc7231#section-3.1.1.5
+*/
+// Match simple MIME types
+// NB :
+// Subtype length must not exceed 100 characters.
+// This rule does not comply to the RFC specs (what is the max length ?).
+
+var mimeTypeSimple = /^(application|audio|font|image|message|model|multipart|text|video)\/[a-zA-Z0-9\.\-\+]{1,100}$/i; // eslint-disable-line max-len
+// Handle "charset" in "text/*"
+
+var mimeTypeText = /^text\/[a-zA-Z0-9\.\-\+]{1,100};\s?charset=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?$/i; // eslint-disable-line max-len
+// Handle "boundary" in "multipart/*"
+
+var mimeTypeMultipart = /^multipart\/[a-zA-Z0-9\.\-\+]{1,100}(;\s?(boundary|charset)=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?){0,2}$/i; // eslint-disable-line max-len
+
+export default function isMimeType(str) {
+ assertString(str);
+ return mimeTypeSimple.test(str) || mimeTypeText.test(str) || mimeTypeMultipart.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isMobilePhone.js b/src/node_modules/validator/es/lib/isMobilePhone.js
new file mode 100644
index 0000000..3e80a10
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isMobilePhone.js
@@ -0,0 +1,140 @@
+import assertString from './util/assertString';
+/* eslint-disable max-len */
+
+var phones = {
+ 'am-AM': /^(\+?374|0)((10|[9|7][0-9])\d{6}$|[2-4]\d{7}$)/,
+ 'ar-AE': /^((\+?971)|0)?5[024568]\d{7}$/,
+ 'ar-BH': /^(\+?973)?(3|6)\d{7}$/,
+ 'ar-DZ': /^(\+?213|0)(5|6|7)\d{8}$/,
+ 'ar-EG': /^((\+?20)|0)?1[0125]\d{8}$/,
+ 'ar-IQ': /^(\+?964|0)?7[0-9]\d{8}$/,
+ 'ar-JO': /^(\+?962|0)?7[789]\d{7}$/,
+ 'ar-KW': /^(\+?965)[569]\d{7}$/,
+ 'ar-SA': /^(!?(\+?966)|0)?5\d{8}$/,
+ 'ar-SY': /^(!?(\+?963)|0)?9\d{8}$/,
+ 'ar-TN': /^(\+?216)?[2459]\d{7}$/,
+ 'be-BY': /^(\+?375)?(24|25|29|33|44)\d{7}$/,
+ 'bg-BG': /^(\+?359|0)?8[789]\d{7}$/,
+ 'bn-BD': /^(\+?880|0)1[13456789][0-9]{8}$/,
+ 'cs-CZ': /^(\+?420)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,
+ 'da-DK': /^(\+?45)?\s?\d{2}\s?\d{2}\s?\d{2}\s?\d{2}$/,
+ 'de-DE': /^(\+49)?0?1(5[0-25-9]\d|6([23]|0\d?)|7([0-57-9]|6\d))\d{7}$/,
+ 'de-AT': /^(\+43|0)\d{1,4}\d{3,12}$/,
+ 'el-GR': /^(\+?30|0)?(69\d{8})$/,
+ 'en-AU': /^(\+?61|0)4\d{8}$/,
+ 'en-GB': /^(\+?44|0)7\d{9}$/,
+ 'en-GG': /^(\+?44|0)1481\d{6}$/,
+ 'en-GH': /^(\+233|0)(20|50|24|54|27|57|26|56|23|28)\d{7}$/,
+ 'en-HK': /^(\+?852[-\s]?)?[456789]\d{3}[-\s]?\d{4}$/,
+ 'en-MO': /^(\+?853[-\s]?)?[6]\d{3}[-\s]?\d{4}$/,
+ 'en-IE': /^(\+?353|0)8[356789]\d{7}$/,
+ 'en-IN': /^(\+?91|0)?[6789]\d{9}$/,
+ 'en-KE': /^(\+?254|0)(7|1)\d{8}$/,
+ 'en-MT': /^(\+?356|0)?(99|79|77|21|27|22|25)[0-9]{6}$/,
+ 'en-MU': /^(\+?230|0)?\d{8}$/,
+ 'en-NG': /^(\+?234|0)?[789]\d{9}$/,
+ 'en-NZ': /^(\+?64|0)[28]\d{7,9}$/,
+ 'en-PK': /^((\+92)|(0092))-{0,1}\d{3}-{0,1}\d{7}$|^\d{11}$|^\d{4}-\d{7}$/,
+ 'en-RW': /^(\+?250|0)?[7]\d{8}$/,
+ 'en-SG': /^(\+65)?[89]\d{7}$/,
+ 'en-TZ': /^(\+?255|0)?[67]\d{8}$/,
+ 'en-UG': /^(\+?256|0)?[7]\d{8}$/,
+ 'en-US': /^((\+1|1)?( |-)?)?(\([2-9][0-9]{2}\)|[2-9][0-9]{2})( |-)?([2-9][0-9]{2}( |-)?[0-9]{4})$/,
+ 'en-ZA': /^(\+?27|0)\d{9}$/,
+ 'en-ZM': /^(\+?26)?09[567]\d{7}$/,
+ 'es-CL': /^(\+?56|0)[2-9]\d{1}\d{7}$/,
+ 'es-EC': /^(\+?593|0)([2-7]|9[2-9])\d{7}$/,
+ 'es-ES': /^(\+?34)?(6\d{1}|7[1234])\d{7}$/,
+ 'es-MX': /^(\+?52)?(1|01)?\d{10,11}$/,
+ 'es-PA': /^(\+?507)\d{7,8}$/,
+ 'es-PY': /^(\+?595|0)9[9876]\d{7}$/,
+ 'es-UY': /^(\+598|0)9[1-9][\d]{6}$/,
+ 'et-EE': /^(\+?372)?\s?(5|8[1-4])\s?([0-9]\s?){6,7}$/,
+ 'fa-IR': /^(\+?98[\-\s]?|0)9[0-39]\d[\-\s]?\d{3}[\-\s]?\d{4}$/,
+ 'fi-FI': /^(\+?358|0)\s?(4(0|1|2|4|5|6)?|50)\s?(\d\s?){4,8}\d$/,
+ 'fj-FJ': /^(\+?679)?\s?\d{3}\s?\d{4}$/,
+ 'fo-FO': /^(\+?298)?\s?\d{2}\s?\d{2}\s?\d{2}$/,
+ 'fr-FR': /^(\+?33|0)[67]\d{8}$/,
+ 'fr-GF': /^(\+?594|0|00594)[67]\d{8}$/,
+ 'fr-GP': /^(\+?590|0|00590)[67]\d{8}$/,
+ 'fr-MQ': /^(\+?596|0|00596)[67]\d{8}$/,
+ 'fr-RE': /^(\+?262|0|00262)[67]\d{8}$/,
+ 'he-IL': /^(\+972|0)([23489]|5[012345689]|77)[1-9]\d{6}$/,
+ 'hu-HU': /^(\+?36)(20|30|70)\d{7}$/,
+ 'id-ID': /^(\+?62|0)8(1[123456789]|2[1238]|3[1238]|5[12356789]|7[78]|9[56789]|8[123456789])([\s?|\d]{5,11})$/,
+ 'it-IT': /^(\+?39)?\s?3\d{2} ?\d{6,7}$/,
+ 'ja-JP': /^(\+81[ \-]?(\(0\))?|0)[6789]0[ \-]?\d{4}[ \-]?\d{4}$/,
+ 'kk-KZ': /^(\+?7|8)?7\d{9}$/,
+ 'kl-GL': /^(\+?299)?\s?\d{2}\s?\d{2}\s?\d{2}$/,
+ 'ko-KR': /^((\+?82)[ \-]?)?0?1([0|1|6|7|8|9]{1})[ \-]?\d{3,4}[ \-]?\d{4}$/,
+ 'lt-LT': /^(\+370|8)\d{8}$/,
+ 'ms-MY': /^(\+?6?01){1}(([0145]{1}(\-|\s)?\d{7,8})|([236789]{1}(\s|\-)?\d{7}))$/,
+ 'nb-NO': /^(\+?47)?[49]\d{7}$/,
+ 'ne-NP': /^(\+?977)?9[78]\d{8}$/,
+ 'nl-BE': /^(\+?32|0)4?\d{8}$/,
+ 'nl-NL': /^(\+?31|0)6?\d{8}$/,
+ 'nn-NO': /^(\+?47)?[49]\d{7}$/,
+ 'pl-PL': /^(\+?48)? ?[5-8]\d ?\d{3} ?\d{2} ?\d{2}$/,
+ 'pt-BR': /(?=^(\+?5{2}\-?|0)[1-9]{2}\-?\d{4}\-?\d{4}$)(^(\+?5{2}\-?|0)[1-9]{2}\-?[6-9]{1}\d{3}\-?\d{4}$)|(^(\+?5{2}\-?|0)[1-9]{2}\-?9[6-9]{1}\d{3}\-?\d{4}$)/,
+ 'pt-PT': /^(\+?351)?9[1236]\d{7}$/,
+ 'ro-RO': /^(\+?4?0)\s?7\d{2}(\/|\s|\.|\-)?\d{3}(\s|\.|\-)?\d{3}$/,
+ 'ru-RU': /^(\+?7|8)?9\d{9}$/,
+ 'sl-SI': /^(\+386\s?|0)(\d{1}\s?\d{3}\s?\d{2}\s?\d{2}|\d{2}\s?\d{3}\s?\d{3})$/,
+ 'sk-SK': /^(\+?421)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,
+ 'sr-RS': /^(\+3816|06)[- \d]{5,9}$/,
+ 'sv-SE': /^(\+?46|0)[\s\-]?7[\s\-]?[02369]([\s\-]?\d){7}$/,
+ 'th-TH': /^(\+66|66|0)\d{9}$/,
+ 'tr-TR': /^(\+?90|0)?5\d{9}$/,
+ 'uk-UA': /^(\+?38|8)?0\d{9}$/,
+ 'vi-VN': /^(\+?84|0)((3([2-9]))|(5([2689]))|(7([0|6-9]))|(8([1-6|89]))|(9([0-9])))([0-9]{7})$/,
+ 'zh-CN': /^((\+|00)86)?1([358][0-9]|4[579]|6[67]|7[01235678]|9[189])[0-9]{8}$/,
+ 'zh-TW': /^(\+?886\-?|0)?9\d{8}$/
+};
+/* eslint-enable max-len */
+// aliases
+
+phones['en-CA'] = phones['en-US'];
+phones['fr-BE'] = phones['nl-BE'];
+phones['zh-HK'] = phones['en-HK'];
+phones['zh-MO'] = phones['en-MO'];
+export default function isMobilePhone(str, locale, options) {
+ assertString(str);
+
+ if (options && options.strictMode && !str.startsWith('+')) {
+ return false;
+ }
+
+ if (Array.isArray(locale)) {
+ return locale.some(function (key) {
+ // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
+ // istanbul ignore else
+ if (phones.hasOwnProperty(key)) {
+ var phone = phones[key];
+
+ if (phone.test(str)) {
+ return true;
+ }
+ }
+
+ return false;
+ });
+ } else if (locale in phones) {
+ return phones[locale].test(str); // alias falsey locale as 'any'
+ } else if (!locale || locale === 'any') {
+ for (var key in phones) {
+ // istanbul ignore else
+ if (phones.hasOwnProperty(key)) {
+ var phone = phones[key];
+
+ if (phone.test(str)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ throw new Error("Invalid locale '".concat(locale, "'"));
+}
+export var locales = Object.keys(phones); \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isMongoId.js b/src/node_modules/validator/es/lib/isMongoId.js
new file mode 100644
index 0000000..fc87b89
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isMongoId.js
@@ -0,0 +1,6 @@
+import assertString from './util/assertString';
+import isHexadecimal from './isHexadecimal';
+export default function isMongoId(str) {
+ assertString(str);
+ return isHexadecimal(str) && str.length === 24;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isMultibyte.js b/src/node_modules/validator/es/lib/isMultibyte.js
new file mode 100644
index 0000000..7a13857
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isMultibyte.js
@@ -0,0 +1,10 @@
+import assertString from './util/assertString';
+/* eslint-disable no-control-regex */
+
+var multibyte = /[^\x00-\x7F]/;
+/* eslint-enable no-control-regex */
+
+export default function isMultibyte(str) {
+ assertString(str);
+ return multibyte.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isNumeric.js b/src/node_modules/validator/es/lib/isNumeric.js
new file mode 100644
index 0000000..b87bfad
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isNumeric.js
@@ -0,0 +1,12 @@
+import assertString from './util/assertString';
+var numeric = /^[+-]?([0-9]*[.])?[0-9]+$/;
+var numericNoSymbols = /^[0-9]+$/;
+export default function isNumeric(str, options) {
+ assertString(str);
+
+ if (options && options.no_symbols) {
+ return numericNoSymbols.test(str);
+ }
+
+ return numeric.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isOctal.js b/src/node_modules/validator/es/lib/isOctal.js
new file mode 100644
index 0000000..3ec51dd
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isOctal.js
@@ -0,0 +1,6 @@
+import assertString from './util/assertString';
+var octal = /^(0o)?[0-7]+$/i;
+export default function isOctal(str) {
+ assertString(str);
+ return octal.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isPassportNumber.js b/src/node_modules/validator/es/lib/isPassportNumber.js
new file mode 100644
index 0000000..3810da0
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isPassportNumber.js
@@ -0,0 +1,104 @@
+/**
+ * Reference:
+ * https://en.wikipedia.org/ -- Wikipedia
+ * https://docs.microsoft.com/en-us/microsoft-365/compliance/eu-passport-number -- EU Passport Number
+ * https://countrycode.org/ -- Country Codes
+ */
+var passportRegexByCountryCode = {
+ AM: /^[A-Z]{2}\d{7}$/,
+ // ARMENIA
+ AR: /^[A-Z]{3}\d{6}$/,
+ // ARGENTINA
+ AT: /^[A-Z]\d{7}$/,
+ // AUSTRIA
+ AU: /^[A-Z]\d{7}$/,
+ // AUSTRALIA
+ BE: /^[A-Z]{2}\d{6}$/,
+ // BELGIUM
+ BG: /^\d{9}$/,
+ // BULGARIA
+ CA: /^[A-Z]{2}\d{6}$/,
+ // CANADA
+ CH: /^[A-Z]\d{7}$/,
+ // SWITZERLAND
+ CN: /^[GE]\d{8}$/,
+ // CHINA [G=Ordinary, E=Electronic] followed by 8-digits
+ CY: /^[A-Z](\d{6}|\d{8})$/,
+ // CYPRUS
+ CZ: /^\d{8}$/,
+ // CZECH REPUBLIC
+ DE: /^[CFGHJKLMNPRTVWXYZ0-9]{9}$/,
+ // GERMANY
+ DK: /^\d{9}$/,
+ // DENMARK
+ DZ: /^\d{9}$/,
+ // ALGERIA
+ EE: /^([A-Z]\d{7}|[A-Z]{2}\d{7})$/,
+ // ESTONIA (K followed by 7-digits), e-passports have 2 UPPERCASE followed by 7 digits
+ ES: /^[A-Z0-9]{2}([A-Z0-9]?)\d{6}$/,
+ // SPAIN
+ FI: /^[A-Z]{2}\d{7}$/,
+ // FINLAND
+ FR: /^\d{2}[A-Z]{2}\d{5}$/,
+ // FRANCE
+ GB: /^\d{9}$/,
+ // UNITED KINGDOM
+ GR: /^[A-Z]{2}\d{7}$/,
+ // GREECE
+ HR: /^\d{9}$/,
+ // CROATIA
+ HU: /^[A-Z]{2}(\d{6}|\d{7})$/,
+ // HUNGARY
+ IE: /^[A-Z0-9]{2}\d{7}$/,
+ // IRELAND
+ IS: /^(A)\d{7}$/,
+ // ICELAND
+ IT: /^[A-Z0-9]{2}\d{7}$/,
+ // ITALY
+ JP: /^[A-Z]{2}\d{7}$/,
+ // JAPAN
+ KR: /^[MS]\d{8}$/,
+ // SOUTH KOREA, REPUBLIC OF KOREA, [S=PS Passports, M=PM Passports]
+ LT: /^[A-Z0-9]{8}$/,
+ // LITHUANIA
+ LU: /^[A-Z0-9]{8}$/,
+ // LUXEMBURG
+ LV: /^[A-Z0-9]{2}\d{7}$/,
+ // LATVIA
+ MT: /^\d{7}$/,
+ // MALTA
+ NL: /^[A-Z]{2}[A-Z0-9]{6}\d$/,
+ // NETHERLANDS
+ PO: /^[A-Z]{2}\d{7}$/,
+ // POLAND
+ PT: /^[A-Z]\d{6}$/,
+ // PORTUGAL
+ RO: /^\d{8,9}$/,
+ // ROMANIA
+ SE: /^\d{8}$/,
+ // SWEDEN
+ SL: /^(P)[A-Z]\d{7}$/,
+ // SLOVANIA
+ SK: /^[0-9A-Z]\d{7}$/,
+ // SLOVAKIA
+ TR: /^[A-Z]\d{8}$/,
+ // TURKEY
+ UA: /^[A-Z]{2}\d{6}$/,
+ // UKRAINE
+ US: /^\d{9}$/ // UNITED STATES
+
+};
+/**
+ * Check if str is a valid passport number
+ * relative to provided ISO Country Code.
+ *
+ * @param {string} str
+ * @param {string} countryCode
+ * @return {boolean}
+ */
+
+export default function isPassportNumber(str, countryCode) {
+ /** Remove All Whitespaces, Convert to UPPERCASE */
+ var normalizedStr = str.replace(/\s/g, '').toUpperCase();
+ return countryCode.toUpperCase() in passportRegexByCountryCode && passportRegexByCountryCode[countryCode].test(normalizedStr);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isPort.js b/src/node_modules/validator/es/lib/isPort.js
new file mode 100644
index 0000000..6490cad
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isPort.js
@@ -0,0 +1,7 @@
+import isInt from './isInt';
+export default function isPort(str) {
+ return isInt(str, {
+ min: 0,
+ max: 65535
+ });
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isPostalCode.js b/src/node_modules/validator/es/lib/isPostalCode.js
new file mode 100644
index 0000000..a333007
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isPostalCode.js
@@ -0,0 +1,84 @@
+import assertString from './util/assertString'; // common patterns
+
+var threeDigit = /^\d{3}$/;
+var fourDigit = /^\d{4}$/;
+var fiveDigit = /^\d{5}$/;
+var sixDigit = /^\d{6}$/;
+var patterns = {
+ AD: /^AD\d{3}$/,
+ AT: fourDigit,
+ AU: fourDigit,
+ BE: fourDigit,
+ BG: fourDigit,
+ BR: /^\d{5}-\d{3}$/,
+ CA: /^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][\s\-]?\d[ABCEGHJ-NPRSTV-Z]\d$/i,
+ CH: fourDigit,
+ CZ: /^\d{3}\s?\d{2}$/,
+ DE: fiveDigit,
+ DK: fourDigit,
+ DZ: fiveDigit,
+ EE: fiveDigit,
+ ES: fiveDigit,
+ FI: fiveDigit,
+ FR: /^\d{2}\s?\d{3}$/,
+ GB: /^(gir\s?0aa|[a-z]{1,2}\d[\da-z]?\s?(\d[a-z]{2})?)$/i,
+ GR: /^\d{3}\s?\d{2}$/,
+ HR: /^([1-5]\d{4}$)/,
+ HU: fourDigit,
+ ID: fiveDigit,
+ IE: /^(?!.*(?:o))[A-z]\d[\dw]\s\w{4}$/i,
+ IL: fiveDigit,
+ IN: /^((?!10|29|35|54|55|65|66|86|87|88|89)[1-9][0-9]{5})$/,
+ IS: threeDigit,
+ IT: fiveDigit,
+ JP: /^\d{3}\-\d{4}$/,
+ KE: fiveDigit,
+ LI: /^(948[5-9]|949[0-7])$/,
+ LT: /^LT\-\d{5}$/,
+ LU: fourDigit,
+ LV: /^LV\-\d{4}$/,
+ MX: fiveDigit,
+ MT: /^[A-Za-z]{3}\s{0,1}\d{4}$/,
+ NL: /^\d{4}\s?[a-z]{2}$/i,
+ NO: fourDigit,
+ NZ: fourDigit,
+ PL: /^\d{2}\-\d{3}$/,
+ PR: /^00[679]\d{2}([ -]\d{4})?$/,
+ PT: /^\d{4}\-\d{3}?$/,
+ RO: sixDigit,
+ RU: sixDigit,
+ SA: fiveDigit,
+ SE: /^[1-9]\d{2}\s?\d{2}$/,
+ SI: fourDigit,
+ SK: /^\d{3}\s?\d{2}$/,
+ TN: fourDigit,
+ TW: /^\d{3}(\d{2})?$/,
+ UA: fiveDigit,
+ US: /^\d{5}(-\d{4})?$/,
+ ZA: fourDigit,
+ ZM: fiveDigit
+};
+export var locales = Object.keys(patterns);
+export default function (str, locale) {
+ assertString(str);
+
+ if (locale in patterns) {
+ return patterns[locale].test(str);
+ } else if (locale === 'any') {
+ for (var key in patterns) {
+ // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
+ // istanbul ignore else
+ if (patterns.hasOwnProperty(key)) {
+ var pattern = patterns[key];
+
+ if (pattern.test(str)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ throw new Error("Invalid locale '".concat(locale, "'"));
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isRFC3339.js b/src/node_modules/validator/es/lib/isRFC3339.js
new file mode 100644
index 0000000..8357ecb
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isRFC3339.js
@@ -0,0 +1,20 @@
+import assertString from './util/assertString';
+/* Based on https://tools.ietf.org/html/rfc3339#section-5.6 */
+
+var dateFullYear = /[0-9]{4}/;
+var dateMonth = /(0[1-9]|1[0-2])/;
+var dateMDay = /([12]\d|0[1-9]|3[01])/;
+var timeHour = /([01][0-9]|2[0-3])/;
+var timeMinute = /[0-5][0-9]/;
+var timeSecond = /([0-5][0-9]|60)/;
+var timeSecFrac = /(\.[0-9]+)?/;
+var timeNumOffset = new RegExp("[-+]".concat(timeHour.source, ":").concat(timeMinute.source));
+var timeOffset = new RegExp("([zZ]|".concat(timeNumOffset.source, ")"));
+var partialTime = new RegExp("".concat(timeHour.source, ":").concat(timeMinute.source, ":").concat(timeSecond.source).concat(timeSecFrac.source));
+var fullDate = new RegExp("".concat(dateFullYear.source, "-").concat(dateMonth.source, "-").concat(dateMDay.source));
+var fullTime = new RegExp("".concat(partialTime.source).concat(timeOffset.source));
+var rfc3339 = new RegExp("".concat(fullDate.source, "[ tT]").concat(fullTime.source));
+export default function isRFC3339(str) {
+ assertString(str);
+ return rfc3339.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isRgbColor.js b/src/node_modules/validator/es/lib/isRgbColor.js
new file mode 100644
index 0000000..2fe2fbb
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isRgbColor.js
@@ -0,0 +1,15 @@
+import assertString from './util/assertString';
+var rgbColor = /^rgb\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\)$/;
+var rgbaColor = /^rgba\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)$/;
+var rgbColorPercent = /^rgb\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\)/;
+var rgbaColorPercent = /^rgba\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)/;
+export default function isRgbColor(str) {
+ var includePercentValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ assertString(str);
+
+ if (!includePercentValues) {
+ return rgbColor.test(str) || rgbaColor.test(str);
+ }
+
+ return rgbColor.test(str) || rgbaColor.test(str) || rgbColorPercent.test(str) || rgbaColorPercent.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isSemVer.js b/src/node_modules/validator/es/lib/isSemVer.js
new file mode 100644
index 0000000..d9b51eb
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isSemVer.js
@@ -0,0 +1,14 @@
+import assertString from './util/assertString';
+import multilineRegexp from './util/multilineRegex';
+/**
+ * Regular Expression to match
+ * semantic versioning (SemVer)
+ * built from multi-line, multi-parts regexp
+ * Reference: https://semver.org/
+ */
+
+var semanticVersioningRegex = multilineRegexp(['^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)', '(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))', '?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$']);
+export default function isSemVer(str) {
+ assertString(str);
+ return semanticVersioningRegex.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isSlug.js b/src/node_modules/validator/es/lib/isSlug.js
new file mode 100644
index 0000000..64417ae
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isSlug.js
@@ -0,0 +1,6 @@
+import assertString from './util/assertString';
+var charsetRegex = /^[^-_](?!.*?[-_]{2,})([a-z0-9\\-]{1,}).*[^-_]$/;
+export default function isSlug(str) {
+ assertString(str);
+ return charsetRegex.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isSurrogatePair.js b/src/node_modules/validator/es/lib/isSurrogatePair.js
new file mode 100644
index 0000000..1e0efb2
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isSurrogatePair.js
@@ -0,0 +1,6 @@
+import assertString from './util/assertString';
+var surrogatePair = /[\uD800-\uDBFF][\uDC00-\uDFFF]/;
+export default function isSurrogatePair(str) {
+ assertString(str);
+ return surrogatePair.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isURL.js b/src/node_modules/validator/es/lib/isURL.js
new file mode 100644
index 0000000..72a79fa
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isURL.js
@@ -0,0 +1,147 @@
+import assertString from './util/assertString';
+import isFQDN from './isFQDN';
+import isIP from './isIP';
+import merge from './util/merge';
+/*
+options for isURL method
+
+require_protocol - if set as true isURL will return false if protocol is not present in the URL
+require_valid_protocol - isURL will check if the URL's protocol is present in the protocols option
+protocols - valid protocols can be modified with this option
+require_host - if set as false isURL will not check if host is present in the URL
+allow_protocol_relative_urls - if set as true protocol relative URLs will be allowed
+
+*/
+
+var default_url_options = {
+ protocols: ['http', 'https', 'ftp'],
+ require_tld: true,
+ require_protocol: false,
+ require_host: true,
+ require_valid_protocol: true,
+ allow_underscores: false,
+ allow_trailing_dot: false,
+ allow_protocol_relative_urls: false
+};
+var wrapped_ipv6 = /^\[([^\]]+)\](?::([0-9]+))?$/;
+
+function isRegExp(obj) {
+ return Object.prototype.toString.call(obj) === '[object RegExp]';
+}
+
+function checkHost(host, matches) {
+ for (var i = 0; i < matches.length; i++) {
+ var match = matches[i];
+
+ if (host === match || isRegExp(match) && match.test(host)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+export default function isURL(url, options) {
+ assertString(url);
+
+ if (!url || url.length >= 2083 || /[\s<>]/.test(url)) {
+ return false;
+ }
+
+ if (url.indexOf('mailto:') === 0) {
+ return false;
+ }
+
+ options = merge(options, default_url_options);
+ var protocol, auth, host, hostname, port, port_str, split, ipv6;
+ split = url.split('#');
+ url = split.shift();
+ split = url.split('?');
+ url = split.shift();
+ split = url.split('://');
+
+ if (split.length > 1) {
+ protocol = split.shift().toLowerCase();
+
+ if (options.require_valid_protocol && options.protocols.indexOf(protocol) === -1) {
+ return false;
+ }
+ } else if (options.require_protocol) {
+ return false;
+ } else if (url.substr(0, 2) === '//') {
+ if (!options.allow_protocol_relative_urls) {
+ return false;
+ }
+
+ split[0] = url.substr(2);
+ }
+
+ url = split.join('://');
+
+ if (url === '') {
+ return false;
+ }
+
+ split = url.split('/');
+ url = split.shift();
+
+ if (url === '' && !options.require_host) {
+ return true;
+ }
+
+ split = url.split('@');
+
+ if (split.length > 1) {
+ if (options.disallow_auth) {
+ return false;
+ }
+
+ auth = split.shift();
+
+ if (auth.indexOf(':') >= 0 && auth.split(':').length > 2) {
+ return false;
+ }
+ }
+
+ hostname = split.join('@');
+ port_str = null;
+ ipv6 = null;
+ var ipv6_match = hostname.match(wrapped_ipv6);
+
+ if (ipv6_match) {
+ host = '';
+ ipv6 = ipv6_match[1];
+ port_str = ipv6_match[2] || null;
+ } else {
+ split = hostname.split(':');
+ host = split.shift();
+
+ if (split.length) {
+ port_str = split.join(':');
+ }
+ }
+
+ if (port_str !== null) {
+ port = parseInt(port_str, 10);
+
+ if (!/^[0-9]+$/.test(port_str) || port <= 0 || port > 65535) {
+ return false;
+ }
+ }
+
+ if (!isIP(host) && !isFQDN(host, options) && (!ipv6 || !isIP(ipv6, 6))) {
+ return false;
+ }
+
+ host = host || ipv6;
+
+ if (options.host_whitelist && !checkHost(host, options.host_whitelist)) {
+ return false;
+ }
+
+ if (options.host_blacklist && checkHost(host, options.host_blacklist)) {
+ return false;
+ }
+
+ return true;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isUUID.js b/src/node_modules/validator/es/lib/isUUID.js
new file mode 100644
index 0000000..04de3ee
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isUUID.js
@@ -0,0 +1,13 @@
+import assertString from './util/assertString';
+var uuid = {
+ 3: /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
+ 4: /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
+ 5: /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
+ all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
+};
+export default function isUUID(str) {
+ var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'all';
+ assertString(str);
+ var pattern = uuid[version];
+ return pattern && pattern.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isUppercase.js b/src/node_modules/validator/es/lib/isUppercase.js
new file mode 100644
index 0000000..fca8790
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isUppercase.js
@@ -0,0 +1,5 @@
+import assertString from './util/assertString';
+export default function isUppercase(str) {
+ assertString(str);
+ return str === str.toUpperCase();
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isVariableWidth.js b/src/node_modules/validator/es/lib/isVariableWidth.js
new file mode 100644
index 0000000..890119e
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isVariableWidth.js
@@ -0,0 +1,7 @@
+import assertString from './util/assertString';
+import { fullWidth } from './isFullWidth';
+import { halfWidth } from './isHalfWidth';
+export default function isVariableWidth(str) {
+ assertString(str);
+ return fullWidth.test(str) && halfWidth.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/isWhitelisted.js b/src/node_modules/validator/es/lib/isWhitelisted.js
new file mode 100644
index 0000000..2cbb95c
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isWhitelisted.js
@@ -0,0 +1,12 @@
+import assertString from './util/assertString';
+export default function isWhitelisted(str, chars) {
+ assertString(str);
+
+ for (var i = str.length - 1; i >= 0; i--) {
+ if (chars.indexOf(str[i]) === -1) {
+ return false;
+ }
+ }
+
+ return true;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/ltrim.js b/src/node_modules/validator/es/lib/ltrim.js
new file mode 100644
index 0000000..0ca3abb
--- /dev/null
+++ b/src/node_modules/validator/es/lib/ltrim.js
@@ -0,0 +1,7 @@
+import assertString from './util/assertString';
+export default function ltrim(str, chars) {
+ assertString(str); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping
+
+ var pattern = chars ? new RegExp("^[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+"), 'g') : /^\s+/g;
+ return str.replace(pattern, '');
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/matches.js b/src/node_modules/validator/es/lib/matches.js
new file mode 100644
index 0000000..7840b1c
--- /dev/null
+++ b/src/node_modules/validator/es/lib/matches.js
@@ -0,0 +1,10 @@
+import assertString from './util/assertString';
+export default function matches(str, pattern, modifiers) {
+ assertString(str);
+
+ if (Object.prototype.toString.call(pattern) !== '[object RegExp]') {
+ pattern = new RegExp(pattern, modifiers);
+ }
+
+ return pattern.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/normalizeEmail.js b/src/node_modules/validator/es/lib/normalizeEmail.js
new file mode 100644
index 0000000..301df83
--- /dev/null
+++ b/src/node_modules/validator/es/lib/normalizeEmail.js
@@ -0,0 +1,138 @@
+import merge from './util/merge';
+var default_normalize_email_options = {
+ // The following options apply to all email addresses
+ // Lowercases the local part of the email address.
+ // Please note this may violate RFC 5321 as per http://stackoverflow.com/a/9808332/192024).
+ // The domain is always lowercased, as per RFC 1035
+ all_lowercase: true,
+ // The following conversions are specific to GMail
+ // Lowercases the local part of the GMail address (known to be case-insensitive)
+ gmail_lowercase: true,
+ // Removes dots from the local part of the email address, as that's ignored by GMail
+ gmail_remove_dots: true,
+ // Removes the subaddress (e.g. "+foo") from the email address
+ gmail_remove_subaddress: true,
+ // Conversts the googlemail.com domain to gmail.com
+ gmail_convert_googlemaildotcom: true,
+ // The following conversions are specific to Outlook.com / Windows Live / Hotmail
+ // Lowercases the local part of the Outlook.com address (known to be case-insensitive)
+ outlookdotcom_lowercase: true,
+ // Removes the subaddress (e.g. "+foo") from the email address
+ outlookdotcom_remove_subaddress: true,
+ // The following conversions are specific to Yahoo
+ // Lowercases the local part of the Yahoo address (known to be case-insensitive)
+ yahoo_lowercase: true,
+ // Removes the subaddress (e.g. "-foo") from the email address
+ yahoo_remove_subaddress: true,
+ // The following conversions are specific to Yandex
+ // Lowercases the local part of the Yandex address (known to be case-insensitive)
+ yandex_lowercase: true,
+ // The following conversions are specific to iCloud
+ // Lowercases the local part of the iCloud address (known to be case-insensitive)
+ icloud_lowercase: true,
+ // Removes the subaddress (e.g. "+foo") from the email address
+ icloud_remove_subaddress: true
+}; // List of domains used by iCloud
+
+var icloud_domains = ['icloud.com', 'me.com']; // List of domains used by Outlook.com and its predecessors
+// This list is likely incomplete.
+// Partial reference:
+// https://blogs.office.com/2013/04/17/outlook-com-gets-two-step-verification-sign-in-by-alias-and-new-international-domains/
+
+var outlookdotcom_domains = ['hotmail.at', 'hotmail.be', 'hotmail.ca', 'hotmail.cl', 'hotmail.co.il', 'hotmail.co.nz', 'hotmail.co.th', 'hotmail.co.uk', 'hotmail.com', 'hotmail.com.ar', 'hotmail.com.au', 'hotmail.com.br', 'hotmail.com.gr', 'hotmail.com.mx', 'hotmail.com.pe', 'hotmail.com.tr', 'hotmail.com.vn', 'hotmail.cz', 'hotmail.de', 'hotmail.dk', 'hotmail.es', 'hotmail.fr', 'hotmail.hu', 'hotmail.id', 'hotmail.ie', 'hotmail.in', 'hotmail.it', 'hotmail.jp', 'hotmail.kr', 'hotmail.lv', 'hotmail.my', 'hotmail.ph', 'hotmail.pt', 'hotmail.sa', 'hotmail.sg', 'hotmail.sk', 'live.be', 'live.co.uk', 'live.com', 'live.com.ar', 'live.com.mx', 'live.de', 'live.es', 'live.eu', 'live.fr', 'live.it', 'live.nl', 'msn.com', 'outlook.at', 'outlook.be', 'outlook.cl', 'outlook.co.il', 'outlook.co.nz', 'outlook.co.th', 'outlook.com', 'outlook.com.ar', 'outlook.com.au', 'outlook.com.br', 'outlook.com.gr', 'outlook.com.pe', 'outlook.com.tr', 'outlook.com.vn', 'outlook.cz', 'outlook.de', 'outlook.dk', 'outlook.es', 'outlook.fr', 'outlook.hu', 'outlook.id', 'outlook.ie', 'outlook.in', 'outlook.it', 'outlook.jp', 'outlook.kr', 'outlook.lv', 'outlook.my', 'outlook.ph', 'outlook.pt', 'outlook.sa', 'outlook.sg', 'outlook.sk', 'passport.com']; // List of domains used by Yahoo Mail
+// This list is likely incomplete
+
+var yahoo_domains = ['rocketmail.com', 'yahoo.ca', 'yahoo.co.uk', 'yahoo.com', 'yahoo.de', 'yahoo.fr', 'yahoo.in', 'yahoo.it', 'ymail.com']; // List of domains used by yandex.ru
+
+var yandex_domains = ['yandex.ru', 'yandex.ua', 'yandex.kz', 'yandex.com', 'yandex.by', 'ya.ru']; // replace single dots, but not multiple consecutive dots
+
+function dotsReplacer(match) {
+ if (match.length > 1) {
+ return match;
+ }
+
+ return '';
+}
+
+export default function normalizeEmail(email, options) {
+ options = merge(options, default_normalize_email_options);
+ var raw_parts = email.split('@');
+ var domain = raw_parts.pop();
+ var user = raw_parts.join('@');
+ var parts = [user, domain]; // The domain is always lowercased, as it's case-insensitive per RFC 1035
+
+ parts[1] = parts[1].toLowerCase();
+
+ if (parts[1] === 'gmail.com' || parts[1] === 'googlemail.com') {
+ // Address is GMail
+ if (options.gmail_remove_subaddress) {
+ parts[0] = parts[0].split('+')[0];
+ }
+
+ if (options.gmail_remove_dots) {
+ // this does not replace consecutive dots like example..email@gmail.com
+ parts[0] = parts[0].replace(/\.+/g, dotsReplacer);
+ }
+
+ if (!parts[0].length) {
+ return false;
+ }
+
+ if (options.all_lowercase || options.gmail_lowercase) {
+ parts[0] = parts[0].toLowerCase();
+ }
+
+ parts[1] = options.gmail_convert_googlemaildotcom ? 'gmail.com' : parts[1];
+ } else if (icloud_domains.indexOf(parts[1]) >= 0) {
+ // Address is iCloud
+ if (options.icloud_remove_subaddress) {
+ parts[0] = parts[0].split('+')[0];
+ }
+
+ if (!parts[0].length) {
+ return false;
+ }
+
+ if (options.all_lowercase || options.icloud_lowercase) {
+ parts[0] = parts[0].toLowerCase();
+ }
+ } else if (outlookdotcom_domains.indexOf(parts[1]) >= 0) {
+ // Address is Outlook.com
+ if (options.outlookdotcom_remove_subaddress) {
+ parts[0] = parts[0].split('+')[0];
+ }
+
+ if (!parts[0].length) {
+ return false;
+ }
+
+ if (options.all_lowercase || options.outlookdotcom_lowercase) {
+ parts[0] = parts[0].toLowerCase();
+ }
+ } else if (yahoo_domains.indexOf(parts[1]) >= 0) {
+ // Address is Yahoo
+ if (options.yahoo_remove_subaddress) {
+ var components = parts[0].split('-');
+ parts[0] = components.length > 1 ? components.slice(0, -1).join('-') : components[0];
+ }
+
+ if (!parts[0].length) {
+ return false;
+ }
+
+ if (options.all_lowercase || options.yahoo_lowercase) {
+ parts[0] = parts[0].toLowerCase();
+ }
+ } else if (yandex_domains.indexOf(parts[1]) >= 0) {
+ if (options.all_lowercase || options.yandex_lowercase) {
+ parts[0] = parts[0].toLowerCase();
+ }
+
+ parts[1] = 'yandex.ru'; // all yandex domains are equal, 1st preffered
+ } else if (options.all_lowercase) {
+ // Any other address
+ parts[0] = parts[0].toLowerCase();
+ }
+
+ return parts.join('@');
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/rtrim.js b/src/node_modules/validator/es/lib/rtrim.js
new file mode 100644
index 0000000..b96cb57
--- /dev/null
+++ b/src/node_modules/validator/es/lib/rtrim.js
@@ -0,0 +1,7 @@
+import assertString from './util/assertString';
+export default function rtrim(str, chars) {
+ assertString(str); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping
+
+ var pattern = chars ? new RegExp("[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+$"), 'g') : /\s+$/g;
+ return str.replace(pattern, '');
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/stripLow.js b/src/node_modules/validator/es/lib/stripLow.js
new file mode 100644
index 0000000..c798425
--- /dev/null
+++ b/src/node_modules/validator/es/lib/stripLow.js
@@ -0,0 +1,7 @@
+import assertString from './util/assertString';
+import blacklist from './blacklist';
+export default function stripLow(str, keep_new_lines) {
+ assertString(str);
+ var chars = keep_new_lines ? '\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F' : '\\x00-\\x1F\\x7F';
+ return blacklist(str, chars);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/toBoolean.js b/src/node_modules/validator/es/lib/toBoolean.js
new file mode 100644
index 0000000..25e1eac
--- /dev/null
+++ b/src/node_modules/validator/es/lib/toBoolean.js
@@ -0,0 +1,10 @@
+import assertString from './util/assertString';
+export default function toBoolean(str, strict) {
+ assertString(str);
+
+ if (strict) {
+ return str === '1' || /^true$/i.test(str);
+ }
+
+ return str !== '0' && !/^false$/i.test(str) && str !== '';
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/toDate.js b/src/node_modules/validator/es/lib/toDate.js
new file mode 100644
index 0000000..62422a3
--- /dev/null
+++ b/src/node_modules/validator/es/lib/toDate.js
@@ -0,0 +1,6 @@
+import assertString from './util/assertString';
+export default function toDate(date) {
+ assertString(date);
+ date = Date.parse(date);
+ return !isNaN(date) ? new Date(date) : null;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/toFloat.js b/src/node_modules/validator/es/lib/toFloat.js
new file mode 100644
index 0000000..f21163d
--- /dev/null
+++ b/src/node_modules/validator/es/lib/toFloat.js
@@ -0,0 +1,5 @@
+import isFloat from './isFloat';
+export default function toFloat(str) {
+ if (!isFloat(str)) return NaN;
+ return parseFloat(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/toInt.js b/src/node_modules/validator/es/lib/toInt.js
new file mode 100644
index 0000000..22d566e
--- /dev/null
+++ b/src/node_modules/validator/es/lib/toInt.js
@@ -0,0 +1,5 @@
+import assertString from './util/assertString';
+export default function toInt(str, radix) {
+ assertString(str);
+ return parseInt(str, radix || 10);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/trim.js b/src/node_modules/validator/es/lib/trim.js
new file mode 100644
index 0000000..b9b8fa0
--- /dev/null
+++ b/src/node_modules/validator/es/lib/trim.js
@@ -0,0 +1,5 @@
+import rtrim from './rtrim';
+import ltrim from './ltrim';
+export default function trim(str, chars) {
+ return rtrim(ltrim(str, chars), chars);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/unescape.js b/src/node_modules/validator/es/lib/unescape.js
new file mode 100644
index 0000000..d6c8077
--- /dev/null
+++ b/src/node_modules/validator/es/lib/unescape.js
@@ -0,0 +1,5 @@
+import assertString from './util/assertString';
+export default function unescape(str) {
+ assertString(str);
+ return str.replace(/&amp;/g, '&').replace(/&quot;/g, '"').replace(/&#x27;/g, "'").replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&#x2F;/g, '/').replace(/&#x5C;/g, '\\').replace(/&#96;/g, '`');
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/util/assertString.js b/src/node_modules/validator/es/lib/util/assertString.js
new file mode 100644
index 0000000..48b8245
--- /dev/null
+++ b/src/node_modules/validator/es/lib/util/assertString.js
@@ -0,0 +1,23 @@
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+export default function assertString(input) {
+ var isString = typeof input === 'string' || input instanceof String;
+
+ if (!isString) {
+ var invalidType;
+
+ if (input === null) {
+ invalidType = 'null';
+ } else {
+ invalidType = _typeof(input);
+
+ if (invalidType === 'object' && input.constructor && input.constructor.hasOwnProperty('name')) {
+ invalidType = input.constructor.name;
+ } else {
+ invalidType = "a ".concat(invalidType);
+ }
+ }
+
+ throw new TypeError("Expected string but received ".concat(invalidType, "."));
+ }
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/util/includes.js b/src/node_modules/validator/es/lib/util/includes.js
new file mode 100644
index 0000000..b01c692
--- /dev/null
+++ b/src/node_modules/validator/es/lib/util/includes.js
@@ -0,0 +1,7 @@
+var includes = function includes(arr, val) {
+ return arr.some(function (arrVal) {
+ return val === arrVal;
+ });
+};
+
+export default includes; \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/util/merge.js b/src/node_modules/validator/es/lib/util/merge.js
new file mode 100644
index 0000000..0d1f699
--- /dev/null
+++ b/src/node_modules/validator/es/lib/util/merge.js
@@ -0,0 +1,12 @@
+export default function merge() {
+ var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+ var defaults = arguments.length > 1 ? arguments[1] : undefined;
+
+ for (var key in defaults) {
+ if (typeof obj[key] === 'undefined') {
+ obj[key] = defaults[key];
+ }
+ }
+
+ return obj;
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/util/multilineRegex.js b/src/node_modules/validator/es/lib/util/multilineRegex.js
new file mode 100644
index 0000000..2a344a7
--- /dev/null
+++ b/src/node_modules/validator/es/lib/util/multilineRegex.js
@@ -0,0 +1,13 @@
+/**
+ * Build RegExp object from an array
+ * of multiple/multi-line regexp parts
+ *
+ * @param {string[]} parts
+ * @param {string} flags
+ * @return {object} - RegExp object
+ */
+export default function multilineRegexp(parts) {
+ var flags = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var regexpAsStringLiteral = parts.join('');
+ return new RegExp(regexpAsStringLiteral, flags);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/util/toString.js b/src/node_modules/validator/es/lib/util/toString.js
new file mode 100644
index 0000000..f483fa4
--- /dev/null
+++ b/src/node_modules/validator/es/lib/util/toString.js
@@ -0,0 +1,15 @@
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+export default function toString(input) {
+ if (_typeof(input) === 'object' && input !== null) {
+ if (typeof input.toString === 'function') {
+ input = input.toString();
+ } else {
+ input = '[object Object]';
+ }
+ } else if (input === null || typeof input === 'undefined' || isNaN(input) && !input.length) {
+ input = '';
+ }
+
+ return String(input);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/es/lib/whitelist.js b/src/node_modules/validator/es/lib/whitelist.js
new file mode 100644
index 0000000..244881b
--- /dev/null
+++ b/src/node_modules/validator/es/lib/whitelist.js
@@ -0,0 +1,5 @@
+import assertString from './util/assertString';
+export default function whitelist(str, chars) {
+ assertString(str);
+ return str.replace(new RegExp("[^".concat(chars, "]+"), 'g'), '');
+} \ No newline at end of file
diff --git a/src/node_modules/validator/index.js b/src/node_modules/validator/index.js
new file mode 100644
index 0000000..966fd96
--- /dev/null
+++ b/src/node_modules/validator/index.js
@@ -0,0 +1,284 @@
+"use strict";
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _toDate = _interopRequireDefault(require("./lib/toDate"));
+
+var _toFloat = _interopRequireDefault(require("./lib/toFloat"));
+
+var _toInt = _interopRequireDefault(require("./lib/toInt"));
+
+var _toBoolean = _interopRequireDefault(require("./lib/toBoolean"));
+
+var _equals = _interopRequireDefault(require("./lib/equals"));
+
+var _contains = _interopRequireDefault(require("./lib/contains"));
+
+var _matches = _interopRequireDefault(require("./lib/matches"));
+
+var _isEmail = _interopRequireDefault(require("./lib/isEmail"));
+
+var _isURL = _interopRequireDefault(require("./lib/isURL"));
+
+var _isMACAddress = _interopRequireDefault(require("./lib/isMACAddress"));
+
+var _isIP = _interopRequireDefault(require("./lib/isIP"));
+
+var _isIPRange = _interopRequireDefault(require("./lib/isIPRange"));
+
+var _isFQDN = _interopRequireDefault(require("./lib/isFQDN"));
+
+var _isBoolean = _interopRequireDefault(require("./lib/isBoolean"));
+
+var _isLocale = _interopRequireDefault(require("./lib/isLocale"));
+
+var _isAlpha = _interopRequireWildcard(require("./lib/isAlpha"));
+
+var _isAlphanumeric = _interopRequireWildcard(require("./lib/isAlphanumeric"));
+
+var _isNumeric = _interopRequireDefault(require("./lib/isNumeric"));
+
+var _isPassportNumber = _interopRequireDefault(require("./lib/isPassportNumber"));
+
+var _isPort = _interopRequireDefault(require("./lib/isPort"));
+
+var _isLowercase = _interopRequireDefault(require("./lib/isLowercase"));
+
+var _isUppercase = _interopRequireDefault(require("./lib/isUppercase"));
+
+var _isAscii = _interopRequireDefault(require("./lib/isAscii"));
+
+var _isFullWidth = _interopRequireDefault(require("./lib/isFullWidth"));
+
+var _isHalfWidth = _interopRequireDefault(require("./lib/isHalfWidth"));
+
+var _isVariableWidth = _interopRequireDefault(require("./lib/isVariableWidth"));
+
+var _isMultibyte = _interopRequireDefault(require("./lib/isMultibyte"));
+
+var _isSemVer = _interopRequireDefault(require("./lib/isSemVer"));
+
+var _isSurrogatePair = _interopRequireDefault(require("./lib/isSurrogatePair"));
+
+var _isInt = _interopRequireDefault(require("./lib/isInt"));
+
+var _isFloat = _interopRequireWildcard(require("./lib/isFloat"));
+
+var _isDecimal = _interopRequireDefault(require("./lib/isDecimal"));
+
+var _isHexadecimal = _interopRequireDefault(require("./lib/isHexadecimal"));
+
+var _isOctal = _interopRequireDefault(require("./lib/isOctal"));
+
+var _isDivisibleBy = _interopRequireDefault(require("./lib/isDivisibleBy"));
+
+var _isHexColor = _interopRequireDefault(require("./lib/isHexColor"));
+
+var _isRgbColor = _interopRequireDefault(require("./lib/isRgbColor"));
+
+var _isHSL = _interopRequireDefault(require("./lib/isHSL"));
+
+var _isISRC = _interopRequireDefault(require("./lib/isISRC"));
+
+var _isIBAN = _interopRequireDefault(require("./lib/isIBAN"));
+
+var _isBIC = _interopRequireDefault(require("./lib/isBIC"));
+
+var _isMD = _interopRequireDefault(require("./lib/isMD5"));
+
+var _isHash = _interopRequireDefault(require("./lib/isHash"));
+
+var _isJWT = _interopRequireDefault(require("./lib/isJWT"));
+
+var _isJSON = _interopRequireDefault(require("./lib/isJSON"));
+
+var _isEmpty = _interopRequireDefault(require("./lib/isEmpty"));
+
+var _isLength = _interopRequireDefault(require("./lib/isLength"));
+
+var _isByteLength = _interopRequireDefault(require("./lib/isByteLength"));
+
+var _isUUID = _interopRequireDefault(require("./lib/isUUID"));
+
+var _isMongoId = _interopRequireDefault(require("./lib/isMongoId"));
+
+var _isAfter = _interopRequireDefault(require("./lib/isAfter"));
+
+var _isBefore = _interopRequireDefault(require("./lib/isBefore"));
+
+var _isIn = _interopRequireDefault(require("./lib/isIn"));
+
+var _isCreditCard = _interopRequireDefault(require("./lib/isCreditCard"));
+
+var _isIdentityCard = _interopRequireDefault(require("./lib/isIdentityCard"));
+
+var _isEAN = _interopRequireDefault(require("./lib/isEAN"));
+
+var _isISIN = _interopRequireDefault(require("./lib/isISIN"));
+
+var _isISBN = _interopRequireDefault(require("./lib/isISBN"));
+
+var _isISSN = _interopRequireDefault(require("./lib/isISSN"));
+
+var _isMobilePhone = _interopRequireWildcard(require("./lib/isMobilePhone"));
+
+var _isEthereumAddress = _interopRequireDefault(require("./lib/isEthereumAddress"));
+
+var _isCurrency = _interopRequireDefault(require("./lib/isCurrency"));
+
+var _isBtcAddress = _interopRequireDefault(require("./lib/isBtcAddress"));
+
+var _isISO = _interopRequireDefault(require("./lib/isISO8601"));
+
+var _isRFC = _interopRequireDefault(require("./lib/isRFC3339"));
+
+var _isISO31661Alpha = _interopRequireDefault(require("./lib/isISO31661Alpha2"));
+
+var _isISO31661Alpha2 = _interopRequireDefault(require("./lib/isISO31661Alpha3"));
+
+var _isBase = _interopRequireDefault(require("./lib/isBase32"));
+
+var _isBase2 = _interopRequireDefault(require("./lib/isBase64"));
+
+var _isDataURI = _interopRequireDefault(require("./lib/isDataURI"));
+
+var _isMagnetURI = _interopRequireDefault(require("./lib/isMagnetURI"));
+
+var _isMimeType = _interopRequireDefault(require("./lib/isMimeType"));
+
+var _isLatLong = _interopRequireDefault(require("./lib/isLatLong"));
+
+var _isPostalCode = _interopRequireWildcard(require("./lib/isPostalCode"));
+
+var _ltrim = _interopRequireDefault(require("./lib/ltrim"));
+
+var _rtrim = _interopRequireDefault(require("./lib/rtrim"));
+
+var _trim = _interopRequireDefault(require("./lib/trim"));
+
+var _escape = _interopRequireDefault(require("./lib/escape"));
+
+var _unescape = _interopRequireDefault(require("./lib/unescape"));
+
+var _stripLow = _interopRequireDefault(require("./lib/stripLow"));
+
+var _whitelist = _interopRequireDefault(require("./lib/whitelist"));
+
+var _blacklist = _interopRequireDefault(require("./lib/blacklist"));
+
+var _isWhitelisted = _interopRequireDefault(require("./lib/isWhitelisted"));
+
+var _normalizeEmail = _interopRequireDefault(require("./lib/normalizeEmail"));
+
+var _isSlug = _interopRequireDefault(require("./lib/isSlug"));
+
+function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var version = '13.0.0';
+var validator = {
+ version: version,
+ toDate: _toDate.default,
+ toFloat: _toFloat.default,
+ toInt: _toInt.default,
+ toBoolean: _toBoolean.default,
+ equals: _equals.default,
+ contains: _contains.default,
+ matches: _matches.default,
+ isEmail: _isEmail.default,
+ isURL: _isURL.default,
+ isMACAddress: _isMACAddress.default,
+ isIP: _isIP.default,
+ isIPRange: _isIPRange.default,
+ isFQDN: _isFQDN.default,
+ isBoolean: _isBoolean.default,
+ isIBAN: _isIBAN.default,
+ isBIC: _isBIC.default,
+ isAlpha: _isAlpha.default,
+ isAlphaLocales: _isAlpha.locales,
+ isAlphanumeric: _isAlphanumeric.default,
+ isAlphanumericLocales: _isAlphanumeric.locales,
+ isNumeric: _isNumeric.default,
+ isPassportNumber: _isPassportNumber.default,
+ isPort: _isPort.default,
+ isLowercase: _isLowercase.default,
+ isUppercase: _isUppercase.default,
+ isAscii: _isAscii.default,
+ isFullWidth: _isFullWidth.default,
+ isHalfWidth: _isHalfWidth.default,
+ isVariableWidth: _isVariableWidth.default,
+ isMultibyte: _isMultibyte.default,
+ isSemVer: _isSemVer.default,
+ isSurrogatePair: _isSurrogatePair.default,
+ isInt: _isInt.default,
+ isFloat: _isFloat.default,
+ isFloatLocales: _isFloat.locales,
+ isDecimal: _isDecimal.default,
+ isHexadecimal: _isHexadecimal.default,
+ isOctal: _isOctal.default,
+ isDivisibleBy: _isDivisibleBy.default,
+ isHexColor: _isHexColor.default,
+ isRgbColor: _isRgbColor.default,
+ isHSL: _isHSL.default,
+ isISRC: _isISRC.default,
+ isMD5: _isMD.default,
+ isHash: _isHash.default,
+ isJWT: _isJWT.default,
+ isJSON: _isJSON.default,
+ isEmpty: _isEmpty.default,
+ isLength: _isLength.default,
+ isLocale: _isLocale.default,
+ isByteLength: _isByteLength.default,
+ isUUID: _isUUID.default,
+ isMongoId: _isMongoId.default,
+ isAfter: _isAfter.default,
+ isBefore: _isBefore.default,
+ isIn: _isIn.default,
+ isCreditCard: _isCreditCard.default,
+ isIdentityCard: _isIdentityCard.default,
+ isEAN: _isEAN.default,
+ isISIN: _isISIN.default,
+ isISBN: _isISBN.default,
+ isISSN: _isISSN.default,
+ isMobilePhone: _isMobilePhone.default,
+ isMobilePhoneLocales: _isMobilePhone.locales,
+ isPostalCode: _isPostalCode.default,
+ isPostalCodeLocales: _isPostalCode.locales,
+ isEthereumAddress: _isEthereumAddress.default,
+ isCurrency: _isCurrency.default,
+ isBtcAddress: _isBtcAddress.default,
+ isISO8601: _isISO.default,
+ isRFC3339: _isRFC.default,
+ isISO31661Alpha2: _isISO31661Alpha.default,
+ isISO31661Alpha3: _isISO31661Alpha2.default,
+ isBase32: _isBase.default,
+ isBase64: _isBase2.default,
+ isDataURI: _isDataURI.default,
+ isMagnetURI: _isMagnetURI.default,
+ isMimeType: _isMimeType.default,
+ isLatLong: _isLatLong.default,
+ ltrim: _ltrim.default,
+ rtrim: _rtrim.default,
+ trim: _trim.default,
+ escape: _escape.default,
+ unescape: _unescape.default,
+ stripLow: _stripLow.default,
+ whitelist: _whitelist.default,
+ blacklist: _blacklist.default,
+ isWhitelisted: _isWhitelisted.default,
+ normalizeEmail: _normalizeEmail.default,
+ toString: toString,
+ isSlug: _isSlug.default
+};
+var _default = validator;
+exports.default = _default;
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/alpha.js b/src/node_modules/validator/lib/alpha.js
new file mode 100644
index 0000000..7c43b56
--- /dev/null
+++ b/src/node_modules/validator/lib/alpha.js
@@ -0,0 +1,113 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.commaDecimal = exports.dotDecimal = exports.arabicLocales = exports.englishLocales = exports.decimal = exports.alphanumeric = exports.alpha = void 0;
+var alpha = {
+ 'en-US': /^[A-Z]+$/i,
+ 'bg-BG': /^[А-Я]+$/i,
+ 'cs-CZ': /^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,
+ 'da-DK': /^[A-ZÆØÅ]+$/i,
+ 'de-DE': /^[A-ZÄÖÜß]+$/i,
+ 'el-GR': /^[Α-ώ]+$/i,
+ 'es-ES': /^[A-ZÁÉÍÑÓÚÜ]+$/i,
+ 'fr-FR': /^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,
+ 'it-IT': /^[A-ZÀÉÈÌÎÓÒÙ]+$/i,
+ 'nb-NO': /^[A-ZÆØÅ]+$/i,
+ 'nl-NL': /^[A-ZÁÉËÏÓÖÜÚ]+$/i,
+ 'nn-NO': /^[A-ZÆØÅ]+$/i,
+ 'hu-HU': /^[A-ZÁÉÍÓÖŐÚÜŰ]+$/i,
+ 'pl-PL': /^[A-ZĄĆĘŚŁŃÓŻŹ]+$/i,
+ 'pt-PT': /^[A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,
+ 'ru-RU': /^[А-ЯЁ]+$/i,
+ 'sl-SI': /^[A-ZČĆĐŠŽ]+$/i,
+ 'sk-SK': /^[A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,
+ 'sr-RS@latin': /^[A-ZČĆŽŠĐ]+$/i,
+ 'sr-RS': /^[А-ЯЂЈЉЊЋЏ]+$/i,
+ 'sv-SE': /^[A-ZÅÄÖ]+$/i,
+ 'tr-TR': /^[A-ZÇĞİıÖŞÜ]+$/i,
+ 'uk-UA': /^[А-ЩЬЮЯЄIЇҐі]+$/i,
+ 'ku-IQ': /^[ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,
+ ar: /^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,
+ he: /^[א-ת]+$/,
+ 'fa-IR': /^['آابپتثجچهخدذرزژسشصضطظعغفقکگلمنوهی']+$/i
+};
+exports.alpha = alpha;
+var alphanumeric = {
+ 'en-US': /^[0-9A-Z]+$/i,
+ 'bg-BG': /^[0-9А-Я]+$/i,
+ 'cs-CZ': /^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,
+ 'da-DK': /^[0-9A-ZÆØÅ]+$/i,
+ 'de-DE': /^[0-9A-ZÄÖÜß]+$/i,
+ 'el-GR': /^[0-9Α-ω]+$/i,
+ 'es-ES': /^[0-9A-ZÁÉÍÑÓÚÜ]+$/i,
+ 'fr-FR': /^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,
+ 'it-IT': /^[0-9A-ZÀÉÈÌÎÓÒÙ]+$/i,
+ 'hu-HU': /^[0-9A-ZÁÉÍÓÖŐÚÜŰ]+$/i,
+ 'nb-NO': /^[0-9A-ZÆØÅ]+$/i,
+ 'nl-NL': /^[0-9A-ZÁÉËÏÓÖÜÚ]+$/i,
+ 'nn-NO': /^[0-9A-ZÆØÅ]+$/i,
+ 'pl-PL': /^[0-9A-ZĄĆĘŚŁŃÓŻŹ]+$/i,
+ 'pt-PT': /^[0-9A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,
+ 'ru-RU': /^[0-9А-ЯЁ]+$/i,
+ 'sl-SI': /^[0-9A-ZČĆĐŠŽ]+$/i,
+ 'sk-SK': /^[0-9A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,
+ 'sr-RS@latin': /^[0-9A-ZČĆŽŠĐ]+$/i,
+ 'sr-RS': /^[0-9А-ЯЂЈЉЊЋЏ]+$/i,
+ 'sv-SE': /^[0-9A-ZÅÄÖ]+$/i,
+ 'tr-TR': /^[0-9A-ZÇĞİıÖŞÜ]+$/i,
+ 'uk-UA': /^[0-9А-ЩЬЮЯЄIЇҐі]+$/i,
+ 'ku-IQ': /^[٠١٢٣٤٥٦٧٨٩0-9ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,
+ ar: /^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,
+ he: /^[0-9א-ת]+$/,
+ 'fa-IR': /^['0-9آابپتثجچهخدذرزژسشصضطظعغفقکگلمنوهی۱۲۳۴۵۶۷۸۹۰']+$/i
+};
+exports.alphanumeric = alphanumeric;
+var decimal = {
+ 'en-US': '.',
+ ar: '٫'
+};
+exports.decimal = decimal;
+var englishLocales = ['AU', 'GB', 'HK', 'IN', 'NZ', 'ZA', 'ZM'];
+exports.englishLocales = englishLocales;
+
+for (var locale, i = 0; i < englishLocales.length; i++) {
+ locale = "en-".concat(englishLocales[i]);
+ alpha[locale] = alpha['en-US'];
+ alphanumeric[locale] = alphanumeric['en-US'];
+ decimal[locale] = decimal['en-US'];
+} // Source: http://www.localeplanet.com/java/
+
+
+var arabicLocales = ['AE', 'BH', 'DZ', 'EG', 'IQ', 'JO', 'KW', 'LB', 'LY', 'MA', 'QM', 'QA', 'SA', 'SD', 'SY', 'TN', 'YE'];
+exports.arabicLocales = arabicLocales;
+
+for (var _locale, _i = 0; _i < arabicLocales.length; _i++) {
+ _locale = "ar-".concat(arabicLocales[_i]);
+ alpha[_locale] = alpha.ar;
+ alphanumeric[_locale] = alphanumeric.ar;
+ decimal[_locale] = decimal.ar;
+} // Source: https://en.wikipedia.org/wiki/Decimal_mark
+
+
+var dotDecimal = ['ar-EG', 'ar-LB', 'ar-LY'];
+exports.dotDecimal = dotDecimal;
+var commaDecimal = ['bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-ZM', 'es-ES', 'fr-FR', 'it-IT', 'ku-IQ', 'hu-HU', 'nb-NO', 'nn-NO', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS@latin', 'sr-RS', 'sv-SE', 'tr-TR', 'uk-UA'];
+exports.commaDecimal = commaDecimal;
+
+for (var _i2 = 0; _i2 < dotDecimal.length; _i2++) {
+ decimal[dotDecimal[_i2]] = decimal['en-US'];
+}
+
+for (var _i3 = 0; _i3 < commaDecimal.length; _i3++) {
+ decimal[commaDecimal[_i3]] = ',';
+}
+
+alpha['pt-BR'] = alpha['pt-PT'];
+alphanumeric['pt-BR'] = alphanumeric['pt-PT'];
+decimal['pt-BR'] = decimal['pt-PT']; // see #862
+
+alpha['pl-Pl'] = alpha['pl-PL'];
+alphanumeric['pl-Pl'] = alphanumeric['pl-PL'];
+decimal['pl-Pl'] = decimal['pl-PL']; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/blacklist.js b/src/node_modules/validator/lib/blacklist.js
new file mode 100644
index 0000000..5dd42ed
--- /dev/null
+++ b/src/node_modules/validator/lib/blacklist.js
@@ -0,0 +1,18 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = blacklist;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function blacklist(str, chars) {
+ (0, _assertString.default)(str);
+ return str.replace(new RegExp("[".concat(chars, "]+"), 'g'), '');
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/contains.js b/src/node_modules/validator/lib/contains.js
new file mode 100644
index 0000000..b02fda2
--- /dev/null
+++ b/src/node_modules/validator/lib/contains.js
@@ -0,0 +1,20 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = contains;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _toString = _interopRequireDefault(require("./util/toString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function contains(str, elem) {
+ (0, _assertString.default)(str);
+ return str.indexOf((0, _toString.default)(elem)) >= 0;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/equals.js b/src/node_modules/validator/lib/equals.js
new file mode 100644
index 0000000..a33c5ab
--- /dev/null
+++ b/src/node_modules/validator/lib/equals.js
@@ -0,0 +1,18 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = equals;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function equals(str, comparison) {
+ (0, _assertString.default)(str);
+ return str === comparison;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/escape.js b/src/node_modules/validator/lib/escape.js
new file mode 100644
index 0000000..05e4220
--- /dev/null
+++ b/src/node_modules/validator/lib/escape.js
@@ -0,0 +1,18 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = escape;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function escape(str) {
+ (0, _assertString.default)(str);
+ return str.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\//g, '&#x2F;').replace(/\\/g, '&#x5C;').replace(/`/g, '&#96;');
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isAfter.js b/src/node_modules/validator/lib/isAfter.js
new file mode 100644
index 0000000..1fa18ad
--- /dev/null
+++ b/src/node_modules/validator/lib/isAfter.js
@@ -0,0 +1,23 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isAfter;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _toDate = _interopRequireDefault(require("./toDate"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function isAfter(str) {
+ var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String(new Date());
+ (0, _assertString.default)(str);
+ var comparison = (0, _toDate.default)(date);
+ var original = (0, _toDate.default)(str);
+ return !!(original && comparison && original > comparison);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isAlpha.js b/src/node_modules/validator/lib/isAlpha.js
new file mode 100644
index 0000000..5035254
--- /dev/null
+++ b/src/node_modules/validator/lib/isAlpha.js
@@ -0,0 +1,27 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isAlpha;
+exports.locales = void 0;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _alpha = require("./alpha");
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function isAlpha(str) {
+ var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
+ (0, _assertString.default)(str);
+
+ if (locale in _alpha.alpha) {
+ return _alpha.alpha[locale].test(str);
+ }
+
+ throw new Error("Invalid locale '".concat(locale, "'"));
+}
+
+var locales = Object.keys(_alpha.alpha);
+exports.locales = locales; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isAlphanumeric.js b/src/node_modules/validator/lib/isAlphanumeric.js
new file mode 100644
index 0000000..33fc3c1
--- /dev/null
+++ b/src/node_modules/validator/lib/isAlphanumeric.js
@@ -0,0 +1,27 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isAlphanumeric;
+exports.locales = void 0;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _alpha = require("./alpha");
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function isAlphanumeric(str) {
+ var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
+ (0, _assertString.default)(str);
+
+ if (locale in _alpha.alphanumeric) {
+ return _alpha.alphanumeric[locale].test(str);
+ }
+
+ throw new Error("Invalid locale '".concat(locale, "'"));
+}
+
+var locales = Object.keys(_alpha.alphanumeric);
+exports.locales = locales; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isAscii.js b/src/node_modules/validator/lib/isAscii.js
new file mode 100644
index 0000000..3c62271
--- /dev/null
+++ b/src/node_modules/validator/lib/isAscii.js
@@ -0,0 +1,22 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isAscii;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/* eslint-disable no-control-regex */
+var ascii = /^[\x00-\x7F]+$/;
+/* eslint-enable no-control-regex */
+
+function isAscii(str) {
+ (0, _assertString.default)(str);
+ return ascii.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isBIC.js b/src/node_modules/validator/lib/isBIC.js
new file mode 100644
index 0000000..4a4b122
--- /dev/null
+++ b/src/node_modules/validator/lib/isBIC.js
@@ -0,0 +1,20 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isBIC;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var isBICReg = /^[A-z]{4}[A-z]{2}\w{2}(\w{3})?$/;
+
+function isBIC(str) {
+ (0, _assertString.default)(str);
+ return isBICReg.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isBase32.js b/src/node_modules/validator/lib/isBase32.js
new file mode 100644
index 0000000..6655b38
--- /dev/null
+++ b/src/node_modules/validator/lib/isBase32.js
@@ -0,0 +1,26 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isBase32;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var base32 = /^[A-Z2-7]+=*$/;
+
+function isBase32(str) {
+ (0, _assertString.default)(str);
+ var len = str.length;
+
+ if (len > 0 && len % 8 === 0 && base32.test(str)) {
+ return true;
+ }
+
+ return false;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isBase64.js b/src/node_modules/validator/lib/isBase64.js
new file mode 100644
index 0000000..283daec
--- /dev/null
+++ b/src/node_modules/validator/lib/isBase64.js
@@ -0,0 +1,27 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isBase64;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var notBase64 = /[^A-Z0-9+\/=]/i;
+
+function isBase64(str) {
+ (0, _assertString.default)(str);
+ var len = str.length;
+
+ if (!len || len % 4 !== 0 || notBase64.test(str)) {
+ return false;
+ }
+
+ var firstPaddingChar = str.indexOf('=');
+ return firstPaddingChar === -1 || firstPaddingChar === len - 1 || firstPaddingChar === len - 2 && str[len - 1] === '=';
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isBefore.js b/src/node_modules/validator/lib/isBefore.js
new file mode 100644
index 0000000..a54eda8
--- /dev/null
+++ b/src/node_modules/validator/lib/isBefore.js
@@ -0,0 +1,23 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isBefore;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _toDate = _interopRequireDefault(require("./toDate"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function isBefore(str) {
+ var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String(new Date());
+ (0, _assertString.default)(str);
+ var comparison = (0, _toDate.default)(date);
+ var original = (0, _toDate.default)(str);
+ return !!(original && comparison && original < comparison);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isBoolean.js b/src/node_modules/validator/lib/isBoolean.js
new file mode 100644
index 0000000..79d0eb0
--- /dev/null
+++ b/src/node_modules/validator/lib/isBoolean.js
@@ -0,0 +1,18 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isBoolean;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function isBoolean(str) {
+ (0, _assertString.default)(str);
+ return ['true', 'false', '1', '0'].indexOf(str) >= 0;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isBtcAddress.js b/src/node_modules/validator/lib/isBtcAddress.js
new file mode 100644
index 0000000..f61460d
--- /dev/null
+++ b/src/node_modules/validator/lib/isBtcAddress.js
@@ -0,0 +1,21 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isBtcAddress;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// supports Bech32 addresses
+var btc = /^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}$/;
+
+function isBtcAddress(str) {
+ (0, _assertString.default)(str);
+ return btc.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isByteLength.js b/src/node_modules/validator/lib/isByteLength.js
new file mode 100644
index 0000000..c1370ea
--- /dev/null
+++ b/src/node_modules/validator/lib/isByteLength.js
@@ -0,0 +1,34 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isByteLength;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+/* eslint-disable prefer-rest-params */
+function isByteLength(str, options) {
+ (0, _assertString.default)(str);
+ var min;
+ var max;
+
+ if (_typeof(options) === 'object') {
+ min = options.min || 0;
+ max = options.max;
+ } else {
+ // backwards compatibility: isByteLength(str, min [, max])
+ min = arguments[1];
+ max = arguments[2];
+ }
+
+ var len = encodeURI(str).split(/%..|./).length - 1;
+ return len >= min && (typeof max === 'undefined' || len <= max);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isCreditCard.js b/src/node_modules/validator/lib/isCreditCard.js
new file mode 100644
index 0000000..6f77f56
--- /dev/null
+++ b/src/node_modules/validator/lib/isCreditCard.js
@@ -0,0 +1,52 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isCreditCard;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/* eslint-disable max-len */
+var creditCard = /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11}|6[27][0-9]{14})$/;
+/* eslint-enable max-len */
+
+function isCreditCard(str) {
+ (0, _assertString.default)(str);
+ var sanitized = str.replace(/[- ]+/g, '');
+
+ if (!creditCard.test(sanitized)) {
+ return false;
+ }
+
+ var sum = 0;
+ var digit;
+ var tmpNum;
+ var shouldDouble;
+
+ for (var i = sanitized.length - 1; i >= 0; i--) {
+ digit = sanitized.substring(i, i + 1);
+ tmpNum = parseInt(digit, 10);
+
+ if (shouldDouble) {
+ tmpNum *= 2;
+
+ if (tmpNum >= 10) {
+ sum += tmpNum % 10 + 1;
+ } else {
+ sum += tmpNum;
+ }
+ } else {
+ sum += tmpNum;
+ }
+
+ shouldDouble = !shouldDouble;
+ }
+
+ return !!(sum % 10 === 0 ? sanitized : false);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isCurrency.js b/src/node_modules/validator/lib/isCurrency.js
new file mode 100644
index 0000000..743b2e8
--- /dev/null
+++ b/src/node_modules/validator/lib/isCurrency.js
@@ -0,0 +1,89 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isCurrency;
+
+var _merge = _interopRequireDefault(require("./util/merge"));
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function currencyRegex(options) {
+ var decimal_digits = "\\d{".concat(options.digits_after_decimal[0], "}");
+ options.digits_after_decimal.forEach(function (digit, index) {
+ if (index !== 0) decimal_digits = "".concat(decimal_digits, "|\\d{").concat(digit, "}");
+ });
+ var symbol = "(\\".concat(options.symbol.replace(/\./g, '\\.'), ")").concat(options.require_symbol ? '' : '?'),
+ negative = '-?',
+ whole_dollar_amount_without_sep = '[1-9]\\d*',
+ whole_dollar_amount_with_sep = "[1-9]\\d{0,2}(\\".concat(options.thousands_separator, "\\d{3})*"),
+ valid_whole_dollar_amounts = ['0', whole_dollar_amount_without_sep, whole_dollar_amount_with_sep],
+ whole_dollar_amount = "(".concat(valid_whole_dollar_amounts.join('|'), ")?"),
+ decimal_amount = "(\\".concat(options.decimal_separator, "(").concat(decimal_digits, "))").concat(options.require_decimal ? '' : '?');
+ var pattern = whole_dollar_amount + (options.allow_decimal || options.require_decimal ? decimal_amount : ''); // default is negative sign before symbol, but there are two other options (besides parens)
+
+ if (options.allow_negatives && !options.parens_for_negatives) {
+ if (options.negative_sign_after_digits) {
+ pattern += negative;
+ } else if (options.negative_sign_before_digits) {
+ pattern = negative + pattern;
+ }
+ } // South African Rand, for example, uses R 123 (space) and R-123 (no space)
+
+
+ if (options.allow_negative_sign_placeholder) {
+ pattern = "( (?!\\-))?".concat(pattern);
+ } else if (options.allow_space_after_symbol) {
+ pattern = " ?".concat(pattern);
+ } else if (options.allow_space_after_digits) {
+ pattern += '( (?!$))?';
+ }
+
+ if (options.symbol_after_digits) {
+ pattern += symbol;
+ } else {
+ pattern = symbol + pattern;
+ }
+
+ if (options.allow_negatives) {
+ if (options.parens_for_negatives) {
+ pattern = "(\\(".concat(pattern, "\\)|").concat(pattern, ")");
+ } else if (!(options.negative_sign_before_digits || options.negative_sign_after_digits)) {
+ pattern = negative + pattern;
+ }
+ } // ensure there's a dollar and/or decimal amount, and that
+ // it doesn't start with a space or a negative sign followed by a space
+
+
+ return new RegExp("^(?!-? )(?=.*\\d)".concat(pattern, "$"));
+}
+
+var default_currency_options = {
+ symbol: '$',
+ require_symbol: false,
+ allow_space_after_symbol: false,
+ symbol_after_digits: false,
+ allow_negatives: true,
+ parens_for_negatives: false,
+ negative_sign_before_digits: false,
+ negative_sign_after_digits: false,
+ allow_negative_sign_placeholder: false,
+ thousands_separator: ',',
+ decimal_separator: '.',
+ allow_decimal: true,
+ require_decimal: false,
+ digits_after_decimal: [2],
+ allow_space_after_digits: false
+};
+
+function isCurrency(str, options) {
+ (0, _assertString.default)(str);
+ options = (0, _merge.default)(options, default_currency_options);
+ return currencyRegex(options).test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isDataURI.js b/src/node_modules/validator/lib/isDataURI.js
new file mode 100644
index 0000000..e882966
--- /dev/null
+++ b/src/node_modules/validator/lib/isDataURI.js
@@ -0,0 +1,54 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isDataURI;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var validMediaType = /^[a-z]+\/[a-z0-9\-\+]+$/i;
+var validAttribute = /^[a-z\-]+=[a-z0-9\-]+$/i;
+var validData = /^[a-z0-9!\$&'\(\)\*\+,;=\-\._~:@\/\?%\s]*$/i;
+
+function isDataURI(str) {
+ (0, _assertString.default)(str);
+ var data = str.split(',');
+
+ if (data.length < 2) {
+ return false;
+ }
+
+ var attributes = data.shift().trim().split(';');
+ var schemeAndMediaType = attributes.shift();
+
+ if (schemeAndMediaType.substr(0, 5) !== 'data:') {
+ return false;
+ }
+
+ var mediaType = schemeAndMediaType.substr(5);
+
+ if (mediaType !== '' && !validMediaType.test(mediaType)) {
+ return false;
+ }
+
+ for (var i = 0; i < attributes.length; i++) {
+ if (i === attributes.length - 1 && attributes[i].toLowerCase() === 'base64') {// ok
+ } else if (!validAttribute.test(attributes[i])) {
+ return false;
+ }
+ }
+
+ for (var _i = 0; _i < data.length; _i++) {
+ if (!validData.test(data[_i])) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isDecimal.js b/src/node_modules/validator/lib/isDecimal.js
new file mode 100644
index 0000000..d45b05f
--- /dev/null
+++ b/src/node_modules/validator/lib/isDecimal.js
@@ -0,0 +1,42 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isDecimal;
+
+var _merge = _interopRequireDefault(require("./util/merge"));
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _includes = _interopRequireDefault(require("./util/includes"));
+
+var _alpha = require("./alpha");
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function decimalRegExp(options) {
+ var regExp = new RegExp("^[-+]?([0-9]+)?(\\".concat(_alpha.decimal[options.locale], "[0-9]{").concat(options.decimal_digits, "})").concat(options.force_decimal ? '' : '?', "$"));
+ return regExp;
+}
+
+var default_decimal_options = {
+ force_decimal: false,
+ decimal_digits: '1,',
+ locale: 'en-US'
+};
+var blacklist = ['', '-', '+'];
+
+function isDecimal(str, options) {
+ (0, _assertString.default)(str);
+ options = (0, _merge.default)(options, default_decimal_options);
+
+ if (options.locale in _alpha.decimal) {
+ return !(0, _includes.default)(blacklist, str.replace(/ /g, '')) && decimalRegExp(options).test(str);
+ }
+
+ throw new Error("Invalid locale '".concat(options.locale, "'"));
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isDivisibleBy.js b/src/node_modules/validator/lib/isDivisibleBy.js
new file mode 100644
index 0000000..02408b3
--- /dev/null
+++ b/src/node_modules/validator/lib/isDivisibleBy.js
@@ -0,0 +1,20 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isDivisibleBy;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _toFloat = _interopRequireDefault(require("./toFloat"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function isDivisibleBy(str, num) {
+ (0, _assertString.default)(str);
+ return (0, _toFloat.default)(str) % parseInt(num, 10) === 0;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isEAN.js b/src/node_modules/validator/lib/isEAN.js
new file mode 100644
index 0000000..098c44c
--- /dev/null
+++ b/src/node_modules/validator/lib/isEAN.js
@@ -0,0 +1,80 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isEAN;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * The most commonly used EAN standard is
+ * the thirteen-digit EAN-13, while the
+ * less commonly used 8-digit EAN-8 barcode was
+ * introduced for use on small packages.
+ * EAN consists of:
+ * GS1 prefix, manufacturer code, product code and check digit
+ * Reference: https://en.wikipedia.org/wiki/International_Article_Number
+ */
+
+/**
+ * Define EAN Lenghts; 8 for EAN-8; 13 for EAN-13
+ * and Regular Expression for valid EANs (EAN-8, EAN-13),
+ * with exact numberic matching of 8 or 13 digits [0-9]
+ */
+var LENGTH_EAN_8 = 8;
+var validEanRegex = /^(\d{8}|\d{13})$/;
+/**
+ * Get position weight given:
+ * EAN length and digit index/position
+ *
+ * @param {number} length
+ * @param {number} index
+ * @return {number}
+ */
+
+function getPositionWeightThroughLengthAndIndex(length, index) {
+ if (length === LENGTH_EAN_8) {
+ return index % 2 === 0 ? 3 : 1;
+ }
+
+ return index % 2 === 0 ? 1 : 3;
+}
+/**
+ * Calculate EAN Check Digit
+ * Reference: https://en.wikipedia.org/wiki/International_Article_Number#Calculation_of_checksum_digit
+ *
+ * @param {string} ean
+ * @return {number}
+ */
+
+
+function calculateCheckDigit(ean) {
+ var checksum = ean.slice(0, -1).split('').map(function (char, index) {
+ return Number(char) * getPositionWeightThroughLengthAndIndex(ean.length, index);
+ }).reduce(function (acc, partialSum) {
+ return acc + partialSum;
+ }, 0);
+ var remainder = 10 - checksum % 10;
+ return remainder < 10 ? remainder : 0;
+}
+/**
+ * Check if string is valid EAN:
+ * Matches EAN-8/EAN-13 regex
+ * Has valid check digit.
+ *
+ * @param {string} str
+ * @return {boolean}
+ */
+
+
+function isEAN(str) {
+ (0, _assertString.default)(str);
+ var actualCheckDigit = Number(str.slice(-1));
+ return validEanRegex.test(str) && actualCheckDigit === calculateCheckDigit(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isEmail.js b/src/node_modules/validator/lib/isEmail.js
new file mode 100644
index 0000000..ca756cc
--- /dev/null
+++ b/src/node_modules/validator/lib/isEmail.js
@@ -0,0 +1,197 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isEmail;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _merge = _interopRequireDefault(require("./util/merge"));
+
+var _isByteLength = _interopRequireDefault(require("./isByteLength"));
+
+var _isFQDN = _interopRequireDefault(require("./isFQDN"));
+
+var _isIP = _interopRequireDefault(require("./isIP"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
+
+function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
+
+function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+
+function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
+
+var default_email_options = {
+ allow_display_name: false,
+ require_display_name: false,
+ allow_utf8_local_part: true,
+ require_tld: true
+};
+/* eslint-disable max-len */
+
+/* eslint-disable no-control-regex */
+
+var splitNameAddress = /^([^\x00-\x1F\x7F-\x9F\cX]+)<(.+)>$/i;
+var emailUserPart = /^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~]+$/i;
+var gmailUserPart = /^[a-z\d]+$/;
+var quotedEmailUser = /^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f]))*$/i;
+var emailUserUtf8Part = /^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+$/i;
+var quotedEmailUserUtf8 = /^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*$/i;
+var defaultMaxEmailLength = 254;
+/* eslint-enable max-len */
+
+/* eslint-enable no-control-regex */
+
+/**
+ * Validate display name according to the RFC2822: https://tools.ietf.org/html/rfc2822#appendix-A.1.2
+ * @param {String} display_name
+ */
+
+function validateDisplayName(display_name) {
+ var trim_quotes = display_name.match(/^"(.+)"$/i);
+ var display_name_without_quotes = trim_quotes ? trim_quotes[1] : display_name; // display name with only spaces is not valid
+
+ if (!display_name_without_quotes.trim()) {
+ return false;
+ } // check whether display name contains illegal character
+
+
+ var contains_illegal = /[\.";<>]/.test(display_name_without_quotes);
+
+ if (contains_illegal) {
+ // if contains illegal characters,
+ // must to be enclosed in double-quotes, otherwise it's not a valid display name
+ if (!trim_quotes) {
+ return false;
+ } // the quotes in display name must start with character symbol \
+
+
+ var all_start_with_back_slash = display_name_without_quotes.split('"').length === display_name_without_quotes.split('\\"').length;
+
+ if (!all_start_with_back_slash) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+function isEmail(str, options) {
+ (0, _assertString.default)(str);
+ options = (0, _merge.default)(options, default_email_options);
+
+ if (options.require_display_name || options.allow_display_name) {
+ var display_email = str.match(splitNameAddress);
+
+ if (display_email) {
+ var display_name;
+
+ var _display_email = _slicedToArray(display_email, 3);
+
+ display_name = _display_email[1];
+ str = _display_email[2];
+
+ // sometimes need to trim the last space to get the display name
+ // because there may be a space between display name and email address
+ // eg. myname <address@gmail.com>
+ // the display name is `myname` instead of `myname `, so need to trim the last space
+ if (display_name.endsWith(' ')) {
+ display_name = display_name.substr(0, display_name.length - 1);
+ }
+
+ if (!validateDisplayName(display_name)) {
+ return false;
+ }
+ } else if (options.require_display_name) {
+ return false;
+ }
+ }
+
+ if (!options.ignore_max_length && str.length > defaultMaxEmailLength) {
+ return false;
+ }
+
+ var parts = str.split('@');
+ var domain = parts.pop();
+ var user = parts.join('@');
+ var lower_domain = domain.toLowerCase();
+
+ if (options.domain_specific_validation && (lower_domain === 'gmail.com' || lower_domain === 'googlemail.com')) {
+ /*
+ Previously we removed dots for gmail addresses before validating.
+ This was removed because it allows `multiple..dots@gmail.com`
+ to be reported as valid, but it is not.
+ Gmail only normalizes single dots, removing them from here is pointless,
+ should be done in normalizeEmail
+ */
+ user = user.toLowerCase(); // Removing sub-address from username before gmail validation
+
+ var username = user.split('+')[0]; // Dots are not included in gmail length restriction
+
+ if (!(0, _isByteLength.default)(username.replace('.', ''), {
+ min: 6,
+ max: 30
+ })) {
+ return false;
+ }
+
+ var _user_parts = username.split('.');
+
+ for (var i = 0; i < _user_parts.length; i++) {
+ if (!gmailUserPart.test(_user_parts[i])) {
+ return false;
+ }
+ }
+ }
+
+ if (!(0, _isByteLength.default)(user, {
+ max: 64
+ }) || !(0, _isByteLength.default)(domain, {
+ max: 254
+ })) {
+ return false;
+ }
+
+ if (!(0, _isFQDN.default)(domain, {
+ require_tld: options.require_tld
+ })) {
+ if (!options.allow_ip_domain) {
+ return false;
+ }
+
+ if (!(0, _isIP.default)(domain)) {
+ if (!domain.startsWith('[') || !domain.endsWith(']')) {
+ return false;
+ }
+
+ var noBracketdomain = domain.substr(1, domain.length - 2);
+
+ if (noBracketdomain.length === 0 || !(0, _isIP.default)(noBracketdomain)) {
+ return false;
+ }
+ }
+ }
+
+ if (user[0] === '"') {
+ user = user.slice(1, user.length - 1);
+ return options.allow_utf8_local_part ? quotedEmailUserUtf8.test(user) : quotedEmailUser.test(user);
+ }
+
+ var pattern = options.allow_utf8_local_part ? emailUserUtf8Part : emailUserPart;
+ var user_parts = user.split('.');
+
+ for (var _i2 = 0; _i2 < user_parts.length; _i2++) {
+ if (!pattern.test(user_parts[_i2])) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isEmpty.js b/src/node_modules/validator/lib/isEmpty.js
new file mode 100644
index 0000000..26766d5
--- /dev/null
+++ b/src/node_modules/validator/lib/isEmpty.js
@@ -0,0 +1,25 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isEmpty;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _merge = _interopRequireDefault(require("./util/merge"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var default_is_empty_options = {
+ ignore_whitespace: false
+};
+
+function isEmpty(str, options) {
+ (0, _assertString.default)(str);
+ options = (0, _merge.default)(options, default_is_empty_options);
+ return (options.ignore_whitespace ? str.trim().length : str.length) === 0;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isEthereumAddress.js b/src/node_modules/validator/lib/isEthereumAddress.js
new file mode 100644
index 0000000..e6999b9
--- /dev/null
+++ b/src/node_modules/validator/lib/isEthereumAddress.js
@@ -0,0 +1,20 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isEthereumAddress;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var eth = /^(0x)[0-9a-f]{40}$/i;
+
+function isEthereumAddress(str) {
+ (0, _assertString.default)(str);
+ return eth.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isFQDN.js b/src/node_modules/validator/lib/isFQDN.js
new file mode 100644
index 0000000..b5c769d
--- /dev/null
+++ b/src/node_modules/validator/lib/isFQDN.js
@@ -0,0 +1,75 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isFQDN;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _merge = _interopRequireDefault(require("./util/merge"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var default_fqdn_options = {
+ require_tld: true,
+ allow_underscores: false,
+ allow_trailing_dot: false
+};
+
+function isFQDN(str, options) {
+ (0, _assertString.default)(str);
+ options = (0, _merge.default)(options, default_fqdn_options);
+ /* Remove the optional trailing dot before checking validity */
+
+ if (options.allow_trailing_dot && str[str.length - 1] === '.') {
+ str = str.substring(0, str.length - 1);
+ }
+
+ var parts = str.split('.');
+
+ for (var i = 0; i < parts.length; i++) {
+ if (parts[i].length > 63) {
+ return false;
+ }
+ }
+
+ if (options.require_tld) {
+ var tld = parts.pop();
+
+ if (!parts.length || !/^([a-z\u00a1-\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) {
+ return false;
+ } // disallow spaces
+
+
+ if (/[\s\u2002-\u200B\u202F\u205F\u3000\uFEFF\uDB40\uDC20]/.test(tld)) {
+ return false;
+ }
+ }
+
+ for (var part, _i = 0; _i < parts.length; _i++) {
+ part = parts[_i];
+
+ if (options.allow_underscores) {
+ part = part.replace(/_/g, '');
+ }
+
+ if (!/^[a-z\u00a1-\uffff0-9-]+$/i.test(part)) {
+ return false;
+ } // disallow full-width chars
+
+
+ if (/[\uff01-\uff5e]/.test(part)) {
+ return false;
+ }
+
+ if (part[0] === '-' || part[part.length - 1] === '-') {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isFloat.js b/src/node_modules/validator/lib/isFloat.js
new file mode 100644
index 0000000..3fdab86
--- /dev/null
+++ b/src/node_modules/validator/lib/isFloat.js
@@ -0,0 +1,29 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isFloat;
+exports.locales = void 0;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _alpha = require("./alpha");
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function isFloat(str, options) {
+ (0, _assertString.default)(str);
+ options = options || {};
+ var float = new RegExp("^(?:[-+])?(?:[0-9]+)?(?:\\".concat(options.locale ? _alpha.decimal[options.locale] : '.', "[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$"));
+
+ if (str === '' || str === '.' || str === '-' || str === '+') {
+ return false;
+ }
+
+ var value = parseFloat(str.replace(',', '.'));
+ return float.test(str) && (!options.hasOwnProperty('min') || value >= options.min) && (!options.hasOwnProperty('max') || value <= options.max) && (!options.hasOwnProperty('lt') || value < options.lt) && (!options.hasOwnProperty('gt') || value > options.gt);
+}
+
+var locales = Object.keys(_alpha.decimal);
+exports.locales = locales; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isFullWidth.js b/src/node_modules/validator/lib/isFullWidth.js
new file mode 100644
index 0000000..1960f13
--- /dev/null
+++ b/src/node_modules/validator/lib/isFullWidth.js
@@ -0,0 +1,19 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isFullWidth;
+exports.fullWidth = void 0;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var fullWidth = /[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;
+exports.fullWidth = fullWidth;
+
+function isFullWidth(str) {
+ (0, _assertString.default)(str);
+ return fullWidth.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isHSL.js b/src/node_modules/validator/lib/isHSL.js
new file mode 100644
index 0000000..5db62d7
--- /dev/null
+++ b/src/node_modules/validator/lib/isHSL.js
@@ -0,0 +1,21 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isHSL;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var hslcomma = /^(hsl)a?\(\s*((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn|\s*)(\s*,\s*(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}\s*(,\s*((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?)\s*)?\)$/i;
+var hslspace = /^(hsl)a?\(\s*((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn|\s)(\s*(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}\s*(\/\s*((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?)\s*)?\)$/i;
+
+function isHSL(str) {
+ (0, _assertString.default)(str);
+ return hslcomma.test(str) || hslspace.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isHalfWidth.js b/src/node_modules/validator/lib/isHalfWidth.js
new file mode 100644
index 0000000..55a9e1a
--- /dev/null
+++ b/src/node_modules/validator/lib/isHalfWidth.js
@@ -0,0 +1,19 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isHalfWidth;
+exports.halfWidth = void 0;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var halfWidth = /[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;
+exports.halfWidth = halfWidth;
+
+function isHalfWidth(str) {
+ (0, _assertString.default)(str);
+ return halfWidth.test(str);
+} \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isHash.js b/src/node_modules/validator/lib/isHash.js
new file mode 100644
index 0000000..1083966
--- /dev/null
+++ b/src/node_modules/validator/lib/isHash.js
@@ -0,0 +1,35 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isHash;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var lengths = {
+ md5: 32,
+ md4: 32,
+ sha1: 40,
+ sha256: 64,
+ sha384: 96,
+ sha512: 128,
+ ripemd128: 32,
+ ripemd160: 40,
+ tiger128: 32,
+ tiger160: 40,
+ tiger192: 48,
+ crc32: 8,
+ crc32b: 8
+};
+
+function isHash(str, algorithm) {
+ (0, _assertString.default)(str);
+ var hash = new RegExp("^[a-fA-F0-9]{".concat(lengths[algorithm], "}$"));
+ return hash.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isHexColor.js b/src/node_modules/validator/lib/isHexColor.js
new file mode 100644
index 0000000..7af3889
--- /dev/null
+++ b/src/node_modules/validator/lib/isHexColor.js
@@ -0,0 +1,20 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isHexColor;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var hexcolor = /^#?([0-9A-F]{3}|[0-9A-F]{4}|[0-9A-F]{6}|[0-9A-F]{8})$/i;
+
+function isHexColor(str) {
+ (0, _assertString.default)(str);
+ return hexcolor.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isHexadecimal.js b/src/node_modules/validator/lib/isHexadecimal.js
new file mode 100644
index 0000000..a1cf738
--- /dev/null
+++ b/src/node_modules/validator/lib/isHexadecimal.js
@@ -0,0 +1,20 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isHexadecimal;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var hexadecimal = /^(0x|0h)?[0-9A-F]+$/i;
+
+function isHexadecimal(str) {
+ (0, _assertString.default)(str);
+ return hexadecimal.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isIBAN.js b/src/node_modules/validator/lib/isIBAN.js
new file mode 100644
index 0000000..be5c512
--- /dev/null
+++ b/src/node_modules/validator/lib/isIBAN.js
@@ -0,0 +1,145 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isIBAN;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * List of country codes with
+ * corresponding IBAN regular expression
+ * Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number
+ */
+var ibanRegexThroughCountryCode = {
+ AD: /^(AD[0-9]{2})\d{8}[A-Z0-9]{12}$/,
+ AE: /^(AE[0-9]{2})\d{3}\d{16}$/,
+ AL: /^(AL[0-9]{2})\d{8}[A-Z0-9]{16}$/,
+ AT: /^(AT[0-9]{2})\d{16}$/,
+ AZ: /^(AZ[0-9]{2})[A-Z0-9]{4}\d{20}$/,
+ BA: /^(BA[0-9]{2})\d{16}$/,
+ BE: /^(BE[0-9]{2})\d{12}$/,
+ BG: /^(BG[0-9]{2})[A-Z]{4}\d{6}[A-Z0-9]{8}$/,
+ BH: /^(BH[0-9]{2})[A-Z]{4}[A-Z0-9]{14}$/,
+ BR: /^(BR[0-9]{2})\d{23}[A-Z]{1}[A-Z0-9]{1}$/,
+ BY: /^(BY[0-9]{2})[A-Z0-9]{4}\d{20}$/,
+ CH: /^(CH[0-9]{2})\d{5}[A-Z0-9]{12}$/,
+ CR: /^(CR[0-9]{2})\d{18}$/,
+ CY: /^(CY[0-9]{2})\d{8}[A-Z0-9]{16}$/,
+ CZ: /^(CZ[0-9]{2})\d{20}$/,
+ DE: /^(DE[0-9]{2})\d{18}$/,
+ DK: /^(DK[0-9]{2})\d{14}$/,
+ DO: /^(DO[0-9]{2})[A-Z]{4}\d{20}$/,
+ EE: /^(EE[0-9]{2})\d{16}$/,
+ ES: /^(ES[0-9]{2})\d{20}$/,
+ FI: /^(FI[0-9]{2})\d{14}$/,
+ FO: /^(FO[0-9]{2})\d{14}$/,
+ FR: /^(FR[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,
+ GB: /^(GB[0-9]{2})[A-Z]{4}\d{14}$/,
+ GE: /^(GE[0-9]{2})[A-Z0-9]{2}\d{16}$/,
+ GI: /^(GI[0-9]{2})[A-Z]{4}[A-Z0-9]{15}$/,
+ GL: /^(GL[0-9]{2})\d{14}$/,
+ GR: /^(GR[0-9]{2})\d{7}[A-Z0-9]{16}$/,
+ GT: /^(GT[0-9]{2})[A-Z0-9]{4}[A-Z0-9]{20}$/,
+ HR: /^(HR[0-9]{2})\d{17}$/,
+ HU: /^(HU[0-9]{2})\d{24}$/,
+ IE: /^(IE[0-9]{2})[A-Z0-9]{4}\d{14}$/,
+ IL: /^(IL[0-9]{2})\d{19}$/,
+ IQ: /^(IQ[0-9]{2})[A-Z]{4}\d{15}$/,
+ IS: /^(IS[0-9]{2})\d{22}$/,
+ IT: /^(IT[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,
+ JO: /^(JO[0-9]{2})[A-Z]{4}\d{22}$/,
+ KW: /^(KW[0-9]{2})[A-Z]{4}[A-Z0-9]{22}$/,
+ KZ: /^(KZ[0-9]{2})\d{3}[A-Z0-9]{13}$/,
+ LB: /^(LB[0-9]{2})\d{4}[A-Z0-9]{20}$/,
+ LC: /^(LC[0-9]{2})[A-Z]{4}[A-Z0-9]{24}$/,
+ LI: /^(LI[0-9]{2})\d{5}[A-Z0-9]{12}$/,
+ LT: /^(LT[0-9]{2})\d{16}$/,
+ LU: /^(LU[0-9]{2})\d{3}[A-Z0-9]{13}$/,
+ LV: /^(LV[0-9]{2})[A-Z]{4}[A-Z0-9]{13}$/,
+ MC: /^(MC[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,
+ MD: /^(MD[0-9]{2})[A-Z0-9]{20}$/,
+ ME: /^(ME[0-9]{2})\d{18}$/,
+ MK: /^(MK[0-9]{2})\d{3}[A-Z0-9]{10}\d{2}$/,
+ MR: /^(MR[0-9]{2})\d{23}$/,
+ MT: /^(MT[0-9]{2})[A-Z]{4}\d{5}[A-Z0-9]{18}$/,
+ MU: /^(MU[0-9]{2})[A-Z]{4}\d{19}[A-Z]{3}$/,
+ NL: /^(NL[0-9]{2})[A-Z]{4}\d{10}$/,
+ NO: /^(NO[0-9]{2})\d{11}$/,
+ PK: /^(PK[0-9]{2})[A-Z0-9]{4}\d{16}$/,
+ PL: /^(PL[0-9]{2})\d{24}$/,
+ PS: /^(PS[0-9]{2})[A-Z0-9]{4}\d{21}$/,
+ PT: /^(PT[0-9]{2})\d{21}$/,
+ QA: /^(QA[0-9]{2})[A-Z]{4}[A-Z0-9]{21}$/,
+ RO: /^(RO[0-9]{2})[A-Z]{4}[A-Z0-9]{16}$/,
+ RS: /^(RS[0-9]{2})\d{18}$/,
+ SA: /^(SA[0-9]{2})\d{2}[A-Z0-9]{18}$/,
+ SC: /^(SC[0-9]{2})[A-Z]{4}\d{20}[A-Z]{3}$/,
+ SE: /^(SE[0-9]{2})\d{20}$/,
+ SI: /^(SI[0-9]{2})\d{15}$/,
+ SK: /^(SK[0-9]{2})\d{20}$/,
+ SM: /^(SM[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,
+ TL: /^(TL[0-9]{2})\d{19}$/,
+ TN: /^(TN[0-9]{2})\d{20}$/,
+ TR: /^(TR[0-9]{2})\d{5}[A-Z0-9]{17}$/,
+ UA: /^(UA[0-9]{2})\d{6}[A-Z0-9]{19}$/,
+ VA: /^(VA[0-9]{2})\d{18}$/,
+ VG: /^(VG[0-9]{2})[A-Z0-9]{4}\d{16}$/,
+ XK: /^(XK[0-9]{2})\d{16}$/
+};
+/**
+ * Check whether string has correct universal IBAN format
+ * The IBAN consists of up to 34 alphanumeric characters, as follows:
+ * Country Code using ISO 3166-1 alpha-2, two letters
+ * check digits, two digits and
+ * Basic Bank Account Number (BBAN), up to 30 alphanumeric characters.
+ * NOTE: Permitted IBAN characters are: digits [0-9] and the 26 latin alphabetic [A-Z]
+ *
+ * @param {string} str - string under validation
+ * @return {boolean}
+ */
+
+function hasValidIbanFormat(str) {
+ // Strip white spaces and hyphens
+ var strippedStr = str.replace(/[\s\-]+/gi, '').toUpperCase();
+ var isoCountryCode = strippedStr.slice(0, 2).toUpperCase();
+ return isoCountryCode in ibanRegexThroughCountryCode && ibanRegexThroughCountryCode[isoCountryCode].test(strippedStr);
+}
+/**
+ * Check whether string has valid IBAN Checksum
+ * by performing basic mod-97 operation and
+ * the remainder should equal 1
+ * -- Start by rearranging the IBAN by moving the four initial characters to the end of the string
+ * -- Replace each letter in the string with two digits, A -> 10, B = 11, Z = 35
+ * -- Interpret the string as a decimal integer and
+ * -- compute the remainder on division by 97 (mod 97)
+ * Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number
+ *
+ * @param {string} str
+ * @return {boolean}
+ */
+
+
+function hasValidIbanChecksum(str) {
+ var strippedStr = str.replace(/[^A-Z0-9]+/gi, '').toUpperCase(); // Keep only digits and A-Z latin alphabetic
+
+ var rearranged = strippedStr.slice(4) + strippedStr.slice(0, 4);
+ var alphaCapsReplacedWithDigits = rearranged.replace(/[A-Z]/g, function (char) {
+ return char.charCodeAt(0) - 55;
+ });
+ var remainder = alphaCapsReplacedWithDigits.match(/\d{1,7}/g).reduce(function (acc, value) {
+ return Number(acc + value) % 97;
+ }, '');
+ return remainder === 1;
+}
+
+function isIBAN(str) {
+ (0, _assertString.default)(str);
+ return hasValidIbanFormat(str) && hasValidIbanChecksum(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isIP.js b/src/node_modules/validator/lib/isIP.js
new file mode 100644
index 0000000..b5a924c
--- /dev/null
+++ b/src/node_modules/validator/lib/isIP.js
@@ -0,0 +1,137 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isIP;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+11.3. Examples
+
+ The following addresses
+
+ fe80::1234 (on the 1st link of the node)
+ ff02::5678 (on the 5th link of the node)
+ ff08::9abc (on the 10th organization of the node)
+
+ would be represented as follows:
+
+ fe80::1234%1
+ ff02::5678%5
+ ff08::9abc%10
+
+ (Here we assume a natural translation from a zone index to the
+ <zone_id> part, where the Nth zone of any scope is translated into
+ "N".)
+
+ If we use interface names as <zone_id>, those addresses could also be
+ represented as follows:
+
+ fe80::1234%ne0
+ ff02::5678%pvc1.3
+ ff08::9abc%interface10
+
+ where the interface "ne0" belongs to the 1st link, "pvc1.3" belongs
+ to the 5th link, and "interface10" belongs to the 10th organization.
+ * * */
+var ipv4Maybe = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/;
+var ipv6Block = /^[0-9A-F]{1,4}$/i;
+
+function isIP(str) {
+ var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ (0, _assertString.default)(str);
+ version = String(version);
+
+ if (!version) {
+ return isIP(str, 4) || isIP(str, 6);
+ } else if (version === '4') {
+ if (!ipv4Maybe.test(str)) {
+ return false;
+ }
+
+ var parts = str.split('.').sort(function (a, b) {
+ return a - b;
+ });
+ return parts[3] <= 255;
+ } else if (version === '6') {
+ var addressAndZone = [str]; // ipv6 addresses could have scoped architecture
+ // according to https://tools.ietf.org/html/rfc4007#section-11
+
+ if (str.includes('%')) {
+ addressAndZone = str.split('%');
+
+ if (addressAndZone.length !== 2) {
+ // it must be just two parts
+ return false;
+ }
+
+ if (!addressAndZone[0].includes(':')) {
+ // the first part must be the address
+ return false;
+ }
+
+ if (addressAndZone[1] === '') {
+ // the second part must not be empty
+ return false;
+ }
+ }
+
+ var blocks = addressAndZone[0].split(':');
+ var foundOmissionBlock = false; // marker to indicate ::
+ // At least some OS accept the last 32 bits of an IPv6 address
+ // (i.e. 2 of the blocks) in IPv4 notation, and RFC 3493 says
+ // that '::ffff:a.b.c.d' is valid for IPv4-mapped IPv6 addresses,
+ // and '::a.b.c.d' is deprecated, but also valid.
+
+ var foundIPv4TransitionBlock = isIP(blocks[blocks.length - 1], 4);
+ var expectedNumberOfBlocks = foundIPv4TransitionBlock ? 7 : 8;
+
+ if (blocks.length > expectedNumberOfBlocks) {
+ return false;
+ } // initial or final ::
+
+
+ if (str === '::') {
+ return true;
+ } else if (str.substr(0, 2) === '::') {
+ blocks.shift();
+ blocks.shift();
+ foundOmissionBlock = true;
+ } else if (str.substr(str.length - 2) === '::') {
+ blocks.pop();
+ blocks.pop();
+ foundOmissionBlock = true;
+ }
+
+ for (var i = 0; i < blocks.length; ++i) {
+ // test for a :: which can not be at the string start/end
+ // since those cases have been handled above
+ if (blocks[i] === '' && i > 0 && i < blocks.length - 1) {
+ if (foundOmissionBlock) {
+ return false; // multiple :: in address
+ }
+
+ foundOmissionBlock = true;
+ } else if (foundIPv4TransitionBlock && i === blocks.length - 1) {// it has been checked before that the last
+ // block is a valid IPv4 address
+ } else if (!ipv6Block.test(blocks[i])) {
+ return false;
+ }
+ }
+
+ if (foundOmissionBlock) {
+ return blocks.length >= 1;
+ }
+
+ return blocks.length === expectedNumberOfBlocks;
+ }
+
+ return false;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isIPRange.js b/src/node_modules/validator/lib/isIPRange.js
new file mode 100644
index 0000000..8c6cbb5
--- /dev/null
+++ b/src/node_modules/validator/lib/isIPRange.js
@@ -0,0 +1,37 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isIPRange;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _isIP = _interopRequireDefault(require("./isIP"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var subnetMaybe = /^\d{1,2}$/;
+
+function isIPRange(str) {
+ (0, _assertString.default)(str);
+ var parts = str.split('/'); // parts[0] -> ip, parts[1] -> subnet
+
+ if (parts.length !== 2) {
+ return false;
+ }
+
+ if (!subnetMaybe.test(parts[1])) {
+ return false;
+ } // Disallow preceding 0 i.e. 01, 02, ...
+
+
+ if (parts[1].length > 1 && parts[1].startsWith('0')) {
+ return false;
+ }
+
+ return (0, _isIP.default)(parts[0], 4) && parts[1] <= 32 && parts[1] >= 0;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isISBN.js b/src/node_modules/validator/lib/isISBN.js
new file mode 100644
index 0000000..f00bb7a
--- /dev/null
+++ b/src/node_modules/validator/lib/isISBN.js
@@ -0,0 +1,65 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isISBN;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var isbn10Maybe = /^(?:[0-9]{9}X|[0-9]{10})$/;
+var isbn13Maybe = /^(?:[0-9]{13})$/;
+var factor = [1, 3];
+
+function isISBN(str) {
+ var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ (0, _assertString.default)(str);
+ version = String(version);
+
+ if (!version) {
+ return isISBN(str, 10) || isISBN(str, 13);
+ }
+
+ var sanitized = str.replace(/[\s-]+/g, '');
+ var checksum = 0;
+ var i;
+
+ if (version === '10') {
+ if (!isbn10Maybe.test(sanitized)) {
+ return false;
+ }
+
+ for (i = 0; i < 9; i++) {
+ checksum += (i + 1) * sanitized.charAt(i);
+ }
+
+ if (sanitized.charAt(9) === 'X') {
+ checksum += 10 * 10;
+ } else {
+ checksum += 10 * sanitized.charAt(9);
+ }
+
+ if (checksum % 11 === 0) {
+ return !!sanitized;
+ }
+ } else if (version === '13') {
+ if (!isbn13Maybe.test(sanitized)) {
+ return false;
+ }
+
+ for (i = 0; i < 12; i++) {
+ checksum += factor[i % 2] * sanitized.charAt(i);
+ }
+
+ if (sanitized.charAt(12) - (10 - checksum % 10) % 10 === 0) {
+ return !!sanitized;
+ }
+ }
+
+ return false;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isISIN.js b/src/node_modules/validator/lib/isISIN.js
new file mode 100644
index 0000000..cadcc92
--- /dev/null
+++ b/src/node_modules/validator/lib/isISIN.js
@@ -0,0 +1,52 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isISIN;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var isin = /^[A-Z]{2}[0-9A-Z]{9}[0-9]$/;
+
+function isISIN(str) {
+ (0, _assertString.default)(str);
+
+ if (!isin.test(str)) {
+ return false;
+ }
+
+ var checksumStr = str.replace(/[A-Z]/g, function (character) {
+ return parseInt(character, 36);
+ });
+ var sum = 0;
+ var digit;
+ var tmpNum;
+ var shouldDouble = true;
+
+ for (var i = checksumStr.length - 2; i >= 0; i--) {
+ digit = checksumStr.substring(i, i + 1);
+ tmpNum = parseInt(digit, 10);
+
+ if (shouldDouble) {
+ tmpNum *= 2;
+
+ if (tmpNum >= 10) {
+ sum += tmpNum + 1;
+ } else {
+ sum += tmpNum;
+ }
+ } else {
+ sum += tmpNum;
+ }
+
+ shouldDouble = !shouldDouble;
+ }
+
+ return parseInt(str.substr(str.length - 1), 10) === (10000 - sum) % 10;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isISO31661Alpha2.js b/src/node_modules/validator/lib/isISO31661Alpha2.js
new file mode 100644
index 0000000..44748a7
--- /dev/null
+++ b/src/node_modules/validator/lib/isISO31661Alpha2.js
@@ -0,0 +1,23 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isISO31661Alpha2;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _includes = _interopRequireDefault(require("./util/includes"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// from https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
+var validISO31661Alpha2CountriesCodes = ['AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM', 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW', 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW'];
+
+function isISO31661Alpha2(str) {
+ (0, _assertString.default)(str);
+ return (0, _includes.default)(validISO31661Alpha2CountriesCodes, str.toUpperCase());
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isISO31661Alpha3.js b/src/node_modules/validator/lib/isISO31661Alpha3.js
new file mode 100644
index 0000000..8dcaabd
--- /dev/null
+++ b/src/node_modules/validator/lib/isISO31661Alpha3.js
@@ -0,0 +1,23 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isISO31661Alpha3;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _includes = _interopRequireDefault(require("./util/includes"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// from https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3
+var validISO31661Alpha3CountriesCodes = ['AFG', 'ALA', 'ALB', 'DZA', 'ASM', 'AND', 'AGO', 'AIA', 'ATA', 'ATG', 'ARG', 'ARM', 'ABW', 'AUS', 'AUT', 'AZE', 'BHS', 'BHR', 'BGD', 'BRB', 'BLR', 'BEL', 'BLZ', 'BEN', 'BMU', 'BTN', 'BOL', 'BES', 'BIH', 'BWA', 'BVT', 'BRA', 'IOT', 'BRN', 'BGR', 'BFA', 'BDI', 'KHM', 'CMR', 'CAN', 'CPV', 'CYM', 'CAF', 'TCD', 'CHL', 'CHN', 'CXR', 'CCK', 'COL', 'COM', 'COG', 'COD', 'COK', 'CRI', 'CIV', 'HRV', 'CUB', 'CUW', 'CYP', 'CZE', 'DNK', 'DJI', 'DMA', 'DOM', 'ECU', 'EGY', 'SLV', 'GNQ', 'ERI', 'EST', 'ETH', 'FLK', 'FRO', 'FJI', 'FIN', 'FRA', 'GUF', 'PYF', 'ATF', 'GAB', 'GMB', 'GEO', 'DEU', 'GHA', 'GIB', 'GRC', 'GRL', 'GRD', 'GLP', 'GUM', 'GTM', 'GGY', 'GIN', 'GNB', 'GUY', 'HTI', 'HMD', 'VAT', 'HND', 'HKG', 'HUN', 'ISL', 'IND', 'IDN', 'IRN', 'IRQ', 'IRL', 'IMN', 'ISR', 'ITA', 'JAM', 'JPN', 'JEY', 'JOR', 'KAZ', 'KEN', 'KIR', 'PRK', 'KOR', 'KWT', 'KGZ', 'LAO', 'LVA', 'LBN', 'LSO', 'LBR', 'LBY', 'LIE', 'LTU', 'LUX', 'MAC', 'MKD', 'MDG', 'MWI', 'MYS', 'MDV', 'MLI', 'MLT', 'MHL', 'MTQ', 'MRT', 'MUS', 'MYT', 'MEX', 'FSM', 'MDA', 'MCO', 'MNG', 'MNE', 'MSR', 'MAR', 'MOZ', 'MMR', 'NAM', 'NRU', 'NPL', 'NLD', 'NCL', 'NZL', 'NIC', 'NER', 'NGA', 'NIU', 'NFK', 'MNP', 'NOR', 'OMN', 'PAK', 'PLW', 'PSE', 'PAN', 'PNG', 'PRY', 'PER', 'PHL', 'PCN', 'POL', 'PRT', 'PRI', 'QAT', 'REU', 'ROU', 'RUS', 'RWA', 'BLM', 'SHN', 'KNA', 'LCA', 'MAF', 'SPM', 'VCT', 'WSM', 'SMR', 'STP', 'SAU', 'SEN', 'SRB', 'SYC', 'SLE', 'SGP', 'SXM', 'SVK', 'SVN', 'SLB', 'SOM', 'ZAF', 'SGS', 'SSD', 'ESP', 'LKA', 'SDN', 'SUR', 'SJM', 'SWZ', 'SWE', 'CHE', 'SYR', 'TWN', 'TJK', 'TZA', 'THA', 'TLS', 'TGO', 'TKL', 'TON', 'TTO', 'TUN', 'TUR', 'TKM', 'TCA', 'TUV', 'UGA', 'UKR', 'ARE', 'GBR', 'USA', 'UMI', 'URY', 'UZB', 'VUT', 'VEN', 'VNM', 'VGB', 'VIR', 'WLF', 'ESH', 'YEM', 'ZMB', 'ZWE'];
+
+function isISO31661Alpha3(str) {
+ (0, _assertString.default)(str);
+ return (0, _includes.default)(validISO31661Alpha3CountriesCodes, str.toUpperCase());
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isISO8601.js b/src/node_modules/validator/lib/isISO8601.js
new file mode 100644
index 0000000..db6d880
--- /dev/null
+++ b/src/node_modules/validator/lib/isISO8601.js
@@ -0,0 +1,57 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isISO8601;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/* eslint-disable max-len */
+// from http://goo.gl/0ejHHW
+var iso8601 = /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;
+/* eslint-enable max-len */
+
+var isValidDate = function isValidDate(str) {
+ // str must have passed the ISO8601 check
+ // this check is meant to catch invalid dates
+ // like 2009-02-31
+ // first check for ordinal dates
+ var ordinalMatch = str.match(/^(\d{4})-?(\d{3})([ T]{1}\.*|$)/);
+
+ if (ordinalMatch) {
+ var oYear = Number(ordinalMatch[1]);
+ var oDay = Number(ordinalMatch[2]); // if is leap year
+
+ if (oYear % 4 === 0 && oYear % 100 !== 0 || oYear % 400 === 0) return oDay <= 366;
+ return oDay <= 365;
+ }
+
+ var match = str.match(/(\d{4})-?(\d{0,2})-?(\d*)/).map(Number);
+ var year = match[1];
+ var month = match[2];
+ var day = match[3];
+ var monthString = month ? "0".concat(month).slice(-2) : month;
+ var dayString = day ? "0".concat(day).slice(-2) : day; // create a date object and compare
+
+ var d = new Date("".concat(year, "-").concat(monthString || '01', "-").concat(dayString || '01'));
+
+ if (month && day) {
+ return d.getUTCFullYear() === year && d.getUTCMonth() + 1 === month && d.getUTCDate() === day;
+ }
+
+ return true;
+};
+
+function isISO8601(str, options) {
+ (0, _assertString.default)(str);
+ var check = iso8601.test(str);
+ if (!options) return check;
+ if (check && options.strict) return isValidDate(str);
+ return check;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isISRC.js b/src/node_modules/validator/lib/isISRC.js
new file mode 100644
index 0000000..c5ce1e2
--- /dev/null
+++ b/src/node_modules/validator/lib/isISRC.js
@@ -0,0 +1,21 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isISRC;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// see http://isrc.ifpi.org/en/isrc-standard/code-syntax
+var isrc = /^[A-Z]{2}[0-9A-Z]{3}\d{2}\d{5}$/;
+
+function isISRC(str) {
+ (0, _assertString.default)(str);
+ return isrc.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isISSN.js b/src/node_modules/validator/lib/isISSN.js
new file mode 100644
index 0000000..eee87b3
--- /dev/null
+++ b/src/node_modules/validator/lib/isISSN.js
@@ -0,0 +1,37 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isISSN;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var issn = '^\\d{4}-?\\d{3}[\\dX]$';
+
+function isISSN(str) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ (0, _assertString.default)(str);
+ var testIssn = issn;
+ testIssn = options.require_hyphen ? testIssn.replace('?', '') : testIssn;
+ testIssn = options.case_sensitive ? new RegExp(testIssn) : new RegExp(testIssn, 'i');
+
+ if (!testIssn.test(str)) {
+ return false;
+ }
+
+ var digits = str.replace('-', '').toUpperCase();
+ var checksum = 0;
+
+ for (var i = 0; i < digits.length; i++) {
+ var digit = digits[i];
+ checksum += (digit === 'X' ? 10 : +digit) * (8 - i);
+ }
+
+ return checksum % 11 === 0;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isIdentityCard.js b/src/node_modules/validator/lib/isIdentityCard.js
new file mode 100644
index 0000000..0a26d44
--- /dev/null
+++ b/src/node_modules/validator/lib/isIdentityCard.js
@@ -0,0 +1,127 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isIdentityCard;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var validators = {
+ ES: function ES(str) {
+ (0, _assertString.default)(str);
+ var DNI = /^[0-9X-Z][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/;
+ var charsValue = {
+ X: 0,
+ Y: 1,
+ Z: 2
+ };
+ var controlDigits = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E']; // sanitize user input
+
+ var sanitized = str.trim().toUpperCase(); // validate the data structure
+
+ if (!DNI.test(sanitized)) {
+ return false;
+ } // validate the control digit
+
+
+ var number = sanitized.slice(0, -1).replace(/[X,Y,Z]/g, function (char) {
+ return charsValue[char];
+ });
+ return sanitized.endsWith(controlDigits[number % 23]);
+ },
+ 'he-IL': function heIL(str) {
+ var DNI = /^\d{9}$/; // sanitize user input
+
+ var sanitized = str.trim(); // validate the data structure
+
+ if (!DNI.test(sanitized)) {
+ return false;
+ }
+
+ var id = sanitized;
+ var sum = 0,
+ incNum;
+
+ for (var i = 0; i < id.length; i++) {
+ incNum = Number(id[i]) * (i % 2 + 1); // Multiply number by 1 or 2
+
+ sum += incNum > 9 ? incNum - 9 : incNum; // Sum the digits up and add to total
+ }
+
+ return sum % 10 === 0;
+ },
+ 'zh-TW': function zhTW(str) {
+ var ALPHABET_CODES = {
+ A: 10,
+ B: 11,
+ C: 12,
+ D: 13,
+ E: 14,
+ F: 15,
+ G: 16,
+ H: 17,
+ I: 34,
+ J: 18,
+ K: 19,
+ L: 20,
+ M: 21,
+ N: 22,
+ O: 35,
+ P: 23,
+ Q: 24,
+ R: 25,
+ S: 26,
+ T: 27,
+ U: 28,
+ V: 29,
+ W: 32,
+ X: 30,
+ Y: 31,
+ Z: 33
+ };
+ var sanitized = str.trim().toUpperCase();
+ if (!/^[A-Z][0-9]{9}$/.test(sanitized)) return false;
+ return Array.from(sanitized).reduce(function (sum, number, index) {
+ if (index === 0) {
+ var code = ALPHABET_CODES[number];
+ return code % 10 * 9 + Math.floor(code / 10);
+ }
+
+ if (index === 9) {
+ return (10 - sum % 10 - Number(number)) % 10 === 0;
+ }
+
+ return sum + Number(number) * (9 - index);
+ }, 0);
+ }
+};
+
+function isIdentityCard(str, locale) {
+ (0, _assertString.default)(str);
+
+ if (locale in validators) {
+ return validators[locale](str);
+ } else if (locale === 'any') {
+ for (var key in validators) {
+ // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
+ // istanbul ignore else
+ if (validators.hasOwnProperty(key)) {
+ var validator = validators[key];
+
+ if (validator(str)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ throw new Error("Invalid locale '".concat(locale, "'"));
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isIn.js b/src/node_modules/validator/lib/isIn.js
new file mode 100644
index 0000000..62c5a4d
--- /dev/null
+++ b/src/node_modules/validator/lib/isIn.js
@@ -0,0 +1,42 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isIn;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _toString = _interopRequireDefault(require("./util/toString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function isIn(str, options) {
+ (0, _assertString.default)(str);
+ var i;
+
+ if (Object.prototype.toString.call(options) === '[object Array]') {
+ var array = [];
+
+ for (i in options) {
+ // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
+ // istanbul ignore else
+ if ({}.hasOwnProperty.call(options, i)) {
+ array[i] = (0, _toString.default)(options[i]);
+ }
+ }
+
+ return array.indexOf(str) >= 0;
+ } else if (_typeof(options) === 'object') {
+ return options.hasOwnProperty(str);
+ } else if (options && typeof options.indexOf === 'function') {
+ return options.indexOf(str) >= 0;
+ }
+
+ return false;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isInt.js b/src/node_modules/validator/lib/isInt.js
new file mode 100644
index 0000000..40f776c
--- /dev/null
+++ b/src/node_modules/validator/lib/isInt.js
@@ -0,0 +1,30 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isInt;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var int = /^(?:[-+]?(?:0|[1-9][0-9]*))$/;
+var intLeadingZeroes = /^[-+]?[0-9]+$/;
+
+function isInt(str, options) {
+ (0, _assertString.default)(str);
+ options = options || {}; // Get the regex to use for testing, based on whether
+ // leading zeroes are allowed or not.
+
+ var regex = options.hasOwnProperty('allow_leading_zeroes') && !options.allow_leading_zeroes ? int : intLeadingZeroes; // Check min/max/lt/gt
+
+ var minCheckPassed = !options.hasOwnProperty('min') || str >= options.min;
+ var maxCheckPassed = !options.hasOwnProperty('max') || str <= options.max;
+ var ltCheckPassed = !options.hasOwnProperty('lt') || str < options.lt;
+ var gtCheckPassed = !options.hasOwnProperty('gt') || str > options.gt;
+ return regex.test(str) && minCheckPassed && maxCheckPassed && ltCheckPassed && gtCheckPassed;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isJSON.js b/src/node_modules/validator/lib/isJSON.js
new file mode 100644
index 0000000..df37913
--- /dev/null
+++ b/src/node_modules/validator/lib/isJSON.js
@@ -0,0 +1,28 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isJSON;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function isJSON(str) {
+ (0, _assertString.default)(str);
+
+ try {
+ var obj = JSON.parse(str);
+ return !!obj && _typeof(obj) === 'object';
+ } catch (e) {
+ /* ignore */
+ }
+
+ return false;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isJWT.js b/src/node_modules/validator/lib/isJWT.js
new file mode 100644
index 0000000..9dfb7cf
--- /dev/null
+++ b/src/node_modules/validator/lib/isJWT.js
@@ -0,0 +1,20 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isJWT;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var jwt = /^([A-Za-z0-9\-_~+\/]+[=]{0,2})\.([A-Za-z0-9\-_~+\/]+[=]{0,2})(?:\.([A-Za-z0-9\-_~+\/]+[=]{0,2}))?$/;
+
+function isJWT(str) {
+ (0, _assertString.default)(str);
+ return jwt.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isLatLong.js b/src/node_modules/validator/lib/isLatLong.js
new file mode 100644
index 0000000..01ac576
--- /dev/null
+++ b/src/node_modules/validator/lib/isLatLong.js
@@ -0,0 +1,24 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = _default;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var lat = /^\(?[+-]?(90(\.0+)?|[1-8]?\d(\.\d+)?)$/;
+var long = /^\s?[+-]?(180(\.0+)?|1[0-7]\d(\.\d+)?|\d{1,2}(\.\d+)?)\)?$/;
+
+function _default(str) {
+ (0, _assertString.default)(str);
+ if (!str.includes(',')) return false;
+ var pair = str.split(',');
+ if (pair[0].startsWith('(') && !pair[1].endsWith(')') || pair[1].endsWith(')') && !pair[0].startsWith('(')) return false;
+ return lat.test(pair[0]) && long.test(pair[1]);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isLength.js b/src/node_modules/validator/lib/isLength.js
new file mode 100644
index 0000000..39b7597
--- /dev/null
+++ b/src/node_modules/validator/lib/isLength.js
@@ -0,0 +1,35 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isLength;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+/* eslint-disable prefer-rest-params */
+function isLength(str, options) {
+ (0, _assertString.default)(str);
+ var min;
+ var max;
+
+ if (_typeof(options) === 'object') {
+ min = options.min || 0;
+ max = options.max;
+ } else {
+ // backwards compatibility: isLength(str, min [, max])
+ min = arguments[1] || 0;
+ max = arguments[2];
+ }
+
+ var surrogatePairs = str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g) || [];
+ var len = str.length - surrogatePairs.length;
+ return len >= min && (typeof max === 'undefined' || len <= max);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isLocale.js b/src/node_modules/validator/lib/isLocale.js
new file mode 100644
index 0000000..8ed8ecd
--- /dev/null
+++ b/src/node_modules/validator/lib/isLocale.js
@@ -0,0 +1,25 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isLocale;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var localeReg = /^[A-z]{2,4}([_-]([A-z]{4}|[\d]{3}))?([_-]([A-z]{2}|[\d]{3}))?$/;
+
+function isLocale(str) {
+ (0, _assertString.default)(str);
+
+ if (str === 'en_US_POSIX' || str === 'ca_ES_VALENCIA') {
+ return true;
+ }
+
+ return localeReg.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isLowercase.js b/src/node_modules/validator/lib/isLowercase.js
new file mode 100644
index 0000000..7f412d9
--- /dev/null
+++ b/src/node_modules/validator/lib/isLowercase.js
@@ -0,0 +1,18 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isLowercase;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function isLowercase(str) {
+ (0, _assertString.default)(str);
+ return str === str.toLowerCase();
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isMACAddress.js b/src/node_modules/validator/lib/isMACAddress.js
new file mode 100644
index 0000000..bc2c9de
--- /dev/null
+++ b/src/node_modules/validator/lib/isMACAddress.js
@@ -0,0 +1,29 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isMACAddress;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var macAddress = /^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$/;
+var macAddressNoColons = /^([0-9a-fA-F]){12}$/;
+var macAddressWithHyphen = /^([0-9a-fA-F][0-9a-fA-F]-){5}([0-9a-fA-F][0-9a-fA-F])$/;
+var macAddressWithSpaces = /^([0-9a-fA-F][0-9a-fA-F]\s){5}([0-9a-fA-F][0-9a-fA-F])$/;
+var macAddressWithDots = /^([0-9a-fA-F]{4}).([0-9a-fA-F]{4}).([0-9a-fA-F]{4})$/;
+
+function isMACAddress(str, options) {
+ (0, _assertString.default)(str);
+
+ if (options && options.no_colons) {
+ return macAddressNoColons.test(str);
+ }
+
+ return macAddress.test(str) || macAddressWithHyphen.test(str) || macAddressWithSpaces.test(str) || macAddressWithDots.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isMD5.js b/src/node_modules/validator/lib/isMD5.js
new file mode 100644
index 0000000..57f2b0e
--- /dev/null
+++ b/src/node_modules/validator/lib/isMD5.js
@@ -0,0 +1,20 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isMD5;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var md5 = /^[a-f0-9]{32}$/;
+
+function isMD5(str) {
+ (0, _assertString.default)(str);
+ return md5.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isMagnetURI.js b/src/node_modules/validator/lib/isMagnetURI.js
new file mode 100644
index 0000000..79aab33
--- /dev/null
+++ b/src/node_modules/validator/lib/isMagnetURI.js
@@ -0,0 +1,20 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isMagnetURI;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var magnetURI = /^magnet:\?xt=urn:[a-z0-9]+:[a-z0-9]{32,40}&dn=.+&tr=.+$/i;
+
+function isMagnetURI(url) {
+ (0, _assertString.default)(url);
+ return magnetURI.test(url.trim());
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isMimeType.js b/src/node_modules/validator/lib/isMimeType.js
new file mode 100644
index 0000000..917aef2
--- /dev/null
+++ b/src/node_modules/validator/lib/isMimeType.js
@@ -0,0 +1,51 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isMimeType;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/*
+ Checks if the provided string matches to a correct Media type format (MIME type)
+
+ This function only checks is the string format follows the
+ etablished rules by the according RFC specifications.
+ This function supports 'charset' in textual media types
+ (https://tools.ietf.org/html/rfc6657).
+
+ This function does not check against all the media types listed
+ by the IANA (https://www.iana.org/assignments/media-types/media-types.xhtml)
+ because of lightness purposes : it would require to include
+ all these MIME types in this librairy, which would weigh it
+ significantly. This kind of effort maybe is not worth for the use that
+ this function has in this entire librairy.
+
+ More informations in the RFC specifications :
+ - https://tools.ietf.org/html/rfc2045
+ - https://tools.ietf.org/html/rfc2046
+ - https://tools.ietf.org/html/rfc7231#section-3.1.1.1
+ - https://tools.ietf.org/html/rfc7231#section-3.1.1.5
+*/
+// Match simple MIME types
+// NB :
+// Subtype length must not exceed 100 characters.
+// This rule does not comply to the RFC specs (what is the max length ?).
+var mimeTypeSimple = /^(application|audio|font|image|message|model|multipart|text|video)\/[a-zA-Z0-9\.\-\+]{1,100}$/i; // eslint-disable-line max-len
+// Handle "charset" in "text/*"
+
+var mimeTypeText = /^text\/[a-zA-Z0-9\.\-\+]{1,100};\s?charset=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?$/i; // eslint-disable-line max-len
+// Handle "boundary" in "multipart/*"
+
+var mimeTypeMultipart = /^multipart\/[a-zA-Z0-9\.\-\+]{1,100}(;\s?(boundary|charset)=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?){0,2}$/i; // eslint-disable-line max-len
+
+function isMimeType(str) {
+ (0, _assertString.default)(str);
+ return mimeTypeSimple.test(str) || mimeTypeText.test(str) || mimeTypeMultipart.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isMobilePhone.js b/src/node_modules/validator/lib/isMobilePhone.js
new file mode 100644
index 0000000..c65c1e2
--- /dev/null
+++ b/src/node_modules/validator/lib/isMobilePhone.js
@@ -0,0 +1,153 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isMobilePhone;
+exports.locales = void 0;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/* eslint-disable max-len */
+var phones = {
+ 'am-AM': /^(\+?374|0)((10|[9|7][0-9])\d{6}$|[2-4]\d{7}$)/,
+ 'ar-AE': /^((\+?971)|0)?5[024568]\d{7}$/,
+ 'ar-BH': /^(\+?973)?(3|6)\d{7}$/,
+ 'ar-DZ': /^(\+?213|0)(5|6|7)\d{8}$/,
+ 'ar-EG': /^((\+?20)|0)?1[0125]\d{8}$/,
+ 'ar-IQ': /^(\+?964|0)?7[0-9]\d{8}$/,
+ 'ar-JO': /^(\+?962|0)?7[789]\d{7}$/,
+ 'ar-KW': /^(\+?965)[569]\d{7}$/,
+ 'ar-SA': /^(!?(\+?966)|0)?5\d{8}$/,
+ 'ar-SY': /^(!?(\+?963)|0)?9\d{8}$/,
+ 'ar-TN': /^(\+?216)?[2459]\d{7}$/,
+ 'be-BY': /^(\+?375)?(24|25|29|33|44)\d{7}$/,
+ 'bg-BG': /^(\+?359|0)?8[789]\d{7}$/,
+ 'bn-BD': /^(\+?880|0)1[13456789][0-9]{8}$/,
+ 'cs-CZ': /^(\+?420)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,
+ 'da-DK': /^(\+?45)?\s?\d{2}\s?\d{2}\s?\d{2}\s?\d{2}$/,
+ 'de-DE': /^(\+49)?0?1(5[0-25-9]\d|6([23]|0\d?)|7([0-57-9]|6\d))\d{7}$/,
+ 'de-AT': /^(\+43|0)\d{1,4}\d{3,12}$/,
+ 'el-GR': /^(\+?30|0)?(69\d{8})$/,
+ 'en-AU': /^(\+?61|0)4\d{8}$/,
+ 'en-GB': /^(\+?44|0)7\d{9}$/,
+ 'en-GG': /^(\+?44|0)1481\d{6}$/,
+ 'en-GH': /^(\+233|0)(20|50|24|54|27|57|26|56|23|28)\d{7}$/,
+ 'en-HK': /^(\+?852[-\s]?)?[456789]\d{3}[-\s]?\d{4}$/,
+ 'en-MO': /^(\+?853[-\s]?)?[6]\d{3}[-\s]?\d{4}$/,
+ 'en-IE': /^(\+?353|0)8[356789]\d{7}$/,
+ 'en-IN': /^(\+?91|0)?[6789]\d{9}$/,
+ 'en-KE': /^(\+?254|0)(7|1)\d{8}$/,
+ 'en-MT': /^(\+?356|0)?(99|79|77|21|27|22|25)[0-9]{6}$/,
+ 'en-MU': /^(\+?230|0)?\d{8}$/,
+ 'en-NG': /^(\+?234|0)?[789]\d{9}$/,
+ 'en-NZ': /^(\+?64|0)[28]\d{7,9}$/,
+ 'en-PK': /^((\+92)|(0092))-{0,1}\d{3}-{0,1}\d{7}$|^\d{11}$|^\d{4}-\d{7}$/,
+ 'en-RW': /^(\+?250|0)?[7]\d{8}$/,
+ 'en-SG': /^(\+65)?[89]\d{7}$/,
+ 'en-TZ': /^(\+?255|0)?[67]\d{8}$/,
+ 'en-UG': /^(\+?256|0)?[7]\d{8}$/,
+ 'en-US': /^((\+1|1)?( |-)?)?(\([2-9][0-9]{2}\)|[2-9][0-9]{2})( |-)?([2-9][0-9]{2}( |-)?[0-9]{4})$/,
+ 'en-ZA': /^(\+?27|0)\d{9}$/,
+ 'en-ZM': /^(\+?26)?09[567]\d{7}$/,
+ 'es-CL': /^(\+?56|0)[2-9]\d{1}\d{7}$/,
+ 'es-EC': /^(\+?593|0)([2-7]|9[2-9])\d{7}$/,
+ 'es-ES': /^(\+?34)?(6\d{1}|7[1234])\d{7}$/,
+ 'es-MX': /^(\+?52)?(1|01)?\d{10,11}$/,
+ 'es-PA': /^(\+?507)\d{7,8}$/,
+ 'es-PY': /^(\+?595|0)9[9876]\d{7}$/,
+ 'es-UY': /^(\+598|0)9[1-9][\d]{6}$/,
+ 'et-EE': /^(\+?372)?\s?(5|8[1-4])\s?([0-9]\s?){6,7}$/,
+ 'fa-IR': /^(\+?98[\-\s]?|0)9[0-39]\d[\-\s]?\d{3}[\-\s]?\d{4}$/,
+ 'fi-FI': /^(\+?358|0)\s?(4(0|1|2|4|5|6)?|50)\s?(\d\s?){4,8}\d$/,
+ 'fj-FJ': /^(\+?679)?\s?\d{3}\s?\d{4}$/,
+ 'fo-FO': /^(\+?298)?\s?\d{2}\s?\d{2}\s?\d{2}$/,
+ 'fr-FR': /^(\+?33|0)[67]\d{8}$/,
+ 'fr-GF': /^(\+?594|0|00594)[67]\d{8}$/,
+ 'fr-GP': /^(\+?590|0|00590)[67]\d{8}$/,
+ 'fr-MQ': /^(\+?596|0|00596)[67]\d{8}$/,
+ 'fr-RE': /^(\+?262|0|00262)[67]\d{8}$/,
+ 'he-IL': /^(\+972|0)([23489]|5[012345689]|77)[1-9]\d{6}$/,
+ 'hu-HU': /^(\+?36)(20|30|70)\d{7}$/,
+ 'id-ID': /^(\+?62|0)8(1[123456789]|2[1238]|3[1238]|5[12356789]|7[78]|9[56789]|8[123456789])([\s?|\d]{5,11})$/,
+ 'it-IT': /^(\+?39)?\s?3\d{2} ?\d{6,7}$/,
+ 'ja-JP': /^(\+81[ \-]?(\(0\))?|0)[6789]0[ \-]?\d{4}[ \-]?\d{4}$/,
+ 'kk-KZ': /^(\+?7|8)?7\d{9}$/,
+ 'kl-GL': /^(\+?299)?\s?\d{2}\s?\d{2}\s?\d{2}$/,
+ 'ko-KR': /^((\+?82)[ \-]?)?0?1([0|1|6|7|8|9]{1})[ \-]?\d{3,4}[ \-]?\d{4}$/,
+ 'lt-LT': /^(\+370|8)\d{8}$/,
+ 'ms-MY': /^(\+?6?01){1}(([0145]{1}(\-|\s)?\d{7,8})|([236789]{1}(\s|\-)?\d{7}))$/,
+ 'nb-NO': /^(\+?47)?[49]\d{7}$/,
+ 'ne-NP': /^(\+?977)?9[78]\d{8}$/,
+ 'nl-BE': /^(\+?32|0)4?\d{8}$/,
+ 'nl-NL': /^(\+?31|0)6?\d{8}$/,
+ 'nn-NO': /^(\+?47)?[49]\d{7}$/,
+ 'pl-PL': /^(\+?48)? ?[5-8]\d ?\d{3} ?\d{2} ?\d{2}$/,
+ 'pt-BR': /(?=^(\+?5{2}\-?|0)[1-9]{2}\-?\d{4}\-?\d{4}$)(^(\+?5{2}\-?|0)[1-9]{2}\-?[6-9]{1}\d{3}\-?\d{4}$)|(^(\+?5{2}\-?|0)[1-9]{2}\-?9[6-9]{1}\d{3}\-?\d{4}$)/,
+ 'pt-PT': /^(\+?351)?9[1236]\d{7}$/,
+ 'ro-RO': /^(\+?4?0)\s?7\d{2}(\/|\s|\.|\-)?\d{3}(\s|\.|\-)?\d{3}$/,
+ 'ru-RU': /^(\+?7|8)?9\d{9}$/,
+ 'sl-SI': /^(\+386\s?|0)(\d{1}\s?\d{3}\s?\d{2}\s?\d{2}|\d{2}\s?\d{3}\s?\d{3})$/,
+ 'sk-SK': /^(\+?421)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,
+ 'sr-RS': /^(\+3816|06)[- \d]{5,9}$/,
+ 'sv-SE': /^(\+?46|0)[\s\-]?7[\s\-]?[02369]([\s\-]?\d){7}$/,
+ 'th-TH': /^(\+66|66|0)\d{9}$/,
+ 'tr-TR': /^(\+?90|0)?5\d{9}$/,
+ 'uk-UA': /^(\+?38|8)?0\d{9}$/,
+ 'vi-VN': /^(\+?84|0)((3([2-9]))|(5([2689]))|(7([0|6-9]))|(8([1-6|89]))|(9([0-9])))([0-9]{7})$/,
+ 'zh-CN': /^((\+|00)86)?1([358][0-9]|4[579]|6[67]|7[01235678]|9[189])[0-9]{8}$/,
+ 'zh-TW': /^(\+?886\-?|0)?9\d{8}$/
+};
+/* eslint-enable max-len */
+// aliases
+
+phones['en-CA'] = phones['en-US'];
+phones['fr-BE'] = phones['nl-BE'];
+phones['zh-HK'] = phones['en-HK'];
+phones['zh-MO'] = phones['en-MO'];
+
+function isMobilePhone(str, locale, options) {
+ (0, _assertString.default)(str);
+
+ if (options && options.strictMode && !str.startsWith('+')) {
+ return false;
+ }
+
+ if (Array.isArray(locale)) {
+ return locale.some(function (key) {
+ // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
+ // istanbul ignore else
+ if (phones.hasOwnProperty(key)) {
+ var phone = phones[key];
+
+ if (phone.test(str)) {
+ return true;
+ }
+ }
+
+ return false;
+ });
+ } else if (locale in phones) {
+ return phones[locale].test(str); // alias falsey locale as 'any'
+ } else if (!locale || locale === 'any') {
+ for (var key in phones) {
+ // istanbul ignore else
+ if (phones.hasOwnProperty(key)) {
+ var phone = phones[key];
+
+ if (phone.test(str)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ throw new Error("Invalid locale '".concat(locale, "'"));
+}
+
+var locales = Object.keys(phones);
+exports.locales = locales; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isMongoId.js b/src/node_modules/validator/lib/isMongoId.js
new file mode 100644
index 0000000..2e9884d
--- /dev/null
+++ b/src/node_modules/validator/lib/isMongoId.js
@@ -0,0 +1,20 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isMongoId;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _isHexadecimal = _interopRequireDefault(require("./isHexadecimal"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function isMongoId(str) {
+ (0, _assertString.default)(str);
+ return (0, _isHexadecimal.default)(str) && str.length === 24;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isMultibyte.js b/src/node_modules/validator/lib/isMultibyte.js
new file mode 100644
index 0000000..3b4477e
--- /dev/null
+++ b/src/node_modules/validator/lib/isMultibyte.js
@@ -0,0 +1,22 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isMultibyte;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/* eslint-disable no-control-regex */
+var multibyte = /[^\x00-\x7F]/;
+/* eslint-enable no-control-regex */
+
+function isMultibyte(str) {
+ (0, _assertString.default)(str);
+ return multibyte.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isNumeric.js b/src/node_modules/validator/lib/isNumeric.js
new file mode 100644
index 0000000..8c1bc44
--- /dev/null
+++ b/src/node_modules/validator/lib/isNumeric.js
@@ -0,0 +1,26 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isNumeric;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var numeric = /^[+-]?([0-9]*[.])?[0-9]+$/;
+var numericNoSymbols = /^[0-9]+$/;
+
+function isNumeric(str, options) {
+ (0, _assertString.default)(str);
+
+ if (options && options.no_symbols) {
+ return numericNoSymbols.test(str);
+ }
+
+ return numeric.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isOctal.js b/src/node_modules/validator/lib/isOctal.js
new file mode 100644
index 0000000..8d3a1c7
--- /dev/null
+++ b/src/node_modules/validator/lib/isOctal.js
@@ -0,0 +1,20 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isOctal;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var octal = /^(0o)?[0-7]+$/i;
+
+function isOctal(str) {
+ (0, _assertString.default)(str);
+ return octal.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isPassportNumber.js b/src/node_modules/validator/lib/isPassportNumber.js
new file mode 100644
index 0000000..dfe6030
--- /dev/null
+++ b/src/node_modules/validator/lib/isPassportNumber.js
@@ -0,0 +1,114 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isPassportNumber;
+
+/**
+ * Reference:
+ * https://en.wikipedia.org/ -- Wikipedia
+ * https://docs.microsoft.com/en-us/microsoft-365/compliance/eu-passport-number -- EU Passport Number
+ * https://countrycode.org/ -- Country Codes
+ */
+var passportRegexByCountryCode = {
+ AM: /^[A-Z]{2}\d{7}$/,
+ // ARMENIA
+ AR: /^[A-Z]{3}\d{6}$/,
+ // ARGENTINA
+ AT: /^[A-Z]\d{7}$/,
+ // AUSTRIA
+ AU: /^[A-Z]\d{7}$/,
+ // AUSTRALIA
+ BE: /^[A-Z]{2}\d{6}$/,
+ // BELGIUM
+ BG: /^\d{9}$/,
+ // BULGARIA
+ CA: /^[A-Z]{2}\d{6}$/,
+ // CANADA
+ CH: /^[A-Z]\d{7}$/,
+ // SWITZERLAND
+ CN: /^[GE]\d{8}$/,
+ // CHINA [G=Ordinary, E=Electronic] followed by 8-digits
+ CY: /^[A-Z](\d{6}|\d{8})$/,
+ // CYPRUS
+ CZ: /^\d{8}$/,
+ // CZECH REPUBLIC
+ DE: /^[CFGHJKLMNPRTVWXYZ0-9]{9}$/,
+ // GERMANY
+ DK: /^\d{9}$/,
+ // DENMARK
+ DZ: /^\d{9}$/,
+ // ALGERIA
+ EE: /^([A-Z]\d{7}|[A-Z]{2}\d{7})$/,
+ // ESTONIA (K followed by 7-digits), e-passports have 2 UPPERCASE followed by 7 digits
+ ES: /^[A-Z0-9]{2}([A-Z0-9]?)\d{6}$/,
+ // SPAIN
+ FI: /^[A-Z]{2}\d{7}$/,
+ // FINLAND
+ FR: /^\d{2}[A-Z]{2}\d{5}$/,
+ // FRANCE
+ GB: /^\d{9}$/,
+ // UNITED KINGDOM
+ GR: /^[A-Z]{2}\d{7}$/,
+ // GREECE
+ HR: /^\d{9}$/,
+ // CROATIA
+ HU: /^[A-Z]{2}(\d{6}|\d{7})$/,
+ // HUNGARY
+ IE: /^[A-Z0-9]{2}\d{7}$/,
+ // IRELAND
+ IS: /^(A)\d{7}$/,
+ // ICELAND
+ IT: /^[A-Z0-9]{2}\d{7}$/,
+ // ITALY
+ JP: /^[A-Z]{2}\d{7}$/,
+ // JAPAN
+ KR: /^[MS]\d{8}$/,
+ // SOUTH KOREA, REPUBLIC OF KOREA, [S=PS Passports, M=PM Passports]
+ LT: /^[A-Z0-9]{8}$/,
+ // LITHUANIA
+ LU: /^[A-Z0-9]{8}$/,
+ // LUXEMBURG
+ LV: /^[A-Z0-9]{2}\d{7}$/,
+ // LATVIA
+ MT: /^\d{7}$/,
+ // MALTA
+ NL: /^[A-Z]{2}[A-Z0-9]{6}\d$/,
+ // NETHERLANDS
+ PO: /^[A-Z]{2}\d{7}$/,
+ // POLAND
+ PT: /^[A-Z]\d{6}$/,
+ // PORTUGAL
+ RO: /^\d{8,9}$/,
+ // ROMANIA
+ SE: /^\d{8}$/,
+ // SWEDEN
+ SL: /^(P)[A-Z]\d{7}$/,
+ // SLOVANIA
+ SK: /^[0-9A-Z]\d{7}$/,
+ // SLOVAKIA
+ TR: /^[A-Z]\d{8}$/,
+ // TURKEY
+ UA: /^[A-Z]{2}\d{6}$/,
+ // UKRAINE
+ US: /^\d{9}$/ // UNITED STATES
+
+};
+/**
+ * Check if str is a valid passport number
+ * relative to provided ISO Country Code.
+ *
+ * @param {string} str
+ * @param {string} countryCode
+ * @return {boolean}
+ */
+
+function isPassportNumber(str, countryCode) {
+ /** Remove All Whitespaces, Convert to UPPERCASE */
+ var normalizedStr = str.replace(/\s/g, '').toUpperCase();
+ return countryCode.toUpperCase() in passportRegexByCountryCode && passportRegexByCountryCode[countryCode].test(normalizedStr);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isPort.js b/src/node_modules/validator/lib/isPort.js
new file mode 100644
index 0000000..9274a4c
--- /dev/null
+++ b/src/node_modules/validator/lib/isPort.js
@@ -0,0 +1,20 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isPort;
+
+var _isInt = _interopRequireDefault(require("./isInt"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function isPort(str) {
+ return (0, _isInt.default)(str, {
+ min: 0,
+ max: 65535
+ });
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isPostalCode.js b/src/node_modules/validator/lib/isPostalCode.js
new file mode 100644
index 0000000..7dab73f
--- /dev/null
+++ b/src/node_modules/validator/lib/isPostalCode.js
@@ -0,0 +1,97 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = _default;
+exports.locales = void 0;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// common patterns
+var threeDigit = /^\d{3}$/;
+var fourDigit = /^\d{4}$/;
+var fiveDigit = /^\d{5}$/;
+var sixDigit = /^\d{6}$/;
+var patterns = {
+ AD: /^AD\d{3}$/,
+ AT: fourDigit,
+ AU: fourDigit,
+ BE: fourDigit,
+ BG: fourDigit,
+ BR: /^\d{5}-\d{3}$/,
+ CA: /^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][\s\-]?\d[ABCEGHJ-NPRSTV-Z]\d$/i,
+ CH: fourDigit,
+ CZ: /^\d{3}\s?\d{2}$/,
+ DE: fiveDigit,
+ DK: fourDigit,
+ DZ: fiveDigit,
+ EE: fiveDigit,
+ ES: fiveDigit,
+ FI: fiveDigit,
+ FR: /^\d{2}\s?\d{3}$/,
+ GB: /^(gir\s?0aa|[a-z]{1,2}\d[\da-z]?\s?(\d[a-z]{2})?)$/i,
+ GR: /^\d{3}\s?\d{2}$/,
+ HR: /^([1-5]\d{4}$)/,
+ HU: fourDigit,
+ ID: fiveDigit,
+ IE: /^(?!.*(?:o))[A-z]\d[\dw]\s\w{4}$/i,
+ IL: fiveDigit,
+ IN: /^((?!10|29|35|54|55|65|66|86|87|88|89)[1-9][0-9]{5})$/,
+ IS: threeDigit,
+ IT: fiveDigit,
+ JP: /^\d{3}\-\d{4}$/,
+ KE: fiveDigit,
+ LI: /^(948[5-9]|949[0-7])$/,
+ LT: /^LT\-\d{5}$/,
+ LU: fourDigit,
+ LV: /^LV\-\d{4}$/,
+ MX: fiveDigit,
+ MT: /^[A-Za-z]{3}\s{0,1}\d{4}$/,
+ NL: /^\d{4}\s?[a-z]{2}$/i,
+ NO: fourDigit,
+ NZ: fourDigit,
+ PL: /^\d{2}\-\d{3}$/,
+ PR: /^00[679]\d{2}([ -]\d{4})?$/,
+ PT: /^\d{4}\-\d{3}?$/,
+ RO: sixDigit,
+ RU: sixDigit,
+ SA: fiveDigit,
+ SE: /^[1-9]\d{2}\s?\d{2}$/,
+ SI: fourDigit,
+ SK: /^\d{3}\s?\d{2}$/,
+ TN: fourDigit,
+ TW: /^\d{3}(\d{2})?$/,
+ UA: fiveDigit,
+ US: /^\d{5}(-\d{4})?$/,
+ ZA: fourDigit,
+ ZM: fiveDigit
+};
+var locales = Object.keys(patterns);
+exports.locales = locales;
+
+function _default(str, locale) {
+ (0, _assertString.default)(str);
+
+ if (locale in patterns) {
+ return patterns[locale].test(str);
+ } else if (locale === 'any') {
+ for (var key in patterns) {
+ // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
+ // istanbul ignore else
+ if (patterns.hasOwnProperty(key)) {
+ var pattern = patterns[key];
+
+ if (pattern.test(str)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ throw new Error("Invalid locale '".concat(locale, "'"));
+} \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isRFC3339.js b/src/node_modules/validator/lib/isRFC3339.js
new file mode 100644
index 0000000..61e4582
--- /dev/null
+++ b/src/node_modules/validator/lib/isRFC3339.js
@@ -0,0 +1,33 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isRFC3339;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/* Based on https://tools.ietf.org/html/rfc3339#section-5.6 */
+var dateFullYear = /[0-9]{4}/;
+var dateMonth = /(0[1-9]|1[0-2])/;
+var dateMDay = /([12]\d|0[1-9]|3[01])/;
+var timeHour = /([01][0-9]|2[0-3])/;
+var timeMinute = /[0-5][0-9]/;
+var timeSecond = /([0-5][0-9]|60)/;
+var timeSecFrac = /(\.[0-9]+)?/;
+var timeNumOffset = new RegExp("[-+]".concat(timeHour.source, ":").concat(timeMinute.source));
+var timeOffset = new RegExp("([zZ]|".concat(timeNumOffset.source, ")"));
+var partialTime = new RegExp("".concat(timeHour.source, ":").concat(timeMinute.source, ":").concat(timeSecond.source).concat(timeSecFrac.source));
+var fullDate = new RegExp("".concat(dateFullYear.source, "-").concat(dateMonth.source, "-").concat(dateMDay.source));
+var fullTime = new RegExp("".concat(partialTime.source).concat(timeOffset.source));
+var rfc3339 = new RegExp("".concat(fullDate.source, "[ tT]").concat(fullTime.source));
+
+function isRFC3339(str) {
+ (0, _assertString.default)(str);
+ return rfc3339.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isRgbColor.js b/src/node_modules/validator/lib/isRgbColor.js
new file mode 100644
index 0000000..9622291
--- /dev/null
+++ b/src/node_modules/validator/lib/isRgbColor.js
@@ -0,0 +1,29 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isRgbColor;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var rgbColor = /^rgb\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\)$/;
+var rgbaColor = /^rgba\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)$/;
+var rgbColorPercent = /^rgb\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\)/;
+var rgbaColorPercent = /^rgba\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)/;
+
+function isRgbColor(str) {
+ var includePercentValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ (0, _assertString.default)(str);
+
+ if (!includePercentValues) {
+ return rgbColor.test(str) || rgbaColor.test(str);
+ }
+
+ return rgbColor.test(str) || rgbaColor.test(str) || rgbColorPercent.test(str) || rgbaColorPercent.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isSemVer.js b/src/node_modules/validator/lib/isSemVer.js
new file mode 100644
index 0000000..23cb2a7
--- /dev/null
+++ b/src/node_modules/validator/lib/isSemVer.js
@@ -0,0 +1,28 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isSemVer;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _multilineRegex = _interopRequireDefault(require("./util/multilineRegex"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Regular Expression to match
+ * semantic versioning (SemVer)
+ * built from multi-line, multi-parts regexp
+ * Reference: https://semver.org/
+ */
+var semanticVersioningRegex = (0, _multilineRegex.default)(['^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)', '(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))', '?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$']);
+
+function isSemVer(str) {
+ (0, _assertString.default)(str);
+ return semanticVersioningRegex.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isSlug.js b/src/node_modules/validator/lib/isSlug.js
new file mode 100644
index 0000000..cf1a33b
--- /dev/null
+++ b/src/node_modules/validator/lib/isSlug.js
@@ -0,0 +1,20 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isSlug;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var charsetRegex = /^[^-_](?!.*?[-_]{2,})([a-z0-9\\-]{1,}).*[^-_]$/;
+
+function isSlug(str) {
+ (0, _assertString.default)(str);
+ return charsetRegex.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isSurrogatePair.js b/src/node_modules/validator/lib/isSurrogatePair.js
new file mode 100644
index 0000000..ee5678b
--- /dev/null
+++ b/src/node_modules/validator/lib/isSurrogatePair.js
@@ -0,0 +1,20 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isSurrogatePair;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var surrogatePair = /[\uD800-\uDBFF][\uDC00-\uDFFF]/;
+
+function isSurrogatePair(str) {
+ (0, _assertString.default)(str);
+ return surrogatePair.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isURL.js b/src/node_modules/validator/lib/isURL.js
new file mode 100644
index 0000000..283270c
--- /dev/null
+++ b/src/node_modules/validator/lib/isURL.js
@@ -0,0 +1,162 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isURL;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _isFQDN = _interopRequireDefault(require("./isFQDN"));
+
+var _isIP = _interopRequireDefault(require("./isIP"));
+
+var _merge = _interopRequireDefault(require("./util/merge"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/*
+options for isURL method
+
+require_protocol - if set as true isURL will return false if protocol is not present in the URL
+require_valid_protocol - isURL will check if the URL's protocol is present in the protocols option
+protocols - valid protocols can be modified with this option
+require_host - if set as false isURL will not check if host is present in the URL
+allow_protocol_relative_urls - if set as true protocol relative URLs will be allowed
+
+*/
+var default_url_options = {
+ protocols: ['http', 'https', 'ftp'],
+ require_tld: true,
+ require_protocol: false,
+ require_host: true,
+ require_valid_protocol: true,
+ allow_underscores: false,
+ allow_trailing_dot: false,
+ allow_protocol_relative_urls: false
+};
+var wrapped_ipv6 = /^\[([^\]]+)\](?::([0-9]+))?$/;
+
+function isRegExp(obj) {
+ return Object.prototype.toString.call(obj) === '[object RegExp]';
+}
+
+function checkHost(host, matches) {
+ for (var i = 0; i < matches.length; i++) {
+ var match = matches[i];
+
+ if (host === match || isRegExp(match) && match.test(host)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+function isURL(url, options) {
+ (0, _assertString.default)(url);
+
+ if (!url || url.length >= 2083 || /[\s<>]/.test(url)) {
+ return false;
+ }
+
+ if (url.indexOf('mailto:') === 0) {
+ return false;
+ }
+
+ options = (0, _merge.default)(options, default_url_options);
+ var protocol, auth, host, hostname, port, port_str, split, ipv6;
+ split = url.split('#');
+ url = split.shift();
+ split = url.split('?');
+ url = split.shift();
+ split = url.split('://');
+
+ if (split.length > 1) {
+ protocol = split.shift().toLowerCase();
+
+ if (options.require_valid_protocol && options.protocols.indexOf(protocol) === -1) {
+ return false;
+ }
+ } else if (options.require_protocol) {
+ return false;
+ } else if (url.substr(0, 2) === '//') {
+ if (!options.allow_protocol_relative_urls) {
+ return false;
+ }
+
+ split[0] = url.substr(2);
+ }
+
+ url = split.join('://');
+
+ if (url === '') {
+ return false;
+ }
+
+ split = url.split('/');
+ url = split.shift();
+
+ if (url === '' && !options.require_host) {
+ return true;
+ }
+
+ split = url.split('@');
+
+ if (split.length > 1) {
+ if (options.disallow_auth) {
+ return false;
+ }
+
+ auth = split.shift();
+
+ if (auth.indexOf(':') >= 0 && auth.split(':').length > 2) {
+ return false;
+ }
+ }
+
+ hostname = split.join('@');
+ port_str = null;
+ ipv6 = null;
+ var ipv6_match = hostname.match(wrapped_ipv6);
+
+ if (ipv6_match) {
+ host = '';
+ ipv6 = ipv6_match[1];
+ port_str = ipv6_match[2] || null;
+ } else {
+ split = hostname.split(':');
+ host = split.shift();
+
+ if (split.length) {
+ port_str = split.join(':');
+ }
+ }
+
+ if (port_str !== null) {
+ port = parseInt(port_str, 10);
+
+ if (!/^[0-9]+$/.test(port_str) || port <= 0 || port > 65535) {
+ return false;
+ }
+ }
+
+ if (!(0, _isIP.default)(host) && !(0, _isFQDN.default)(host, options) && (!ipv6 || !(0, _isIP.default)(ipv6, 6))) {
+ return false;
+ }
+
+ host = host || ipv6;
+
+ if (options.host_whitelist && !checkHost(host, options.host_whitelist)) {
+ return false;
+ }
+
+ if (options.host_blacklist && checkHost(host, options.host_blacklist)) {
+ return false;
+ }
+
+ return true;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isUUID.js b/src/node_modules/validator/lib/isUUID.js
new file mode 100644
index 0000000..08ec27e
--- /dev/null
+++ b/src/node_modules/validator/lib/isUUID.js
@@ -0,0 +1,27 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isUUID;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var uuid = {
+ 3: /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
+ 4: /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
+ 5: /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
+ all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
+};
+
+function isUUID(str) {
+ var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'all';
+ (0, _assertString.default)(str);
+ var pattern = uuid[version];
+ return pattern && pattern.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isUppercase.js b/src/node_modules/validator/lib/isUppercase.js
new file mode 100644
index 0000000..c1c02f9
--- /dev/null
+++ b/src/node_modules/validator/lib/isUppercase.js
@@ -0,0 +1,18 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isUppercase;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function isUppercase(str) {
+ (0, _assertString.default)(str);
+ return str === str.toUpperCase();
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isVariableWidth.js b/src/node_modules/validator/lib/isVariableWidth.js
new file mode 100644
index 0000000..6bf226e
--- /dev/null
+++ b/src/node_modules/validator/lib/isVariableWidth.js
@@ -0,0 +1,22 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isVariableWidth;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _isFullWidth = require("./isFullWidth");
+
+var _isHalfWidth = require("./isHalfWidth");
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function isVariableWidth(str) {
+ (0, _assertString.default)(str);
+ return _isFullWidth.fullWidth.test(str) && _isHalfWidth.halfWidth.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/isWhitelisted.js b/src/node_modules/validator/lib/isWhitelisted.js
new file mode 100644
index 0000000..5a80a1b
--- /dev/null
+++ b/src/node_modules/validator/lib/isWhitelisted.js
@@ -0,0 +1,25 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = isWhitelisted;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function isWhitelisted(str, chars) {
+ (0, _assertString.default)(str);
+
+ for (var i = str.length - 1; i >= 0; i--) {
+ if (chars.indexOf(str[i]) === -1) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/ltrim.js b/src/node_modules/validator/lib/ltrim.js
new file mode 100644
index 0000000..fc39160
--- /dev/null
+++ b/src/node_modules/validator/lib/ltrim.js
@@ -0,0 +1,20 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = ltrim;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function ltrim(str, chars) {
+ (0, _assertString.default)(str); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping
+
+ var pattern = chars ? new RegExp("^[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+"), 'g') : /^\s+/g;
+ return str.replace(pattern, '');
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/matches.js b/src/node_modules/validator/lib/matches.js
new file mode 100644
index 0000000..ea01ac1
--- /dev/null
+++ b/src/node_modules/validator/lib/matches.js
@@ -0,0 +1,23 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = matches;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function matches(str, pattern, modifiers) {
+ (0, _assertString.default)(str);
+
+ if (Object.prototype.toString.call(pattern) !== '[object RegExp]') {
+ pattern = new RegExp(pattern, modifiers);
+ }
+
+ return pattern.test(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/normalizeEmail.js b/src/node_modules/validator/lib/normalizeEmail.js
new file mode 100644
index 0000000..dcab4b9
--- /dev/null
+++ b/src/node_modules/validator/lib/normalizeEmail.js
@@ -0,0 +1,151 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = normalizeEmail;
+
+var _merge = _interopRequireDefault(require("./util/merge"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var default_normalize_email_options = {
+ // The following options apply to all email addresses
+ // Lowercases the local part of the email address.
+ // Please note this may violate RFC 5321 as per http://stackoverflow.com/a/9808332/192024).
+ // The domain is always lowercased, as per RFC 1035
+ all_lowercase: true,
+ // The following conversions are specific to GMail
+ // Lowercases the local part of the GMail address (known to be case-insensitive)
+ gmail_lowercase: true,
+ // Removes dots from the local part of the email address, as that's ignored by GMail
+ gmail_remove_dots: true,
+ // Removes the subaddress (e.g. "+foo") from the email address
+ gmail_remove_subaddress: true,
+ // Conversts the googlemail.com domain to gmail.com
+ gmail_convert_googlemaildotcom: true,
+ // The following conversions are specific to Outlook.com / Windows Live / Hotmail
+ // Lowercases the local part of the Outlook.com address (known to be case-insensitive)
+ outlookdotcom_lowercase: true,
+ // Removes the subaddress (e.g. "+foo") from the email address
+ outlookdotcom_remove_subaddress: true,
+ // The following conversions are specific to Yahoo
+ // Lowercases the local part of the Yahoo address (known to be case-insensitive)
+ yahoo_lowercase: true,
+ // Removes the subaddress (e.g. "-foo") from the email address
+ yahoo_remove_subaddress: true,
+ // The following conversions are specific to Yandex
+ // Lowercases the local part of the Yandex address (known to be case-insensitive)
+ yandex_lowercase: true,
+ // The following conversions are specific to iCloud
+ // Lowercases the local part of the iCloud address (known to be case-insensitive)
+ icloud_lowercase: true,
+ // Removes the subaddress (e.g. "+foo") from the email address
+ icloud_remove_subaddress: true
+}; // List of domains used by iCloud
+
+var icloud_domains = ['icloud.com', 'me.com']; // List of domains used by Outlook.com and its predecessors
+// This list is likely incomplete.
+// Partial reference:
+// https://blogs.office.com/2013/04/17/outlook-com-gets-two-step-verification-sign-in-by-alias-and-new-international-domains/
+
+var outlookdotcom_domains = ['hotmail.at', 'hotmail.be', 'hotmail.ca', 'hotmail.cl', 'hotmail.co.il', 'hotmail.co.nz', 'hotmail.co.th', 'hotmail.co.uk', 'hotmail.com', 'hotmail.com.ar', 'hotmail.com.au', 'hotmail.com.br', 'hotmail.com.gr', 'hotmail.com.mx', 'hotmail.com.pe', 'hotmail.com.tr', 'hotmail.com.vn', 'hotmail.cz', 'hotmail.de', 'hotmail.dk', 'hotmail.es', 'hotmail.fr', 'hotmail.hu', 'hotmail.id', 'hotmail.ie', 'hotmail.in', 'hotmail.it', 'hotmail.jp', 'hotmail.kr', 'hotmail.lv', 'hotmail.my', 'hotmail.ph', 'hotmail.pt', 'hotmail.sa', 'hotmail.sg', 'hotmail.sk', 'live.be', 'live.co.uk', 'live.com', 'live.com.ar', 'live.com.mx', 'live.de', 'live.es', 'live.eu', 'live.fr', 'live.it', 'live.nl', 'msn.com', 'outlook.at', 'outlook.be', 'outlook.cl', 'outlook.co.il', 'outlook.co.nz', 'outlook.co.th', 'outlook.com', 'outlook.com.ar', 'outlook.com.au', 'outlook.com.br', 'outlook.com.gr', 'outlook.com.pe', 'outlook.com.tr', 'outlook.com.vn', 'outlook.cz', 'outlook.de', 'outlook.dk', 'outlook.es', 'outlook.fr', 'outlook.hu', 'outlook.id', 'outlook.ie', 'outlook.in', 'outlook.it', 'outlook.jp', 'outlook.kr', 'outlook.lv', 'outlook.my', 'outlook.ph', 'outlook.pt', 'outlook.sa', 'outlook.sg', 'outlook.sk', 'passport.com']; // List of domains used by Yahoo Mail
+// This list is likely incomplete
+
+var yahoo_domains = ['rocketmail.com', 'yahoo.ca', 'yahoo.co.uk', 'yahoo.com', 'yahoo.de', 'yahoo.fr', 'yahoo.in', 'yahoo.it', 'ymail.com']; // List of domains used by yandex.ru
+
+var yandex_domains = ['yandex.ru', 'yandex.ua', 'yandex.kz', 'yandex.com', 'yandex.by', 'ya.ru']; // replace single dots, but not multiple consecutive dots
+
+function dotsReplacer(match) {
+ if (match.length > 1) {
+ return match;
+ }
+
+ return '';
+}
+
+function normalizeEmail(email, options) {
+ options = (0, _merge.default)(options, default_normalize_email_options);
+ var raw_parts = email.split('@');
+ var domain = raw_parts.pop();
+ var user = raw_parts.join('@');
+ var parts = [user, domain]; // The domain is always lowercased, as it's case-insensitive per RFC 1035
+
+ parts[1] = parts[1].toLowerCase();
+
+ if (parts[1] === 'gmail.com' || parts[1] === 'googlemail.com') {
+ // Address is GMail
+ if (options.gmail_remove_subaddress) {
+ parts[0] = parts[0].split('+')[0];
+ }
+
+ if (options.gmail_remove_dots) {
+ // this does not replace consecutive dots like example..email@gmail.com
+ parts[0] = parts[0].replace(/\.+/g, dotsReplacer);
+ }
+
+ if (!parts[0].length) {
+ return false;
+ }
+
+ if (options.all_lowercase || options.gmail_lowercase) {
+ parts[0] = parts[0].toLowerCase();
+ }
+
+ parts[1] = options.gmail_convert_googlemaildotcom ? 'gmail.com' : parts[1];
+ } else if (icloud_domains.indexOf(parts[1]) >= 0) {
+ // Address is iCloud
+ if (options.icloud_remove_subaddress) {
+ parts[0] = parts[0].split('+')[0];
+ }
+
+ if (!parts[0].length) {
+ return false;
+ }
+
+ if (options.all_lowercase || options.icloud_lowercase) {
+ parts[0] = parts[0].toLowerCase();
+ }
+ } else if (outlookdotcom_domains.indexOf(parts[1]) >= 0) {
+ // Address is Outlook.com
+ if (options.outlookdotcom_remove_subaddress) {
+ parts[0] = parts[0].split('+')[0];
+ }
+
+ if (!parts[0].length) {
+ return false;
+ }
+
+ if (options.all_lowercase || options.outlookdotcom_lowercase) {
+ parts[0] = parts[0].toLowerCase();
+ }
+ } else if (yahoo_domains.indexOf(parts[1]) >= 0) {
+ // Address is Yahoo
+ if (options.yahoo_remove_subaddress) {
+ var components = parts[0].split('-');
+ parts[0] = components.length > 1 ? components.slice(0, -1).join('-') : components[0];
+ }
+
+ if (!parts[0].length) {
+ return false;
+ }
+
+ if (options.all_lowercase || options.yahoo_lowercase) {
+ parts[0] = parts[0].toLowerCase();
+ }
+ } else if (yandex_domains.indexOf(parts[1]) >= 0) {
+ if (options.all_lowercase || options.yandex_lowercase) {
+ parts[0] = parts[0].toLowerCase();
+ }
+
+ parts[1] = 'yandex.ru'; // all yandex domains are equal, 1st preffered
+ } else if (options.all_lowercase) {
+ // Any other address
+ parts[0] = parts[0].toLowerCase();
+ }
+
+ return parts.join('@');
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/rtrim.js b/src/node_modules/validator/lib/rtrim.js
new file mode 100644
index 0000000..af50c69
--- /dev/null
+++ b/src/node_modules/validator/lib/rtrim.js
@@ -0,0 +1,20 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = rtrim;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function rtrim(str, chars) {
+ (0, _assertString.default)(str); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping
+
+ var pattern = chars ? new RegExp("[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+$"), 'g') : /\s+$/g;
+ return str.replace(pattern, '');
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/stripLow.js b/src/node_modules/validator/lib/stripLow.js
new file mode 100644
index 0000000..aec2e0b
--- /dev/null
+++ b/src/node_modules/validator/lib/stripLow.js
@@ -0,0 +1,21 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = stripLow;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+var _blacklist = _interopRequireDefault(require("./blacklist"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function stripLow(str, keep_new_lines) {
+ (0, _assertString.default)(str);
+ var chars = keep_new_lines ? '\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F' : '\\x00-\\x1F\\x7F';
+ return (0, _blacklist.default)(str, chars);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/toBoolean.js b/src/node_modules/validator/lib/toBoolean.js
new file mode 100644
index 0000000..a1b1fe4
--- /dev/null
+++ b/src/node_modules/validator/lib/toBoolean.js
@@ -0,0 +1,23 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = toBoolean;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function toBoolean(str, strict) {
+ (0, _assertString.default)(str);
+
+ if (strict) {
+ return str === '1' || /^true$/i.test(str);
+ }
+
+ return str !== '0' && !/^false$/i.test(str) && str !== '';
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/toDate.js b/src/node_modules/validator/lib/toDate.js
new file mode 100644
index 0000000..cb0756c
--- /dev/null
+++ b/src/node_modules/validator/lib/toDate.js
@@ -0,0 +1,19 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = toDate;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function toDate(date) {
+ (0, _assertString.default)(date);
+ date = Date.parse(date);
+ return !isNaN(date) ? new Date(date) : null;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/toFloat.js b/src/node_modules/validator/lib/toFloat.js
new file mode 100644
index 0000000..96adafd
--- /dev/null
+++ b/src/node_modules/validator/lib/toFloat.js
@@ -0,0 +1,18 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = toFloat;
+
+var _isFloat = _interopRequireDefault(require("./isFloat"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function toFloat(str) {
+ if (!(0, _isFloat.default)(str)) return NaN;
+ return parseFloat(str);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/toInt.js b/src/node_modules/validator/lib/toInt.js
new file mode 100644
index 0000000..4c0e7ad
--- /dev/null
+++ b/src/node_modules/validator/lib/toInt.js
@@ -0,0 +1,18 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = toInt;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function toInt(str, radix) {
+ (0, _assertString.default)(str);
+ return parseInt(str, radix || 10);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/trim.js b/src/node_modules/validator/lib/trim.js
new file mode 100644
index 0000000..497e3c3
--- /dev/null
+++ b/src/node_modules/validator/lib/trim.js
@@ -0,0 +1,19 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = trim;
+
+var _rtrim = _interopRequireDefault(require("./rtrim"));
+
+var _ltrim = _interopRequireDefault(require("./ltrim"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function trim(str, chars) {
+ return (0, _rtrim.default)((0, _ltrim.default)(str, chars), chars);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/unescape.js b/src/node_modules/validator/lib/unescape.js
new file mode 100644
index 0000000..ab5dbbf
--- /dev/null
+++ b/src/node_modules/validator/lib/unescape.js
@@ -0,0 +1,18 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = unescape;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function unescape(str) {
+ (0, _assertString.default)(str);
+ return str.replace(/&amp;/g, '&').replace(/&quot;/g, '"').replace(/&#x27;/g, "'").replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&#x2F;/g, '/').replace(/&#x5C;/g, '\\').replace(/&#96;/g, '`');
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/util/assertString.js b/src/node_modules/validator/lib/util/assertString.js
new file mode 100644
index 0000000..ed3ec75
--- /dev/null
+++ b/src/node_modules/validator/lib/util/assertString.js
@@ -0,0 +1,33 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = assertString;
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function assertString(input) {
+ var isString = typeof input === 'string' || input instanceof String;
+
+ if (!isString) {
+ var invalidType;
+
+ if (input === null) {
+ invalidType = 'null';
+ } else {
+ invalidType = _typeof(input);
+
+ if (invalidType === 'object' && input.constructor && input.constructor.hasOwnProperty('name')) {
+ invalidType = input.constructor.name;
+ } else {
+ invalidType = "a ".concat(invalidType);
+ }
+ }
+
+ throw new TypeError("Expected string but received ".concat(invalidType, "."));
+ }
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/util/includes.js b/src/node_modules/validator/lib/util/includes.js
new file mode 100644
index 0000000..e061828
--- /dev/null
+++ b/src/node_modules/validator/lib/util/includes.js
@@ -0,0 +1,17 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var includes = function includes(arr, val) {
+ return arr.some(function (arrVal) {
+ return val === arrVal;
+ });
+};
+
+var _default = includes;
+exports.default = _default;
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/util/merge.js b/src/node_modules/validator/lib/util/merge.js
new file mode 100644
index 0000000..a96c739
--- /dev/null
+++ b/src/node_modules/validator/lib/util/merge.js
@@ -0,0 +1,22 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = merge;
+
+function merge() {
+ var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+ var defaults = arguments.length > 1 ? arguments[1] : undefined;
+
+ for (var key in defaults) {
+ if (typeof obj[key] === 'undefined') {
+ obj[key] = defaults[key];
+ }
+ }
+
+ return obj;
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/util/multilineRegex.js b/src/node_modules/validator/lib/util/multilineRegex.js
new file mode 100644
index 0000000..0879ca9
--- /dev/null
+++ b/src/node_modules/validator/lib/util/multilineRegex.js
@@ -0,0 +1,23 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = multilineRegexp;
+
+/**
+ * Build RegExp object from an array
+ * of multiple/multi-line regexp parts
+ *
+ * @param {string[]} parts
+ * @param {string} flags
+ * @return {object} - RegExp object
+ */
+function multilineRegexp(parts) {
+ var flags = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var regexpAsStringLiteral = parts.join('');
+ return new RegExp(regexpAsStringLiteral, flags);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/util/toString.js b/src/node_modules/validator/lib/util/toString.js
new file mode 100644
index 0000000..6295192
--- /dev/null
+++ b/src/node_modules/validator/lib/util/toString.js
@@ -0,0 +1,25 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = toString;
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function toString(input) {
+ if (_typeof(input) === 'object' && input !== null) {
+ if (typeof input.toString === 'function') {
+ input = input.toString();
+ } else {
+ input = '[object Object]';
+ }
+ } else if (input === null || typeof input === 'undefined' || isNaN(input) && !input.length) {
+ input = '';
+ }
+
+ return String(input);
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/lib/whitelist.js b/src/node_modules/validator/lib/whitelist.js
new file mode 100644
index 0000000..7ae624e
--- /dev/null
+++ b/src/node_modules/validator/lib/whitelist.js
@@ -0,0 +1,18 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = whitelist;
+
+var _assertString = _interopRequireDefault(require("./util/assertString"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function whitelist(str, chars) {
+ (0, _assertString.default)(str);
+ return str.replace(new RegExp("[^".concat(chars, "]+"), 'g'), '');
+}
+
+module.exports = exports.default;
+module.exports.default = exports.default; \ No newline at end of file
diff --git a/src/node_modules/validator/package.json b/src/node_modules/validator/package.json
new file mode 100644
index 0000000..b9d0f46
--- /dev/null
+++ b/src/node_modules/validator/package.json
@@ -0,0 +1,76 @@
+{
+ "name": "validator",
+ "description": "String validation and sanitization",
+ "version": "13.0.0",
+ "sideEffects": false,
+ "homepage": "https://github.com/chriso/validator.js",
+ "files": [
+ "index.js",
+ "es",
+ "lib",
+ "README.md",
+ "LICENCE",
+ "validator.js",
+ "validator.min.js"
+ ],
+ "keywords": [
+ "validator",
+ "validation",
+ "validate",
+ "sanitization",
+ "sanitize",
+ "sanitisation",
+ "sanitise",
+ "assert"
+ ],
+ "author": "Chris O'Hara <cohara87@gmail.com>",
+ "contributors": [
+ {
+ "name": "Anthony Nandaa",
+ "url": "https://github.com/profnandaa"
+ }
+ ],
+ "main": "index.js",
+ "bugs": {
+ "url": "https://github.com/chriso/validator.js/issues"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/chriso/validator.js.git"
+ },
+ "devDependencies": {
+ "@babel/cli": "^7.0.0",
+ "@babel/core": "^7.0.0",
+ "@babel/preset-env": "^7.0.0",
+ "@babel/register": "^7.0.0",
+ "babel-eslint": "^10.0.1",
+ "babel-plugin-add-module-exports": "^1.0.0",
+ "eslint": "^4.19.1",
+ "eslint-config-airbnb-base": "^12.1.0",
+ "eslint-plugin-import": "^2.11.0",
+ "mocha": "^5.1.1",
+ "nyc": "^14.1.0",
+ "rollup": "^0.43.0",
+ "rollup-plugin-babel": "^4.0.1",
+ "uglify-js": "^3.0.19"
+ },
+ "scripts": {
+ "lint": "eslint src test",
+ "lint:fix": "eslint --fix src test",
+ "clean:node": "rm -rf index.js lib",
+ "clean:es": "rm -rf es",
+ "clean:browser": "rm -rf validator*.js",
+ "clean": "npm run clean:node && npm run clean:browser && npm run clean:es",
+ "minify": "uglifyjs validator.js -o validator.min.js --compress --mangle --comments /Copyright/",
+ "build:browser": "node --require @babel/register build-browser && npm run minify",
+ "build:es": "babel src -d es --env-name=es",
+ "build:node": "babel src -d .",
+ "build": "npm run build:browser && npm run build:node && npm run build:es",
+ "pretest": "npm run lint && npm run build",
+ "test": "nyc mocha --require @babel/register --reporter dot"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ },
+ "license": "MIT"
+}
diff --git a/src/node_modules/validator/validator.js b/src/node_modules/validator/validator.js
new file mode 100644
index 0000000..0d18d9b
--- /dev/null
+++ b/src/node_modules/validator/validator.js
@@ -0,0 +1,2597 @@
+/*!
+ * Copyright (c) 2018 Chris O'Hara <cohara87@gmail.com>
+ *
+ * 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.
+ */
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global.validator = factory());
+}(this, (function () { 'use strict';
+
+function _typeof(obj) {
+ "@babel/helpers - typeof";
+
+ if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
+ _typeof = function (obj) {
+ return typeof obj;
+ };
+ } else {
+ _typeof = function (obj) {
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+ }
+
+ return _typeof(obj);
+}
+
+function _slicedToArray(arr, i) {
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
+}
+
+function _arrayWithHoles(arr) {
+ if (Array.isArray(arr)) return arr;
+}
+
+function _iterableToArrayLimit(arr, i) {
+ if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) {
+ return;
+ }
+
+ var _arr = [];
+ var _n = true;
+ var _d = false;
+ var _e = undefined;
+
+ try {
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
+ _arr.push(_s.value);
+
+ if (i && _arr.length === i) break;
+ }
+ } catch (err) {
+ _d = true;
+ _e = err;
+ } finally {
+ try {
+ if (!_n && _i["return"] != null) _i["return"]();
+ } finally {
+ if (_d) throw _e;
+ }
+ }
+
+ return _arr;
+}
+
+function _nonIterableRest() {
+ throw new TypeError("Invalid attempt to destructure non-iterable instance");
+}
+
+function assertString(input) {
+ var isString = typeof input === 'string' || input instanceof String;
+
+ if (!isString) {
+ var invalidType;
+
+ if (input === null) {
+ invalidType = 'null';
+ } else {
+ invalidType = _typeof(input);
+
+ if (invalidType === 'object' && input.constructor && input.constructor.hasOwnProperty('name')) {
+ invalidType = input.constructor.name;
+ } else {
+ invalidType = "a ".concat(invalidType);
+ }
+ }
+
+ throw new TypeError("Expected string but received ".concat(invalidType, "."));
+ }
+}
+
+function toDate(date) {
+ assertString(date);
+ date = Date.parse(date);
+ return !isNaN(date) ? new Date(date) : null;
+}
+
+var alpha = {
+ 'en-US': /^[A-Z]+$/i,
+ 'bg-BG': /^[А-Я]+$/i,
+ 'cs-CZ': /^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,
+ 'da-DK': /^[A-ZÆØÅ]+$/i,
+ 'de-DE': /^[A-ZÄÖÜß]+$/i,
+ 'el-GR': /^[Α-ώ]+$/i,
+ 'es-ES': /^[A-ZÁÉÍÑÓÚÜ]+$/i,
+ 'fr-FR': /^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,
+ 'it-IT': /^[A-ZÀÉÈÌÎÓÒÙ]+$/i,
+ 'nb-NO': /^[A-ZÆØÅ]+$/i,
+ 'nl-NL': /^[A-ZÁÉËÏÓÖÜÚ]+$/i,
+ 'nn-NO': /^[A-ZÆØÅ]+$/i,
+ 'hu-HU': /^[A-ZÁÉÍÓÖŐÚÜŰ]+$/i,
+ 'pl-PL': /^[A-ZĄĆĘŚŁŃÓŻŹ]+$/i,
+ 'pt-PT': /^[A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,
+ 'ru-RU': /^[А-ЯЁ]+$/i,
+ 'sl-SI': /^[A-ZČĆĐŠŽ]+$/i,
+ 'sk-SK': /^[A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,
+ 'sr-RS@latin': /^[A-ZČĆŽŠĐ]+$/i,
+ 'sr-RS': /^[А-ЯЂЈЉЊЋЏ]+$/i,
+ 'sv-SE': /^[A-ZÅÄÖ]+$/i,
+ 'tr-TR': /^[A-ZÇĞİıÖŞÜ]+$/i,
+ 'uk-UA': /^[А-ЩЬЮЯЄIЇҐі]+$/i,
+ 'ku-IQ': /^[ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,
+ ar: /^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,
+ he: /^[א-ת]+$/,
+ 'fa-IR': /^['آابپتثجچهخدذرزژسشصضطظعغفقکگلمنوهی']+$/i
+};
+var alphanumeric = {
+ 'en-US': /^[0-9A-Z]+$/i,
+ 'bg-BG': /^[0-9А-Я]+$/i,
+ 'cs-CZ': /^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,
+ 'da-DK': /^[0-9A-ZÆØÅ]+$/i,
+ 'de-DE': /^[0-9A-ZÄÖÜß]+$/i,
+ 'el-GR': /^[0-9Α-ω]+$/i,
+ 'es-ES': /^[0-9A-ZÁÉÍÑÓÚÜ]+$/i,
+ 'fr-FR': /^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,
+ 'it-IT': /^[0-9A-ZÀÉÈÌÎÓÒÙ]+$/i,
+ 'hu-HU': /^[0-9A-ZÁÉÍÓÖŐÚÜŰ]+$/i,
+ 'nb-NO': /^[0-9A-ZÆØÅ]+$/i,
+ 'nl-NL': /^[0-9A-ZÁÉËÏÓÖÜÚ]+$/i,
+ 'nn-NO': /^[0-9A-ZÆØÅ]+$/i,
+ 'pl-PL': /^[0-9A-ZĄĆĘŚŁŃÓŻŹ]+$/i,
+ 'pt-PT': /^[0-9A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,
+ 'ru-RU': /^[0-9А-ЯЁ]+$/i,
+ 'sl-SI': /^[0-9A-ZČĆĐŠŽ]+$/i,
+ 'sk-SK': /^[0-9A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,
+ 'sr-RS@latin': /^[0-9A-ZČĆŽŠĐ]+$/i,
+ 'sr-RS': /^[0-9А-ЯЂЈЉЊЋЏ]+$/i,
+ 'sv-SE': /^[0-9A-ZÅÄÖ]+$/i,
+ 'tr-TR': /^[0-9A-ZÇĞİıÖŞÜ]+$/i,
+ 'uk-UA': /^[0-9А-ЩЬЮЯЄIЇҐі]+$/i,
+ 'ku-IQ': /^[٠١٢٣٤٥٦٧٨٩0-9ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,
+ ar: /^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,
+ he: /^[0-9א-ת]+$/,
+ 'fa-IR': /^['0-9آابپتثجچهخدذرزژسشصضطظعغفقکگلمنوهی۱۲۳۴۵۶۷۸۹۰']+$/i
+};
+var decimal = {
+ 'en-US': '.',
+ ar: '٫'
+};
+var englishLocales = ['AU', 'GB', 'HK', 'IN', 'NZ', 'ZA', 'ZM'];
+
+for (var locale, i = 0; i < englishLocales.length; i++) {
+ locale = "en-".concat(englishLocales[i]);
+ alpha[locale] = alpha['en-US'];
+ alphanumeric[locale] = alphanumeric['en-US'];
+ decimal[locale] = decimal['en-US'];
+} // Source: http://www.localeplanet.com/java/
+
+
+var arabicLocales = ['AE', 'BH', 'DZ', 'EG', 'IQ', 'JO', 'KW', 'LB', 'LY', 'MA', 'QM', 'QA', 'SA', 'SD', 'SY', 'TN', 'YE'];
+
+for (var _locale, _i = 0; _i < arabicLocales.length; _i++) {
+ _locale = "ar-".concat(arabicLocales[_i]);
+ alpha[_locale] = alpha.ar;
+ alphanumeric[_locale] = alphanumeric.ar;
+ decimal[_locale] = decimal.ar;
+} // Source: https://en.wikipedia.org/wiki/Decimal_mark
+
+
+var dotDecimal = ['ar-EG', 'ar-LB', 'ar-LY'];
+var commaDecimal = ['bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-ZM', 'es-ES', 'fr-FR', 'it-IT', 'ku-IQ', 'hu-HU', 'nb-NO', 'nn-NO', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS@latin', 'sr-RS', 'sv-SE', 'tr-TR', 'uk-UA'];
+
+for (var _i2 = 0; _i2 < dotDecimal.length; _i2++) {
+ decimal[dotDecimal[_i2]] = decimal['en-US'];
+}
+
+for (var _i3 = 0; _i3 < commaDecimal.length; _i3++) {
+ decimal[commaDecimal[_i3]] = ',';
+}
+
+alpha['pt-BR'] = alpha['pt-PT'];
+alphanumeric['pt-BR'] = alphanumeric['pt-PT'];
+decimal['pt-BR'] = decimal['pt-PT']; // see #862
+
+alpha['pl-Pl'] = alpha['pl-PL'];
+alphanumeric['pl-Pl'] = alphanumeric['pl-PL'];
+decimal['pl-Pl'] = decimal['pl-PL'];
+
+function isFloat(str, options) {
+ assertString(str);
+ options = options || {};
+
+ var _float = new RegExp("^(?:[-+])?(?:[0-9]+)?(?:\\".concat(options.locale ? decimal[options.locale] : '.', "[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$"));
+
+ if (str === '' || str === '.' || str === '-' || str === '+') {
+ return false;
+ }
+
+ var value = parseFloat(str.replace(',', '.'));
+ return _float.test(str) && (!options.hasOwnProperty('min') || value >= options.min) && (!options.hasOwnProperty('max') || value <= options.max) && (!options.hasOwnProperty('lt') || value < options.lt) && (!options.hasOwnProperty('gt') || value > options.gt);
+}
+var locales = Object.keys(decimal);
+
+function toFloat(str) {
+ if (!isFloat(str)) return NaN;
+ return parseFloat(str);
+}
+
+function toInt(str, radix) {
+ assertString(str);
+ return parseInt(str, radix || 10);
+}
+
+function toBoolean(str, strict) {
+ assertString(str);
+
+ if (strict) {
+ return str === '1' || /^true$/i.test(str);
+ }
+
+ return str !== '0' && !/^false$/i.test(str) && str !== '';
+}
+
+function equals(str, comparison) {
+ assertString(str);
+ return str === comparison;
+}
+
+function toString$1(input) {
+ if (_typeof(input) === 'object' && input !== null) {
+ if (typeof input.toString === 'function') {
+ input = input.toString();
+ } else {
+ input = '[object Object]';
+ }
+ } else if (input === null || typeof input === 'undefined' || isNaN(input) && !input.length) {
+ input = '';
+ }
+
+ return String(input);
+}
+
+function contains(str, elem) {
+ assertString(str);
+ return str.indexOf(toString$1(elem)) >= 0;
+}
+
+function matches(str, pattern, modifiers) {
+ assertString(str);
+
+ if (Object.prototype.toString.call(pattern) !== '[object RegExp]') {
+ pattern = new RegExp(pattern, modifiers);
+ }
+
+ return pattern.test(str);
+}
+
+function merge() {
+ var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+ var defaults = arguments.length > 1 ? arguments[1] : undefined;
+
+ for (var key in defaults) {
+ if (typeof obj[key] === 'undefined') {
+ obj[key] = defaults[key];
+ }
+ }
+
+ return obj;
+}
+
+/* eslint-disable prefer-rest-params */
+
+function isByteLength(str, options) {
+ assertString(str);
+ var min;
+ var max;
+
+ if (_typeof(options) === 'object') {
+ min = options.min || 0;
+ max = options.max;
+ } else {
+ // backwards compatibility: isByteLength(str, min [, max])
+ min = arguments[1];
+ max = arguments[2];
+ }
+
+ var len = encodeURI(str).split(/%..|./).length - 1;
+ return len >= min && (typeof max === 'undefined' || len <= max);
+}
+
+var default_fqdn_options = {
+ require_tld: true,
+ allow_underscores: false,
+ allow_trailing_dot: false
+};
+function isFQDN(str, options) {
+ assertString(str);
+ options = merge(options, default_fqdn_options);
+ /* Remove the optional trailing dot before checking validity */
+
+ if (options.allow_trailing_dot && str[str.length - 1] === '.') {
+ str = str.substring(0, str.length - 1);
+ }
+
+ var parts = str.split('.');
+
+ for (var i = 0; i < parts.length; i++) {
+ if (parts[i].length > 63) {
+ return false;
+ }
+ }
+
+ if (options.require_tld) {
+ var tld = parts.pop();
+
+ if (!parts.length || !/^([a-z\u00a1-\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) {
+ return false;
+ } // disallow spaces
+
+
+ if (/[\s\u2002-\u200B\u202F\u205F\u3000\uFEFF\uDB40\uDC20]/.test(tld)) {
+ return false;
+ }
+ }
+
+ for (var part, _i = 0; _i < parts.length; _i++) {
+ part = parts[_i];
+
+ if (options.allow_underscores) {
+ part = part.replace(/_/g, '');
+ }
+
+ if (!/^[a-z\u00a1-\uffff0-9-]+$/i.test(part)) {
+ return false;
+ } // disallow full-width chars
+
+
+ if (/[\uff01-\uff5e]/.test(part)) {
+ return false;
+ }
+
+ if (part[0] === '-' || part[part.length - 1] === '-') {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/**
+11.3. Examples
+
+ The following addresses
+
+ fe80::1234 (on the 1st link of the node)
+ ff02::5678 (on the 5th link of the node)
+ ff08::9abc (on the 10th organization of the node)
+
+ would be represented as follows:
+
+ fe80::1234%1
+ ff02::5678%5
+ ff08::9abc%10
+
+ (Here we assume a natural translation from a zone index to the
+ <zone_id> part, where the Nth zone of any scope is translated into
+ "N".)
+
+ If we use interface names as <zone_id>, those addresses could also be
+ represented as follows:
+
+ fe80::1234%ne0
+ ff02::5678%pvc1.3
+ ff08::9abc%interface10
+
+ where the interface "ne0" belongs to the 1st link, "pvc1.3" belongs
+ to the 5th link, and "interface10" belongs to the 10th organization.
+ * * */
+
+var ipv4Maybe = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/;
+var ipv6Block = /^[0-9A-F]{1,4}$/i;
+function isIP(str) {
+ var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ assertString(str);
+ version = String(version);
+
+ if (!version) {
+ return isIP(str, 4) || isIP(str, 6);
+ } else if (version === '4') {
+ if (!ipv4Maybe.test(str)) {
+ return false;
+ }
+
+ var parts = str.split('.').sort(function (a, b) {
+ return a - b;
+ });
+ return parts[3] <= 255;
+ } else if (version === '6') {
+ var addressAndZone = [str]; // ipv6 addresses could have scoped architecture
+ // according to https://tools.ietf.org/html/rfc4007#section-11
+
+ if (str.includes('%')) {
+ addressAndZone = str.split('%');
+
+ if (addressAndZone.length !== 2) {
+ // it must be just two parts
+ return false;
+ }
+
+ if (!addressAndZone[0].includes(':')) {
+ // the first part must be the address
+ return false;
+ }
+
+ if (addressAndZone[1] === '') {
+ // the second part must not be empty
+ return false;
+ }
+ }
+
+ var blocks = addressAndZone[0].split(':');
+ var foundOmissionBlock = false; // marker to indicate ::
+ // At least some OS accept the last 32 bits of an IPv6 address
+ // (i.e. 2 of the blocks) in IPv4 notation, and RFC 3493 says
+ // that '::ffff:a.b.c.d' is valid for IPv4-mapped IPv6 addresses,
+ // and '::a.b.c.d' is deprecated, but also valid.
+
+ var foundIPv4TransitionBlock = isIP(blocks[blocks.length - 1], 4);
+ var expectedNumberOfBlocks = foundIPv4TransitionBlock ? 7 : 8;
+
+ if (blocks.length > expectedNumberOfBlocks) {
+ return false;
+ } // initial or final ::
+
+
+ if (str === '::') {
+ return true;
+ } else if (str.substr(0, 2) === '::') {
+ blocks.shift();
+ blocks.shift();
+ foundOmissionBlock = true;
+ } else if (str.substr(str.length - 2) === '::') {
+ blocks.pop();
+ blocks.pop();
+ foundOmissionBlock = true;
+ }
+
+ for (var i = 0; i < blocks.length; ++i) {
+ // test for a :: which can not be at the string start/end
+ // since those cases have been handled above
+ if (blocks[i] === '' && i > 0 && i < blocks.length - 1) {
+ if (foundOmissionBlock) {
+ return false; // multiple :: in address
+ }
+
+ foundOmissionBlock = true;
+ } else if (foundIPv4TransitionBlock && i === blocks.length - 1) {// it has been checked before that the last
+ // block is a valid IPv4 address
+ } else if (!ipv6Block.test(blocks[i])) {
+ return false;
+ }
+ }
+
+ if (foundOmissionBlock) {
+ return blocks.length >= 1;
+ }
+
+ return blocks.length === expectedNumberOfBlocks;
+ }
+
+ return false;
+}
+
+var default_email_options = {
+ allow_display_name: false,
+ require_display_name: false,
+ allow_utf8_local_part: true,
+ require_tld: true
+};
+/* eslint-disable max-len */
+
+/* eslint-disable no-control-regex */
+
+var splitNameAddress = /^([^\x00-\x1F\x7F-\x9F\cX]+)<(.+)>$/i;
+var emailUserPart = /^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~]+$/i;
+var gmailUserPart = /^[a-z\d]+$/;
+var quotedEmailUser = /^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f]))*$/i;
+var emailUserUtf8Part = /^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+$/i;
+var quotedEmailUserUtf8 = /^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*$/i;
+var defaultMaxEmailLength = 254;
+/* eslint-enable max-len */
+
+/* eslint-enable no-control-regex */
+
+/**
+ * Validate display name according to the RFC2822: https://tools.ietf.org/html/rfc2822#appendix-A.1.2
+ * @param {String} display_name
+ */
+
+function validateDisplayName(display_name) {
+ var trim_quotes = display_name.match(/^"(.+)"$/i);
+ var display_name_without_quotes = trim_quotes ? trim_quotes[1] : display_name; // display name with only spaces is not valid
+
+ if (!display_name_without_quotes.trim()) {
+ return false;
+ } // check whether display name contains illegal character
+
+
+ var contains_illegal = /[\.";<>]/.test(display_name_without_quotes);
+
+ if (contains_illegal) {
+ // if contains illegal characters,
+ // must to be enclosed in double-quotes, otherwise it's not a valid display name
+ if (!trim_quotes) {
+ return false;
+ } // the quotes in display name must start with character symbol \
+
+
+ var all_start_with_back_slash = display_name_without_quotes.split('"').length === display_name_without_quotes.split('\\"').length;
+
+ if (!all_start_with_back_slash) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+function isEmail(str, options) {
+ assertString(str);
+ options = merge(options, default_email_options);
+
+ if (options.require_display_name || options.allow_display_name) {
+ var display_email = str.match(splitNameAddress);
+
+ if (display_email) {
+ var display_name;
+
+ var _display_email = _slicedToArray(display_email, 3);
+
+ display_name = _display_email[1];
+ str = _display_email[2];
+
+ // sometimes need to trim the last space to get the display name
+ // because there may be a space between display name and email address
+ // eg. myname <address@gmail.com>
+ // the display name is `myname` instead of `myname `, so need to trim the last space
+ if (display_name.endsWith(' ')) {
+ display_name = display_name.substr(0, display_name.length - 1);
+ }
+
+ if (!validateDisplayName(display_name)) {
+ return false;
+ }
+ } else if (options.require_display_name) {
+ return false;
+ }
+ }
+
+ if (!options.ignore_max_length && str.length > defaultMaxEmailLength) {
+ return false;
+ }
+
+ var parts = str.split('@');
+ var domain = parts.pop();
+ var user = parts.join('@');
+ var lower_domain = domain.toLowerCase();
+
+ if (options.domain_specific_validation && (lower_domain === 'gmail.com' || lower_domain === 'googlemail.com')) {
+ /*
+ Previously we removed dots for gmail addresses before validating.
+ This was removed because it allows `multiple..dots@gmail.com`
+ to be reported as valid, but it is not.
+ Gmail only normalizes single dots, removing them from here is pointless,
+ should be done in normalizeEmail
+ */
+ user = user.toLowerCase(); // Removing sub-address from username before gmail validation
+
+ var username = user.split('+')[0]; // Dots are not included in gmail length restriction
+
+ if (!isByteLength(username.replace('.', ''), {
+ min: 6,
+ max: 30
+ })) {
+ return false;
+ }
+
+ var _user_parts = username.split('.');
+
+ for (var i = 0; i < _user_parts.length; i++) {
+ if (!gmailUserPart.test(_user_parts[i])) {
+ return false;
+ }
+ }
+ }
+
+ if (!isByteLength(user, {
+ max: 64
+ }) || !isByteLength(domain, {
+ max: 254
+ })) {
+ return false;
+ }
+
+ if (!isFQDN(domain, {
+ require_tld: options.require_tld
+ })) {
+ if (!options.allow_ip_domain) {
+ return false;
+ }
+
+ if (!isIP(domain)) {
+ if (!domain.startsWith('[') || !domain.endsWith(']')) {
+ return false;
+ }
+
+ var noBracketdomain = domain.substr(1, domain.length - 2);
+
+ if (noBracketdomain.length === 0 || !isIP(noBracketdomain)) {
+ return false;
+ }
+ }
+ }
+
+ if (user[0] === '"') {
+ user = user.slice(1, user.length - 1);
+ return options.allow_utf8_local_part ? quotedEmailUserUtf8.test(user) : quotedEmailUser.test(user);
+ }
+
+ var pattern = options.allow_utf8_local_part ? emailUserUtf8Part : emailUserPart;
+ var user_parts = user.split('.');
+
+ for (var _i = 0; _i < user_parts.length; _i++) {
+ if (!pattern.test(user_parts[_i])) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/*
+options for isURL method
+
+require_protocol - if set as true isURL will return false if protocol is not present in the URL
+require_valid_protocol - isURL will check if the URL's protocol is present in the protocols option
+protocols - valid protocols can be modified with this option
+require_host - if set as false isURL will not check if host is present in the URL
+allow_protocol_relative_urls - if set as true protocol relative URLs will be allowed
+
+*/
+
+var default_url_options = {
+ protocols: ['http', 'https', 'ftp'],
+ require_tld: true,
+ require_protocol: false,
+ require_host: true,
+ require_valid_protocol: true,
+ allow_underscores: false,
+ allow_trailing_dot: false,
+ allow_protocol_relative_urls: false
+};
+var wrapped_ipv6 = /^\[([^\]]+)\](?::([0-9]+))?$/;
+
+function isRegExp(obj) {
+ return Object.prototype.toString.call(obj) === '[object RegExp]';
+}
+
+function checkHost(host, matches) {
+ for (var i = 0; i < matches.length; i++) {
+ var match = matches[i];
+
+ if (host === match || isRegExp(match) && match.test(host)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+function isURL(url, options) {
+ assertString(url);
+
+ if (!url || url.length >= 2083 || /[\s<>]/.test(url)) {
+ return false;
+ }
+
+ if (url.indexOf('mailto:') === 0) {
+ return false;
+ }
+
+ options = merge(options, default_url_options);
+ var protocol, auth, host, hostname, port, port_str, split, ipv6;
+ split = url.split('#');
+ url = split.shift();
+ split = url.split('?');
+ url = split.shift();
+ split = url.split('://');
+
+ if (split.length > 1) {
+ protocol = split.shift().toLowerCase();
+
+ if (options.require_valid_protocol && options.protocols.indexOf(protocol) === -1) {
+ return false;
+ }
+ } else if (options.require_protocol) {
+ return false;
+ } else if (url.substr(0, 2) === '//') {
+ if (!options.allow_protocol_relative_urls) {
+ return false;
+ }
+
+ split[0] = url.substr(2);
+ }
+
+ url = split.join('://');
+
+ if (url === '') {
+ return false;
+ }
+
+ split = url.split('/');
+ url = split.shift();
+
+ if (url === '' && !options.require_host) {
+ return true;
+ }
+
+ split = url.split('@');
+
+ if (split.length > 1) {
+ if (options.disallow_auth) {
+ return false;
+ }
+
+ auth = split.shift();
+
+ if (auth.indexOf(':') >= 0 && auth.split(':').length > 2) {
+ return false;
+ }
+ }
+
+ hostname = split.join('@');
+ port_str = null;
+ ipv6 = null;
+ var ipv6_match = hostname.match(wrapped_ipv6);
+
+ if (ipv6_match) {
+ host = '';
+ ipv6 = ipv6_match[1];
+ port_str = ipv6_match[2] || null;
+ } else {
+ split = hostname.split(':');
+ host = split.shift();
+
+ if (split.length) {
+ port_str = split.join(':');
+ }
+ }
+
+ if (port_str !== null) {
+ port = parseInt(port_str, 10);
+
+ if (!/^[0-9]+$/.test(port_str) || port <= 0 || port > 65535) {
+ return false;
+ }
+ }
+
+ if (!isIP(host) && !isFQDN(host, options) && (!ipv6 || !isIP(ipv6, 6))) {
+ return false;
+ }
+
+ host = host || ipv6;
+
+ if (options.host_whitelist && !checkHost(host, options.host_whitelist)) {
+ return false;
+ }
+
+ if (options.host_blacklist && checkHost(host, options.host_blacklist)) {
+ return false;
+ }
+
+ return true;
+}
+
+var macAddress = /^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$/;
+var macAddressNoColons = /^([0-9a-fA-F]){12}$/;
+var macAddressWithHyphen = /^([0-9a-fA-F][0-9a-fA-F]-){5}([0-9a-fA-F][0-9a-fA-F])$/;
+var macAddressWithSpaces = /^([0-9a-fA-F][0-9a-fA-F]\s){5}([0-9a-fA-F][0-9a-fA-F])$/;
+var macAddressWithDots = /^([0-9a-fA-F]{4}).([0-9a-fA-F]{4}).([0-9a-fA-F]{4})$/;
+function isMACAddress(str, options) {
+ assertString(str);
+
+ if (options && options.no_colons) {
+ return macAddressNoColons.test(str);
+ }
+
+ return macAddress.test(str) || macAddressWithHyphen.test(str) || macAddressWithSpaces.test(str) || macAddressWithDots.test(str);
+}
+
+var subnetMaybe = /^\d{1,2}$/;
+function isIPRange(str) {
+ assertString(str);
+ var parts = str.split('/'); // parts[0] -> ip, parts[1] -> subnet
+
+ if (parts.length !== 2) {
+ return false;
+ }
+
+ if (!subnetMaybe.test(parts[1])) {
+ return false;
+ } // Disallow preceding 0 i.e. 01, 02, ...
+
+
+ if (parts[1].length > 1 && parts[1].startsWith('0')) {
+ return false;
+ }
+
+ return isIP(parts[0], 4) && parts[1] <= 32 && parts[1] >= 0;
+}
+
+function isBoolean(str) {
+ assertString(str);
+ return ['true', 'false', '1', '0'].indexOf(str) >= 0;
+}
+
+var localeReg = /^[A-z]{2,4}([_-]([A-z]{4}|[\d]{3}))?([_-]([A-z]{2}|[\d]{3}))?$/;
+function isLocale(str) {
+ assertString(str);
+
+ if (str === 'en_US_POSIX' || str === 'ca_ES_VALENCIA') {
+ return true;
+ }
+
+ return localeReg.test(str);
+}
+
+function isAlpha(str) {
+ var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
+ assertString(str);
+
+ if (locale in alpha) {
+ return alpha[locale].test(str);
+ }
+
+ throw new Error("Invalid locale '".concat(locale, "'"));
+}
+var locales$1 = Object.keys(alpha);
+
+function isAlphanumeric(str) {
+ var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
+ assertString(str);
+
+ if (locale in alphanumeric) {
+ return alphanumeric[locale].test(str);
+ }
+
+ throw new Error("Invalid locale '".concat(locale, "'"));
+}
+var locales$2 = Object.keys(alphanumeric);
+
+var numeric = /^[+-]?([0-9]*[.])?[0-9]+$/;
+var numericNoSymbols = /^[0-9]+$/;
+function isNumeric(str, options) {
+ assertString(str);
+
+ if (options && options.no_symbols) {
+ return numericNoSymbols.test(str);
+ }
+
+ return numeric.test(str);
+}
+
+/**
+ * Reference:
+ * https://en.wikipedia.org/ -- Wikipedia
+ * https://docs.microsoft.com/en-us/microsoft-365/compliance/eu-passport-number -- EU Passport Number
+ * https://countrycode.org/ -- Country Codes
+ */
+var passportRegexByCountryCode = {
+ AM: /^[A-Z]{2}\d{7}$/,
+ // ARMENIA
+ AR: /^[A-Z]{3}\d{6}$/,
+ // ARGENTINA
+ AT: /^[A-Z]\d{7}$/,
+ // AUSTRIA
+ AU: /^[A-Z]\d{7}$/,
+ // AUSTRALIA
+ BE: /^[A-Z]{2}\d{6}$/,
+ // BELGIUM
+ BG: /^\d{9}$/,
+ // BULGARIA
+ CA: /^[A-Z]{2}\d{6}$/,
+ // CANADA
+ CH: /^[A-Z]\d{7}$/,
+ // SWITZERLAND
+ CN: /^[GE]\d{8}$/,
+ // CHINA [G=Ordinary, E=Electronic] followed by 8-digits
+ CY: /^[A-Z](\d{6}|\d{8})$/,
+ // CYPRUS
+ CZ: /^\d{8}$/,
+ // CZECH REPUBLIC
+ DE: /^[CFGHJKLMNPRTVWXYZ0-9]{9}$/,
+ // GERMANY
+ DK: /^\d{9}$/,
+ // DENMARK
+ DZ: /^\d{9}$/,
+ // ALGERIA
+ EE: /^([A-Z]\d{7}|[A-Z]{2}\d{7})$/,
+ // ESTONIA (K followed by 7-digits), e-passports have 2 UPPERCASE followed by 7 digits
+ ES: /^[A-Z0-9]{2}([A-Z0-9]?)\d{6}$/,
+ // SPAIN
+ FI: /^[A-Z]{2}\d{7}$/,
+ // FINLAND
+ FR: /^\d{2}[A-Z]{2}\d{5}$/,
+ // FRANCE
+ GB: /^\d{9}$/,
+ // UNITED KINGDOM
+ GR: /^[A-Z]{2}\d{7}$/,
+ // GREECE
+ HR: /^\d{9}$/,
+ // CROATIA
+ HU: /^[A-Z]{2}(\d{6}|\d{7})$/,
+ // HUNGARY
+ IE: /^[A-Z0-9]{2}\d{7}$/,
+ // IRELAND
+ IS: /^(A)\d{7}$/,
+ // ICELAND
+ IT: /^[A-Z0-9]{2}\d{7}$/,
+ // ITALY
+ JP: /^[A-Z]{2}\d{7}$/,
+ // JAPAN
+ KR: /^[MS]\d{8}$/,
+ // SOUTH KOREA, REPUBLIC OF KOREA, [S=PS Passports, M=PM Passports]
+ LT: /^[A-Z0-9]{8}$/,
+ // LITHUANIA
+ LU: /^[A-Z0-9]{8}$/,
+ // LUXEMBURG
+ LV: /^[A-Z0-9]{2}\d{7}$/,
+ // LATVIA
+ MT: /^\d{7}$/,
+ // MALTA
+ NL: /^[A-Z]{2}[A-Z0-9]{6}\d$/,
+ // NETHERLANDS
+ PO: /^[A-Z]{2}\d{7}$/,
+ // POLAND
+ PT: /^[A-Z]\d{6}$/,
+ // PORTUGAL
+ RO: /^\d{8,9}$/,
+ // ROMANIA
+ SE: /^\d{8}$/,
+ // SWEDEN
+ SL: /^(P)[A-Z]\d{7}$/,
+ // SLOVANIA
+ SK: /^[0-9A-Z]\d{7}$/,
+ // SLOVAKIA
+ TR: /^[A-Z]\d{8}$/,
+ // TURKEY
+ UA: /^[A-Z]{2}\d{6}$/,
+ // UKRAINE
+ US: /^\d{9}$/ // UNITED STATES
+
+};
+/**
+ * Check if str is a valid passport number
+ * relative to provided ISO Country Code.
+ *
+ * @param {string} str
+ * @param {string} countryCode
+ * @return {boolean}
+ */
+
+function isPassportNumber(str, countryCode) {
+ /** Remove All Whitespaces, Convert to UPPERCASE */
+ var normalizedStr = str.replace(/\s/g, '').toUpperCase();
+ return countryCode.toUpperCase() in passportRegexByCountryCode && passportRegexByCountryCode[countryCode].test(normalizedStr);
+}
+
+var _int = /^(?:[-+]?(?:0|[1-9][0-9]*))$/;
+var intLeadingZeroes = /^[-+]?[0-9]+$/;
+function isInt(str, options) {
+ assertString(str);
+ options = options || {}; // Get the regex to use for testing, based on whether
+ // leading zeroes are allowed or not.
+
+ var regex = options.hasOwnProperty('allow_leading_zeroes') && !options.allow_leading_zeroes ? _int : intLeadingZeroes; // Check min/max/lt/gt
+
+ var minCheckPassed = !options.hasOwnProperty('min') || str >= options.min;
+ var maxCheckPassed = !options.hasOwnProperty('max') || str <= options.max;
+ var ltCheckPassed = !options.hasOwnProperty('lt') || str < options.lt;
+ var gtCheckPassed = !options.hasOwnProperty('gt') || str > options.gt;
+ return regex.test(str) && minCheckPassed && maxCheckPassed && ltCheckPassed && gtCheckPassed;
+}
+
+function isPort(str) {
+ return isInt(str, {
+ min: 0,
+ max: 65535
+ });
+}
+
+function isLowercase(str) {
+ assertString(str);
+ return str === str.toLowerCase();
+}
+
+function isUppercase(str) {
+ assertString(str);
+ return str === str.toUpperCase();
+}
+
+/* eslint-disable no-control-regex */
+
+var ascii = /^[\x00-\x7F]+$/;
+/* eslint-enable no-control-regex */
+
+function isAscii(str) {
+ assertString(str);
+ return ascii.test(str);
+}
+
+var fullWidth = /[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;
+function isFullWidth(str) {
+ assertString(str);
+ return fullWidth.test(str);
+}
+
+var halfWidth = /[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;
+function isHalfWidth(str) {
+ assertString(str);
+ return halfWidth.test(str);
+}
+
+function isVariableWidth(str) {
+ assertString(str);
+ return fullWidth.test(str) && halfWidth.test(str);
+}
+
+/* eslint-disable no-control-regex */
+
+var multibyte = /[^\x00-\x7F]/;
+/* eslint-enable no-control-regex */
+
+function isMultibyte(str) {
+ assertString(str);
+ return multibyte.test(str);
+}
+
+/**
+ * Build RegExp object from an array
+ * of multiple/multi-line regexp parts
+ *
+ * @param {string[]} parts
+ * @param {string} flags
+ * @return {object} - RegExp object
+ */
+function multilineRegexp(parts) {
+ var flags = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ var regexpAsStringLiteral = parts.join('');
+ return new RegExp(regexpAsStringLiteral, flags);
+}
+
+/**
+ * Regular Expression to match
+ * semantic versioning (SemVer)
+ * built from multi-line, multi-parts regexp
+ * Reference: https://semver.org/
+ */
+
+var semanticVersioningRegex = multilineRegexp(['^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)', '(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))', '?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$']);
+function isSemVer(str) {
+ assertString(str);
+ return semanticVersioningRegex.test(str);
+}
+
+var surrogatePair = /[\uD800-\uDBFF][\uDC00-\uDFFF]/;
+function isSurrogatePair(str) {
+ assertString(str);
+ return surrogatePair.test(str);
+}
+
+var includes = function includes(arr, val) {
+ return arr.some(function (arrVal) {
+ return val === arrVal;
+ });
+};
+
+function decimalRegExp(options) {
+ var regExp = new RegExp("^[-+]?([0-9]+)?(\\".concat(decimal[options.locale], "[0-9]{").concat(options.decimal_digits, "})").concat(options.force_decimal ? '' : '?', "$"));
+ return regExp;
+}
+
+var default_decimal_options = {
+ force_decimal: false,
+ decimal_digits: '1,',
+ locale: 'en-US'
+};
+var blacklist = ['', '-', '+'];
+function isDecimal(str, options) {
+ assertString(str);
+ options = merge(options, default_decimal_options);
+
+ if (options.locale in decimal) {
+ return !includes(blacklist, str.replace(/ /g, '')) && decimalRegExp(options).test(str);
+ }
+
+ throw new Error("Invalid locale '".concat(options.locale, "'"));
+}
+
+var hexadecimal = /^(0x|0h)?[0-9A-F]+$/i;
+function isHexadecimal(str) {
+ assertString(str);
+ return hexadecimal.test(str);
+}
+
+var octal = /^(0o)?[0-7]+$/i;
+function isOctal(str) {
+ assertString(str);
+ return octal.test(str);
+}
+
+function isDivisibleBy(str, num) {
+ assertString(str);
+ return toFloat(str) % parseInt(num, 10) === 0;
+}
+
+var hexcolor = /^#?([0-9A-F]{3}|[0-9A-F]{4}|[0-9A-F]{6}|[0-9A-F]{8})$/i;
+function isHexColor(str) {
+ assertString(str);
+ return hexcolor.test(str);
+}
+
+var rgbColor = /^rgb\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\)$/;
+var rgbaColor = /^rgba\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)$/;
+var rgbColorPercent = /^rgb\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\)/;
+var rgbaColorPercent = /^rgba\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)/;
+function isRgbColor(str) {
+ var includePercentValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ assertString(str);
+
+ if (!includePercentValues) {
+ return rgbColor.test(str) || rgbaColor.test(str);
+ }
+
+ return rgbColor.test(str) || rgbaColor.test(str) || rgbColorPercent.test(str) || rgbaColorPercent.test(str);
+}
+
+var hslcomma = /^(hsl)a?\(\s*((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn|\s*)(\s*,\s*(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}\s*(,\s*((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?)\s*)?\)$/i;
+var hslspace = /^(hsl)a?\(\s*((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn|\s)(\s*(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}\s*(\/\s*((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?)\s*)?\)$/i;
+function isHSL(str) {
+ assertString(str);
+ return hslcomma.test(str) || hslspace.test(str);
+}
+
+var isrc = /^[A-Z]{2}[0-9A-Z]{3}\d{2}\d{5}$/;
+function isISRC(str) {
+ assertString(str);
+ return isrc.test(str);
+}
+
+/**
+ * List of country codes with
+ * corresponding IBAN regular expression
+ * Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number
+ */
+
+var ibanRegexThroughCountryCode = {
+ AD: /^(AD[0-9]{2})\d{8}[A-Z0-9]{12}$/,
+ AE: /^(AE[0-9]{2})\d{3}\d{16}$/,
+ AL: /^(AL[0-9]{2})\d{8}[A-Z0-9]{16}$/,
+ AT: /^(AT[0-9]{2})\d{16}$/,
+ AZ: /^(AZ[0-9]{2})[A-Z0-9]{4}\d{20}$/,
+ BA: /^(BA[0-9]{2})\d{16}$/,
+ BE: /^(BE[0-9]{2})\d{12}$/,
+ BG: /^(BG[0-9]{2})[A-Z]{4}\d{6}[A-Z0-9]{8}$/,
+ BH: /^(BH[0-9]{2})[A-Z]{4}[A-Z0-9]{14}$/,
+ BR: /^(BR[0-9]{2})\d{23}[A-Z]{1}[A-Z0-9]{1}$/,
+ BY: /^(BY[0-9]{2})[A-Z0-9]{4}\d{20}$/,
+ CH: /^(CH[0-9]{2})\d{5}[A-Z0-9]{12}$/,
+ CR: /^(CR[0-9]{2})\d{18}$/,
+ CY: /^(CY[0-9]{2})\d{8}[A-Z0-9]{16}$/,
+ CZ: /^(CZ[0-9]{2})\d{20}$/,
+ DE: /^(DE[0-9]{2})\d{18}$/,
+ DK: /^(DK[0-9]{2})\d{14}$/,
+ DO: /^(DO[0-9]{2})[A-Z]{4}\d{20}$/,
+ EE: /^(EE[0-9]{2})\d{16}$/,
+ ES: /^(ES[0-9]{2})\d{20}$/,
+ FI: /^(FI[0-9]{2})\d{14}$/,
+ FO: /^(FO[0-9]{2})\d{14}$/,
+ FR: /^(FR[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,
+ GB: /^(GB[0-9]{2})[A-Z]{4}\d{14}$/,
+ GE: /^(GE[0-9]{2})[A-Z0-9]{2}\d{16}$/,
+ GI: /^(GI[0-9]{2})[A-Z]{4}[A-Z0-9]{15}$/,
+ GL: /^(GL[0-9]{2})\d{14}$/,
+ GR: /^(GR[0-9]{2})\d{7}[A-Z0-9]{16}$/,
+ GT: /^(GT[0-9]{2})[A-Z0-9]{4}[A-Z0-9]{20}$/,
+ HR: /^(HR[0-9]{2})\d{17}$/,
+ HU: /^(HU[0-9]{2})\d{24}$/,
+ IE: /^(IE[0-9]{2})[A-Z0-9]{4}\d{14}$/,
+ IL: /^(IL[0-9]{2})\d{19}$/,
+ IQ: /^(IQ[0-9]{2})[A-Z]{4}\d{15}$/,
+ IS: /^(IS[0-9]{2})\d{22}$/,
+ IT: /^(IT[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,
+ JO: /^(JO[0-9]{2})[A-Z]{4}\d{22}$/,
+ KW: /^(KW[0-9]{2})[A-Z]{4}[A-Z0-9]{22}$/,
+ KZ: /^(KZ[0-9]{2})\d{3}[A-Z0-9]{13}$/,
+ LB: /^(LB[0-9]{2})\d{4}[A-Z0-9]{20}$/,
+ LC: /^(LC[0-9]{2})[A-Z]{4}[A-Z0-9]{24}$/,
+ LI: /^(LI[0-9]{2})\d{5}[A-Z0-9]{12}$/,
+ LT: /^(LT[0-9]{2})\d{16}$/,
+ LU: /^(LU[0-9]{2})\d{3}[A-Z0-9]{13}$/,
+ LV: /^(LV[0-9]{2})[A-Z]{4}[A-Z0-9]{13}$/,
+ MC: /^(MC[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,
+ MD: /^(MD[0-9]{2})[A-Z0-9]{20}$/,
+ ME: /^(ME[0-9]{2})\d{18}$/,
+ MK: /^(MK[0-9]{2})\d{3}[A-Z0-9]{10}\d{2}$/,
+ MR: /^(MR[0-9]{2})\d{23}$/,
+ MT: /^(MT[0-9]{2})[A-Z]{4}\d{5}[A-Z0-9]{18}$/,
+ MU: /^(MU[0-9]{2})[A-Z]{4}\d{19}[A-Z]{3}$/,
+ NL: /^(NL[0-9]{2})[A-Z]{4}\d{10}$/,
+ NO: /^(NO[0-9]{2})\d{11}$/,
+ PK: /^(PK[0-9]{2})[A-Z0-9]{4}\d{16}$/,
+ PL: /^(PL[0-9]{2})\d{24}$/,
+ PS: /^(PS[0-9]{2})[A-Z0-9]{4}\d{21}$/,
+ PT: /^(PT[0-9]{2})\d{21}$/,
+ QA: /^(QA[0-9]{2})[A-Z]{4}[A-Z0-9]{21}$/,
+ RO: /^(RO[0-9]{2})[A-Z]{4}[A-Z0-9]{16}$/,
+ RS: /^(RS[0-9]{2})\d{18}$/,
+ SA: /^(SA[0-9]{2})\d{2}[A-Z0-9]{18}$/,
+ SC: /^(SC[0-9]{2})[A-Z]{4}\d{20}[A-Z]{3}$/,
+ SE: /^(SE[0-9]{2})\d{20}$/,
+ SI: /^(SI[0-9]{2})\d{15}$/,
+ SK: /^(SK[0-9]{2})\d{20}$/,
+ SM: /^(SM[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,
+ TL: /^(TL[0-9]{2})\d{19}$/,
+ TN: /^(TN[0-9]{2})\d{20}$/,
+ TR: /^(TR[0-9]{2})\d{5}[A-Z0-9]{17}$/,
+ UA: /^(UA[0-9]{2})\d{6}[A-Z0-9]{19}$/,
+ VA: /^(VA[0-9]{2})\d{18}$/,
+ VG: /^(VG[0-9]{2})[A-Z0-9]{4}\d{16}$/,
+ XK: /^(XK[0-9]{2})\d{16}$/
+};
+/**
+ * Check whether string has correct universal IBAN format
+ * The IBAN consists of up to 34 alphanumeric characters, as follows:
+ * Country Code using ISO 3166-1 alpha-2, two letters
+ * check digits, two digits and
+ * Basic Bank Account Number (BBAN), up to 30 alphanumeric characters.
+ * NOTE: Permitted IBAN characters are: digits [0-9] and the 26 latin alphabetic [A-Z]
+ *
+ * @param {string} str - string under validation
+ * @return {boolean}
+ */
+
+function hasValidIbanFormat(str) {
+ // Strip white spaces and hyphens
+ var strippedStr = str.replace(/[\s\-]+/gi, '').toUpperCase();
+ var isoCountryCode = strippedStr.slice(0, 2).toUpperCase();
+ return isoCountryCode in ibanRegexThroughCountryCode && ibanRegexThroughCountryCode[isoCountryCode].test(strippedStr);
+}
+/**
+ * Check whether string has valid IBAN Checksum
+ * by performing basic mod-97 operation and
+ * the remainder should equal 1
+ * -- Start by rearranging the IBAN by moving the four initial characters to the end of the string
+ * -- Replace each letter in the string with two digits, A -> 10, B = 11, Z = 35
+ * -- Interpret the string as a decimal integer and
+ * -- compute the remainder on division by 97 (mod 97)
+ * Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number
+ *
+ * @param {string} str
+ * @return {boolean}
+ */
+
+
+function hasValidIbanChecksum(str) {
+ var strippedStr = str.replace(/[^A-Z0-9]+/gi, '').toUpperCase(); // Keep only digits and A-Z latin alphabetic
+
+ var rearranged = strippedStr.slice(4) + strippedStr.slice(0, 4);
+ var alphaCapsReplacedWithDigits = rearranged.replace(/[A-Z]/g, function (_char) {
+ return _char.charCodeAt(0) - 55;
+ });
+ var remainder = alphaCapsReplacedWithDigits.match(/\d{1,7}/g).reduce(function (acc, value) {
+ return Number(acc + value) % 97;
+ }, '');
+ return remainder === 1;
+}
+
+function isIBAN(str) {
+ assertString(str);
+ return hasValidIbanFormat(str) && hasValidIbanChecksum(str);
+}
+
+var isBICReg = /^[A-z]{4}[A-z]{2}\w{2}(\w{3})?$/;
+function isBIC(str) {
+ assertString(str);
+ return isBICReg.test(str);
+}
+
+var md5 = /^[a-f0-9]{32}$/;
+function isMD5(str) {
+ assertString(str);
+ return md5.test(str);
+}
+
+var lengths = {
+ md5: 32,
+ md4: 32,
+ sha1: 40,
+ sha256: 64,
+ sha384: 96,
+ sha512: 128,
+ ripemd128: 32,
+ ripemd160: 40,
+ tiger128: 32,
+ tiger160: 40,
+ tiger192: 48,
+ crc32: 8,
+ crc32b: 8
+};
+function isHash(str, algorithm) {
+ assertString(str);
+ var hash = new RegExp("^[a-fA-F0-9]{".concat(lengths[algorithm], "}$"));
+ return hash.test(str);
+}
+
+var jwt = /^([A-Za-z0-9\-_~+\/]+[=]{0,2})\.([A-Za-z0-9\-_~+\/]+[=]{0,2})(?:\.([A-Za-z0-9\-_~+\/]+[=]{0,2}))?$/;
+function isJWT(str) {
+ assertString(str);
+ return jwt.test(str);
+}
+
+function isJSON(str) {
+ assertString(str);
+
+ try {
+ var obj = JSON.parse(str);
+ return !!obj && _typeof(obj) === 'object';
+ } catch (e) {
+ /* ignore */
+ }
+
+ return false;
+}
+
+var default_is_empty_options = {
+ ignore_whitespace: false
+};
+function isEmpty(str, options) {
+ assertString(str);
+ options = merge(options, default_is_empty_options);
+ return (options.ignore_whitespace ? str.trim().length : str.length) === 0;
+}
+
+/* eslint-disable prefer-rest-params */
+
+function isLength(str, options) {
+ assertString(str);
+ var min;
+ var max;
+
+ if (_typeof(options) === 'object') {
+ min = options.min || 0;
+ max = options.max;
+ } else {
+ // backwards compatibility: isLength(str, min [, max])
+ min = arguments[1] || 0;
+ max = arguments[2];
+ }
+
+ var surrogatePairs = str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g) || [];
+ var len = str.length - surrogatePairs.length;
+ return len >= min && (typeof max === 'undefined' || len <= max);
+}
+
+var uuid = {
+ 3: /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
+ 4: /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
+ 5: /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
+ all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
+};
+function isUUID(str) {
+ var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'all';
+ assertString(str);
+ var pattern = uuid[version];
+ return pattern && pattern.test(str);
+}
+
+function isMongoId(str) {
+ assertString(str);
+ return isHexadecimal(str) && str.length === 24;
+}
+
+function isAfter(str) {
+ var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String(new Date());
+ assertString(str);
+ var comparison = toDate(date);
+ var original = toDate(str);
+ return !!(original && comparison && original > comparison);
+}
+
+function isBefore(str) {
+ var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String(new Date());
+ assertString(str);
+ var comparison = toDate(date);
+ var original = toDate(str);
+ return !!(original && comparison && original < comparison);
+}
+
+function isIn(str, options) {
+ assertString(str);
+ var i;
+
+ if (Object.prototype.toString.call(options) === '[object Array]') {
+ var array = [];
+
+ for (i in options) {
+ // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
+ // istanbul ignore else
+ if ({}.hasOwnProperty.call(options, i)) {
+ array[i] = toString$1(options[i]);
+ }
+ }
+
+ return array.indexOf(str) >= 0;
+ } else if (_typeof(options) === 'object') {
+ return options.hasOwnProperty(str);
+ } else if (options && typeof options.indexOf === 'function') {
+ return options.indexOf(str) >= 0;
+ }
+
+ return false;
+}
+
+/* eslint-disable max-len */
+
+var creditCard = /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11}|6[27][0-9]{14})$/;
+/* eslint-enable max-len */
+
+function isCreditCard(str) {
+ assertString(str);
+ var sanitized = str.replace(/[- ]+/g, '');
+
+ if (!creditCard.test(sanitized)) {
+ return false;
+ }
+
+ var sum = 0;
+ var digit;
+ var tmpNum;
+ var shouldDouble;
+
+ for (var i = sanitized.length - 1; i >= 0; i--) {
+ digit = sanitized.substring(i, i + 1);
+ tmpNum = parseInt(digit, 10);
+
+ if (shouldDouble) {
+ tmpNum *= 2;
+
+ if (tmpNum >= 10) {
+ sum += tmpNum % 10 + 1;
+ } else {
+ sum += tmpNum;
+ }
+ } else {
+ sum += tmpNum;
+ }
+
+ shouldDouble = !shouldDouble;
+ }
+
+ return !!(sum % 10 === 0 ? sanitized : false);
+}
+
+var validators = {
+ ES: function ES(str) {
+ assertString(str);
+ var DNI = /^[0-9X-Z][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/;
+ var charsValue = {
+ X: 0,
+ Y: 1,
+ Z: 2
+ };
+ var controlDigits = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E']; // sanitize user input
+
+ var sanitized = str.trim().toUpperCase(); // validate the data structure
+
+ if (!DNI.test(sanitized)) {
+ return false;
+ } // validate the control digit
+
+
+ var number = sanitized.slice(0, -1).replace(/[X,Y,Z]/g, function (_char) {
+ return charsValue[_char];
+ });
+ return sanitized.endsWith(controlDigits[number % 23]);
+ },
+ 'he-IL': function heIL(str) {
+ var DNI = /^\d{9}$/; // sanitize user input
+
+ var sanitized = str.trim(); // validate the data structure
+
+ if (!DNI.test(sanitized)) {
+ return false;
+ }
+
+ var id = sanitized;
+ var sum = 0,
+ incNum;
+
+ for (var i = 0; i < id.length; i++) {
+ incNum = Number(id[i]) * (i % 2 + 1); // Multiply number by 1 or 2
+
+ sum += incNum > 9 ? incNum - 9 : incNum; // Sum the digits up and add to total
+ }
+
+ return sum % 10 === 0;
+ },
+ 'zh-TW': function zhTW(str) {
+ var ALPHABET_CODES = {
+ A: 10,
+ B: 11,
+ C: 12,
+ D: 13,
+ E: 14,
+ F: 15,
+ G: 16,
+ H: 17,
+ I: 34,
+ J: 18,
+ K: 19,
+ L: 20,
+ M: 21,
+ N: 22,
+ O: 35,
+ P: 23,
+ Q: 24,
+ R: 25,
+ S: 26,
+ T: 27,
+ U: 28,
+ V: 29,
+ W: 32,
+ X: 30,
+ Y: 31,
+ Z: 33
+ };
+ var sanitized = str.trim().toUpperCase();
+ if (!/^[A-Z][0-9]{9}$/.test(sanitized)) return false;
+ return Array.from(sanitized).reduce(function (sum, number, index) {
+ if (index === 0) {
+ var code = ALPHABET_CODES[number];
+ return code % 10 * 9 + Math.floor(code / 10);
+ }
+
+ if (index === 9) {
+ return (10 - sum % 10 - Number(number)) % 10 === 0;
+ }
+
+ return sum + Number(number) * (9 - index);
+ }, 0);
+ }
+};
+function isIdentityCard(str, locale) {
+ assertString(str);
+
+ if (locale in validators) {
+ return validators[locale](str);
+ } else if (locale === 'any') {
+ for (var key in validators) {
+ // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
+ // istanbul ignore else
+ if (validators.hasOwnProperty(key)) {
+ var validator = validators[key];
+
+ if (validator(str)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ throw new Error("Invalid locale '".concat(locale, "'"));
+}
+
+/**
+ * The most commonly used EAN standard is
+ * the thirteen-digit EAN-13, while the
+ * less commonly used 8-digit EAN-8 barcode was
+ * introduced for use on small packages.
+ * EAN consists of:
+ * GS1 prefix, manufacturer code, product code and check digit
+ * Reference: https://en.wikipedia.org/wiki/International_Article_Number
+ */
+/**
+ * Define EAN Lenghts; 8 for EAN-8; 13 for EAN-13
+ * and Regular Expression for valid EANs (EAN-8, EAN-13),
+ * with exact numberic matching of 8 or 13 digits [0-9]
+ */
+
+var LENGTH_EAN_8 = 8;
+var validEanRegex = /^(\d{8}|\d{13})$/;
+/**
+ * Get position weight given:
+ * EAN length and digit index/position
+ *
+ * @param {number} length
+ * @param {number} index
+ * @return {number}
+ */
+
+function getPositionWeightThroughLengthAndIndex(length, index) {
+ if (length === LENGTH_EAN_8) {
+ return index % 2 === 0 ? 3 : 1;
+ }
+
+ return index % 2 === 0 ? 1 : 3;
+}
+/**
+ * Calculate EAN Check Digit
+ * Reference: https://en.wikipedia.org/wiki/International_Article_Number#Calculation_of_checksum_digit
+ *
+ * @param {string} ean
+ * @return {number}
+ */
+
+
+function calculateCheckDigit(ean) {
+ var checksum = ean.slice(0, -1).split('').map(function (_char, index) {
+ return Number(_char) * getPositionWeightThroughLengthAndIndex(ean.length, index);
+ }).reduce(function (acc, partialSum) {
+ return acc + partialSum;
+ }, 0);
+ var remainder = 10 - checksum % 10;
+ return remainder < 10 ? remainder : 0;
+}
+/**
+ * Check if string is valid EAN:
+ * Matches EAN-8/EAN-13 regex
+ * Has valid check digit.
+ *
+ * @param {string} str
+ * @return {boolean}
+ */
+
+
+function isEAN(str) {
+ assertString(str);
+ var actualCheckDigit = Number(str.slice(-1));
+ return validEanRegex.test(str) && actualCheckDigit === calculateCheckDigit(str);
+}
+
+var isin = /^[A-Z]{2}[0-9A-Z]{9}[0-9]$/;
+function isISIN(str) {
+ assertString(str);
+
+ if (!isin.test(str)) {
+ return false;
+ }
+
+ var checksumStr = str.replace(/[A-Z]/g, function (character) {
+ return parseInt(character, 36);
+ });
+ var sum = 0;
+ var digit;
+ var tmpNum;
+ var shouldDouble = true;
+
+ for (var i = checksumStr.length - 2; i >= 0; i--) {
+ digit = checksumStr.substring(i, i + 1);
+ tmpNum = parseInt(digit, 10);
+
+ if (shouldDouble) {
+ tmpNum *= 2;
+
+ if (tmpNum >= 10) {
+ sum += tmpNum + 1;
+ } else {
+ sum += tmpNum;
+ }
+ } else {
+ sum += tmpNum;
+ }
+
+ shouldDouble = !shouldDouble;
+ }
+
+ return parseInt(str.substr(str.length - 1), 10) === (10000 - sum) % 10;
+}
+
+var isbn10Maybe = /^(?:[0-9]{9}X|[0-9]{10})$/;
+var isbn13Maybe = /^(?:[0-9]{13})$/;
+var factor = [1, 3];
+function isISBN(str) {
+ var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ assertString(str);
+ version = String(version);
+
+ if (!version) {
+ return isISBN(str, 10) || isISBN(str, 13);
+ }
+
+ var sanitized = str.replace(/[\s-]+/g, '');
+ var checksum = 0;
+ var i;
+
+ if (version === '10') {
+ if (!isbn10Maybe.test(sanitized)) {
+ return false;
+ }
+
+ for (i = 0; i < 9; i++) {
+ checksum += (i + 1) * sanitized.charAt(i);
+ }
+
+ if (sanitized.charAt(9) === 'X') {
+ checksum += 10 * 10;
+ } else {
+ checksum += 10 * sanitized.charAt(9);
+ }
+
+ if (checksum % 11 === 0) {
+ return !!sanitized;
+ }
+ } else if (version === '13') {
+ if (!isbn13Maybe.test(sanitized)) {
+ return false;
+ }
+
+ for (i = 0; i < 12; i++) {
+ checksum += factor[i % 2] * sanitized.charAt(i);
+ }
+
+ if (sanitized.charAt(12) - (10 - checksum % 10) % 10 === 0) {
+ return !!sanitized;
+ }
+ }
+
+ return false;
+}
+
+var issn = '^\\d{4}-?\\d{3}[\\dX]$';
+function isISSN(str) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ assertString(str);
+ var testIssn = issn;
+ testIssn = options.require_hyphen ? testIssn.replace('?', '') : testIssn;
+ testIssn = options.case_sensitive ? new RegExp(testIssn) : new RegExp(testIssn, 'i');
+
+ if (!testIssn.test(str)) {
+ return false;
+ }
+
+ var digits = str.replace('-', '').toUpperCase();
+ var checksum = 0;
+
+ for (var i = 0; i < digits.length; i++) {
+ var digit = digits[i];
+ checksum += (digit === 'X' ? 10 : +digit) * (8 - i);
+ }
+
+ return checksum % 11 === 0;
+}
+
+/* eslint-disable max-len */
+
+var phones = {
+ 'am-AM': /^(\+?374|0)((10|[9|7][0-9])\d{6}$|[2-4]\d{7}$)/,
+ 'ar-AE': /^((\+?971)|0)?5[024568]\d{7}$/,
+ 'ar-BH': /^(\+?973)?(3|6)\d{7}$/,
+ 'ar-DZ': /^(\+?213|0)(5|6|7)\d{8}$/,
+ 'ar-EG': /^((\+?20)|0)?1[0125]\d{8}$/,
+ 'ar-IQ': /^(\+?964|0)?7[0-9]\d{8}$/,
+ 'ar-JO': /^(\+?962|0)?7[789]\d{7}$/,
+ 'ar-KW': /^(\+?965)[569]\d{7}$/,
+ 'ar-SA': /^(!?(\+?966)|0)?5\d{8}$/,
+ 'ar-SY': /^(!?(\+?963)|0)?9\d{8}$/,
+ 'ar-TN': /^(\+?216)?[2459]\d{7}$/,
+ 'be-BY': /^(\+?375)?(24|25|29|33|44)\d{7}$/,
+ 'bg-BG': /^(\+?359|0)?8[789]\d{7}$/,
+ 'bn-BD': /^(\+?880|0)1[13456789][0-9]{8}$/,
+ 'cs-CZ': /^(\+?420)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,
+ 'da-DK': /^(\+?45)?\s?\d{2}\s?\d{2}\s?\d{2}\s?\d{2}$/,
+ 'de-DE': /^(\+49)?0?1(5[0-25-9]\d|6([23]|0\d?)|7([0-57-9]|6\d))\d{7}$/,
+ 'de-AT': /^(\+43|0)\d{1,4}\d{3,12}$/,
+ 'el-GR': /^(\+?30|0)?(69\d{8})$/,
+ 'en-AU': /^(\+?61|0)4\d{8}$/,
+ 'en-GB': /^(\+?44|0)7\d{9}$/,
+ 'en-GG': /^(\+?44|0)1481\d{6}$/,
+ 'en-GH': /^(\+233|0)(20|50|24|54|27|57|26|56|23|28)\d{7}$/,
+ 'en-HK': /^(\+?852[-\s]?)?[456789]\d{3}[-\s]?\d{4}$/,
+ 'en-MO': /^(\+?853[-\s]?)?[6]\d{3}[-\s]?\d{4}$/,
+ 'en-IE': /^(\+?353|0)8[356789]\d{7}$/,
+ 'en-IN': /^(\+?91|0)?[6789]\d{9}$/,
+ 'en-KE': /^(\+?254|0)(7|1)\d{8}$/,
+ 'en-MT': /^(\+?356|0)?(99|79|77|21|27|22|25)[0-9]{6}$/,
+ 'en-MU': /^(\+?230|0)?\d{8}$/,
+ 'en-NG': /^(\+?234|0)?[789]\d{9}$/,
+ 'en-NZ': /^(\+?64|0)[28]\d{7,9}$/,
+ 'en-PK': /^((\+92)|(0092))-{0,1}\d{3}-{0,1}\d{7}$|^\d{11}$|^\d{4}-\d{7}$/,
+ 'en-RW': /^(\+?250|0)?[7]\d{8}$/,
+ 'en-SG': /^(\+65)?[89]\d{7}$/,
+ 'en-TZ': /^(\+?255|0)?[67]\d{8}$/,
+ 'en-UG': /^(\+?256|0)?[7]\d{8}$/,
+ 'en-US': /^((\+1|1)?( |-)?)?(\([2-9][0-9]{2}\)|[2-9][0-9]{2})( |-)?([2-9][0-9]{2}( |-)?[0-9]{4})$/,
+ 'en-ZA': /^(\+?27|0)\d{9}$/,
+ 'en-ZM': /^(\+?26)?09[567]\d{7}$/,
+ 'es-CL': /^(\+?56|0)[2-9]\d{1}\d{7}$/,
+ 'es-EC': /^(\+?593|0)([2-7]|9[2-9])\d{7}$/,
+ 'es-ES': /^(\+?34)?(6\d{1}|7[1234])\d{7}$/,
+ 'es-MX': /^(\+?52)?(1|01)?\d{10,11}$/,
+ 'es-PA': /^(\+?507)\d{7,8}$/,
+ 'es-PY': /^(\+?595|0)9[9876]\d{7}$/,
+ 'es-UY': /^(\+598|0)9[1-9][\d]{6}$/,
+ 'et-EE': /^(\+?372)?\s?(5|8[1-4])\s?([0-9]\s?){6,7}$/,
+ 'fa-IR': /^(\+?98[\-\s]?|0)9[0-39]\d[\-\s]?\d{3}[\-\s]?\d{4}$/,
+ 'fi-FI': /^(\+?358|0)\s?(4(0|1|2|4|5|6)?|50)\s?(\d\s?){4,8}\d$/,
+ 'fj-FJ': /^(\+?679)?\s?\d{3}\s?\d{4}$/,
+ 'fo-FO': /^(\+?298)?\s?\d{2}\s?\d{2}\s?\d{2}$/,
+ 'fr-FR': /^(\+?33|0)[67]\d{8}$/,
+ 'fr-GF': /^(\+?594|0|00594)[67]\d{8}$/,
+ 'fr-GP': /^(\+?590|0|00590)[67]\d{8}$/,
+ 'fr-MQ': /^(\+?596|0|00596)[67]\d{8}$/,
+ 'fr-RE': /^(\+?262|0|00262)[67]\d{8}$/,
+ 'he-IL': /^(\+972|0)([23489]|5[012345689]|77)[1-9]\d{6}$/,
+ 'hu-HU': /^(\+?36)(20|30|70)\d{7}$/,
+ 'id-ID': /^(\+?62|0)8(1[123456789]|2[1238]|3[1238]|5[12356789]|7[78]|9[56789]|8[123456789])([\s?|\d]{5,11})$/,
+ 'it-IT': /^(\+?39)?\s?3\d{2} ?\d{6,7}$/,
+ 'ja-JP': /^(\+81[ \-]?(\(0\))?|0)[6789]0[ \-]?\d{4}[ \-]?\d{4}$/,
+ 'kk-KZ': /^(\+?7|8)?7\d{9}$/,
+ 'kl-GL': /^(\+?299)?\s?\d{2}\s?\d{2}\s?\d{2}$/,
+ 'ko-KR': /^((\+?82)[ \-]?)?0?1([0|1|6|7|8|9]{1})[ \-]?\d{3,4}[ \-]?\d{4}$/,
+ 'lt-LT': /^(\+370|8)\d{8}$/,
+ 'ms-MY': /^(\+?6?01){1}(([0145]{1}(\-|\s)?\d{7,8})|([236789]{1}(\s|\-)?\d{7}))$/,
+ 'nb-NO': /^(\+?47)?[49]\d{7}$/,
+ 'ne-NP': /^(\+?977)?9[78]\d{8}$/,
+ 'nl-BE': /^(\+?32|0)4?\d{8}$/,
+ 'nl-NL': /^(\+?31|0)6?\d{8}$/,
+ 'nn-NO': /^(\+?47)?[49]\d{7}$/,
+ 'pl-PL': /^(\+?48)? ?[5-8]\d ?\d{3} ?\d{2} ?\d{2}$/,
+ 'pt-BR': /(?=^(\+?5{2}\-?|0)[1-9]{2}\-?\d{4}\-?\d{4}$)(^(\+?5{2}\-?|0)[1-9]{2}\-?[6-9]{1}\d{3}\-?\d{4}$)|(^(\+?5{2}\-?|0)[1-9]{2}\-?9[6-9]{1}\d{3}\-?\d{4}$)/,
+ 'pt-PT': /^(\+?351)?9[1236]\d{7}$/,
+ 'ro-RO': /^(\+?4?0)\s?7\d{2}(\/|\s|\.|\-)?\d{3}(\s|\.|\-)?\d{3}$/,
+ 'ru-RU': /^(\+?7|8)?9\d{9}$/,
+ 'sl-SI': /^(\+386\s?|0)(\d{1}\s?\d{3}\s?\d{2}\s?\d{2}|\d{2}\s?\d{3}\s?\d{3})$/,
+ 'sk-SK': /^(\+?421)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,
+ 'sr-RS': /^(\+3816|06)[- \d]{5,9}$/,
+ 'sv-SE': /^(\+?46|0)[\s\-]?7[\s\-]?[02369]([\s\-]?\d){7}$/,
+ 'th-TH': /^(\+66|66|0)\d{9}$/,
+ 'tr-TR': /^(\+?90|0)?5\d{9}$/,
+ 'uk-UA': /^(\+?38|8)?0\d{9}$/,
+ 'vi-VN': /^(\+?84|0)((3([2-9]))|(5([2689]))|(7([0|6-9]))|(8([1-6|89]))|(9([0-9])))([0-9]{7})$/,
+ 'zh-CN': /^((\+|00)86)?1([358][0-9]|4[579]|6[67]|7[01235678]|9[189])[0-9]{8}$/,
+ 'zh-TW': /^(\+?886\-?|0)?9\d{8}$/
+};
+/* eslint-enable max-len */
+// aliases
+
+phones['en-CA'] = phones['en-US'];
+phones['fr-BE'] = phones['nl-BE'];
+phones['zh-HK'] = phones['en-HK'];
+phones['zh-MO'] = phones['en-MO'];
+function isMobilePhone(str, locale, options) {
+ assertString(str);
+
+ if (options && options.strictMode && !str.startsWith('+')) {
+ return false;
+ }
+
+ if (Array.isArray(locale)) {
+ return locale.some(function (key) {
+ // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
+ // istanbul ignore else
+ if (phones.hasOwnProperty(key)) {
+ var phone = phones[key];
+
+ if (phone.test(str)) {
+ return true;
+ }
+ }
+
+ return false;
+ });
+ } else if (locale in phones) {
+ return phones[locale].test(str); // alias falsey locale as 'any'
+ } else if (!locale || locale === 'any') {
+ for (var key in phones) {
+ // istanbul ignore else
+ if (phones.hasOwnProperty(key)) {
+ var phone = phones[key];
+
+ if (phone.test(str)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ throw new Error("Invalid locale '".concat(locale, "'"));
+}
+var locales$3 = Object.keys(phones);
+
+var eth = /^(0x)[0-9a-f]{40}$/i;
+function isEthereumAddress(str) {
+ assertString(str);
+ return eth.test(str);
+}
+
+function currencyRegex(options) {
+ var decimal_digits = "\\d{".concat(options.digits_after_decimal[0], "}");
+ options.digits_after_decimal.forEach(function (digit, index) {
+ if (index !== 0) decimal_digits = "".concat(decimal_digits, "|\\d{").concat(digit, "}");
+ });
+ var symbol = "(\\".concat(options.symbol.replace(/\./g, '\\.'), ")").concat(options.require_symbol ? '' : '?'),
+ negative = '-?',
+ whole_dollar_amount_without_sep = '[1-9]\\d*',
+ whole_dollar_amount_with_sep = "[1-9]\\d{0,2}(\\".concat(options.thousands_separator, "\\d{3})*"),
+ valid_whole_dollar_amounts = ['0', whole_dollar_amount_without_sep, whole_dollar_amount_with_sep],
+ whole_dollar_amount = "(".concat(valid_whole_dollar_amounts.join('|'), ")?"),
+ decimal_amount = "(\\".concat(options.decimal_separator, "(").concat(decimal_digits, "))").concat(options.require_decimal ? '' : '?');
+ var pattern = whole_dollar_amount + (options.allow_decimal || options.require_decimal ? decimal_amount : ''); // default is negative sign before symbol, but there are two other options (besides parens)
+
+ if (options.allow_negatives && !options.parens_for_negatives) {
+ if (options.negative_sign_after_digits) {
+ pattern += negative;
+ } else if (options.negative_sign_before_digits) {
+ pattern = negative + pattern;
+ }
+ } // South African Rand, for example, uses R 123 (space) and R-123 (no space)
+
+
+ if (options.allow_negative_sign_placeholder) {
+ pattern = "( (?!\\-))?".concat(pattern);
+ } else if (options.allow_space_after_symbol) {
+ pattern = " ?".concat(pattern);
+ } else if (options.allow_space_after_digits) {
+ pattern += '( (?!$))?';
+ }
+
+ if (options.symbol_after_digits) {
+ pattern += symbol;
+ } else {
+ pattern = symbol + pattern;
+ }
+
+ if (options.allow_negatives) {
+ if (options.parens_for_negatives) {
+ pattern = "(\\(".concat(pattern, "\\)|").concat(pattern, ")");
+ } else if (!(options.negative_sign_before_digits || options.negative_sign_after_digits)) {
+ pattern = negative + pattern;
+ }
+ } // ensure there's a dollar and/or decimal amount, and that
+ // it doesn't start with a space or a negative sign followed by a space
+
+
+ return new RegExp("^(?!-? )(?=.*\\d)".concat(pattern, "$"));
+}
+
+var default_currency_options = {
+ symbol: '$',
+ require_symbol: false,
+ allow_space_after_symbol: false,
+ symbol_after_digits: false,
+ allow_negatives: true,
+ parens_for_negatives: false,
+ negative_sign_before_digits: false,
+ negative_sign_after_digits: false,
+ allow_negative_sign_placeholder: false,
+ thousands_separator: ',',
+ decimal_separator: '.',
+ allow_decimal: true,
+ require_decimal: false,
+ digits_after_decimal: [2],
+ allow_space_after_digits: false
+};
+function isCurrency(str, options) {
+ assertString(str);
+ options = merge(options, default_currency_options);
+ return currencyRegex(options).test(str);
+}
+
+var btc = /^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}$/;
+function isBtcAddress(str) {
+ assertString(str);
+ return btc.test(str);
+}
+
+/* eslint-disable max-len */
+// from http://goo.gl/0ejHHW
+
+var iso8601 = /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;
+/* eslint-enable max-len */
+
+var isValidDate = function isValidDate(str) {
+ // str must have passed the ISO8601 check
+ // this check is meant to catch invalid dates
+ // like 2009-02-31
+ // first check for ordinal dates
+ var ordinalMatch = str.match(/^(\d{4})-?(\d{3})([ T]{1}\.*|$)/);
+
+ if (ordinalMatch) {
+ var oYear = Number(ordinalMatch[1]);
+ var oDay = Number(ordinalMatch[2]); // if is leap year
+
+ if (oYear % 4 === 0 && oYear % 100 !== 0 || oYear % 400 === 0) return oDay <= 366;
+ return oDay <= 365;
+ }
+
+ var match = str.match(/(\d{4})-?(\d{0,2})-?(\d*)/).map(Number);
+ var year = match[1];
+ var month = match[2];
+ var day = match[3];
+ var monthString = month ? "0".concat(month).slice(-2) : month;
+ var dayString = day ? "0".concat(day).slice(-2) : day; // create a date object and compare
+
+ var d = new Date("".concat(year, "-").concat(monthString || '01', "-").concat(dayString || '01'));
+
+ if (month && day) {
+ return d.getUTCFullYear() === year && d.getUTCMonth() + 1 === month && d.getUTCDate() === day;
+ }
+
+ return true;
+};
+
+function isISO8601(str, options) {
+ assertString(str);
+ var check = iso8601.test(str);
+ if (!options) return check;
+ if (check && options.strict) return isValidDate(str);
+ return check;
+}
+
+/* Based on https://tools.ietf.org/html/rfc3339#section-5.6 */
+
+var dateFullYear = /[0-9]{4}/;
+var dateMonth = /(0[1-9]|1[0-2])/;
+var dateMDay = /([12]\d|0[1-9]|3[01])/;
+var timeHour = /([01][0-9]|2[0-3])/;
+var timeMinute = /[0-5][0-9]/;
+var timeSecond = /([0-5][0-9]|60)/;
+var timeSecFrac = /(\.[0-9]+)?/;
+var timeNumOffset = new RegExp("[-+]".concat(timeHour.source, ":").concat(timeMinute.source));
+var timeOffset = new RegExp("([zZ]|".concat(timeNumOffset.source, ")"));
+var partialTime = new RegExp("".concat(timeHour.source, ":").concat(timeMinute.source, ":").concat(timeSecond.source).concat(timeSecFrac.source));
+var fullDate = new RegExp("".concat(dateFullYear.source, "-").concat(dateMonth.source, "-").concat(dateMDay.source));
+var fullTime = new RegExp("".concat(partialTime.source).concat(timeOffset.source));
+var rfc3339 = new RegExp("".concat(fullDate.source, "[ tT]").concat(fullTime.source));
+function isRFC3339(str) {
+ assertString(str);
+ return rfc3339.test(str);
+}
+
+var validISO31661Alpha2CountriesCodes = ['AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM', 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW', 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW'];
+function isISO31661Alpha2(str) {
+ assertString(str);
+ return includes(validISO31661Alpha2CountriesCodes, str.toUpperCase());
+}
+
+var validISO31661Alpha3CountriesCodes = ['AFG', 'ALA', 'ALB', 'DZA', 'ASM', 'AND', 'AGO', 'AIA', 'ATA', 'ATG', 'ARG', 'ARM', 'ABW', 'AUS', 'AUT', 'AZE', 'BHS', 'BHR', 'BGD', 'BRB', 'BLR', 'BEL', 'BLZ', 'BEN', 'BMU', 'BTN', 'BOL', 'BES', 'BIH', 'BWA', 'BVT', 'BRA', 'IOT', 'BRN', 'BGR', 'BFA', 'BDI', 'KHM', 'CMR', 'CAN', 'CPV', 'CYM', 'CAF', 'TCD', 'CHL', 'CHN', 'CXR', 'CCK', 'COL', 'COM', 'COG', 'COD', 'COK', 'CRI', 'CIV', 'HRV', 'CUB', 'CUW', 'CYP', 'CZE', 'DNK', 'DJI', 'DMA', 'DOM', 'ECU', 'EGY', 'SLV', 'GNQ', 'ERI', 'EST', 'ETH', 'FLK', 'FRO', 'FJI', 'FIN', 'FRA', 'GUF', 'PYF', 'ATF', 'GAB', 'GMB', 'GEO', 'DEU', 'GHA', 'GIB', 'GRC', 'GRL', 'GRD', 'GLP', 'GUM', 'GTM', 'GGY', 'GIN', 'GNB', 'GUY', 'HTI', 'HMD', 'VAT', 'HND', 'HKG', 'HUN', 'ISL', 'IND', 'IDN', 'IRN', 'IRQ', 'IRL', 'IMN', 'ISR', 'ITA', 'JAM', 'JPN', 'JEY', 'JOR', 'KAZ', 'KEN', 'KIR', 'PRK', 'KOR', 'KWT', 'KGZ', 'LAO', 'LVA', 'LBN', 'LSO', 'LBR', 'LBY', 'LIE', 'LTU', 'LUX', 'MAC', 'MKD', 'MDG', 'MWI', 'MYS', 'MDV', 'MLI', 'MLT', 'MHL', 'MTQ', 'MRT', 'MUS', 'MYT', 'MEX', 'FSM', 'MDA', 'MCO', 'MNG', 'MNE', 'MSR', 'MAR', 'MOZ', 'MMR', 'NAM', 'NRU', 'NPL', 'NLD', 'NCL', 'NZL', 'NIC', 'NER', 'NGA', 'NIU', 'NFK', 'MNP', 'NOR', 'OMN', 'PAK', 'PLW', 'PSE', 'PAN', 'PNG', 'PRY', 'PER', 'PHL', 'PCN', 'POL', 'PRT', 'PRI', 'QAT', 'REU', 'ROU', 'RUS', 'RWA', 'BLM', 'SHN', 'KNA', 'LCA', 'MAF', 'SPM', 'VCT', 'WSM', 'SMR', 'STP', 'SAU', 'SEN', 'SRB', 'SYC', 'SLE', 'SGP', 'SXM', 'SVK', 'SVN', 'SLB', 'SOM', 'ZAF', 'SGS', 'SSD', 'ESP', 'LKA', 'SDN', 'SUR', 'SJM', 'SWZ', 'SWE', 'CHE', 'SYR', 'TWN', 'TJK', 'TZA', 'THA', 'TLS', 'TGO', 'TKL', 'TON', 'TTO', 'TUN', 'TUR', 'TKM', 'TCA', 'TUV', 'UGA', 'UKR', 'ARE', 'GBR', 'USA', 'UMI', 'URY', 'UZB', 'VUT', 'VEN', 'VNM', 'VGB', 'VIR', 'WLF', 'ESH', 'YEM', 'ZMB', 'ZWE'];
+function isISO31661Alpha3(str) {
+ assertString(str);
+ return includes(validISO31661Alpha3CountriesCodes, str.toUpperCase());
+}
+
+var base32 = /^[A-Z2-7]+=*$/;
+function isBase32(str) {
+ assertString(str);
+ var len = str.length;
+
+ if (len > 0 && len % 8 === 0 && base32.test(str)) {
+ return true;
+ }
+
+ return false;
+}
+
+var notBase64 = /[^A-Z0-9+\/=]/i;
+function isBase64(str) {
+ assertString(str);
+ var len = str.length;
+
+ if (!len || len % 4 !== 0 || notBase64.test(str)) {
+ return false;
+ }
+
+ var firstPaddingChar = str.indexOf('=');
+ return firstPaddingChar === -1 || firstPaddingChar === len - 1 || firstPaddingChar === len - 2 && str[len - 1] === '=';
+}
+
+var validMediaType = /^[a-z]+\/[a-z0-9\-\+]+$/i;
+var validAttribute = /^[a-z\-]+=[a-z0-9\-]+$/i;
+var validData = /^[a-z0-9!\$&'\(\)\*\+,;=\-\._~:@\/\?%\s]*$/i;
+function isDataURI(str) {
+ assertString(str);
+ var data = str.split(',');
+
+ if (data.length < 2) {
+ return false;
+ }
+
+ var attributes = data.shift().trim().split(';');
+ var schemeAndMediaType = attributes.shift();
+
+ if (schemeAndMediaType.substr(0, 5) !== 'data:') {
+ return false;
+ }
+
+ var mediaType = schemeAndMediaType.substr(5);
+
+ if (mediaType !== '' && !validMediaType.test(mediaType)) {
+ return false;
+ }
+
+ for (var i = 0; i < attributes.length; i++) {
+ if (i === attributes.length - 1 && attributes[i].toLowerCase() === 'base64') {// ok
+ } else if (!validAttribute.test(attributes[i])) {
+ return false;
+ }
+ }
+
+ for (var _i = 0; _i < data.length; _i++) {
+ if (!validData.test(data[_i])) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+var magnetURI = /^magnet:\?xt=urn:[a-z0-9]+:[a-z0-9]{32,40}&dn=.+&tr=.+$/i;
+function isMagnetURI(url) {
+ assertString(url);
+ return magnetURI.test(url.trim());
+}
+
+/*
+ Checks if the provided string matches to a correct Media type format (MIME type)
+
+ This function only checks is the string format follows the
+ etablished rules by the according RFC specifications.
+ This function supports 'charset' in textual media types
+ (https://tools.ietf.org/html/rfc6657).
+
+ This function does not check against all the media types listed
+ by the IANA (https://www.iana.org/assignments/media-types/media-types.xhtml)
+ because of lightness purposes : it would require to include
+ all these MIME types in this librairy, which would weigh it
+ significantly. This kind of effort maybe is not worth for the use that
+ this function has in this entire librairy.
+
+ More informations in the RFC specifications :
+ - https://tools.ietf.org/html/rfc2045
+ - https://tools.ietf.org/html/rfc2046
+ - https://tools.ietf.org/html/rfc7231#section-3.1.1.1
+ - https://tools.ietf.org/html/rfc7231#section-3.1.1.5
+*/
+// Match simple MIME types
+// NB :
+// Subtype length must not exceed 100 characters.
+// This rule does not comply to the RFC specs (what is the max length ?).
+
+var mimeTypeSimple = /^(application|audio|font|image|message|model|multipart|text|video)\/[a-zA-Z0-9\.\-\+]{1,100}$/i; // eslint-disable-line max-len
+// Handle "charset" in "text/*"
+
+var mimeTypeText = /^text\/[a-zA-Z0-9\.\-\+]{1,100};\s?charset=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?$/i; // eslint-disable-line max-len
+// Handle "boundary" in "multipart/*"
+
+var mimeTypeMultipart = /^multipart\/[a-zA-Z0-9\.\-\+]{1,100}(;\s?(boundary|charset)=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?){0,2}$/i; // eslint-disable-line max-len
+
+function isMimeType(str) {
+ assertString(str);
+ return mimeTypeSimple.test(str) || mimeTypeText.test(str) || mimeTypeMultipart.test(str);
+}
+
+var lat = /^\(?[+-]?(90(\.0+)?|[1-8]?\d(\.\d+)?)$/;
+var _long = /^\s?[+-]?(180(\.0+)?|1[0-7]\d(\.\d+)?|\d{1,2}(\.\d+)?)\)?$/;
+var isLatLong = function (str) {
+ assertString(str);
+ if (!str.includes(',')) return false;
+ var pair = str.split(',');
+ if (pair[0].startsWith('(') && !pair[1].endsWith(')') || pair[1].endsWith(')') && !pair[0].startsWith('(')) return false;
+ return lat.test(pair[0]) && _long.test(pair[1]);
+};
+
+var threeDigit = /^\d{3}$/;
+var fourDigit = /^\d{4}$/;
+var fiveDigit = /^\d{5}$/;
+var sixDigit = /^\d{6}$/;
+var patterns = {
+ AD: /^AD\d{3}$/,
+ AT: fourDigit,
+ AU: fourDigit,
+ BE: fourDigit,
+ BG: fourDigit,
+ BR: /^\d{5}-\d{3}$/,
+ CA: /^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][\s\-]?\d[ABCEGHJ-NPRSTV-Z]\d$/i,
+ CH: fourDigit,
+ CZ: /^\d{3}\s?\d{2}$/,
+ DE: fiveDigit,
+ DK: fourDigit,
+ DZ: fiveDigit,
+ EE: fiveDigit,
+ ES: fiveDigit,
+ FI: fiveDigit,
+ FR: /^\d{2}\s?\d{3}$/,
+ GB: /^(gir\s?0aa|[a-z]{1,2}\d[\da-z]?\s?(\d[a-z]{2})?)$/i,
+ GR: /^\d{3}\s?\d{2}$/,
+ HR: /^([1-5]\d{4}$)/,
+ HU: fourDigit,
+ ID: fiveDigit,
+ IE: /^(?!.*(?:o))[A-z]\d[\dw]\s\w{4}$/i,
+ IL: fiveDigit,
+ IN: /^((?!10|29|35|54|55|65|66|86|87|88|89)[1-9][0-9]{5})$/,
+ IS: threeDigit,
+ IT: fiveDigit,
+ JP: /^\d{3}\-\d{4}$/,
+ KE: fiveDigit,
+ LI: /^(948[5-9]|949[0-7])$/,
+ LT: /^LT\-\d{5}$/,
+ LU: fourDigit,
+ LV: /^LV\-\d{4}$/,
+ MX: fiveDigit,
+ MT: /^[A-Za-z]{3}\s{0,1}\d{4}$/,
+ NL: /^\d{4}\s?[a-z]{2}$/i,
+ NO: fourDigit,
+ NZ: fourDigit,
+ PL: /^\d{2}\-\d{3}$/,
+ PR: /^00[679]\d{2}([ -]\d{4})?$/,
+ PT: /^\d{4}\-\d{3}?$/,
+ RO: sixDigit,
+ RU: sixDigit,
+ SA: fiveDigit,
+ SE: /^[1-9]\d{2}\s?\d{2}$/,
+ SI: fourDigit,
+ SK: /^\d{3}\s?\d{2}$/,
+ TN: fourDigit,
+ TW: /^\d{3}(\d{2})?$/,
+ UA: fiveDigit,
+ US: /^\d{5}(-\d{4})?$/,
+ ZA: fourDigit,
+ ZM: fiveDigit
+};
+var locales$4 = Object.keys(patterns);
+var isPostalCode = function (str, locale) {
+ assertString(str);
+
+ if (locale in patterns) {
+ return patterns[locale].test(str);
+ } else if (locale === 'any') {
+ for (var key in patterns) {
+ // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
+ // istanbul ignore else
+ if (patterns.hasOwnProperty(key)) {
+ var pattern = patterns[key];
+
+ if (pattern.test(str)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ throw new Error("Invalid locale '".concat(locale, "'"));
+};
+
+function ltrim(str, chars) {
+ assertString(str); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping
+
+ var pattern = chars ? new RegExp("^[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+"), 'g') : /^\s+/g;
+ return str.replace(pattern, '');
+}
+
+function rtrim(str, chars) {
+ assertString(str); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping
+
+ var pattern = chars ? new RegExp("[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+$"), 'g') : /\s+$/g;
+ return str.replace(pattern, '');
+}
+
+function trim(str, chars) {
+ return rtrim(ltrim(str, chars), chars);
+}
+
+function escape(str) {
+ assertString(str);
+ return str.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\//g, '&#x2F;').replace(/\\/g, '&#x5C;').replace(/`/g, '&#96;');
+}
+
+function unescape(str) {
+ assertString(str);
+ return str.replace(/&amp;/g, '&').replace(/&quot;/g, '"').replace(/&#x27;/g, "'").replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&#x2F;/g, '/').replace(/&#x5C;/g, '\\').replace(/&#96;/g, '`');
+}
+
+function blacklist$1(str, chars) {
+ assertString(str);
+ return str.replace(new RegExp("[".concat(chars, "]+"), 'g'), '');
+}
+
+function stripLow(str, keep_new_lines) {
+ assertString(str);
+ var chars = keep_new_lines ? '\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F' : '\\x00-\\x1F\\x7F';
+ return blacklist$1(str, chars);
+}
+
+function whitelist(str, chars) {
+ assertString(str);
+ return str.replace(new RegExp("[^".concat(chars, "]+"), 'g'), '');
+}
+
+function isWhitelisted(str, chars) {
+ assertString(str);
+
+ for (var i = str.length - 1; i >= 0; i--) {
+ if (chars.indexOf(str[i]) === -1) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+var default_normalize_email_options = {
+ // The following options apply to all email addresses
+ // Lowercases the local part of the email address.
+ // Please note this may violate RFC 5321 as per http://stackoverflow.com/a/9808332/192024).
+ // The domain is always lowercased, as per RFC 1035
+ all_lowercase: true,
+ // The following conversions are specific to GMail
+ // Lowercases the local part of the GMail address (known to be case-insensitive)
+ gmail_lowercase: true,
+ // Removes dots from the local part of the email address, as that's ignored by GMail
+ gmail_remove_dots: true,
+ // Removes the subaddress (e.g. "+foo") from the email address
+ gmail_remove_subaddress: true,
+ // Conversts the googlemail.com domain to gmail.com
+ gmail_convert_googlemaildotcom: true,
+ // The following conversions are specific to Outlook.com / Windows Live / Hotmail
+ // Lowercases the local part of the Outlook.com address (known to be case-insensitive)
+ outlookdotcom_lowercase: true,
+ // Removes the subaddress (e.g. "+foo") from the email address
+ outlookdotcom_remove_subaddress: true,
+ // The following conversions are specific to Yahoo
+ // Lowercases the local part of the Yahoo address (known to be case-insensitive)
+ yahoo_lowercase: true,
+ // Removes the subaddress (e.g. "-foo") from the email address
+ yahoo_remove_subaddress: true,
+ // The following conversions are specific to Yandex
+ // Lowercases the local part of the Yandex address (known to be case-insensitive)
+ yandex_lowercase: true,
+ // The following conversions are specific to iCloud
+ // Lowercases the local part of the iCloud address (known to be case-insensitive)
+ icloud_lowercase: true,
+ // Removes the subaddress (e.g. "+foo") from the email address
+ icloud_remove_subaddress: true
+}; // List of domains used by iCloud
+
+var icloud_domains = ['icloud.com', 'me.com']; // List of domains used by Outlook.com and its predecessors
+// This list is likely incomplete.
+// Partial reference:
+// https://blogs.office.com/2013/04/17/outlook-com-gets-two-step-verification-sign-in-by-alias-and-new-international-domains/
+
+var outlookdotcom_domains = ['hotmail.at', 'hotmail.be', 'hotmail.ca', 'hotmail.cl', 'hotmail.co.il', 'hotmail.co.nz', 'hotmail.co.th', 'hotmail.co.uk', 'hotmail.com', 'hotmail.com.ar', 'hotmail.com.au', 'hotmail.com.br', 'hotmail.com.gr', 'hotmail.com.mx', 'hotmail.com.pe', 'hotmail.com.tr', 'hotmail.com.vn', 'hotmail.cz', 'hotmail.de', 'hotmail.dk', 'hotmail.es', 'hotmail.fr', 'hotmail.hu', 'hotmail.id', 'hotmail.ie', 'hotmail.in', 'hotmail.it', 'hotmail.jp', 'hotmail.kr', 'hotmail.lv', 'hotmail.my', 'hotmail.ph', 'hotmail.pt', 'hotmail.sa', 'hotmail.sg', 'hotmail.sk', 'live.be', 'live.co.uk', 'live.com', 'live.com.ar', 'live.com.mx', 'live.de', 'live.es', 'live.eu', 'live.fr', 'live.it', 'live.nl', 'msn.com', 'outlook.at', 'outlook.be', 'outlook.cl', 'outlook.co.il', 'outlook.co.nz', 'outlook.co.th', 'outlook.com', 'outlook.com.ar', 'outlook.com.au', 'outlook.com.br', 'outlook.com.gr', 'outlook.com.pe', 'outlook.com.tr', 'outlook.com.vn', 'outlook.cz', 'outlook.de', 'outlook.dk', 'outlook.es', 'outlook.fr', 'outlook.hu', 'outlook.id', 'outlook.ie', 'outlook.in', 'outlook.it', 'outlook.jp', 'outlook.kr', 'outlook.lv', 'outlook.my', 'outlook.ph', 'outlook.pt', 'outlook.sa', 'outlook.sg', 'outlook.sk', 'passport.com']; // List of domains used by Yahoo Mail
+// This list is likely incomplete
+
+var yahoo_domains = ['rocketmail.com', 'yahoo.ca', 'yahoo.co.uk', 'yahoo.com', 'yahoo.de', 'yahoo.fr', 'yahoo.in', 'yahoo.it', 'ymail.com']; // List of domains used by yandex.ru
+
+var yandex_domains = ['yandex.ru', 'yandex.ua', 'yandex.kz', 'yandex.com', 'yandex.by', 'ya.ru']; // replace single dots, but not multiple consecutive dots
+
+function dotsReplacer(match) {
+ if (match.length > 1) {
+ return match;
+ }
+
+ return '';
+}
+
+function normalizeEmail(email, options) {
+ options = merge(options, default_normalize_email_options);
+ var raw_parts = email.split('@');
+ var domain = raw_parts.pop();
+ var user = raw_parts.join('@');
+ var parts = [user, domain]; // The domain is always lowercased, as it's case-insensitive per RFC 1035
+
+ parts[1] = parts[1].toLowerCase();
+
+ if (parts[1] === 'gmail.com' || parts[1] === 'googlemail.com') {
+ // Address is GMail
+ if (options.gmail_remove_subaddress) {
+ parts[0] = parts[0].split('+')[0];
+ }
+
+ if (options.gmail_remove_dots) {
+ // this does not replace consecutive dots like example..email@gmail.com
+ parts[0] = parts[0].replace(/\.+/g, dotsReplacer);
+ }
+
+ if (!parts[0].length) {
+ return false;
+ }
+
+ if (options.all_lowercase || options.gmail_lowercase) {
+ parts[0] = parts[0].toLowerCase();
+ }
+
+ parts[1] = options.gmail_convert_googlemaildotcom ? 'gmail.com' : parts[1];
+ } else if (icloud_domains.indexOf(parts[1]) >= 0) {
+ // Address is iCloud
+ if (options.icloud_remove_subaddress) {
+ parts[0] = parts[0].split('+')[0];
+ }
+
+ if (!parts[0].length) {
+ return false;
+ }
+
+ if (options.all_lowercase || options.icloud_lowercase) {
+ parts[0] = parts[0].toLowerCase();
+ }
+ } else if (outlookdotcom_domains.indexOf(parts[1]) >= 0) {
+ // Address is Outlook.com
+ if (options.outlookdotcom_remove_subaddress) {
+ parts[0] = parts[0].split('+')[0];
+ }
+
+ if (!parts[0].length) {
+ return false;
+ }
+
+ if (options.all_lowercase || options.outlookdotcom_lowercase) {
+ parts[0] = parts[0].toLowerCase();
+ }
+ } else if (yahoo_domains.indexOf(parts[1]) >= 0) {
+ // Address is Yahoo
+ if (options.yahoo_remove_subaddress) {
+ var components = parts[0].split('-');
+ parts[0] = components.length > 1 ? components.slice(0, -1).join('-') : components[0];
+ }
+
+ if (!parts[0].length) {
+ return false;
+ }
+
+ if (options.all_lowercase || options.yahoo_lowercase) {
+ parts[0] = parts[0].toLowerCase();
+ }
+ } else if (yandex_domains.indexOf(parts[1]) >= 0) {
+ if (options.all_lowercase || options.yandex_lowercase) {
+ parts[0] = parts[0].toLowerCase();
+ }
+
+ parts[1] = 'yandex.ru'; // all yandex domains are equal, 1st preffered
+ } else if (options.all_lowercase) {
+ // Any other address
+ parts[0] = parts[0].toLowerCase();
+ }
+
+ return parts.join('@');
+}
+
+var charsetRegex = /^[^-_](?!.*?[-_]{2,})([a-z0-9\\-]{1,}).*[^-_]$/;
+function isSlug(str) {
+ assertString(str);
+ return charsetRegex.test(str);
+}
+
+var version = '13.0.0';
+var validator = {
+ version: version,
+ toDate: toDate,
+ toFloat: toFloat,
+ toInt: toInt,
+ toBoolean: toBoolean,
+ equals: equals,
+ contains: contains,
+ matches: matches,
+ isEmail: isEmail,
+ isURL: isURL,
+ isMACAddress: isMACAddress,
+ isIP: isIP,
+ isIPRange: isIPRange,
+ isFQDN: isFQDN,
+ isBoolean: isBoolean,
+ isIBAN: isIBAN,
+ isBIC: isBIC,
+ isAlpha: isAlpha,
+ isAlphaLocales: locales$1,
+ isAlphanumeric: isAlphanumeric,
+ isAlphanumericLocales: locales$2,
+ isNumeric: isNumeric,
+ isPassportNumber: isPassportNumber,
+ isPort: isPort,
+ isLowercase: isLowercase,
+ isUppercase: isUppercase,
+ isAscii: isAscii,
+ isFullWidth: isFullWidth,
+ isHalfWidth: isHalfWidth,
+ isVariableWidth: isVariableWidth,
+ isMultibyte: isMultibyte,
+ isSemVer: isSemVer,
+ isSurrogatePair: isSurrogatePair,
+ isInt: isInt,
+ isFloat: isFloat,
+ isFloatLocales: locales,
+ isDecimal: isDecimal,
+ isHexadecimal: isHexadecimal,
+ isOctal: isOctal,
+ isDivisibleBy: isDivisibleBy,
+ isHexColor: isHexColor,
+ isRgbColor: isRgbColor,
+ isHSL: isHSL,
+ isISRC: isISRC,
+ isMD5: isMD5,
+ isHash: isHash,
+ isJWT: isJWT,
+ isJSON: isJSON,
+ isEmpty: isEmpty,
+ isLength: isLength,
+ isLocale: isLocale,
+ isByteLength: isByteLength,
+ isUUID: isUUID,
+ isMongoId: isMongoId,
+ isAfter: isAfter,
+ isBefore: isBefore,
+ isIn: isIn,
+ isCreditCard: isCreditCard,
+ isIdentityCard: isIdentityCard,
+ isEAN: isEAN,
+ isISIN: isISIN,
+ isISBN: isISBN,
+ isISSN: isISSN,
+ isMobilePhone: isMobilePhone,
+ isMobilePhoneLocales: locales$3,
+ isPostalCode: isPostalCode,
+ isPostalCodeLocales: locales$4,
+ isEthereumAddress: isEthereumAddress,
+ isCurrency: isCurrency,
+ isBtcAddress: isBtcAddress,
+ isISO8601: isISO8601,
+ isRFC3339: isRFC3339,
+ isISO31661Alpha2: isISO31661Alpha2,
+ isISO31661Alpha3: isISO31661Alpha3,
+ isBase32: isBase32,
+ isBase64: isBase64,
+ isDataURI: isDataURI,
+ isMagnetURI: isMagnetURI,
+ isMimeType: isMimeType,
+ isLatLong: isLatLong,
+ ltrim: ltrim,
+ rtrim: rtrim,
+ trim: trim,
+ escape: escape,
+ unescape: unescape,
+ stripLow: stripLow,
+ whitelist: whitelist,
+ blacklist: blacklist$1,
+ isWhitelisted: isWhitelisted,
+ normalizeEmail: normalizeEmail,
+ toString: toString,
+ isSlug: isSlug
+};
+
+return validator;
+
+})));
diff --git a/src/node_modules/validator/validator.min.js b/src/node_modules/validator/validator.min.js
new file mode 100644
index 0000000..ea3eb9c
--- /dev/null
+++ b/src/node_modules/validator/validator.min.js
@@ -0,0 +1,23 @@
+/*!
+ * Copyright (c) 2018 Chris O'Hara <cohara87@gmail.com>
+ *
+ * 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.
+ */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.validator=e()}(this,function(){"use strict";function a(t){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function g(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){if(!(Symbol.iterator in Object(t)||"[object Arguments]"===Object.prototype.toString.call(t)))return;var r=[],n=!0,o=!1,i=void 0;try{for(var a,s=t[Symbol.iterator]();!(n=(a=s.next()).done)&&(r.push(a.value),!e||r.length!==e);n=!0);}catch(t){o=!0,i=t}finally{try{n||null==s.return||s.return()}finally{if(o)throw i}}return r}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function h(t){var e;if(!("string"==typeof t||t instanceof String))throw e=null===t?"null":"object"===(e=a(t))&&t.constructor&&t.constructor.hasOwnProperty("name")?t.constructor.name:"a ".concat(e),new TypeError("Expected string but received ".concat(e,"."))}function o(t){return h(t),t=Date.parse(t),isNaN(t)?null:new Date(t)}for(var t,r={"en-US":/^[A-Z]+$/i,"bg-BG":/^[А-Я]+$/i,"cs-CZ":/^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,"da-DK":/^[A-ZÆØÅ]+$/i,"de-DE":/^[A-ZÄÖÜß]+$/i,"el-GR":/^[Α-ώ]+$/i,"es-ES":/^[A-ZÁÉÍÑÓÚÜ]+$/i,"fr-FR":/^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,"it-IT":/^[A-ZÀÉÈÌÎÓÒÙ]+$/i,"nb-NO":/^[A-ZÆØÅ]+$/i,"nl-NL":/^[A-ZÁÉËÏÓÖÜÚ]+$/i,"nn-NO":/^[A-ZÆØÅ]+$/i,"hu-HU":/^[A-ZÁÉÍÓÖŐÚÜŰ]+$/i,"pl-PL":/^[A-ZĄĆĘŚŁŃÓŻŹ]+$/i,"pt-PT":/^[A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,"ru-RU":/^[А-ЯЁ]+$/i,"sl-SI":/^[A-ZČĆĐŠŽ]+$/i,"sk-SK":/^[A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,"sr-RS@latin":/^[A-ZČĆŽŠĐ]+$/i,"sr-RS":/^[А-ЯЂЈЉЊЋЏ]+$/i,"sv-SE":/^[A-ZÅÄÖ]+$/i,"tr-TR":/^[A-ZÇĞİıÖŞÜ]+$/i,"uk-UA":/^[А-ЩЬЮЯЄIЇҐі]+$/i,"ku-IQ":/^[ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,ar:/^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,he:/^[א-ת]+$/,"fa-IR":/^['آابپتثجچهخدذرزژسشصضطظعغفقکگلمنوهی']+$/i},n={"en-US":/^[0-9A-Z]+$/i,"bg-BG":/^[0-9А-Я]+$/i,"cs-CZ":/^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,"da-DK":/^[0-9A-ZÆØÅ]+$/i,"de-DE":/^[0-9A-ZÄÖÜß]+$/i,"el-GR":/^[0-9Α-ω]+$/i,"es-ES":/^[0-9A-ZÁÉÍÑÓÚÜ]+$/i,"fr-FR":/^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,"it-IT":/^[0-9A-ZÀÉÈÌÎÓÒÙ]+$/i,"hu-HU":/^[0-9A-ZÁÉÍÓÖŐÚÜŰ]+$/i,"nb-NO":/^[0-9A-ZÆØÅ]+$/i,"nl-NL":/^[0-9A-ZÁÉËÏÓÖÜÚ]+$/i,"nn-NO":/^[0-9A-ZÆØÅ]+$/i,"pl-PL":/^[0-9A-ZĄĆĘŚŁŃÓŻŹ]+$/i,"pt-PT":/^[0-9A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,"ru-RU":/^[0-9А-ЯЁ]+$/i,"sl-SI":/^[0-9A-ZČĆĐŠŽ]+$/i,"sk-SK":/^[0-9A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,"sr-RS@latin":/^[0-9A-ZČĆŽŠĐ]+$/i,"sr-RS":/^[0-9А-ЯЂЈЉЊЋЏ]+$/i,"sv-SE":/^[0-9A-ZÅÄÖ]+$/i,"tr-TR":/^[0-9A-ZÇĞİıÖŞÜ]+$/i,"uk-UA":/^[0-9А-ЩЬЮЯЄIЇҐі]+$/i,"ku-IQ":/^[٠١٢٣٤٥٦٧٨٩0-9ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,ar:/^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,he:/^[0-9א-ת]+$/,"fa-IR":/^['0-9آابپتثجچهخدذرزژسشصضطظعغفقکگلمنوهی۱۲۳۴۵۶۷۸۹۰']+$/i},i={"en-US":".",ar:"٫"},e=["AU","GB","HK","IN","NZ","ZA","ZM"],s=0;s<e.length;s++)t="en-".concat(e[s]),r[t]=r["en-US"],n[t]=n["en-US"],i[t]=i["en-US"];for(var l,u=["AE","BH","DZ","EG","IQ","JO","KW","LB","LY","MA","QM","QA","SA","SD","SY","TN","YE"],d=0;d<u.length;d++)l="ar-".concat(u[d]),r[l]=r.ar,n[l]=n.ar,i[l]=i.ar;for(var c=["ar-EG","ar-LB","ar-LY"],f=["bg-BG","cs-CZ","da-DK","de-DE","el-GR","en-ZM","es-ES","fr-FR","it-IT","ku-IQ","hu-HU","nb-NO","nn-NO","nl-NL","pl-PL","pt-PT","ru-RU","sl-SI","sr-RS@latin","sr-RS","sv-SE","tr-TR","uk-UA"],A=0;A<c.length;A++)i[c[A]]=i["en-US"];for(var $=0;$<f.length;$++)i[f[$]]=",";function p(t,e){h(t),e=e||{};var r=new RegExp("^(?:[-+])?(?:[0-9]+)?(?:\\".concat(e.locale?i[e.locale]:".","[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$"));if(""===t||"."===t||"-"===t||"+"===t)return!1;var n=parseFloat(t.replace(",","."));return r.test(t)&&(!e.hasOwnProperty("min")||n>=e.min)&&(!e.hasOwnProperty("max")||n<=e.max)&&(!e.hasOwnProperty("lt")||n<e.lt)&&(!e.hasOwnProperty("gt")||n>e.gt)}r["pt-BR"]=r["pt-PT"],n["pt-BR"]=n["pt-PT"],i["pt-BR"]=i["pt-PT"],r["pl-Pl"]=r["pl-PL"],n["pl-Pl"]=n["pl-PL"],i["pl-Pl"]=i["pl-PL"];var m=Object.keys(i);function v(t){return p(t)?parseFloat(t):NaN}function Z(t){return"object"===a(t)&&null!==t?t="function"==typeof t.toString?t.toString():"[object Object]":(null==t||isNaN(t)&&!t.length)&&(t=""),String(t)}function S(t,e){var r=0<arguments.length&&void 0!==t?t:{},n=1<arguments.length?e:void 0;for(var o in n)void 0===r[o]&&(r[o]=n[o]);return r}function _(t,e){var r,n;h(t),n="object"===a(e)?(r=e.min||0,e.max):(r=e,arguments[2]);var o=encodeURI(t).split(/%..|./).length-1;return r<=o&&(void 0===n||o<=n)}var F={require_tld:!0,allow_underscores:!1,allow_trailing_dot:!1};function E(t,e){h(t),(e=S(e,F)).allow_trailing_dot&&"."===t[t.length-1]&&(t=t.substring(0,t.length-1));for(var r=t.split("."),n=0;n<r.length;n++)if(63<r[n].length)return!1;if(e.require_tld){var o=r.pop();if(!r.length||!/^([a-z\u00a1-\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(o))return!1;if(/[\s\u2002-\u200B\u202F\u205F\u3000\uFEFF\uDB40\uDC20]/.test(o))return!1}for(var i,a=0;a<r.length;a++){if(i=r[a],e.allow_underscores&&(i=i.replace(/_/g,"")),!/^[a-z\u00a1-\uffff0-9-]+$/i.test(i))return!1;if(/[\uff01-\uff5e]/.test(i))return!1;if("-"===i[0]||"-"===i[i.length-1])return!1}return!0}var R=/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/,L=/^[0-9A-F]{1,4}$/i;function C(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"";if(h(t),!(e=String(e)))return C(t,4)||C(t,6);if("4"===e)return!!R.test(t)&&t.split(".").sort(function(t,e){return t-e})[3]<=255;if("6"!==e)return!1;var r=[t];if(t.includes("%")){if(2!==(r=t.split("%")).length)return!1;if(!r[0].includes(":"))return!1;if(""===r[1])return!1}var n=r[0].split(":"),o=!1,i=C(n[n.length-1],4),a=i?7:8;if(n.length>a)return!1;if("::"===t)return!0;"::"===t.substr(0,2)?(n.shift(),n.shift(),o=!0):"::"===t.substr(t.length-2)&&(n.pop(),n.pop(),o=!0);for(var s=0;s<n.length;++s)if(""===n[s]&&0<s&&s<n.length-1){if(o)return!1;o=!0}else if(!(i&&s===n.length-1||L.test(n[s])))return!1;return o?1<=n.length:n.length===a}var M={allow_display_name:!1,require_display_name:!1,allow_utf8_local_part:!0,require_tld:!0},I=/^([^\x00-\x1F\x7F-\x9F\cX]+)<(.+)>$/i,N=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~]+$/i,T=/^[a-z\d]+$/,B=/^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f]))*$/i,x=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+$/i,w=/^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*$/i;var G={protocols:["http","https","ftp"],require_tld:!0,require_protocol:!1,require_host:!0,require_valid_protocol:!0,allow_underscores:!1,allow_trailing_dot:!1,allow_protocol_relative_urls:!1},U=/^\[([^\]]+)\](?::([0-9]+))?$/;function b(t,e){for(var r=0;r<e.length;r++){var n=e[r];if(t===n||(o=n,"[object RegExp]"===Object.prototype.toString.call(o)&&n.test(t)))return 1}var o}var O=/^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$/,P=/^([0-9a-fA-F]){12}$/,y=/^([0-9a-fA-F][0-9a-fA-F]-){5}([0-9a-fA-F][0-9a-fA-F])$/,D=/^([0-9a-fA-F][0-9a-fA-F]\s){5}([0-9a-fA-F][0-9a-fA-F])$/,K=/^([0-9a-fA-F]{4}).([0-9a-fA-F]{4}).([0-9a-fA-F]{4})$/;var H=/^\d{1,2}$/;var k=/^[A-z]{2,4}([_-]([A-z]{4}|[\d]{3}))?([_-]([A-z]{2}|[\d]{3}))?$/;var z=Object.keys(r);var W=Object.keys(n),V=/^[+-]?([0-9]*[.])?[0-9]+$/,Y=/^[0-9]+$/;var j={AM:/^[A-Z]{2}\d{7}$/,AR:/^[A-Z]{3}\d{6}$/,AT:/^[A-Z]\d{7}$/,AU:/^[A-Z]\d{7}$/,BE:/^[A-Z]{2}\d{6}$/,BG:/^\d{9}$/,CA:/^[A-Z]{2}\d{6}$/,CH:/^[A-Z]\d{7}$/,CN:/^[GE]\d{8}$/,CY:/^[A-Z](\d{6}|\d{8})$/,CZ:/^\d{8}$/,DE:/^[CFGHJKLMNPRTVWXYZ0-9]{9}$/,DK:/^\d{9}$/,DZ:/^\d{9}$/,EE:/^([A-Z]\d{7}|[A-Z]{2}\d{7})$/,ES:/^[A-Z0-9]{2}([A-Z0-9]?)\d{6}$/,FI:/^[A-Z]{2}\d{7}$/,FR:/^\d{2}[A-Z]{2}\d{5}$/,GB:/^\d{9}$/,GR:/^[A-Z]{2}\d{7}$/,HR:/^\d{9}$/,HU:/^[A-Z]{2}(\d{6}|\d{7})$/,IE:/^[A-Z0-9]{2}\d{7}$/,IS:/^(A)\d{7}$/,IT:/^[A-Z0-9]{2}\d{7}$/,JP:/^[A-Z]{2}\d{7}$/,KR:/^[MS]\d{8}$/,LT:/^[A-Z0-9]{8}$/,LU:/^[A-Z0-9]{8}$/,LV:/^[A-Z0-9]{2}\d{7}$/,MT:/^\d{7}$/,NL:/^[A-Z]{2}[A-Z0-9]{6}\d$/,PO:/^[A-Z]{2}\d{7}$/,PT:/^[A-Z]\d{6}$/,RO:/^\d{8,9}$/,SE:/^\d{8}$/,SL:/^(P)[A-Z]\d{7}$/,SK:/^[0-9A-Z]\d{7}$/,TR:/^[A-Z]\d{8}$/,UA:/^[A-Z]{2}\d{6}$/,US:/^\d{9}$/};var J=/^(?:[-+]?(?:0|[1-9][0-9]*))$/,Q=/^[-+]?[0-9]+$/;function X(t,e){h(t);var r=(e=e||{}).hasOwnProperty("allow_leading_zeroes")&&!e.allow_leading_zeroes?J:Q,n=!e.hasOwnProperty("min")||t>=e.min,o=!e.hasOwnProperty("max")||t<=e.max,i=!e.hasOwnProperty("lt")||t<e.lt,a=!e.hasOwnProperty("gt")||t>e.gt;return r.test(t)&&n&&o&&i&&a}var q=/^[\x00-\x7F]+$/;var tt=/[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;var et=/[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;var rt=/[^\x00-\x7F]/;var nt=function(t,e){var r=1<arguments.length&&void 0!==e?e:"",n=t.join("");return new RegExp(n,r)}(["^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)","(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))","?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"]);var ot=/[\uD800-\uDBFF][\uDC00-\uDFFF]/;function it(t,e){return t.some(function(t){return e===t})}var at={force_decimal:!1,decimal_digits:"1,",locale:"en-US"},st=["","-","+"];var lt=/^(0x|0h)?[0-9A-F]+$/i;function ut(t){return h(t),lt.test(t)}var dt=/^(0o)?[0-7]+$/i;var ct=/^#?([0-9A-F]{3}|[0-9A-F]{4}|[0-9A-F]{6}|[0-9A-F]{8})$/i;var ft=/^rgb\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\)$/,At=/^rgba\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)$/,$t=/^rgb\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\)/,pt=/^rgba\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)/;var gt=/^(hsl)a?\(\s*((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn|\s*)(\s*,\s*(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}\s*(,\s*((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?)\s*)?\)$/i,ht=/^(hsl)a?\(\s*((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn|\s)(\s*(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}\s*(\/\s*((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?)\s*)?\)$/i;var mt=/^[A-Z]{2}[0-9A-Z]{3}\d{2}\d{5}$/;var vt={AD:/^(AD[0-9]{2})\d{8}[A-Z0-9]{12}$/,AE:/^(AE[0-9]{2})\d{3}\d{16}$/,AL:/^(AL[0-9]{2})\d{8}[A-Z0-9]{16}$/,AT:/^(AT[0-9]{2})\d{16}$/,AZ:/^(AZ[0-9]{2})[A-Z0-9]{4}\d{20}$/,BA:/^(BA[0-9]{2})\d{16}$/,BE:/^(BE[0-9]{2})\d{12}$/,BG:/^(BG[0-9]{2})[A-Z]{4}\d{6}[A-Z0-9]{8}$/,BH:/^(BH[0-9]{2})[A-Z]{4}[A-Z0-9]{14}$/,BR:/^(BR[0-9]{2})\d{23}[A-Z]{1}[A-Z0-9]{1}$/,BY:/^(BY[0-9]{2})[A-Z0-9]{4}\d{20}$/,CH:/^(CH[0-9]{2})\d{5}[A-Z0-9]{12}$/,CR:/^(CR[0-9]{2})\d{18}$/,CY:/^(CY[0-9]{2})\d{8}[A-Z0-9]{16}$/,CZ:/^(CZ[0-9]{2})\d{20}$/,DE:/^(DE[0-9]{2})\d{18}$/,DK:/^(DK[0-9]{2})\d{14}$/,DO:/^(DO[0-9]{2})[A-Z]{4}\d{20}$/,EE:/^(EE[0-9]{2})\d{16}$/,ES:/^(ES[0-9]{2})\d{20}$/,FI:/^(FI[0-9]{2})\d{14}$/,FO:/^(FO[0-9]{2})\d{14}$/,FR:/^(FR[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,GB:/^(GB[0-9]{2})[A-Z]{4}\d{14}$/,GE:/^(GE[0-9]{2})[A-Z0-9]{2}\d{16}$/,GI:/^(GI[0-9]{2})[A-Z]{4}[A-Z0-9]{15}$/,GL:/^(GL[0-9]{2})\d{14}$/,GR:/^(GR[0-9]{2})\d{7}[A-Z0-9]{16}$/,GT:/^(GT[0-9]{2})[A-Z0-9]{4}[A-Z0-9]{20}$/,HR:/^(HR[0-9]{2})\d{17}$/,HU:/^(HU[0-9]{2})\d{24}$/,IE:/^(IE[0-9]{2})[A-Z0-9]{4}\d{14}$/,IL:/^(IL[0-9]{2})\d{19}$/,IQ:/^(IQ[0-9]{2})[A-Z]{4}\d{15}$/,IS:/^(IS[0-9]{2})\d{22}$/,IT:/^(IT[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,JO:/^(JO[0-9]{2})[A-Z]{4}\d{22}$/,KW:/^(KW[0-9]{2})[A-Z]{4}[A-Z0-9]{22}$/,KZ:/^(KZ[0-9]{2})\d{3}[A-Z0-9]{13}$/,LB:/^(LB[0-9]{2})\d{4}[A-Z0-9]{20}$/,LC:/^(LC[0-9]{2})[A-Z]{4}[A-Z0-9]{24}$/,LI:/^(LI[0-9]{2})\d{5}[A-Z0-9]{12}$/,LT:/^(LT[0-9]{2})\d{16}$/,LU:/^(LU[0-9]{2})\d{3}[A-Z0-9]{13}$/,LV:/^(LV[0-9]{2})[A-Z]{4}[A-Z0-9]{13}$/,MC:/^(MC[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,MD:/^(MD[0-9]{2})[A-Z0-9]{20}$/,ME:/^(ME[0-9]{2})\d{18}$/,MK:/^(MK[0-9]{2})\d{3}[A-Z0-9]{10}\d{2}$/,MR:/^(MR[0-9]{2})\d{23}$/,MT:/^(MT[0-9]{2})[A-Z]{4}\d{5}[A-Z0-9]{18}$/,MU:/^(MU[0-9]{2})[A-Z]{4}\d{19}[A-Z]{3}$/,NL:/^(NL[0-9]{2})[A-Z]{4}\d{10}$/,NO:/^(NO[0-9]{2})\d{11}$/,PK:/^(PK[0-9]{2})[A-Z0-9]{4}\d{16}$/,PL:/^(PL[0-9]{2})\d{24}$/,PS:/^(PS[0-9]{2})[A-Z0-9]{4}\d{21}$/,PT:/^(PT[0-9]{2})\d{21}$/,QA:/^(QA[0-9]{2})[A-Z]{4}[A-Z0-9]{21}$/,RO:/^(RO[0-9]{2})[A-Z]{4}[A-Z0-9]{16}$/,RS:/^(RS[0-9]{2})\d{18}$/,SA:/^(SA[0-9]{2})\d{2}[A-Z0-9]{18}$/,SC:/^(SC[0-9]{2})[A-Z]{4}\d{20}[A-Z]{3}$/,SE:/^(SE[0-9]{2})\d{20}$/,SI:/^(SI[0-9]{2})\d{15}$/,SK:/^(SK[0-9]{2})\d{20}$/,SM:/^(SM[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,TL:/^(TL[0-9]{2})\d{19}$/,TN:/^(TN[0-9]{2})\d{20}$/,TR:/^(TR[0-9]{2})\d{5}[A-Z0-9]{17}$/,UA:/^(UA[0-9]{2})\d{6}[A-Z0-9]{19}$/,VA:/^(VA[0-9]{2})\d{18}$/,VG:/^(VG[0-9]{2})[A-Z0-9]{4}\d{16}$/,XK:/^(XK[0-9]{2})\d{16}$/};var Zt=/^[A-z]{4}[A-z]{2}\w{2}(\w{3})?$/;var St=/^[a-f0-9]{32}$/;var _t={md5:32,md4:32,sha1:40,sha256:64,sha384:96,sha512:128,ripemd128:32,ripemd160:40,tiger128:32,tiger160:40,tiger192:48,crc32:8,crc32b:8};var Ft=/^([A-Za-z0-9\-_~+\/]+[=]{0,2})\.([A-Za-z0-9\-_~+\/]+[=]{0,2})(?:\.([A-Za-z0-9\-_~+\/]+[=]{0,2}))?$/;var Et={ignore_whitespace:!1};var Rt={3:/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,4:/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,5:/^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,all:/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i};var Lt=/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11}|6[27][0-9]{14})$/;var Ct={ES:function(t){h(t);var e={X:0,Y:1,Z:2},r=t.trim().toUpperCase();if(!/^[0-9X-Z][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/.test(r))return!1;var n=r.slice(0,-1).replace(/[X,Y,Z]/g,function(t){return e[t]});return r.endsWith(["T","R","W","A","G","M","Y","F","P","D","X","B","N","J","Z","S","Q","V","H","L","C","K","E"][n%23])},"he-IL":function(t){var e=t.trim();if(!/^\d{9}$/.test(e))return!1;for(var r,n=e,o=0,i=0;i<n.length;i++)o+=9<(r=Number(n[i])*(i%2+1))?r-9:r;return o%10==0},"zh-TW":function(t){var o={A:10,B:11,C:12,D:13,E:14,F:15,G:16,H:17,I:34,J:18,K:19,L:20,M:21,N:22,O:35,P:23,Q:24,R:25,S:26,T:27,U:28,V:29,W:32,X:30,Y:31,Z:33},e=t.trim().toUpperCase();return!!/^[A-Z][0-9]{9}$/.test(e)&&Array.from(e).reduce(function(t,e,r){if(0!==r)return 9===r?(10-t%10-Number(e))%10==0:t+Number(e)*(9-r);var n=o[e];return n%10*9+Math.floor(n/10)},0)}};var Mt=8,It=/^(\d{8}|\d{13})$/;function Nt(o){var t=10-o.slice(0,-1).split("").map(function(t,e){return Number(t)*(r=o.length,n=e,r===Mt?n%2==0?3:1:n%2==0?1:3);var r,n}).reduce(function(t,e){return t+e},0)%10;return t<10?t:0}var Tt=/^[A-Z]{2}[0-9A-Z]{9}[0-9]$/;var Bt=/^(?:[0-9]{9}X|[0-9]{10})$/,xt=/^(?:[0-9]{13})$/,wt=[1,3];var Gt={"am-AM":/^(\+?374|0)((10|[9|7][0-9])\d{6}$|[2-4]\d{7}$)/,"ar-AE":/^((\+?971)|0)?5[024568]\d{7}$/,"ar-BH":/^(\+?973)?(3|6)\d{7}$/,"ar-DZ":/^(\+?213|0)(5|6|7)\d{8}$/,"ar-EG":/^((\+?20)|0)?1[0125]\d{8}$/,"ar-IQ":/^(\+?964|0)?7[0-9]\d{8}$/,"ar-JO":/^(\+?962|0)?7[789]\d{7}$/,"ar-KW":/^(\+?965)[569]\d{7}$/,"ar-SA":/^(!?(\+?966)|0)?5\d{8}$/,"ar-SY":/^(!?(\+?963)|0)?9\d{8}$/,"ar-TN":/^(\+?216)?[2459]\d{7}$/,"be-BY":/^(\+?375)?(24|25|29|33|44)\d{7}$/,"bg-BG":/^(\+?359|0)?8[789]\d{7}$/,"bn-BD":/^(\+?880|0)1[13456789][0-9]{8}$/,"cs-CZ":/^(\+?420)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,"da-DK":/^(\+?45)?\s?\d{2}\s?\d{2}\s?\d{2}\s?\d{2}$/,"de-DE":/^(\+49)?0?1(5[0-25-9]\d|6([23]|0\d?)|7([0-57-9]|6\d))\d{7}$/,"de-AT":/^(\+43|0)\d{1,4}\d{3,12}$/,"el-GR":/^(\+?30|0)?(69\d{8})$/,"en-AU":/^(\+?61|0)4\d{8}$/,"en-GB":/^(\+?44|0)7\d{9}$/,"en-GG":/^(\+?44|0)1481\d{6}$/,"en-GH":/^(\+233|0)(20|50|24|54|27|57|26|56|23|28)\d{7}$/,"en-HK":/^(\+?852[-\s]?)?[456789]\d{3}[-\s]?\d{4}$/,"en-MO":/^(\+?853[-\s]?)?[6]\d{3}[-\s]?\d{4}$/,"en-IE":/^(\+?353|0)8[356789]\d{7}$/,"en-IN":/^(\+?91|0)?[6789]\d{9}$/,"en-KE":/^(\+?254|0)(7|1)\d{8}$/,"en-MT":/^(\+?356|0)?(99|79|77|21|27|22|25)[0-9]{6}$/,"en-MU":/^(\+?230|0)?\d{8}$/,"en-NG":/^(\+?234|0)?[789]\d{9}$/,"en-NZ":/^(\+?64|0)[28]\d{7,9}$/,"en-PK":/^((\+92)|(0092))-{0,1}\d{3}-{0,1}\d{7}$|^\d{11}$|^\d{4}-\d{7}$/,"en-RW":/^(\+?250|0)?[7]\d{8}$/,"en-SG":/^(\+65)?[89]\d{7}$/,"en-TZ":/^(\+?255|0)?[67]\d{8}$/,"en-UG":/^(\+?256|0)?[7]\d{8}$/,"en-US":/^((\+1|1)?( |-)?)?(\([2-9][0-9]{2}\)|[2-9][0-9]{2})( |-)?([2-9][0-9]{2}( |-)?[0-9]{4})$/,"en-ZA":/^(\+?27|0)\d{9}$/,"en-ZM":/^(\+?26)?09[567]\d{7}$/,"es-CL":/^(\+?56|0)[2-9]\d{1}\d{7}$/,"es-EC":/^(\+?593|0)([2-7]|9[2-9])\d{7}$/,"es-ES":/^(\+?34)?(6\d{1}|7[1234])\d{7}$/,"es-MX":/^(\+?52)?(1|01)?\d{10,11}$/,"es-PA":/^(\+?507)\d{7,8}$/,"es-PY":/^(\+?595|0)9[9876]\d{7}$/,"es-UY":/^(\+598|0)9[1-9][\d]{6}$/,"et-EE":/^(\+?372)?\s?(5|8[1-4])\s?([0-9]\s?){6,7}$/,"fa-IR":/^(\+?98[\-\s]?|0)9[0-39]\d[\-\s]?\d{3}[\-\s]?\d{4}$/,"fi-FI":/^(\+?358|0)\s?(4(0|1|2|4|5|6)?|50)\s?(\d\s?){4,8}\d$/,"fj-FJ":/^(\+?679)?\s?\d{3}\s?\d{4}$/,"fo-FO":/^(\+?298)?\s?\d{2}\s?\d{2}\s?\d{2}$/,"fr-FR":/^(\+?33|0)[67]\d{8}$/,"fr-GF":/^(\+?594|0|00594)[67]\d{8}$/,"fr-GP":/^(\+?590|0|00590)[67]\d{8}$/,"fr-MQ":/^(\+?596|0|00596)[67]\d{8}$/,"fr-RE":/^(\+?262|0|00262)[67]\d{8}$/,"he-IL":/^(\+972|0)([23489]|5[012345689]|77)[1-9]\d{6}$/,"hu-HU":/^(\+?36)(20|30|70)\d{7}$/,"id-ID":/^(\+?62|0)8(1[123456789]|2[1238]|3[1238]|5[12356789]|7[78]|9[56789]|8[123456789])([\s?|\d]{5,11})$/,"it-IT":/^(\+?39)?\s?3\d{2} ?\d{6,7}$/,"ja-JP":/^(\+81[ \-]?(\(0\))?|0)[6789]0[ \-]?\d{4}[ \-]?\d{4}$/,"kk-KZ":/^(\+?7|8)?7\d{9}$/,"kl-GL":/^(\+?299)?\s?\d{2}\s?\d{2}\s?\d{2}$/,"ko-KR":/^((\+?82)[ \-]?)?0?1([0|1|6|7|8|9]{1})[ \-]?\d{3,4}[ \-]?\d{4}$/,"lt-LT":/^(\+370|8)\d{8}$/,"ms-MY":/^(\+?6?01){1}(([0145]{1}(\-|\s)?\d{7,8})|([236789]{1}(\s|\-)?\d{7}))$/,"nb-NO":/^(\+?47)?[49]\d{7}$/,"ne-NP":/^(\+?977)?9[78]\d{8}$/,"nl-BE":/^(\+?32|0)4?\d{8}$/,"nl-NL":/^(\+?31|0)6?\d{8}$/,"nn-NO":/^(\+?47)?[49]\d{7}$/,"pl-PL":/^(\+?48)? ?[5-8]\d ?\d{3} ?\d{2} ?\d{2}$/,"pt-BR":/(?=^(\+?5{2}\-?|0)[1-9]{2}\-?\d{4}\-?\d{4}$)(^(\+?5{2}\-?|0)[1-9]{2}\-?[6-9]{1}\d{3}\-?\d{4}$)|(^(\+?5{2}\-?|0)[1-9]{2}\-?9[6-9]{1}\d{3}\-?\d{4}$)/,"pt-PT":/^(\+?351)?9[1236]\d{7}$/,"ro-RO":/^(\+?4?0)\s?7\d{2}(\/|\s|\.|\-)?\d{3}(\s|\.|\-)?\d{3}$/,"ru-RU":/^(\+?7|8)?9\d{9}$/,"sl-SI":/^(\+386\s?|0)(\d{1}\s?\d{3}\s?\d{2}\s?\d{2}|\d{2}\s?\d{3}\s?\d{3})$/,"sk-SK":/^(\+?421)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,"sr-RS":/^(\+3816|06)[- \d]{5,9}$/,"sv-SE":/^(\+?46|0)[\s\-]?7[\s\-]?[02369]([\s\-]?\d){7}$/,"th-TH":/^(\+66|66|0)\d{9}$/,"tr-TR":/^(\+?90|0)?5\d{9}$/,"uk-UA":/^(\+?38|8)?0\d{9}$/,"vi-VN":/^(\+?84|0)((3([2-9]))|(5([2689]))|(7([0|6-9]))|(8([1-6|89]))|(9([0-9])))([0-9]{7})$/,"zh-CN":/^((\+|00)86)?1([358][0-9]|4[579]|6[67]|7[01235678]|9[189])[0-9]{8}$/,"zh-TW":/^(\+?886\-?|0)?9\d{8}$/};Gt["en-CA"]=Gt["en-US"],Gt["fr-BE"]=Gt["nl-BE"],Gt["zh-HK"]=Gt["en-HK"],Gt["zh-MO"]=Gt["en-MO"];var Ut=Object.keys(Gt),bt=/^(0x)[0-9a-f]{40}$/i;var Ot={symbol:"$",require_symbol:!1,allow_space_after_symbol:!1,symbol_after_digits:!1,allow_negatives:!0,parens_for_negatives:!1,negative_sign_before_digits:!1,negative_sign_after_digits:!1,allow_negative_sign_placeholder:!1,thousands_separator:",",decimal_separator:".",allow_decimal:!0,require_decimal:!1,digits_after_decimal:[2],allow_space_after_digits:!1};var Pt=/^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}$/;var yt=/^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;var Dt=/([01][0-9]|2[0-3])/,Kt=/[0-5][0-9]/,Ht=new RegExp("[-+]".concat(Dt.source,":").concat(Kt.source)),kt=new RegExp("([zZ]|".concat(Ht.source,")")),zt=new RegExp("".concat(Dt.source,":").concat(Kt.source,":").concat(/([0-5][0-9]|60)/.source).concat(/(\.[0-9]+)?/.source)),Wt=new RegExp("".concat(/[0-9]{4}/.source,"-").concat(/(0[1-9]|1[0-2])/.source,"-").concat(/([12]\d|0[1-9]|3[01])/.source)),Vt=new RegExp("".concat(zt.source).concat(kt.source)),Yt=new RegExp("".concat(Wt.source,"[ tT]").concat(Vt.source));var jt=["AD","AE","AF","AG","AI","AL","AM","AO","AQ","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","ZA","ZM","ZW"];var Jt=["AFG","ALA","ALB","DZA","ASM","AND","AGO","AIA","ATA","ATG","ARG","ARM","ABW","AUS","AUT","AZE","BHS","BHR","BGD","BRB","BLR","BEL","BLZ","BEN","BMU","BTN","BOL","BES","BIH","BWA","BVT","BRA","IOT","BRN","BGR","BFA","BDI","KHM","CMR","CAN","CPV","CYM","CAF","TCD","CHL","CHN","CXR","CCK","COL","COM","COG","COD","COK","CRI","CIV","HRV","CUB","CUW","CYP","CZE","DNK","DJI","DMA","DOM","ECU","EGY","SLV","GNQ","ERI","EST","ETH","FLK","FRO","FJI","FIN","FRA","GUF","PYF","ATF","GAB","GMB","GEO","DEU","GHA","GIB","GRC","GRL","GRD","GLP","GUM","GTM","GGY","GIN","GNB","GUY","HTI","HMD","VAT","HND","HKG","HUN","ISL","IND","IDN","IRN","IRQ","IRL","IMN","ISR","ITA","JAM","JPN","JEY","JOR","KAZ","KEN","KIR","PRK","KOR","KWT","KGZ","LAO","LVA","LBN","LSO","LBR","LBY","LIE","LTU","LUX","MAC","MKD","MDG","MWI","MYS","MDV","MLI","MLT","MHL","MTQ","MRT","MUS","MYT","MEX","FSM","MDA","MCO","MNG","MNE","MSR","MAR","MOZ","MMR","NAM","NRU","NPL","NLD","NCL","NZL","NIC","NER","NGA","NIU","NFK","MNP","NOR","OMN","PAK","PLW","PSE","PAN","PNG","PRY","PER","PHL","PCN","POL","PRT","PRI","QAT","REU","ROU","RUS","RWA","BLM","SHN","KNA","LCA","MAF","SPM","VCT","WSM","SMR","STP","SAU","SEN","SRB","SYC","SLE","SGP","SXM","SVK","SVN","SLB","SOM","ZAF","SGS","SSD","ESP","LKA","SDN","SUR","SJM","SWZ","SWE","CHE","SYR","TWN","TJK","TZA","THA","TLS","TGO","TKL","TON","TTO","TUN","TUR","TKM","TCA","TUV","UGA","UKR","ARE","GBR","USA","UMI","URY","UZB","VUT","VEN","VNM","VGB","VIR","WLF","ESH","YEM","ZMB","ZWE"];var Qt=/^[A-Z2-7]+=*$/;var Xt=/[^A-Z0-9+\/=]/i;var qt=/^[a-z]+\/[a-z0-9\-\+]+$/i,te=/^[a-z\-]+=[a-z0-9\-]+$/i,ee=/^[a-z0-9!\$&'\(\)\*\+,;=\-\._~:@\/\?%\s]*$/i;var re=/^magnet:\?xt=urn:[a-z0-9]+:[a-z0-9]{32,40}&dn=.+&tr=.+$/i;var ne=/^(application|audio|font|image|message|model|multipart|text|video)\/[a-zA-Z0-9\.\-\+]{1,100}$/i,oe=/^text\/[a-zA-Z0-9\.\-\+]{1,100};\s?charset=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?$/i,ie=/^multipart\/[a-zA-Z0-9\.\-\+]{1,100}(;\s?(boundary|charset)=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?){0,2}$/i;var ae=/^\(?[+-]?(90(\.0+)?|[1-8]?\d(\.\d+)?)$/,se=/^\s?[+-]?(180(\.0+)?|1[0-7]\d(\.\d+)?|\d{1,2}(\.\d+)?)\)?$/,le=/^\d{4}$/,ue=/^\d{5}$/,de=/^\d{6}$/,ce={AD:/^AD\d{3}$/,AT:le,AU:le,BE:le,BG:le,BR:/^\d{5}-\d{3}$/,CA:/^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][\s\-]?\d[ABCEGHJ-NPRSTV-Z]\d$/i,CH:le,CZ:/^\d{3}\s?\d{2}$/,DE:ue,DK:le,DZ:ue,EE:ue,ES:ue,FI:ue,FR:/^\d{2}\s?\d{3}$/,GB:/^(gir\s?0aa|[a-z]{1,2}\d[\da-z]?\s?(\d[a-z]{2})?)$/i,GR:/^\d{3}\s?\d{2}$/,HR:/^([1-5]\d{4}$)/,HU:le,ID:ue,IE:/^(?!.*(?:o))[A-z]\d[\dw]\s\w{4}$/i,IL:ue,IN:/^((?!10|29|35|54|55|65|66|86|87|88|89)[1-9][0-9]{5})$/,IS:/^\d{3}$/,IT:ue,JP:/^\d{3}\-\d{4}$/,KE:ue,LI:/^(948[5-9]|949[0-7])$/,LT:/^LT\-\d{5}$/,LU:le,LV:/^LV\-\d{4}$/,MX:ue,MT:/^[A-Za-z]{3}\s{0,1}\d{4}$/,NL:/^\d{4}\s?[a-z]{2}$/i,NO:le,NZ:le,PL:/^\d{2}\-\d{3}$/,PR:/^00[679]\d{2}([ -]\d{4})?$/,PT:/^\d{4}\-\d{3}?$/,RO:de,RU:de,SA:ue,SE:/^[1-9]\d{2}\s?\d{2}$/,SI:le,SK:/^\d{3}\s?\d{2}$/,TN:le,TW:/^\d{3}(\d{2})?$/,UA:ue,US:/^\d{5}(-\d{4})?$/,ZA:le,ZM:ue},fe=Object.keys(ce);function Ae(t,e){h(t);var r=e?new RegExp("^[".concat(e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"]+"),"g"):/^\s+/g;return t.replace(r,"")}function $e(t,e){h(t);var r=e?new RegExp("[".concat(e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"]+$"),"g"):/\s+$/g;return t.replace(r,"")}function pe(t,e){return h(t),t.replace(new RegExp("[".concat(e,"]+"),"g"),"")}var ge={all_lowercase:!0,gmail_lowercase:!0,gmail_remove_dots:!0,gmail_remove_subaddress:!0,gmail_convert_googlemaildotcom:!0,outlookdotcom_lowercase:!0,outlookdotcom_remove_subaddress:!0,yahoo_lowercase:!0,yahoo_remove_subaddress:!0,yandex_lowercase:!0,icloud_lowercase:!0,icloud_remove_subaddress:!0},he=["icloud.com","me.com"],me=["hotmail.at","hotmail.be","hotmail.ca","hotmail.cl","hotmail.co.il","hotmail.co.nz","hotmail.co.th","hotmail.co.uk","hotmail.com","hotmail.com.ar","hotmail.com.au","hotmail.com.br","hotmail.com.gr","hotmail.com.mx","hotmail.com.pe","hotmail.com.tr","hotmail.com.vn","hotmail.cz","hotmail.de","hotmail.dk","hotmail.es","hotmail.fr","hotmail.hu","hotmail.id","hotmail.ie","hotmail.in","hotmail.it","hotmail.jp","hotmail.kr","hotmail.lv","hotmail.my","hotmail.ph","hotmail.pt","hotmail.sa","hotmail.sg","hotmail.sk","live.be","live.co.uk","live.com","live.com.ar","live.com.mx","live.de","live.es","live.eu","live.fr","live.it","live.nl","msn.com","outlook.at","outlook.be","outlook.cl","outlook.co.il","outlook.co.nz","outlook.co.th","outlook.com","outlook.com.ar","outlook.com.au","outlook.com.br","outlook.com.gr","outlook.com.pe","outlook.com.tr","outlook.com.vn","outlook.cz","outlook.de","outlook.dk","outlook.es","outlook.fr","outlook.hu","outlook.id","outlook.ie","outlook.in","outlook.it","outlook.jp","outlook.kr","outlook.lv","outlook.my","outlook.ph","outlook.pt","outlook.sa","outlook.sg","outlook.sk","passport.com"],ve=["rocketmail.com","yahoo.ca","yahoo.co.uk","yahoo.com","yahoo.de","yahoo.fr","yahoo.in","yahoo.it","ymail.com"],Ze=["yandex.ru","yandex.ua","yandex.kz","yandex.com","yandex.by","ya.ru"];function Se(t){return 1<t.length?t:""}var _e=/^[^-_](?!.*?[-_]{2,})([a-z0-9\\-]{1,}).*[^-_]$/;return{version:"13.0.0",toDate:o,toFloat:v,toInt:function(t,e){return h(t),parseInt(t,e||10)},toBoolean:function(t,e){return h(t),e?"1"===t||/^true$/i.test(t):"0"!==t&&!/^false$/i.test(t)&&""!==t},equals:function(t,e){return h(t),t===e},contains:function(t,e){return h(t),0<=t.indexOf(Z(e))},matches:function(t,e,r){return h(t),"[object RegExp]"!==Object.prototype.toString.call(e)&&(e=new RegExp(e,r)),e.test(t)},isEmail:function(t,e){if(h(t),(e=S(e,M)).require_display_name||e.allow_display_name){var r=t.match(I);if(r){var n,o=g(r,3);if(n=o[1],t=o[2],n.endsWith(" ")&&(n=n.substr(0,n.length-1)),!function(t){var e=t.match(/^"(.+)"$/i),r=e?e[1]:t;if(r.trim()){if(/[\.";<>]/.test(r)){if(!e)return;if(!(r.split('"').length===r.split('\\"').length))return}return 1}}(n))return!1}else if(e.require_display_name)return!1}if(!e.ignore_max_length&&254<t.length)return!1;var i=t.split("@"),a=i.pop(),s=i.join("@"),l=a.toLowerCase();if(e.domain_specific_validation&&("gmail.com"===l||"googlemail.com"===l)){var u=(s=s.toLowerCase()).split("+")[0];if(!_(u.replace(".",""),{min:6,max:30}))return!1;for(var d=u.split("."),c=0;c<d.length;c++)if(!T.test(d[c]))return!1}if(!_(s,{max:64})||!_(a,{max:254}))return!1;if(!E(a,{require_tld:e.require_tld})){if(!e.allow_ip_domain)return!1;if(!C(a)){if(!a.startsWith("[")||!a.endsWith("]"))return!1;var f=a.substr(1,a.length-2);if(0===f.length||!C(f))return!1}}if('"'===s[0])return s=s.slice(1,s.length-1),e.allow_utf8_local_part?w.test(s):B.test(s);for(var A=e.allow_utf8_local_part?x:N,$=s.split("."),p=0;p<$.length;p++)if(!A.test($[p]))return!1;return!0},isURL:function(t,e){if(h(t),!t||2083<=t.length||/[\s<>]/.test(t))return!1;if(0===t.indexOf("mailto:"))return!1;var r,n,o,i,a,s,l,u;if(e=S(e,G),1<(l=(t=(l=(t=(l=t.split("#")).shift()).split("?")).shift()).split("://")).length){if(r=l.shift().toLowerCase(),e.require_valid_protocol&&-1===e.protocols.indexOf(r))return!1}else{if(e.require_protocol)return!1;if("//"===t.substr(0,2)){if(!e.allow_protocol_relative_urls)return!1;l[0]=t.substr(2)}}if(""===(t=l.join("://")))return!1;if(""===(t=(l=t.split("/")).shift())&&!e.require_host)return!0;if(1<(l=t.split("@")).length){if(e.disallow_auth)return!1;if(0<=(n=l.shift()).indexOf(":")&&2<n.split(":").length)return!1}u=s=null;var d=(i=l.join("@")).match(U);return d?(o="",u=d[1],s=d[2]||null):(o=(l=i.split(":")).shift(),l.length&&(s=l.join(":"))),!(null!==s&&(a=parseInt(s,10),!/^[0-9]+$/.test(s)||a<=0||65535<a))&&(!!(C(o)||E(o,e)||u&&C(u,6))&&(o=o||u,!(e.host_whitelist&&!b(o,e.host_whitelist))&&(!e.host_blacklist||!b(o,e.host_blacklist))))},isMACAddress:function(t,e){return h(t),e&&e.no_colons?P.test(t):O.test(t)||y.test(t)||D.test(t)||K.test(t)},isIP:C,isIPRange:function(t){h(t);var e=t.split("/");return 2===e.length&&(!!H.test(e[1])&&(!(1<e[1].length&&e[1].startsWith("0"))&&(C(e[0],4)&&e[1]<=32&&0<=e[1])))},isFQDN:E,isBoolean:function(t){return h(t),0<=["true","false","1","0"].indexOf(t)},isIBAN:function(t){return h(t),r=t.replace(/[\s\-]+/gi,"").toUpperCase(),(n=r.slice(0,2).toUpperCase())in vt&&vt[n].test(r)&&1===((e=t.replace(/[^A-Z0-9]+/gi,"").toUpperCase()).slice(4)+e.slice(0,4)).replace(/[A-Z]/g,function(t){return t.charCodeAt(0)-55}).match(/\d{1,7}/g).reduce(function(t,e){return Number(t+e)%97},"");var e,r,n},isBIC:function(t){return h(t),Zt.test(t)},isAlpha:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"en-US";if(h(t),e in r)return r[e].test(t);throw new Error("Invalid locale '".concat(e,"'"))},isAlphaLocales:z,isAlphanumeric:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"en-US";if(h(t),e in n)return n[e].test(t);throw new Error("Invalid locale '".concat(e,"'"))},isAlphanumericLocales:W,isNumeric:function(t,e){return h(t),e&&e.no_symbols?Y.test(t):V.test(t)},isPassportNumber:function(t,e){var r=t.replace(/\s/g,"").toUpperCase();return e.toUpperCase()in j&&j[e].test(r)},isPort:function(t){return X(t,{min:0,max:65535})},isLowercase:function(t){return h(t),t===t.toLowerCase()},isUppercase:function(t){return h(t),t===t.toUpperCase()},isAscii:function(t){return h(t),q.test(t)},isFullWidth:function(t){return h(t),tt.test(t)},isHalfWidth:function(t){return h(t),et.test(t)},isVariableWidth:function(t){return h(t),tt.test(t)&&et.test(t)},isMultibyte:function(t){return h(t),rt.test(t)},isSemVer:function(t){return h(t),nt.test(t)},isSurrogatePair:function(t){return h(t),ot.test(t)},isInt:X,isFloat:p,isFloatLocales:m,isDecimal:function(t,e){if(h(t),(e=S(e,at)).locale in i)return!it(st,t.replace(/ /g,""))&&(r=e,new RegExp("^[-+]?([0-9]+)?(\\".concat(i[r.locale],"[0-9]{").concat(r.decimal_digits,"})").concat(r.force_decimal?"":"?","$")).test(t));var r;throw new Error("Invalid locale '".concat(e.locale,"'"))},isHexadecimal:ut,isOctal:function(t){return h(t),dt.test(t)},isDivisibleBy:function(t,e){return h(t),v(t)%parseInt(e,10)==0},isHexColor:function(t){return h(t),ct.test(t)},isRgbColor:function(t){var e=!(1<arguments.length&&void 0!==arguments[1])||arguments[1];return h(t),e?ft.test(t)||At.test(t)||$t.test(t)||pt.test(t):ft.test(t)||At.test(t)},isHSL:function(t){return h(t),gt.test(t)||ht.test(t)},isISRC:function(t){return h(t),mt.test(t)},isMD5:function(t){return h(t),St.test(t)},isHash:function(t,e){return h(t),new RegExp("^[a-fA-F0-9]{".concat(_t[e],"}$")).test(t)},isJWT:function(t){return h(t),Ft.test(t)},isJSON:function(t){h(t);try{var e=JSON.parse(t);return!!e&&"object"===a(e)}catch(t){}return!1},isEmpty:function(t,e){return h(t),0===((e=S(e,Et)).ignore_whitespace?t.trim().length:t.length)},isLength:function(t,e){var r,n;h(t),n="object"===a(e)?(r=e.min||0,e.max):(r=e||0,arguments[2]);var o=t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g)||[],i=t.length-o.length;return r<=i&&(void 0===n||i<=n)},isLocale:function(t){return h(t),"en_US_POSIX"===t||"ca_ES_VALENCIA"===t||k.test(t)},isByteLength:_,isUUID:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"all";h(t);var r=Rt[e];return r&&r.test(t)},isMongoId:function(t){return h(t),ut(t)&&24===t.length},isAfter:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:String(new Date);h(t);var r=o(e),n=o(t);return!!(n&&r&&r<n)},isBefore:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:String(new Date);h(t);var r=o(e),n=o(t);return!!(n&&r&&n<r)},isIn:function(t,e){var r;if(h(t),"[object Array]"!==Object.prototype.toString.call(e))return"object"===a(e)?e.hasOwnProperty(t):!(!e||"function"!=typeof e.indexOf)&&0<=e.indexOf(t);var n=[];for(r in e)!{}.hasOwnProperty.call(e,r)||(n[r]=Z(e[r]));return 0<=n.indexOf(t)},isCreditCard:function(t){h(t);var e=t.replace(/[- ]+/g,"");if(!Lt.test(e))return!1;for(var r,n,o,i=0,a=e.length-1;0<=a;a--)r=e.substring(a,a+1),n=parseInt(r,10),i+=o&&10<=(n*=2)?n%10+1:n,o=!o;return!(i%10!=0||!e)},isIdentityCard:function(t,e){if(h(t),e in Ct)return Ct[e](t);if("any"!==e)throw new Error("Invalid locale '".concat(e,"'"));for(var r in Ct){if(Ct.hasOwnProperty(r))if((0,Ct[r])(t))return!0}return!1},isEAN:function(t){h(t);var e=Number(t.slice(-1));return It.test(t)&&e===Nt(t)},isISIN:function(t){if(h(t),!Tt.test(t))return!1;for(var e,r,n=t.replace(/[A-Z]/g,function(t){return parseInt(t,36)}),o=0,i=!0,a=n.length-2;0<=a;a--)e=n.substring(a,a+1),r=parseInt(e,10),o+=i&&10<=(r*=2)?r+1:r,i=!i;return parseInt(t.substr(t.length-1),10)===(1e4-o)%10},isISBN:function t(e){var r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"";if(h(e),!(r=String(r)))return t(e,10)||t(e,13);var n,o=e.replace(/[\s-]+/g,""),i=0;if("10"===r){if(!Bt.test(o))return!1;for(n=0;n<9;n++)i+=(n+1)*o.charAt(n);if("X"===o.charAt(9)?i+=100:i+=10*o.charAt(9),i%11==0)return!!o}else if("13"===r){if(!xt.test(o))return!1;for(n=0;n<12;n++)i+=wt[n%2]*o.charAt(n);if(o.charAt(12)-(10-i%10)%10==0)return!!o}return!1},isISSN:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};h(t);var r="^\\d{4}-?\\d{3}[\\dX]$";if(r=e.require_hyphen?r.replace("?",""):r,!(r=e.case_sensitive?new RegExp(r):new RegExp(r,"i")).test(t))return!1;for(var n=t.replace("-","").toUpperCase(),o=0,i=0;i<n.length;i++){var a=n[i];o+=("X"===a?10:+a)*(8-i)}return o%11==0},isMobilePhone:function(e,t,r){if(h(e),r&&r.strictMode&&!e.startsWith("+"))return!1;if(Array.isArray(t))return t.some(function(t){if(Gt.hasOwnProperty(t)&&Gt[t].test(e))return!0;return!1});if(t in Gt)return Gt[t].test(e);if(t&&"any"!==t)throw new Error("Invalid locale '".concat(t,"'"));for(var n in Gt){if(Gt.hasOwnProperty(n))if(Gt[n].test(e))return!0}return!1},isMobilePhoneLocales:Ut,isPostalCode:function(t,e){if(h(t),e in ce)return ce[e].test(t);if("any"!==e)throw new Error("Invalid locale '".concat(e,"'"));for(var r in ce){if(ce.hasOwnProperty(r))if(ce[r].test(t))return!0}return!1},isPostalCodeLocales:fe,isEthereumAddress:function(t){return h(t),bt.test(t)},isCurrency:function(t,e){return h(t),function(t){var r="\\d{".concat(t.digits_after_decimal[0],"}");t.digits_after_decimal.forEach(function(t,e){0!==e&&(r="".concat(r,"|\\d{").concat(t,"}"))});var e="(\\".concat(t.symbol.replace(/\./g,"\\."),")").concat(t.require_symbol?"":"?"),n="[1-9]\\d{0,2}(\\".concat(t.thousands_separator,"\\d{3})*"),o="(".concat(["0","[1-9]\\d*",n].join("|"),")?"),i="(\\".concat(t.decimal_separator,"(").concat(r,"))").concat(t.require_decimal?"":"?"),a=o+(t.allow_decimal||t.require_decimal?i:"");return t.allow_negatives&&!t.parens_for_negatives&&(t.negative_sign_after_digits?a+="-?":t.negative_sign_before_digits&&(a="-?"+a)),t.allow_negative_sign_placeholder?a="( (?!\\-))?".concat(a):t.allow_space_after_symbol?a=" ?".concat(a):t.allow_space_after_digits&&(a+="( (?!$))?"),t.symbol_after_digits?a+=e:a=e+a,t.allow_negatives&&(t.parens_for_negatives?a="(\\(".concat(a,"\\)|").concat(a,")"):t.negative_sign_before_digits||t.negative_sign_after_digits||(a="-?"+a)),new RegExp("^(?!-? )(?=.*\\d)".concat(a,"$"))}(e=S(e,Ot)).test(t)},isBtcAddress:function(t){return h(t),Pt.test(t)},isISO8601:function(t,e){h(t);var r=yt.test(t);return e&&r&&e.strict?function(t){var e=t.match(/^(\d{4})-?(\d{3})([ T]{1}\.*|$)/);if(e){var r=Number(e[1]),n=Number(e[2]);return r%4==0&&r%100!=0||r%400==0?n<=366:n<=365}var o=t.match(/(\d{4})-?(\d{0,2})-?(\d*)/).map(Number),i=o[1],a=o[2],s=o[3],l=a?"0".concat(a).slice(-2):a,u=s?"0".concat(s).slice(-2):s,d=new Date("".concat(i,"-").concat(l||"01","-").concat(u||"01"));return!a||!s||d.getUTCFullYear()===i&&d.getUTCMonth()+1===a&&d.getUTCDate()===s}(t):r},isRFC3339:function(t){return h(t),Yt.test(t)},isISO31661Alpha2:function(t){return h(t),it(jt,t.toUpperCase())},isISO31661Alpha3:function(t){return h(t),it(Jt,t.toUpperCase())},isBase32:function(t){h(t);var e=t.length;return!!(0<e&&e%8==0&&Qt.test(t))},isBase64:function(t){h(t);var e=t.length;if(!e||e%4!=0||Xt.test(t))return!1;var r=t.indexOf("=");return-1===r||r===e-1||r===e-2&&"="===t[e-1]},isDataURI:function(t){h(t);var e=t.split(",");if(e.length<2)return!1;var r=e.shift().trim().split(";"),n=r.shift();if("data:"!==n.substr(0,5))return!1;var o=n.substr(5);if(""!==o&&!qt.test(o))return!1;for(var i=0;i<r.length;i++)if((i!==r.length-1||"base64"!==r[i].toLowerCase())&&!te.test(r[i]))return!1;for(var a=0;a<e.length;a++)if(!ee.test(e[a]))return!1;return!0},isMagnetURI:function(t){return h(t),re.test(t.trim())},isMimeType:function(t){return h(t),ne.test(t)||oe.test(t)||ie.test(t)},isLatLong:function(t){if(h(t),!t.includes(","))return!1;var e=t.split(",");return!(e[0].startsWith("(")&&!e[1].endsWith(")")||e[1].endsWith(")")&&!e[0].startsWith("("))&&(ae.test(e[0])&&se.test(e[1]))},ltrim:Ae,rtrim:$e,trim:function(t,e){return $e(Ae(t,e),e)},escape:function(t){return h(t),t.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\//g,"&#x2F;").replace(/\\/g,"&#x5C;").replace(/`/g,"&#96;")},unescape:function(t){return h(t),t.replace(/&amp;/g,"&").replace(/&quot;/g,'"').replace(/&#x27;/g,"'").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&#x2F;/g,"/").replace(/&#x5C;/g,"\\").replace(/&#96;/g,"`")},stripLow:function(t,e){return h(t),pe(t,e?"\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F":"\\x00-\\x1F\\x7F")},whitelist:function(t,e){return h(t),t.replace(new RegExp("[^".concat(e,"]+"),"g"),"")},blacklist:pe,isWhitelisted:function(t,e){h(t);for(var r=t.length-1;0<=r;r--)if(-1===e.indexOf(t[r]))return!1;return!0},normalizeEmail:function(t,e){e=S(e,ge);var r=t.split("@"),n=r.pop(),o=[r.join("@"),n];if(o[1]=o[1].toLowerCase(),"gmail.com"===o[1]||"googlemail.com"===o[1]){if(e.gmail_remove_subaddress&&(o[0]=o[0].split("+")[0]),e.gmail_remove_dots&&(o[0]=o[0].replace(/\.+/g,Se)),!o[0].length)return!1;(e.all_lowercase||e.gmail_lowercase)&&(o[0]=o[0].toLowerCase()),o[1]=e.gmail_convert_googlemaildotcom?"gmail.com":o[1]}else if(0<=he.indexOf(o[1])){if(e.icloud_remove_subaddress&&(o[0]=o[0].split("+")[0]),!o[0].length)return!1;(e.all_lowercase||e.icloud_lowercase)&&(o[0]=o[0].toLowerCase())}else if(0<=me.indexOf(o[1])){if(e.outlookdotcom_remove_subaddress&&(o[0]=o[0].split("+")[0]),!o[0].length)return!1;(e.all_lowercase||e.outlookdotcom_lowercase)&&(o[0]=o[0].toLowerCase())}else if(0<=ve.indexOf(o[1])){if(e.yahoo_remove_subaddress){var i=o[0].split("-");o[0]=1<i.length?i.slice(0,-1).join("-"):i[0]}if(!o[0].length)return!1;(e.all_lowercase||e.yahoo_lowercase)&&(o[0]=o[0].toLowerCase())}else 0<=Ze.indexOf(o[1])?((e.all_lowercase||e.yandex_lowercase)&&(o[0]=o[0].toLowerCase()),o[1]="yandex.ru"):e.all_lowercase&&(o[0]=o[0].toLowerCase());return o.join("@")},toString:toString,isSlug:function(t){return h(t),_e.test(t)}}}); \ No newline at end of file