diff --git a/README.md b/README.md
index d64e5ae..643cb90 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
Package validator
=================
[![Join the chat at https://gitter.im/go-playground/validator](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-playground/validator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-![Project status](https://img.shields.io/badge/version-10.6.0-green.svg)
+![Project status](https://img.shields.io/badge/version-10.8.0-green.svg)
[![Build Status](https://travis-ci.org/go-playground/validator.svg?branch=master)](https://travis-ci.org/go-playground/validator)
[![Coverage Status](https://coveralls.io/repos/go-playground/validator/badge.svg?branch=master&service=github)](https://coveralls.io/github/go-playground/validator?branch=master)
[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/validator)](https://goreportcard.com/report/github.com/go-playground/validator)
@@ -27,11 +27,11 @@ Installation
Use go get.
- go get github.com/go-playground/validator
+ go get github.com/go-playground/validator/v10
Then import the validator package into your own code.
- import "github.com/go-playground/validator"
+ import "github.com/go-playground/validator/v10"
Error Return Value
-------
@@ -43,7 +43,7 @@ They return type error to avoid the issue discussed in the following, where err
* http://stackoverflow.com/a/29138676/3158232
* https://github.com/go-playground/validator/issues/134
-Validator only InvalidValidationError for bad validation input, nil or ValidationErrors as type error; so, in your code all you need to do is check if the error returned is not nil, and if it's not check if error is InvalidValidationError ( if necessary, most of the time it isn't ) type cast it to type ValidationErrors like so:
+Validator returns only InvalidValidationError for bad validation input, nil or ValidationErrors as type error; so, in your code all you need to do is check if the error returned is not nil, and if it's not check if error is InvalidValidationError ( if necessary, most of the time it isn't ) type cast it to type ValidationErrors like so:
```go
err := validate.Struct(mystruct)
@@ -100,7 +100,7 @@ Baked-in Validations
| hostname_rfc1123 | Hostname RFC 1123 |
| ip | Internet Protocol Address IP |
| ip4_addr | Internet Protocol Address IPv4 |
-| ip6_addr |Internet Protocol Address IPv6 |
+| ip6_addr | Internet Protocol Address IPv6 |
| ip_addr | Internet Protocol Address IP |
| ipv4 | Internet Protocol Address IPv4 |
| ipv6 | Internet Protocol Address IPv6 |
@@ -129,12 +129,17 @@ Baked-in Validations
| contains | Contains |
| containsany | Contains Any |
| containsrune | Contains Rune |
+| endsnotwith | Ends With |
| endswith | Ends With |
+| excludes | Excludes |
+| excludesall | Excludes All |
+| excludesrune | Excludes Rune |
| lowercase | Lowercase |
| multibyte | Multi-Byte Characters |
| number | NOT DOCUMENTED IN doc.go |
| numeric | Numeric |
| printascii | Printable ASCII |
+| startsnotwith | Starts Not With |
| startswith | Starts With |
| uppercase | Uppercase |
@@ -143,6 +148,8 @@ Baked-in Validations
| - | - |
| base64 | Base64 String |
| base64url | Base64URL String |
+| bic | Business Identifier Code (ISO 9362) |
+| bcp47_language_tag | Language tag (BCP 47) |
| btc_addr | Bitcoin Address |
| btc_addr_bech32 | Bitcoin Bech32 Address (segwit) |
| datetime | Datetime |
@@ -158,12 +165,20 @@ Baked-in Validations
| isbn | International Standard Book Number |
| isbn10 | International Standard Book Number 10 |
| isbn13 | International Standard Book Number 13 |
+| iso3166_1_alpha2 | Two-letter country code (ISO 3166-1 alpha-2) |
+| iso3166_1_alpha3 | Three-letter country code (ISO 3166-1 alpha-3) |
+| iso3166_1_alpha_numeric | Numeric country code (ISO 3166-1 numeric) |
+| iso3166_2 | Country subdivision code (ISO 3166-2) |
| json | JSON |
+| jwt | JSON Web Token (JWT) |
| latitude | Latitude |
| longitude | Longitude |
+| postcode_iso3166_alpha2 | Postcode |
+| postcode_iso3166_alpha2_field | Postcode |
| rgb | RGB String |
| rgba | RGBA String |
| ssn | Social Security Number SSN |
+| timezone | Timezone |
| uuid | Universally Unique Identifier UUID |
| uuid3 | Universally Unique Identifier UUID v3 |
| uuid3_rfc4122 | Universally Unique Identifier UUID v3 RFC4122 |
@@ -178,7 +193,7 @@ Baked-in Validations
| - | - |
| eq | Equals |
| gt | Greater than|
-| gte |Greater than or equal |
+| gte | Greater than or equal |
| lt | Less Than |
| lte | Less Than or Equal |
| ne | Not Equal |
@@ -187,10 +202,6 @@ Baked-in Validations
| Tag | Description |
| - | - |
| dir | Directory |
-| endswith | Ends With |
-| excludes | Excludes |
-| excludesall | Excludes All |
-| excludesrune | Excludes Rune |
| file | File path |
| isdefault | Is Default |
| len | Length |
@@ -210,6 +221,12 @@ Baked-in Validations
| excluded_without_all | Excluded Without All |
| unique | Unique |
+#### Aliases:
+| Tag | Description |
+| - | - |
+| iscolor | hexcolor\|rgb\|rgba\|hsl\|hsla |
+| country_code | iso3166_1_alpha2\|iso3166_1_alpha3\|iso3166_1_alpha_numeric |
+
Benchmarks
------
###### Run on MacBook Pro (15-inch, 2017) go version go1.10.2 darwin/amd64
@@ -301,4 +318,4 @@ Distributed under MIT License, please see license file within the code for more
Maintainers
-----------
This project has grown large enough that more than one person is required to properly support the community.
-If you are interested in becoming a maintainer please reach out to me https://github.com/deankarn
\ No newline at end of file
+If you are interested in becoming a maintainer please reach out to me https://github.com/deankarn
diff --git a/baked_in.go b/baked_in.go
index c46e6cd..ce81457 100644
--- a/baked_in.go
+++ b/baked_in.go
@@ -56,7 +56,7 @@ var (
isdefault: {},
}
- // BakedInAliasValidators is a default mapping of a single validation tag that
+ // bakedInAliases is a default mapping of a single validation tag that
// defines a common or complex set of validation(s) to simplify
// adding validation to structs.
bakedInAliases = map[string]string{
@@ -64,7 +64,7 @@ var (
"country_code": "iso3166_1_alpha2|iso3166_1_alpha3|iso3166_1_alpha_numeric",
}
- // BakedInValidators is the default map of ValidationFunc
+ // bakedInValidators is the default map of ValidationFunc
// you can add, remove or even replace items to suite your needs,
// or even disregard and use your own map if so desired.
bakedInValidators = map[string]Func{
@@ -181,6 +181,7 @@ var (
"url_encoded": isURLEncoded,
"dir": isDir,
"json": isJSON,
+ "jwt": isJWT,
"hostname_port": isHostnamePort,
"lowercase": isLowercase,
"uppercase": isUppercase,
@@ -189,6 +190,7 @@ var (
"iso3166_1_alpha2": isIso3166Alpha2,
"iso3166_1_alpha3": isIso3166Alpha3,
"iso3166_1_alpha_numeric": isIso3166AlphaNumeric,
+ "iso3166_2": isIso31662,
"bcp47_language_tag": isBCP47LanguageTag,
"postcode_iso3166_alpha2": isPostcodeByIso3166Alpha2,
"postcode_iso3166_alpha2_field": isPostcodeByIso3166Alpha2Field,
@@ -301,7 +303,7 @@ func isUnique(fl FieldLevel) bool {
}
}
-// IsMAC is the validation function for validating if the field's value is a valid MAC address.
+// isMAC is the validation function for validating if the field's value is a valid MAC address.
func isMAC(fl FieldLevel) bool {
_, err := net.ParseMAC(fl.Field().String())
@@ -309,7 +311,7 @@ func isMAC(fl FieldLevel) bool {
return err == nil
}
-// IsCIDRv4 is the validation function for validating if the field's value is a valid v4 CIDR address.
+// isCIDRv4 is the validation function for validating if the field's value is a valid v4 CIDR address.
func isCIDRv4(fl FieldLevel) bool {
ip, _, err := net.ParseCIDR(fl.Field().String())
@@ -317,7 +319,7 @@ func isCIDRv4(fl FieldLevel) bool {
return err == nil && ip.To4() != nil
}
-// IsCIDRv6 is the validation function for validating if the field's value is a valid v6 CIDR address.
+// isCIDRv6 is the validation function for validating if the field's value is a valid v6 CIDR address.
func isCIDRv6(fl FieldLevel) bool {
ip, _, err := net.ParseCIDR(fl.Field().String())
@@ -325,7 +327,7 @@ func isCIDRv6(fl FieldLevel) bool {
return err == nil && ip.To4() == nil
}
-// IsCIDR is the validation function for validating if the field's value is a valid v4 or v6 CIDR address.
+// isCIDR is the validation function for validating if the field's value is a valid v4 or v6 CIDR address.
func isCIDR(fl FieldLevel) bool {
_, _, err := net.ParseCIDR(fl.Field().String())
@@ -333,7 +335,7 @@ func isCIDR(fl FieldLevel) bool {
return err == nil
}
-// IsIPv4 is the validation function for validating if a value is a valid v4 IP address.
+// isIPv4 is the validation function for validating if a value is a valid v4 IP address.
func isIPv4(fl FieldLevel) bool {
ip := net.ParseIP(fl.Field().String())
@@ -341,7 +343,7 @@ func isIPv4(fl FieldLevel) bool {
return ip != nil && ip.To4() != nil
}
-// IsIPv6 is the validation function for validating if the field's value is a valid v6 IP address.
+// isIPv6 is the validation function for validating if the field's value is a valid v6 IP address.
func isIPv6(fl FieldLevel) bool {
ip := net.ParseIP(fl.Field().String())
@@ -349,7 +351,7 @@ func isIPv6(fl FieldLevel) bool {
return ip != nil && ip.To4() == nil
}
-// IsIP is the validation function for validating if the field's value is a valid v4 or v6 IP address.
+// isIP is the validation function for validating if the field's value is a valid v4 or v6 IP address.
func isIP(fl FieldLevel) bool {
ip := net.ParseIP(fl.Field().String())
@@ -357,7 +359,7 @@ func isIP(fl FieldLevel) bool {
return ip != nil
}
-// IsSSN is the validation function for validating if the field's value is a valid SSN.
+// isSSN is the validation function for validating if the field's value is a valid SSN.
func isSSN(fl FieldLevel) bool {
field := fl.Field()
@@ -369,7 +371,7 @@ func isSSN(fl FieldLevel) bool {
return sSNRegex.MatchString(field.String())
}
-// IsLongitude is the validation function for validating if the field's value is a valid longitude coordinate.
+// isLongitude is the validation function for validating if the field's value is a valid longitude coordinate.
func isLongitude(fl FieldLevel) bool {
field := fl.Field()
@@ -392,7 +394,7 @@ func isLongitude(fl FieldLevel) bool {
return longitudeRegex.MatchString(v)
}
-// IsLatitude is the validation function for validating if the field's value is a valid latitude coordinate.
+// isLatitude is the validation function for validating if the field's value is a valid latitude coordinate.
func isLatitude(fl FieldLevel) bool {
field := fl.Field()
@@ -415,7 +417,7 @@ func isLatitude(fl FieldLevel) bool {
return latitudeRegex.MatchString(v)
}
-// IsDataURI is the validation function for validating if the field's value is a valid data URI.
+// isDataURI is the validation function for validating if the field's value is a valid data URI.
func isDataURI(fl FieldLevel) bool {
uri := strings.SplitN(fl.Field().String(), ",", 2)
@@ -431,7 +433,7 @@ func isDataURI(fl FieldLevel) bool {
return base64Regex.MatchString(uri[1])
}
-// HasMultiByteCharacter is the validation function for validating if the field's value has a multi byte character.
+// hasMultiByteCharacter is the validation function for validating if the field's value has a multi byte character.
func hasMultiByteCharacter(fl FieldLevel) bool {
field := fl.Field()
@@ -443,62 +445,62 @@ func hasMultiByteCharacter(fl FieldLevel) bool {
return multibyteRegex.MatchString(field.String())
}
-// IsPrintableASCII is the validation function for validating if the field's value is a valid printable ASCII character.
+// isPrintableASCII is the validation function for validating if the field's value is a valid printable ASCII character.
func isPrintableASCII(fl FieldLevel) bool {
return printableASCIIRegex.MatchString(fl.Field().String())
}
-// IsASCII is the validation function for validating if the field's value is a valid ASCII character.
+// isASCII is the validation function for validating if the field's value is a valid ASCII character.
func isASCII(fl FieldLevel) bool {
return aSCIIRegex.MatchString(fl.Field().String())
}
-// IsUUID5 is the validation function for validating if the field's value is a valid v5 UUID.
+// isUUID5 is the validation function for validating if the field's value is a valid v5 UUID.
func isUUID5(fl FieldLevel) bool {
return uUID5Regex.MatchString(fl.Field().String())
}
-// IsUUID4 is the validation function for validating if the field's value is a valid v4 UUID.
+// isUUID4 is the validation function for validating if the field's value is a valid v4 UUID.
func isUUID4(fl FieldLevel) bool {
return uUID4Regex.MatchString(fl.Field().String())
}
-// IsUUID3 is the validation function for validating if the field's value is a valid v3 UUID.
+// isUUID3 is the validation function for validating if the field's value is a valid v3 UUID.
func isUUID3(fl FieldLevel) bool {
return uUID3Regex.MatchString(fl.Field().String())
}
-// IsUUID is the validation function for validating if the field's value is a valid UUID of any version.
+// isUUID is the validation function for validating if the field's value is a valid UUID of any version.
func isUUID(fl FieldLevel) bool {
return uUIDRegex.MatchString(fl.Field().String())
}
-// IsUUID5RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v5 UUID.
+// isUUID5RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v5 UUID.
func isUUID5RFC4122(fl FieldLevel) bool {
return uUID5RFC4122Regex.MatchString(fl.Field().String())
}
-// IsUUID4RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v4 UUID.
+// isUUID4RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v4 UUID.
func isUUID4RFC4122(fl FieldLevel) bool {
return uUID4RFC4122Regex.MatchString(fl.Field().String())
}
-// IsUUID3RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v3 UUID.
+// isUUID3RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v3 UUID.
func isUUID3RFC4122(fl FieldLevel) bool {
return uUID3RFC4122Regex.MatchString(fl.Field().String())
}
-// IsUUIDRFC4122 is the validation function for validating if the field's value is a valid RFC4122 UUID of any version.
+// isUUIDRFC4122 is the validation function for validating if the field's value is a valid RFC4122 UUID of any version.
func isUUIDRFC4122(fl FieldLevel) bool {
return uUIDRFC4122Regex.MatchString(fl.Field().String())
}
-// IsISBN is the validation function for validating if the field's value is a valid v10 or v13 ISBN.
+// isISBN is the validation function for validating if the field's value is a valid v10 or v13 ISBN.
func isISBN(fl FieldLevel) bool {
return isISBN10(fl) || isISBN13(fl)
}
-// IsISBN13 is the validation function for validating if the field's value is a valid v13 ISBN.
+// isISBN13 is the validation function for validating if the field's value is a valid v13 ISBN.
func isISBN13(fl FieldLevel) bool {
s := strings.Replace(strings.Replace(fl.Field().String(), "-", "", 4), " ", "", 4)
@@ -519,7 +521,7 @@ func isISBN13(fl FieldLevel) bool {
return (int32(s[12]-'0'))-((10-(checksum%10))%10) == 0
}
-// IsISBN10 is the validation function for validating if the field's value is a valid v10 ISBN.
+// isISBN10 is the validation function for validating if the field's value is a valid v10 ISBN.
func isISBN10(fl FieldLevel) bool {
s := strings.Replace(strings.Replace(fl.Field().String(), "-", "", 3), " ", "", 3)
@@ -544,7 +546,7 @@ func isISBN10(fl FieldLevel) bool {
return checksum%11 == 0
}
-// IsEthereumAddress is the validation function for validating if the field's value is a valid Ethereum address.
+// isEthereumAddress is the validation function for validating if the field's value is a valid Ethereum address.
func isEthereumAddress(fl FieldLevel) bool {
address := fl.Field().String()
@@ -575,7 +577,7 @@ func isEthereumAddress(fl FieldLevel) bool {
return true
}
-// IsBitcoinAddress is the validation function for validating if the field's value is a valid btc address
+// isBitcoinAddress is the validation function for validating if the field's value is a valid btc address
func isBitcoinAddress(fl FieldLevel) bool {
address := fl.Field().String()
@@ -612,7 +614,7 @@ func isBitcoinAddress(fl FieldLevel) bool {
return validchecksum == computedchecksum
}
-// IsBitcoinBech32Address is the validation function for validating if the field's value is a valid bech32 btc address
+// isBitcoinBech32Address is the validation function for validating if the field's value is a valid bech32 btc address
func isBitcoinBech32Address(fl FieldLevel) bool {
address := fl.Field().String()
@@ -692,22 +694,22 @@ func isBitcoinBech32Address(fl FieldLevel) bool {
return true
}
-// ExcludesRune is the validation function for validating that the field's value does not contain the rune specified within the param.
+// excludesRune is the validation function for validating that the field's value does not contain the rune specified within the param.
func excludesRune(fl FieldLevel) bool {
return !containsRune(fl)
}
-// ExcludesAll is the validation function for validating that the field's value does not contain any of the characters specified within the param.
+// excludesAll is the validation function for validating that the field's value does not contain any of the characters specified within the param.
func excludesAll(fl FieldLevel) bool {
return !containsAny(fl)
}
-// Excludes is the validation function for validating that the field's value does not contain the text specified within the param.
+// excludes is the validation function for validating that the field's value does not contain the text specified within the param.
func excludes(fl FieldLevel) bool {
return !contains(fl)
}
-// ContainsRune is the validation function for validating that the field's value contains the rune specified within the param.
+// containsRune is the validation function for validating that the field's value contains the rune specified within the param.
func containsRune(fl FieldLevel) bool {
r, _ := utf8.DecodeRuneInString(fl.Param())
@@ -715,37 +717,37 @@ func containsRune(fl FieldLevel) bool {
return strings.ContainsRune(fl.Field().String(), r)
}
-// ContainsAny is the validation function for validating that the field's value contains any of the characters specified within the param.
+// containsAny is the validation function for validating that the field's value contains any of the characters specified within the param.
func containsAny(fl FieldLevel) bool {
return strings.ContainsAny(fl.Field().String(), fl.Param())
}
-// Contains is the validation function for validating that the field's value contains the text specified within the param.
+// contains is the validation function for validating that the field's value contains the text specified within the param.
func contains(fl FieldLevel) bool {
return strings.Contains(fl.Field().String(), fl.Param())
}
-// StartsWith is the validation function for validating that the field's value starts with the text specified within the param.
+// startsWith is the validation function for validating that the field's value starts with the text specified within the param.
func startsWith(fl FieldLevel) bool {
return strings.HasPrefix(fl.Field().String(), fl.Param())
}
-// EndsWith is the validation function for validating that the field's value ends with the text specified within the param.
+// endsWith is the validation function for validating that the field's value ends with the text specified within the param.
func endsWith(fl FieldLevel) bool {
return strings.HasSuffix(fl.Field().String(), fl.Param())
}
-// StartsNotWith is the validation function for validating that the field's value does not start with the text specified within the param.
+// startsNotWith is the validation function for validating that the field's value does not start with the text specified within the param.
func startsNotWith(fl FieldLevel) bool {
return !startsWith(fl)
}
-// EndsNotWith is the validation function for validating that the field's value does not end with the text specified within the param.
+// endsNotWith is the validation function for validating that the field's value does not end with the text specified within the param.
func endsNotWith(fl FieldLevel) bool {
return !endsWith(fl)
}
-// FieldContains is the validation function for validating if the current field's value contains the field specified by the param's value.
+// fieldContains is the validation function for validating if the current field's value contains the field specified by the param's value.
func fieldContains(fl FieldLevel) bool {
field := fl.Field()
@@ -758,7 +760,7 @@ func fieldContains(fl FieldLevel) bool {
return strings.Contains(field.String(), currentField.String())
}
-// FieldExcludes is the validation function for validating if the current field's value excludes the field specified by the param's value.
+// fieldExcludes is the validation function for validating if the current field's value excludes the field specified by the param's value.
func fieldExcludes(fl FieldLevel) bool {
field := fl.Field()
@@ -770,7 +772,7 @@ func fieldExcludes(fl FieldLevel) bool {
return !strings.Contains(field.String(), currentField.String())
}
-// IsNeField is the validation function for validating if the current field's value is not equal to the field specified by the param's value.
+// isNeField is the validation function for validating if the current field's value is not equal to the field specified by the param's value.
func isNeField(fl FieldLevel) bool {
field := fl.Field()
@@ -822,12 +824,12 @@ func isNeField(fl FieldLevel) bool {
return field.String() != currentField.String()
}
-// IsNe is the validation function for validating that the field's value does not equal the provided param value.
+// isNe is the validation function for validating that the field's value does not equal the provided param value.
func isNe(fl FieldLevel) bool {
return !isEq(fl)
}
-// IsLteCrossStructField is the validation function for validating if the current field's value is less than or equal to the field, within a separate struct, specified by the param's value.
+// isLteCrossStructField is the validation function for validating if the current field's value is less than or equal to the field, within a separate struct, specified by the param's value.
func isLteCrossStructField(fl FieldLevel) bool {
field := fl.Field()
@@ -874,7 +876,7 @@ func isLteCrossStructField(fl FieldLevel) bool {
return field.String() <= topField.String()
}
-// IsLtCrossStructField is the validation function for validating if the current field's value is less than the field, within a separate struct, specified by the param's value.
+// isLtCrossStructField is the validation function for validating if the current field's value is less than the field, within a separate struct, specified by the param's value.
// NOTE: This is exposed for use within your own custom functions and not intended to be called directly.
func isLtCrossStructField(fl FieldLevel) bool {
@@ -922,7 +924,7 @@ func isLtCrossStructField(fl FieldLevel) bool {
return field.String() < topField.String()
}
-// IsGteCrossStructField is the validation function for validating if the current field's value is greater than or equal to the field, within a separate struct, specified by the param's value.
+// isGteCrossStructField is the validation function for validating if the current field's value is greater than or equal to the field, within a separate struct, specified by the param's value.
func isGteCrossStructField(fl FieldLevel) bool {
field := fl.Field()
@@ -969,7 +971,7 @@ func isGteCrossStructField(fl FieldLevel) bool {
return field.String() >= topField.String()
}
-// IsGtCrossStructField is the validation function for validating if the current field's value is greater than the field, within a separate struct, specified by the param's value.
+// isGtCrossStructField is the validation function for validating if the current field's value is greater than the field, within a separate struct, specified by the param's value.
func isGtCrossStructField(fl FieldLevel) bool {
field := fl.Field()
@@ -1016,7 +1018,7 @@ func isGtCrossStructField(fl FieldLevel) bool {
return field.String() > topField.String()
}
-// IsNeCrossStructField is the validation function for validating that the current field's value is not equal to the field, within a separate struct, specified by the param's value.
+// isNeCrossStructField is the validation function for validating that the current field's value is not equal to the field, within a separate struct, specified by the param's value.
func isNeCrossStructField(fl FieldLevel) bool {
field := fl.Field()
@@ -1066,7 +1068,7 @@ func isNeCrossStructField(fl FieldLevel) bool {
return topField.String() != field.String()
}
-// IsEqCrossStructField is the validation function for validating that the current field's value is equal to the field, within a separate struct, specified by the param's value.
+// isEqCrossStructField is the validation function for validating that the current field's value is equal to the field, within a separate struct, specified by the param's value.
func isEqCrossStructField(fl FieldLevel) bool {
field := fl.Field()
@@ -1116,7 +1118,7 @@ func isEqCrossStructField(fl FieldLevel) bool {
return topField.String() == field.String()
}
-// IsEqField is the validation function for validating if the current field's value is equal to the field specified by the param's value.
+// isEqField is the validation function for validating if the current field's value is equal to the field specified by the param's value.
func isEqField(fl FieldLevel) bool {
field := fl.Field()
@@ -1167,7 +1169,7 @@ func isEqField(fl FieldLevel) bool {
return field.String() == currentField.String()
}
-// IsEq is the validation function for validating if the current field's value is equal to the param's value.
+// isEq is the validation function for validating if the current field's value is equal to the param's value.
func isEq(fl FieldLevel) bool {
field := fl.Field()
@@ -1248,17 +1250,17 @@ func isPostcodeByIso3166Alpha2Field(fl FieldLevel) bool {
return reg.MatchString(field.String())
}
-// IsBase64 is the validation function for validating if the current field's value is a valid base 64.
+// isBase64 is the validation function for validating if the current field's value is a valid base 64.
func isBase64(fl FieldLevel) bool {
return base64Regex.MatchString(fl.Field().String())
}
-// IsBase64URL is the validation function for validating if the current field's value is a valid base64 URL safe string.
+// isBase64URL is the validation function for validating if the current field's value is a valid base64 URL safe string.
func isBase64URL(fl FieldLevel) bool {
return base64URLRegex.MatchString(fl.Field().String())
}
-// IsURI is the validation function for validating if the current field's value is a valid URI.
+// isURI is the validation function for validating if the current field's value is a valid URI.
func isURI(fl FieldLevel) bool {
field := fl.Field()
@@ -1287,7 +1289,7 @@ func isURI(fl FieldLevel) bool {
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
}
-// IsURL is the validation function for validating if the current field's value is a valid URL.
+// isURL is the validation function for validating if the current field's value is a valid URL.
func isURL(fl FieldLevel) bool {
field := fl.Field()
@@ -1339,7 +1341,7 @@ func isUrnRFC2141(fl FieldLevel) bool {
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
}
-// IsFile is the validation function for validating if the current field's value is a valid file path.
+// isFile is the validation function for validating if the current field's value is a valid file path.
func isFile(fl FieldLevel) bool {
field := fl.Field()
@@ -1356,47 +1358,47 @@ func isFile(fl FieldLevel) bool {
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
}
-// IsE164 is the validation function for validating if the current field's value is a valid e.164 formatted phone number.
+// isE164 is the validation function for validating if the current field's value is a valid e.164 formatted phone number.
func isE164(fl FieldLevel) bool {
return e164Regex.MatchString(fl.Field().String())
}
-// IsEmail is the validation function for validating if the current field's value is a valid email address.
+// isEmail is the validation function for validating if the current field's value is a valid email address.
func isEmail(fl FieldLevel) bool {
return emailRegex.MatchString(fl.Field().String())
}
-// IsHSLA is the validation function for validating if the current field's value is a valid HSLA color.
+// isHSLA is the validation function for validating if the current field's value is a valid HSLA color.
func isHSLA(fl FieldLevel) bool {
return hslaRegex.MatchString(fl.Field().String())
}
-// IsHSL is the validation function for validating if the current field's value is a valid HSL color.
+// isHSL is the validation function for validating if the current field's value is a valid HSL color.
func isHSL(fl FieldLevel) bool {
return hslRegex.MatchString(fl.Field().String())
}
-// IsRGBA is the validation function for validating if the current field's value is a valid RGBA color.
+// isRGBA is the validation function for validating if the current field's value is a valid RGBA color.
func isRGBA(fl FieldLevel) bool {
return rgbaRegex.MatchString(fl.Field().String())
}
-// IsRGB is the validation function for validating if the current field's value is a valid RGB color.
+// isRGB is the validation function for validating if the current field's value is a valid RGB color.
func isRGB(fl FieldLevel) bool {
return rgbRegex.MatchString(fl.Field().String())
}
-// IsHEXColor is the validation function for validating if the current field's value is a valid HEX color.
+// isHEXColor is the validation function for validating if the current field's value is a valid HEX color.
func isHEXColor(fl FieldLevel) bool {
return hexColorRegex.MatchString(fl.Field().String())
}
-// IsHexadecimal is the validation function for validating if the current field's value is a valid hexadecimal.
+// isHexadecimal is the validation function for validating if the current field's value is a valid hexadecimal.
func isHexadecimal(fl FieldLevel) bool {
return hexadecimalRegex.MatchString(fl.Field().String())
}
-// IsNumber is the validation function for validating if the current field's value is a valid number.
+// isNumber is the validation function for validating if the current field's value is a valid number.
func isNumber(fl FieldLevel) bool {
switch fl.Field().Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.Float32, reflect.Float64:
@@ -1406,7 +1408,7 @@ func isNumber(fl FieldLevel) bool {
}
}
-// IsNumeric is the validation function for validating if the current field's value is a valid numeric value.
+// isNumeric is the validation function for validating if the current field's value is a valid numeric value.
func isNumeric(fl FieldLevel) bool {
switch fl.Field().Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.Float32, reflect.Float64:
@@ -1416,22 +1418,22 @@ func isNumeric(fl FieldLevel) bool {
}
}
-// IsAlphanum is the validation function for validating if the current field's value is a valid alphanumeric value.
+// isAlphanum is the validation function for validating if the current field's value is a valid alphanumeric value.
func isAlphanum(fl FieldLevel) bool {
return alphaNumericRegex.MatchString(fl.Field().String())
}
-// IsAlpha is the validation function for validating if the current field's value is a valid alpha value.
+// isAlpha is the validation function for validating if the current field's value is a valid alpha value.
func isAlpha(fl FieldLevel) bool {
return alphaRegex.MatchString(fl.Field().String())
}
-// IsAlphanumUnicode is the validation function for validating if the current field's value is a valid alphanumeric unicode value.
+// isAlphanumUnicode is the validation function for validating if the current field's value is a valid alphanumeric unicode value.
func isAlphanumUnicode(fl FieldLevel) bool {
return alphaUnicodeNumericRegex.MatchString(fl.Field().String())
}
-// IsAlphaUnicode is the validation function for validating if the current field's value is a valid alpha unicode value.
+// isAlphaUnicode is the validation function for validating if the current field's value is a valid alpha unicode value.
func isAlphaUnicode(fl FieldLevel) bool {
return alphaUnicodeRegex.MatchString(fl.Field().String())
}
@@ -1441,7 +1443,7 @@ func isDefault(fl FieldLevel) bool {
return !hasValue(fl)
}
-// HasValue is the validation function for validating if the current field's value is not the default static value.
+// hasValue is the validation function for validating if the current field's value is not the default static value.
func hasValue(fl FieldLevel) bool {
field := fl.Field()
switch field.Kind() {
@@ -1539,7 +1541,7 @@ func requiredUnless(fl FieldLevel) bool {
return hasValue(fl)
}
-// ExcludedWith is the validation function
+// excludedWith is the validation function
// The field under validation must not be present or is empty if any of the other specified fields are present.
func excludedWith(fl FieldLevel) bool {
params := parseOneOfParam2(fl.Param())
@@ -1551,7 +1553,7 @@ func excludedWith(fl FieldLevel) bool {
return true
}
-// RequiredWith is the validation function
+// requiredWith is the validation function
// The field under validation must be present and not empty only if any of the other specified fields are present.
func requiredWith(fl FieldLevel) bool {
params := parseOneOfParam2(fl.Param())
@@ -1563,7 +1565,7 @@ func requiredWith(fl FieldLevel) bool {
return true
}
-// ExcludedWithAll is the validation function
+// excludedWithAll is the validation function
// The field under validation must not be present or is empty if all of the other specified fields are present.
func excludedWithAll(fl FieldLevel) bool {
params := parseOneOfParam2(fl.Param())
@@ -1575,7 +1577,7 @@ func excludedWithAll(fl FieldLevel) bool {
return !hasValue(fl)
}
-// RequiredWithAll is the validation function
+// requiredWithAll is the validation function
// The field under validation must be present and not empty only if all of the other specified fields are present.
func requiredWithAll(fl FieldLevel) bool {
params := parseOneOfParam2(fl.Param())
@@ -1587,7 +1589,7 @@ func requiredWithAll(fl FieldLevel) bool {
return hasValue(fl)
}
-// ExcludedWithout is the validation function
+// excludedWithout is the validation function
// The field under validation must not be present or is empty when any of the other specified fields are not present.
func excludedWithout(fl FieldLevel) bool {
if requireCheckFieldKind(fl, strings.TrimSpace(fl.Param()), true) {
@@ -1596,7 +1598,7 @@ func excludedWithout(fl FieldLevel) bool {
return true
}
-// RequiredWithout is the validation function
+// requiredWithout is the validation function
// The field under validation must be present and not empty only when any of the other specified fields are not present.
func requiredWithout(fl FieldLevel) bool {
if requireCheckFieldKind(fl, strings.TrimSpace(fl.Param()), true) {
@@ -1605,7 +1607,7 @@ func requiredWithout(fl FieldLevel) bool {
return true
}
-// ExcludedWithoutAll is the validation function
+// excludedWithoutAll is the validation function
// The field under validation must not be present or is empty when all of the other specified fields are not present.
func excludedWithoutAll(fl FieldLevel) bool {
params := parseOneOfParam2(fl.Param())
@@ -1617,7 +1619,7 @@ func excludedWithoutAll(fl FieldLevel) bool {
return !hasValue(fl)
}
-// RequiredWithoutAll is the validation function
+// requiredWithoutAll is the validation function
// The field under validation must be present and not empty only when all of the other specified fields are not present.
func requiredWithoutAll(fl FieldLevel) bool {
params := parseOneOfParam2(fl.Param())
@@ -1629,7 +1631,7 @@ func requiredWithoutAll(fl FieldLevel) bool {
return hasValue(fl)
}
-// IsGteField is the validation function for validating if the current field's value is greater than or equal to the field specified by the param's value.
+// isGteField is the validation function for validating if the current field's value is greater than or equal to the field specified by the param's value.
func isGteField(fl FieldLevel) bool {
field := fl.Field()
@@ -1676,7 +1678,7 @@ func isGteField(fl FieldLevel) bool {
return len(field.String()) >= len(currentField.String())
}
-// IsGtField is the validation function for validating if the current field's value is greater than the field specified by the param's value.
+// isGtField is the validation function for validating if the current field's value is greater than the field specified by the param's value.
func isGtField(fl FieldLevel) bool {
field := fl.Field()
@@ -1723,7 +1725,7 @@ func isGtField(fl FieldLevel) bool {
return len(field.String()) > len(currentField.String())
}
-// IsGte is the validation function for validating if the current field's value is greater than or equal to the param's value.
+// isGte is the validation function for validating if the current field's value is greater than or equal to the param's value.
func isGte(fl FieldLevel) bool {
field := fl.Field()
@@ -1770,7 +1772,7 @@ func isGte(fl FieldLevel) bool {
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
}
-// IsGt is the validation function for validating if the current field's value is greater than the param's value.
+// isGt is the validation function for validating if the current field's value is greater than the param's value.
func isGt(fl FieldLevel) bool {
field := fl.Field()
@@ -1813,7 +1815,7 @@ func isGt(fl FieldLevel) bool {
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
}
-// HasLengthOf is the validation function for validating if the current field's value is equal to the param's value.
+// hasLengthOf is the validation function for validating if the current field's value is equal to the param's value.
func hasLengthOf(fl FieldLevel) bool {
field := fl.Field()
@@ -1850,12 +1852,12 @@ func hasLengthOf(fl FieldLevel) bool {
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
}
-// HasMinOf is the validation function for validating if the current field's value is greater than or equal to the param's value.
+// hasMinOf is the validation function for validating if the current field's value is greater than or equal to the param's value.
func hasMinOf(fl FieldLevel) bool {
return isGte(fl)
}
-// IsLteField is the validation function for validating if the current field's value is less than or equal to the field specified by the param's value.
+// isLteField is the validation function for validating if the current field's value is less than or equal to the field specified by the param's value.
func isLteField(fl FieldLevel) bool {
field := fl.Field()
@@ -1902,7 +1904,7 @@ func isLteField(fl FieldLevel) bool {
return len(field.String()) <= len(currentField.String())
}
-// IsLtField is the validation function for validating if the current field's value is less than the field specified by the param's value.
+// isLtField is the validation function for validating if the current field's value is less than the field specified by the param's value.
func isLtField(fl FieldLevel) bool {
field := fl.Field()
@@ -1949,7 +1951,7 @@ func isLtField(fl FieldLevel) bool {
return len(field.String()) < len(currentField.String())
}
-// IsLte is the validation function for validating if the current field's value is less than or equal to the param's value.
+// isLte is the validation function for validating if the current field's value is less than or equal to the param's value.
func isLte(fl FieldLevel) bool {
field := fl.Field()
@@ -1996,7 +1998,7 @@ func isLte(fl FieldLevel) bool {
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
}
-// IsLt is the validation function for validating if the current field's value is less than the param's value.
+// isLt is the validation function for validating if the current field's value is less than the param's value.
func isLt(fl FieldLevel) bool {
field := fl.Field()
@@ -2040,12 +2042,12 @@ func isLt(fl FieldLevel) bool {
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
}
-// HasMaxOf is the validation function for validating if the current field's value is less than or equal to the param's value.
+// hasMaxOf is the validation function for validating if the current field's value is less than or equal to the param's value.
func hasMaxOf(fl FieldLevel) bool {
return isLte(fl)
}
-// IsTCP4AddrResolvable is the validation function for validating if the field's value is a resolvable tcp4 address.
+// isTCP4AddrResolvable is the validation function for validating if the field's value is a resolvable tcp4 address.
func isTCP4AddrResolvable(fl FieldLevel) bool {
if !isIP4Addr(fl) {
@@ -2056,7 +2058,7 @@ func isTCP4AddrResolvable(fl FieldLevel) bool {
return err == nil
}
-// IsTCP6AddrResolvable is the validation function for validating if the field's value is a resolvable tcp6 address.
+// isTCP6AddrResolvable is the validation function for validating if the field's value is a resolvable tcp6 address.
func isTCP6AddrResolvable(fl FieldLevel) bool {
if !isIP6Addr(fl) {
@@ -2068,7 +2070,7 @@ func isTCP6AddrResolvable(fl FieldLevel) bool {
return err == nil
}
-// IsTCPAddrResolvable is the validation function for validating if the field's value is a resolvable tcp address.
+// isTCPAddrResolvable is the validation function for validating if the field's value is a resolvable tcp address.
func isTCPAddrResolvable(fl FieldLevel) bool {
if !isIP4Addr(fl) && !isIP6Addr(fl) {
@@ -2080,7 +2082,7 @@ func isTCPAddrResolvable(fl FieldLevel) bool {
return err == nil
}
-// IsUDP4AddrResolvable is the validation function for validating if the field's value is a resolvable udp4 address.
+// isUDP4AddrResolvable is the validation function for validating if the field's value is a resolvable udp4 address.
func isUDP4AddrResolvable(fl FieldLevel) bool {
if !isIP4Addr(fl) {
@@ -2092,7 +2094,7 @@ func isUDP4AddrResolvable(fl FieldLevel) bool {
return err == nil
}
-// IsUDP6AddrResolvable is the validation function for validating if the field's value is a resolvable udp6 address.
+// isUDP6AddrResolvable is the validation function for validating if the field's value is a resolvable udp6 address.
func isUDP6AddrResolvable(fl FieldLevel) bool {
if !isIP6Addr(fl) {
@@ -2104,7 +2106,7 @@ func isUDP6AddrResolvable(fl FieldLevel) bool {
return err == nil
}
-// IsUDPAddrResolvable is the validation function for validating if the field's value is a resolvable udp address.
+// isUDPAddrResolvable is the validation function for validating if the field's value is a resolvable udp address.
func isUDPAddrResolvable(fl FieldLevel) bool {
if !isIP4Addr(fl) && !isIP6Addr(fl) {
@@ -2116,7 +2118,7 @@ func isUDPAddrResolvable(fl FieldLevel) bool {
return err == nil
}
-// IsIP4AddrResolvable is the validation function for validating if the field's value is a resolvable ip4 address.
+// isIP4AddrResolvable is the validation function for validating if the field's value is a resolvable ip4 address.
func isIP4AddrResolvable(fl FieldLevel) bool {
if !isIPv4(fl) {
@@ -2128,7 +2130,7 @@ func isIP4AddrResolvable(fl FieldLevel) bool {
return err == nil
}
-// IsIP6AddrResolvable is the validation function for validating if the field's value is a resolvable ip6 address.
+// isIP6AddrResolvable is the validation function for validating if the field's value is a resolvable ip6 address.
func isIP6AddrResolvable(fl FieldLevel) bool {
if !isIPv6(fl) {
@@ -2140,7 +2142,7 @@ func isIP6AddrResolvable(fl FieldLevel) bool {
return err == nil
}
-// IsIPAddrResolvable is the validation function for validating if the field's value is a resolvable ip address.
+// isIPAddrResolvable is the validation function for validating if the field's value is a resolvable ip address.
func isIPAddrResolvable(fl FieldLevel) bool {
if !isIP(fl) {
@@ -2152,7 +2154,7 @@ func isIPAddrResolvable(fl FieldLevel) bool {
return err == nil
}
-// IsUnixAddrResolvable is the validation function for validating if the field's value is a resolvable unix address.
+// isUnixAddrResolvable is the validation function for validating if the field's value is a resolvable unix address.
func isUnixAddrResolvable(fl FieldLevel) bool {
_, err := net.ResolveUnixAddr("unix", fl.Field().String())
@@ -2206,7 +2208,7 @@ func isFQDN(fl FieldLevel) bool {
return fqdnRegexRFC1123.MatchString(val)
}
-// IsDir is the validation function for validating if the current field's value is a valid directory.
+// isDir is the validation function for validating if the current field's value is a valid directory.
func isDir(fl FieldLevel) bool {
field := fl.Field()
@@ -2234,6 +2236,11 @@ func isJSON(fl FieldLevel) bool {
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
}
+// isJWT is the validation function for validating if the current field's value is a valid JWT string.
+func isJWT(fl FieldLevel) bool {
+ return jWTRegex.MatchString(fl.Field().String())
+}
+
// isHostnamePort validates a : combination for fields typically used for socket address.
func isHostnamePort(fl FieldLevel) bool {
val := fl.Field().String()
@@ -2345,6 +2352,12 @@ func isIso3166AlphaNumeric(fl FieldLevel) bool {
return iso3166_1_alpha_numeric[code]
}
+// isIso31662 is the validation function for validating if the current field's value is a valid iso3166-2 code.
+func isIso31662(fl FieldLevel) bool {
+ val := fl.Field().String()
+ return iso3166_2[val]
+}
+
// isBCP47LanguageTag is the validation function for validating if the current field's value is a valid BCP 47 language tag, as parsed by language.Parse
func isBCP47LanguageTag(fl FieldLevel) bool {
field := fl.Field()
diff --git a/country_codes.go b/country_codes.go
index ef81ead..0d9eda0 100644
--- a/country_codes.go
+++ b/country_codes.go
@@ -160,3 +160,973 @@ var iso3166_1_alpha_numeric = map[int]bool{
704: true, 92: true, 850: true, 876: true, 732: true,
887: true, 894: true, 716: true, 248: true,
}
+
+var iso3166_2 = map[string]bool{
+ "AD-02" : true, "AD-03" : true, "AD-04" : true, "AD-05" : true, "AD-06" : true,
+ "AD-07" : true, "AD-08" : true, "AE-AJ" : true, "AE-AZ" : true, "AE-DU" : true,
+ "AE-FU" : true, "AE-RK" : true, "AE-SH" : true, "AE-UQ" : true, "AF-BAL" : true,
+ "AF-BAM" : true, "AF-BDG" : true, "AF-BDS" : true, "AF-BGL" : true, "AF-DAY" : true,
+ "AF-FRA" : true, "AF-FYB" : true, "AF-GHA" : true, "AF-GHO" : true, "AF-HEL" : true,
+ "AF-HER" : true, "AF-JOW" : true, "AF-KAB" : true, "AF-KAN" : true, "AF-KAP" : true,
+ "AF-KDZ" : true, "AF-KHO" : true, "AF-KNR" : true, "AF-LAG" : true, "AF-LOG" : true,
+ "AF-NAN" : true, "AF-NIM" : true, "AF-NUR" : true, "AF-PAN" : true, "AF-PAR" : true,
+ "AF-PIA" : true, "AF-PKA" : true, "AF-SAM" : true, "AF-SAR" : true, "AF-TAK" : true,
+ "AF-URU" : true, "AF-WAR" : true, "AF-ZAB" : true, "AG-03" : true, "AG-04" : true,
+ "AG-05" : true, "AG-06" : true, "AG-07" : true, "AG-08" : true, "AG-10" : true,
+ "AG-11" : true, "AL-01" : true, "AL-02" : true, "AL-03" : true, "AL-04" : true,
+ "AL-05" : true, "AL-06" : true, "AL-07" : true, "AL-08" : true, "AL-09" : true,
+ "AL-10" : true, "AL-11" : true, "AL-12" : true, "AL-BR" : true, "AL-BU" : true,
+ "AL-DI" : true, "AL-DL" : true, "AL-DR" : true, "AL-DV" : true, "AL-EL" : true,
+ "AL-ER" : true, "AL-FR" : true, "AL-GJ" : true, "AL-GR" : true, "AL-HA" : true,
+ "AL-KA" : true, "AL-KB" : true, "AL-KC" : true, "AL-KO" : true, "AL-KR" : true,
+ "AL-KU" : true, "AL-LB" : true, "AL-LE" : true, "AL-LU" : true, "AL-MK" : true,
+ "AL-MM" : true, "AL-MR" : true, "AL-MT" : true, "AL-PG" : true, "AL-PQ" : true,
+ "AL-PR" : true, "AL-PU" : true, "AL-SH" : true, "AL-SK" : true, "AL-SR" : true,
+ "AL-TE" : true, "AL-TP" : true, "AL-TR" : true, "AL-VL" : true, "AM-AG" : true,
+ "AM-AR" : true, "AM-AV" : true, "AM-ER" : true, "AM-GR" : true, "AM-KT" : true,
+ "AM-LO" : true, "AM-SH" : true, "AM-SU" : true, "AM-TV" : true, "AM-VD" : true,
+ "AO-BGO" : true, "AO-BGU" : true, "AO-BIE" : true, "AO-CAB" : true, "AO-CCU" : true,
+ "AO-CNN" : true, "AO-CNO" : true, "AO-CUS" : true, "AO-HUA" : true, "AO-HUI" : true,
+ "AO-LNO" : true, "AO-LSU" : true, "AO-LUA" : true, "AO-MAL" : true, "AO-MOX" : true,
+ "AO-NAM" : true, "AO-UIG" : true, "AO-ZAI" : true, "AR-A" : true, "AR-B" : true,
+ "AR-C" : true, "AR-D" : true, "AR-E" : true, "AR-G" : true, "AR-H" : true,
+ "AR-J" : true, "AR-K" : true, "AR-L" : true, "AR-M" : true, "AR-N" : true,
+ "AR-P" : true, "AR-Q" : true, "AR-R" : true, "AR-S" : true, "AR-T" : true,
+ "AR-U" : true, "AR-V" : true, "AR-W" : true, "AR-X" : true, "AR-Y" : true,
+ "AR-Z" : true, "AT-1" : true, "AT-2" : true, "AT-3" : true, "AT-4" : true,
+ "AT-5" : true, "AT-6" : true, "AT-7" : true, "AT-8" : true, "AT-9" : true,
+ "AU-ACT" : true, "AU-NSW" : true, "AU-NT" : true, "AU-QLD" : true, "AU-SA" : true,
+ "AU-TAS" : true, "AU-VIC" : true, "AU-WA" : true, "AZ-ABS" : true, "AZ-AGA" : true,
+ "AZ-AGC" : true, "AZ-AGM" : true, "AZ-AGS" : true, "AZ-AGU" : true, "AZ-AST" : true,
+ "AZ-BA" : true, "AZ-BAB" : true, "AZ-BAL" : true, "AZ-BAR" : true, "AZ-BEY" : true,
+ "AZ-BIL" : true, "AZ-CAB" : true, "AZ-CAL" : true, "AZ-CUL" : true, "AZ-DAS" : true,
+ "AZ-FUZ" : true, "AZ-GA" : true, "AZ-GAD" : true, "AZ-GOR" : true, "AZ-GOY" : true,
+ "AZ-GYG" : true, "AZ-HAC" : true, "AZ-IMI" : true, "AZ-ISM" : true, "AZ-KAL" : true,
+ "AZ-KAN" : true, "AZ-KUR" : true, "AZ-LA" : true, "AZ-LAC" : true, "AZ-LAN" : true,
+ "AZ-LER" : true, "AZ-MAS" : true, "AZ-MI" : true, "AZ-NA" : true, "AZ-NEF" : true,
+ "AZ-NV" : true, "AZ-NX" : true, "AZ-OGU" : true, "AZ-ORD" : true, "AZ-QAB" : true,
+ "AZ-QAX" : true, "AZ-QAZ" : true, "AZ-QBA" : true, "AZ-QBI" : true, "AZ-QOB" : true,
+ "AZ-QUS" : true, "AZ-SA" : true, "AZ-SAB" : true, "AZ-SAD" : true, "AZ-SAH" : true,
+ "AZ-SAK" : true, "AZ-SAL" : true, "AZ-SAR" : true, "AZ-SAT" : true, "AZ-SBN" : true,
+ "AZ-SIY" : true, "AZ-SKR" : true, "AZ-SM" : true, "AZ-SMI" : true, "AZ-SMX" : true,
+ "AZ-SR" : true, "AZ-SUS" : true, "AZ-TAR" : true, "AZ-TOV" : true, "AZ-UCA" : true,
+ "AZ-XA" : true, "AZ-XAC" : true, "AZ-XCI" : true, "AZ-XIZ" : true, "AZ-XVD" : true,
+ "AZ-YAR" : true, "AZ-YE" : true, "AZ-YEV" : true, "AZ-ZAN" : true, "AZ-ZAQ" : true,
+ "AZ-ZAR" : true, "BA-01" : true, "BA-02" : true, "BA-03" : true, "BA-04" : true,
+ "BA-05" : true, "BA-06" : true, "BA-07" : true, "BA-08" : true, "BA-09" : true,
+ "BA-10" : true, "BA-BIH" : true, "BA-BRC" : true, "BA-SRP" : true, "BB-01" : true,
+ "BB-02" : true, "BB-03" : true, "BB-04" : true, "BB-05" : true, "BB-06" : true,
+ "BB-07" : true, "BB-08" : true, "BB-09" : true, "BB-10" : true, "BB-11" : true,
+ "BD-01" : true, "BD-02" : true, "BD-03" : true, "BD-04" : true, "BD-05" : true,
+ "BD-06" : true, "BD-07" : true, "BD-08" : true, "BD-09" : true, "BD-10" : true,
+ "BD-11" : true, "BD-12" : true, "BD-13" : true, "BD-14" : true, "BD-15" : true,
+ "BD-16" : true, "BD-17" : true, "BD-18" : true, "BD-19" : true, "BD-20" : true,
+ "BD-21" : true, "BD-22" : true, "BD-23" : true, "BD-24" : true, "BD-25" : true,
+ "BD-26" : true, "BD-27" : true, "BD-28" : true, "BD-29" : true, "BD-30" : true,
+ "BD-31" : true, "BD-32" : true, "BD-33" : true, "BD-34" : true, "BD-35" : true,
+ "BD-36" : true, "BD-37" : true, "BD-38" : true, "BD-39" : true, "BD-40" : true,
+ "BD-41" : true, "BD-42" : true, "BD-43" : true, "BD-44" : true, "BD-45" : true,
+ "BD-46" : true, "BD-47" : true, "BD-48" : true, "BD-49" : true, "BD-50" : true,
+ "BD-51" : true, "BD-52" : true, "BD-53" : true, "BD-54" : true, "BD-55" : true,
+ "BD-56" : true, "BD-57" : true, "BD-58" : true, "BD-59" : true, "BD-60" : true,
+ "BD-61" : true, "BD-62" : true, "BD-63" : true, "BD-64" : true, "BD-A" : true,
+ "BD-B" : true, "BD-C" : true, "BD-D" : true, "BD-E" : true, "BD-F" : true,
+ "BD-G" : true, "BE-BRU" : true, "BE-VAN" : true, "BE-VBR" : true, "BE-VLG" : true,
+ "BE-VLI" : true, "BE-VOV" : true, "BE-VWV" : true, "BE-WAL" : true, "BE-WBR" : true,
+ "BE-WHT" : true, "BE-WLG" : true, "BE-WLX" : true, "BE-WNA" : true, "BF-01" : true,
+ "BF-02" : true, "BF-03" : true, "BF-04" : true, "BF-05" : true, "BF-06" : true,
+ "BF-07" : true, "BF-08" : true, "BF-09" : true, "BF-10" : true, "BF-11" : true,
+ "BF-12" : true, "BF-13" : true, "BF-BAL" : true, "BF-BAM" : true, "BF-BAN" : true,
+ "BF-BAZ" : true, "BF-BGR" : true, "BF-BLG" : true, "BF-BLK" : true, "BF-COM" : true,
+ "BF-GAN" : true, "BF-GNA" : true, "BF-GOU" : true, "BF-HOU" : true, "BF-IOB" : true,
+ "BF-KAD" : true, "BF-KEN" : true, "BF-KMD" : true, "BF-KMP" : true, "BF-KOP" : true,
+ "BF-KOS" : true, "BF-KOT" : true, "BF-KOW" : true, "BF-LER" : true, "BF-LOR" : true,
+ "BF-MOU" : true, "BF-NAM" : true, "BF-NAO" : true, "BF-NAY" : true, "BF-NOU" : true,
+ "BF-OUB" : true, "BF-OUD" : true, "BF-PAS" : true, "BF-PON" : true, "BF-SEN" : true,
+ "BF-SIS" : true, "BF-SMT" : true, "BF-SNG" : true, "BF-SOM" : true, "BF-SOR" : true,
+ "BF-TAP" : true, "BF-TUI" : true, "BF-YAG" : true, "BF-YAT" : true, "BF-ZIR" : true,
+ "BF-ZON" : true, "BF-ZOU" : true, "BG-01" : true, "BG-02" : true, "BG-03" : true,
+ "BG-04" : true, "BG-05" : true, "BG-06" : true, "BG-07" : true, "BG-08" : true,
+ "BG-09" : true, "BG-10" : true, "BG-11" : true, "BG-12" : true, "BG-13" : true,
+ "BG-14" : true, "BG-15" : true, "BG-16" : true, "BG-17" : true, "BG-18" : true,
+ "BG-19" : true, "BG-20" : true, "BG-21" : true, "BG-22" : true, "BG-23" : true,
+ "BG-24" : true, "BG-25" : true, "BG-26" : true, "BG-27" : true, "BG-28" : true,
+ "BH-13" : true, "BH-14" : true, "BH-15" : true, "BH-16" : true, "BH-17" : true,
+ "BI-BB" : true, "BI-BL" : true, "BI-BM" : true, "BI-BR" : true, "BI-CA" : true,
+ "BI-CI" : true, "BI-GI" : true, "BI-KI" : true, "BI-KR" : true, "BI-KY" : true,
+ "BI-MA" : true, "BI-MU" : true, "BI-MW" : true, "BI-NG" : true, "BI-RT" : true,
+ "BI-RY" : true, "BJ-AK" : true, "BJ-AL" : true, "BJ-AQ" : true, "BJ-BO" : true,
+ "BJ-CO" : true, "BJ-DO" : true, "BJ-KO" : true, "BJ-LI" : true, "BJ-MO" : true,
+ "BJ-OU" : true, "BJ-PL" : true, "BJ-ZO" : true, "BN-BE" : true, "BN-BM" : true,
+ "BN-TE" : true, "BN-TU" : true, "BO-B" : true, "BO-C" : true, "BO-H" : true,
+ "BO-L" : true, "BO-N" : true, "BO-O" : true, "BO-P" : true, "BO-S" : true,
+ "BO-T" : true, "BQ-BO" : true, "BQ-SA" : true, "BQ-SE" : true, "BR-AC" : true,
+ "BR-AL" : true, "BR-AM" : true, "BR-AP" : true, "BR-BA" : true, "BR-CE" : true,
+ "BR-DF" : true, "BR-ES" : true, "BR-FN" : true, "BR-GO" : true, "BR-MA" : true,
+ "BR-MG" : true, "BR-MS" : true, "BR-MT" : true, "BR-PA" : true, "BR-PB" : true,
+ "BR-PE" : true, "BR-PI" : true, "BR-PR" : true, "BR-RJ" : true, "BR-RN" : true,
+ "BR-RO" : true, "BR-RR" : true, "BR-RS" : true, "BR-SC" : true, "BR-SE" : true,
+ "BR-SP" : true, "BR-TO" : true, "BS-AK" : true, "BS-BI" : true, "BS-BP" : true,
+ "BS-BY" : true, "BS-CE" : true, "BS-CI" : true, "BS-CK" : true, "BS-CO" : true,
+ "BS-CS" : true, "BS-EG" : true, "BS-EX" : true, "BS-FP" : true, "BS-GC" : true,
+ "BS-HI" : true, "BS-HT" : true, "BS-IN" : true, "BS-LI" : true, "BS-MC" : true,
+ "BS-MG" : true, "BS-MI" : true, "BS-NE" : true, "BS-NO" : true, "BS-NS" : true,
+ "BS-RC" : true, "BS-RI" : true, "BS-SA" : true, "BS-SE" : true, "BS-SO" : true,
+ "BS-SS" : true, "BS-SW" : true, "BS-WG" : true, "BT-11" : true, "BT-12" : true,
+ "BT-13" : true, "BT-14" : true, "BT-15" : true, "BT-21" : true, "BT-22" : true,
+ "BT-23" : true, "BT-24" : true, "BT-31" : true, "BT-32" : true, "BT-33" : true,
+ "BT-34" : true, "BT-41" : true, "BT-42" : true, "BT-43" : true, "BT-44" : true,
+ "BT-45" : true, "BT-GA" : true, "BT-TY" : true, "BW-CE" : true, "BW-GH" : true,
+ "BW-KG" : true, "BW-KL" : true, "BW-KW" : true, "BW-NE" : true, "BW-NW" : true,
+ "BW-SE" : true, "BW-SO" : true, "BY-BR" : true, "BY-HM" : true, "BY-HO" : true,
+ "BY-HR" : true, "BY-MA" : true, "BY-MI" : true, "BY-VI" : true, "BZ-BZ" : true,
+ "BZ-CY" : true, "BZ-CZL" : true, "BZ-OW" : true, "BZ-SC" : true, "BZ-TOL" : true,
+ "CA-AB" : true, "CA-BC" : true, "CA-MB" : true, "CA-NB" : true, "CA-NL" : true,
+ "CA-NS" : true, "CA-NT" : true, "CA-NU" : true, "CA-ON" : true, "CA-PE" : true,
+ "CA-QC" : true, "CA-SK" : true, "CA-YT" : true, "CD-BC" : true, "CD-BN" : true,
+ "CD-EQ" : true, "CD-KA" : true, "CD-KE" : true, "CD-KN" : true, "CD-KW" : true,
+ "CD-MA" : true, "CD-NK" : true, "CD-OR" : true, "CD-SK" : true, "CF-AC" : true,
+ "CF-BB" : true, "CF-BGF" : true, "CF-BK" : true, "CF-HK" : true, "CF-HM" : true,
+ "CF-HS" : true, "CF-KB" : true, "CF-KG" : true, "CF-LB" : true, "CF-MB" : true,
+ "CF-MP" : true, "CF-NM" : true, "CF-OP" : true, "CF-SE" : true, "CF-UK" : true,
+ "CF-VK" : true, "CG-11" : true, "CG-12" : true, "CG-13" : true, "CG-14" : true,
+ "CG-15" : true, "CG-2" : true, "CG-5" : true, "CG-7" : true, "CG-8" : true,
+ "CG-9" : true, "CG-BZV" : true, "CH-AG" : true, "CH-AI" : true, "CH-AR" : true,
+ "CH-BE" : true, "CH-BL" : true, "CH-BS" : true, "CH-FR" : true, "CH-GE" : true,
+ "CH-GL" : true, "CH-GR" : true, "CH-JU" : true, "CH-LU" : true, "CH-NE" : true,
+ "CH-NW" : true, "CH-OW" : true, "CH-SG" : true, "CH-SH" : true, "CH-SO" : true,
+ "CH-SZ" : true, "CH-TG" : true, "CH-TI" : true, "CH-UR" : true, "CH-VD" : true,
+ "CH-VS" : true, "CH-ZG" : true, "CH-ZH" : true, "CI-01" : true, "CI-02" : true,
+ "CI-03" : true, "CI-04" : true, "CI-05" : true, "CI-06" : true, "CI-07" : true,
+ "CI-08" : true, "CI-09" : true, "CI-10" : true, "CI-11" : true, "CI-12" : true,
+ "CI-13" : true, "CI-14" : true, "CI-15" : true, "CI-16" : true, "CI-17" : true,
+ "CI-18" : true, "CI-19" : true, "CL-AI" : true, "CL-AN" : true, "CL-AP" : true,
+ "CL-AR" : true, "CL-AT" : true, "CL-BI" : true, "CL-CO" : true, "CL-LI" : true,
+ "CL-LL" : true, "CL-LR" : true, "CL-MA" : true, "CL-ML" : true, "CL-RM" : true,
+ "CL-TA" : true, "CL-VS" : true, "CM-AD" : true, "CM-CE" : true, "CM-EN" : true,
+ "CM-ES" : true, "CM-LT" : true, "CM-NO" : true, "CM-NW" : true, "CM-OU" : true,
+ "CM-SU" : true, "CM-SW" : true, "CN-11" : true, "CN-12" : true, "CN-13" : true,
+ "CN-14" : true, "CN-15" : true, "CN-21" : true, "CN-22" : true, "CN-23" : true,
+ "CN-31" : true, "CN-32" : true, "CN-33" : true, "CN-34" : true, "CN-35" : true,
+ "CN-36" : true, "CN-37" : true, "CN-41" : true, "CN-42" : true, "CN-43" : true,
+ "CN-44" : true, "CN-45" : true, "CN-46" : true, "CN-50" : true, "CN-51" : true,
+ "CN-52" : true, "CN-53" : true, "CN-54" : true, "CN-61" : true, "CN-62" : true,
+ "CN-63" : true, "CN-64" : true, "CN-65" : true, "CN-71" : true, "CN-91" : true,
+ "CN-92" : true, "CO-AMA" : true, "CO-ANT" : true, "CO-ARA" : true, "CO-ATL" : true,
+ "CO-BOL" : true, "CO-BOY" : true, "CO-CAL" : true, "CO-CAQ" : true, "CO-CAS" : true,
+ "CO-CAU" : true, "CO-CES" : true, "CO-CHO" : true, "CO-COR" : true, "CO-CUN" : true,
+ "CO-DC" : true, "CO-GUA" : true, "CO-GUV" : true, "CO-HUI" : true, "CO-LAG" : true,
+ "CO-MAG" : true, "CO-MET" : true, "CO-NAR" : true, "CO-NSA" : true, "CO-PUT" : true,
+ "CO-QUI" : true, "CO-RIS" : true, "CO-SAN" : true, "CO-SAP" : true, "CO-SUC" : true,
+ "CO-TOL" : true, "CO-VAC" : true, "CO-VAU" : true, "CO-VID" : true, "CR-A" : true,
+ "CR-C" : true, "CR-G" : true, "CR-H" : true, "CR-L" : true, "CR-P" : true,
+ "CR-SJ" : true, "CU-01" : true, "CU-02" : true, "CU-03" : true, "CU-04" : true,
+ "CU-05" : true, "CU-06" : true, "CU-07" : true, "CU-08" : true, "CU-09" : true,
+ "CU-10" : true, "CU-11" : true, "CU-12" : true, "CU-13" : true, "CU-14" : true,
+ "CU-99" : true, "CV-B" : true, "CV-BR" : true, "CV-BV" : true, "CV-CA" : true,
+ "CV-CF" : true, "CV-CR" : true, "CV-MA" : true, "CV-MO" : true, "CV-PA" : true,
+ "CV-PN" : true, "CV-PR" : true, "CV-RB" : true, "CV-RG" : true, "CV-RS" : true,
+ "CV-S" : true, "CV-SD" : true, "CV-SF" : true, "CV-SL" : true, "CV-SM" : true,
+ "CV-SO" : true, "CV-SS" : true, "CV-SV" : true, "CV-TA" : true, "CV-TS" : true,
+ "CY-01" : true, "CY-02" : true, "CY-03" : true, "CY-04" : true, "CY-05" : true,
+ "CY-06" : true, "CZ-10" : true, "CZ-101" : true, "CZ-102" : true, "CZ-103" : true,
+ "CZ-104" : true, "CZ-105" : true, "CZ-106" : true, "CZ-107" : true, "CZ-108" : true,
+ "CZ-109" : true, "CZ-110" : true, "CZ-111" : true, "CZ-112" : true, "CZ-113" : true,
+ "CZ-114" : true, "CZ-115" : true, "CZ-116" : true, "CZ-117" : true, "CZ-118" : true,
+ "CZ-119" : true, "CZ-120" : true, "CZ-121" : true, "CZ-122" : true, "CZ-20" : true,
+ "CZ-201" : true, "CZ-202" : true, "CZ-203" : true, "CZ-204" : true, "CZ-205" : true,
+ "CZ-206" : true, "CZ-207" : true, "CZ-208" : true, "CZ-209" : true, "CZ-20A" : true,
+ "CZ-20B" : true, "CZ-20C" : true, "CZ-31" : true, "CZ-311" : true, "CZ-312" : true,
+ "CZ-313" : true, "CZ-314" : true, "CZ-315" : true, "CZ-316" : true, "CZ-317" : true,
+ "CZ-32" : true, "CZ-321" : true, "CZ-322" : true, "CZ-323" : true, "CZ-324" : true,
+ "CZ-325" : true, "CZ-326" : true, "CZ-327" : true, "CZ-41" : true, "CZ-411" : true,
+ "CZ-412" : true, "CZ-413" : true, "CZ-42" : true, "CZ-421" : true, "CZ-422" : true,
+ "CZ-423" : true, "CZ-424" : true, "CZ-425" : true, "CZ-426" : true, "CZ-427" : true,
+ "CZ-51" : true, "CZ-511" : true, "CZ-512" : true, "CZ-513" : true, "CZ-514" : true,
+ "CZ-52" : true, "CZ-521" : true, "CZ-522" : true, "CZ-523" : true, "CZ-524" : true,
+ "CZ-525" : true, "CZ-53" : true, "CZ-531" : true, "CZ-532" : true, "CZ-533" : true,
+ "CZ-534" : true, "CZ-63" : true, "CZ-631" : true, "CZ-632" : true, "CZ-633" : true,
+ "CZ-634" : true, "CZ-635" : true, "CZ-64" : true, "CZ-641" : true, "CZ-642" : true,
+ "CZ-643" : true, "CZ-644" : true, "CZ-645" : true, "CZ-646" : true, "CZ-647" : true,
+ "CZ-71" : true, "CZ-711" : true, "CZ-712" : true, "CZ-713" : true, "CZ-714" : true,
+ "CZ-715" : true, "CZ-72" : true, "CZ-721" : true, "CZ-722" : true, "CZ-723" : true,
+ "CZ-724" : true, "CZ-80" : true, "CZ-801" : true, "CZ-802" : true, "CZ-803" : true,
+ "CZ-804" : true, "CZ-805" : true, "CZ-806" : true, "DE-BB" : true, "DE-BE" : true,
+ "DE-BW" : true, "DE-BY" : true, "DE-HB" : true, "DE-HE" : true, "DE-HH" : true,
+ "DE-MV" : true, "DE-NI" : true, "DE-NW" : true, "DE-RP" : true, "DE-SH" : true,
+ "DE-SL" : true, "DE-SN" : true, "DE-ST" : true, "DE-TH" : true, "DJ-AR" : true,
+ "DJ-AS" : true, "DJ-DI" : true, "DJ-DJ" : true, "DJ-OB" : true, "DJ-TA" : true,
+ "DK-81" : true, "DK-82" : true, "DK-83" : true, "DK-84" : true, "DK-85" : true,
+ "DM-01" : true, "DM-02" : true, "DM-03" : true, "DM-04" : true, "DM-05" : true,
+ "DM-06" : true, "DM-07" : true, "DM-08" : true, "DM-09" : true, "DM-10" : true,
+ "DO-01" : true, "DO-02" : true, "DO-03" : true, "DO-04" : true, "DO-05" : true,
+ "DO-06" : true, "DO-07" : true, "DO-08" : true, "DO-09" : true, "DO-10" : true,
+ "DO-11" : true, "DO-12" : true, "DO-13" : true, "DO-14" : true, "DO-15" : true,
+ "DO-16" : true, "DO-17" : true, "DO-18" : true, "DO-19" : true, "DO-20" : true,
+ "DO-21" : true, "DO-22" : true, "DO-23" : true, "DO-24" : true, "DO-25" : true,
+ "DO-26" : true, "DO-27" : true, "DO-28" : true, "DO-29" : true, "DO-30" : true,
+ "DZ-01" : true, "DZ-02" : true, "DZ-03" : true, "DZ-04" : true, "DZ-05" : true,
+ "DZ-06" : true, "DZ-07" : true, "DZ-08" : true, "DZ-09" : true, "DZ-10" : true,
+ "DZ-11" : true, "DZ-12" : true, "DZ-13" : true, "DZ-14" : true, "DZ-15" : true,
+ "DZ-16" : true, "DZ-17" : true, "DZ-18" : true, "DZ-19" : true, "DZ-20" : true,
+ "DZ-21" : true, "DZ-22" : true, "DZ-23" : true, "DZ-24" : true, "DZ-25" : true,
+ "DZ-26" : true, "DZ-27" : true, "DZ-28" : true, "DZ-29" : true, "DZ-30" : true,
+ "DZ-31" : true, "DZ-32" : true, "DZ-33" : true, "DZ-34" : true, "DZ-35" : true,
+ "DZ-36" : true, "DZ-37" : true, "DZ-38" : true, "DZ-39" : true, "DZ-40" : true,
+ "DZ-41" : true, "DZ-42" : true, "DZ-43" : true, "DZ-44" : true, "DZ-45" : true,
+ "DZ-46" : true, "DZ-47" : true, "DZ-48" : true, "EC-A" : true, "EC-B" : true,
+ "EC-C" : true, "EC-D" : true, "EC-E" : true, "EC-F" : true, "EC-G" : true,
+ "EC-H" : true, "EC-I" : true, "EC-L" : true, "EC-M" : true, "EC-N" : true,
+ "EC-O" : true, "EC-P" : true, "EC-R" : true, "EC-S" : true, "EC-SD" : true,
+ "EC-SE" : true, "EC-T" : true, "EC-U" : true, "EC-W" : true, "EC-X" : true,
+ "EC-Y" : true, "EC-Z" : true, "EE-37" : true, "EE-39" : true, "EE-44" : true,
+ "EE-49" : true, "EE-51" : true, "EE-57" : true, "EE-59" : true, "EE-65" : true,
+ "EE-67" : true, "EE-70" : true, "EE-74" : true, "EE-78" : true, "EE-82" : true,
+ "EE-84" : true, "EE-86" : true, "EG-ALX" : true, "EG-ASN" : true, "EG-AST" : true,
+ "EG-BA" : true, "EG-BH" : true, "EG-BNS" : true, "EG-C" : true, "EG-DK" : true,
+ "EG-DT" : true, "EG-FYM" : true, "EG-GH" : true, "EG-GZ" : true, "EG-HU" : true,
+ "EG-IS" : true, "EG-JS" : true, "EG-KB" : true, "EG-KFS" : true, "EG-KN" : true,
+ "EG-MN" : true, "EG-MNF" : true, "EG-MT" : true, "EG-PTS" : true, "EG-SHG" : true,
+ "EG-SHR" : true, "EG-SIN" : true, "EG-SU" : true, "EG-SUZ" : true, "EG-WAD" : true,
+ "ER-AN" : true, "ER-DK" : true, "ER-DU" : true, "ER-GB" : true, "ER-MA" : true,
+ "ER-SK" : true, "ES-A" : true, "ES-AB" : true, "ES-AL" : true, "ES-AN" : true,
+ "ES-AR" : true, "ES-AS" : true, "ES-AV" : true, "ES-B" : true, "ES-BA" : true,
+ "ES-BI" : true, "ES-BU" : true, "ES-C" : true, "ES-CA" : true, "ES-CB" : true,
+ "ES-CC" : true, "ES-CE" : true, "ES-CL" : true, "ES-CM" : true, "ES-CN" : true,
+ "ES-CO" : true, "ES-CR" : true, "ES-CS" : true, "ES-CT" : true, "ES-CU" : true,
+ "ES-EX" : true, "ES-GA" : true, "ES-GC" : true, "ES-GI" : true, "ES-GR" : true,
+ "ES-GU" : true, "ES-H" : true, "ES-HU" : true, "ES-IB" : true, "ES-J" : true,
+ "ES-L" : true, "ES-LE" : true, "ES-LO" : true, "ES-LU" : true, "ES-M" : true,
+ "ES-MA" : true, "ES-MC" : true, "ES-MD" : true, "ES-ML" : true, "ES-MU" : true,
+ "ES-NA" : true, "ES-NC" : true, "ES-O" : true, "ES-OR" : true, "ES-P" : true,
+ "ES-PM" : true, "ES-PO" : true, "ES-PV" : true, "ES-RI" : true, "ES-S" : true,
+ "ES-SA" : true, "ES-SE" : true, "ES-SG" : true, "ES-SO" : true, "ES-SS" : true,
+ "ES-T" : true, "ES-TE" : true, "ES-TF" : true, "ES-TO" : true, "ES-V" : true,
+ "ES-VA" : true, "ES-VC" : true, "ES-VI" : true, "ES-Z" : true, "ES-ZA" : true,
+ "ET-AA" : true, "ET-AF" : true, "ET-AM" : true, "ET-BE" : true, "ET-DD" : true,
+ "ET-GA" : true, "ET-HA" : true, "ET-OR" : true, "ET-SN" : true, "ET-SO" : true,
+ "ET-TI" : true, "FI-01" : true, "FI-02" : true, "FI-03" : true, "FI-04" : true,
+ "FI-05" : true, "FI-06" : true, "FI-07" : true, "FI-08" : true, "FI-09" : true,
+ "FI-10" : true, "FI-11" : true, "FI-12" : true, "FI-13" : true, "FI-14" : true,
+ "FI-15" : true, "FI-16" : true, "FI-17" : true, "FI-18" : true, "FI-19" : true,
+ "FJ-C" : true, "FJ-E" : true, "FJ-N" : true, "FJ-R" : true, "FJ-W" : true,
+ "FM-KSA" : true, "FM-PNI" : true, "FM-TRK" : true, "FM-YAP" : true, "FR-01" : true,
+ "FR-02" : true, "FR-03" : true, "FR-04" : true, "FR-05" : true, "FR-06" : true,
+ "FR-07" : true, "FR-08" : true, "FR-09" : true, "FR-10" : true, "FR-11" : true,
+ "FR-12" : true, "FR-13" : true, "FR-14" : true, "FR-15" : true, "FR-16" : true,
+ "FR-17" : true, "FR-18" : true, "FR-19" : true, "FR-21" : true, "FR-22" : true,
+ "FR-23" : true, "FR-24" : true, "FR-25" : true, "FR-26" : true, "FR-27" : true,
+ "FR-28" : true, "FR-29" : true, "FR-2A" : true, "FR-2B" : true, "FR-30" : true,
+ "FR-31" : true, "FR-32" : true, "FR-33" : true, "FR-34" : true, "FR-35" : true,
+ "FR-36" : true, "FR-37" : true, "FR-38" : true, "FR-39" : true, "FR-40" : true,
+ "FR-41" : true, "FR-42" : true, "FR-43" : true, "FR-44" : true, "FR-45" : true,
+ "FR-46" : true, "FR-47" : true, "FR-48" : true, "FR-49" : true, "FR-50" : true,
+ "FR-51" : true, "FR-52" : true, "FR-53" : true, "FR-54" : true, "FR-55" : true,
+ "FR-56" : true, "FR-57" : true, "FR-58" : true, "FR-59" : true, "FR-60" : true,
+ "FR-61" : true, "FR-62" : true, "FR-63" : true, "FR-64" : true, "FR-65" : true,
+ "FR-66" : true, "FR-67" : true, "FR-68" : true, "FR-69" : true, "FR-70" : true,
+ "FR-71" : true, "FR-72" : true, "FR-73" : true, "FR-74" : true, "FR-75" : true,
+ "FR-76" : true, "FR-77" : true, "FR-78" : true, "FR-79" : true, "FR-80" : true,
+ "FR-81" : true, "FR-82" : true, "FR-83" : true, "FR-84" : true, "FR-85" : true,
+ "FR-86" : true, "FR-87" : true, "FR-88" : true, "FR-89" : true, "FR-90" : true,
+ "FR-91" : true, "FR-92" : true, "FR-93" : true, "FR-94" : true, "FR-95" : true,
+ "FR-ARA" : true, "FR-BFC" : true, "FR-BL" : true, "FR-BRE" : true, "FR-COR" : true,
+ "FR-CP" : true, "FR-CVL" : true, "FR-GES" : true, "FR-GF" : true, "FR-GP" : true,
+ "FR-GUA" : true, "FR-HDF" : true, "FR-IDF" : true, "FR-LRE" : true, "FR-MAY" : true,
+ "FR-MF" : true, "FR-MQ" : true, "FR-NAQ" : true, "FR-NC" : true, "FR-NOR" : true,
+ "FR-OCC" : true, "FR-PAC" : true, "FR-PDL" : true, "FR-PF" : true, "FR-PM" : true,
+ "FR-RE" : true, "FR-TF" : true, "FR-WF" : true, "FR-YT" : true, "GA-1" : true,
+ "GA-2" : true, "GA-3" : true, "GA-4" : true, "GA-5" : true, "GA-6" : true,
+ "GA-7" : true, "GA-8" : true, "GA-9" : true, "GB-ABC" : true, "GB-ABD" : true,
+ "GB-ABE" : true, "GB-AGB" : true, "GB-AGY" : true, "GB-AND" : true, "GB-ANN" : true,
+ "GB-ANS" : true, "GB-BAS" : true, "GB-BBD" : true, "GB-BDF" : true, "GB-BDG" : true,
+ "GB-BEN" : true, "GB-BEX" : true, "GB-BFS" : true, "GB-BGE" : true, "GB-BGW" : true,
+ "GB-BIR" : true, "GB-BKM" : true, "GB-BMH" : true, "GB-BNE" : true, "GB-BNH" : true,
+ "GB-BNS" : true, "GB-BOL" : true, "GB-BPL" : true, "GB-BRC" : true, "GB-BRD" : true,
+ "GB-BRY" : true, "GB-BST" : true, "GB-BUR" : true, "GB-CAM" : true, "GB-CAY" : true,
+ "GB-CBF" : true, "GB-CCG" : true, "GB-CGN" : true, "GB-CHE" : true, "GB-CHW" : true,
+ "GB-CLD" : true, "GB-CLK" : true, "GB-CMA" : true, "GB-CMD" : true, "GB-CMN" : true,
+ "GB-CON" : true, "GB-COV" : true, "GB-CRF" : true, "GB-CRY" : true, "GB-CWY" : true,
+ "GB-DAL" : true, "GB-DBY" : true, "GB-DEN" : true, "GB-DER" : true, "GB-DEV" : true,
+ "GB-DGY" : true, "GB-DNC" : true, "GB-DND" : true, "GB-DOR" : true, "GB-DRS" : true,
+ "GB-DUD" : true, "GB-DUR" : true, "GB-EAL" : true, "GB-EAW" : true, "GB-EAY" : true,
+ "GB-EDH" : true, "GB-EDU" : true, "GB-ELN" : true, "GB-ELS" : true, "GB-ENF" : true,
+ "GB-ENG" : true, "GB-ERW" : true, "GB-ERY" : true, "GB-ESS" : true, "GB-ESX" : true,
+ "GB-FAL" : true, "GB-FIF" : true, "GB-FLN" : true, "GB-FMO" : true, "GB-GAT" : true,
+ "GB-GBN" : true, "GB-GLG" : true, "GB-GLS" : true, "GB-GRE" : true, "GB-GWN" : true,
+ "GB-HAL" : true, "GB-HAM" : true, "GB-HAV" : true, "GB-HCK" : true, "GB-HEF" : true,
+ "GB-HIL" : true, "GB-HLD" : true, "GB-HMF" : true, "GB-HNS" : true, "GB-HPL" : true,
+ "GB-HRT" : true, "GB-HRW" : true, "GB-HRY" : true, "GB-IOS" : true, "GB-IOW" : true,
+ "GB-ISL" : true, "GB-IVC" : true, "GB-KEC" : true, "GB-KEN" : true, "GB-KHL" : true,
+ "GB-KIR" : true, "GB-KTT" : true, "GB-KWL" : true, "GB-LAN" : true, "GB-LBC" : true,
+ "GB-LBH" : true, "GB-LCE" : true, "GB-LDS" : true, "GB-LEC" : true, "GB-LEW" : true,
+ "GB-LIN" : true, "GB-LIV" : true, "GB-LND" : true, "GB-LUT" : true, "GB-MAN" : true,
+ "GB-MDB" : true, "GB-MDW" : true, "GB-MEA" : true, "GB-MIK" : true, "GD-01" : true,
+ "GB-MLN" : true, "GB-MON" : true, "GB-MRT" : true, "GB-MRY" : true, "GB-MTY" : true,
+ "GB-MUL" : true, "GB-NAY" : true, "GB-NBL" : true, "GB-NEL" : true, "GB-NET" : true,
+ "GB-NFK" : true, "GB-NGM" : true, "GB-NIR" : true, "GB-NLK" : true, "GB-NLN" : true,
+ "GB-NMD" : true, "GB-NSM" : true, "GB-NTH" : true, "GB-NTL" : true, "GB-NTT" : true,
+ "GB-NTY" : true, "GB-NWM" : true, "GB-NWP" : true, "GB-NYK" : true, "GB-OLD" : true,
+ "GB-ORK" : true, "GB-OXF" : true, "GB-PEM" : true, "GB-PKN" : true, "GB-PLY" : true,
+ "GB-POL" : true, "GB-POR" : true, "GB-POW" : true, "GB-PTE" : true, "GB-RCC" : true,
+ "GB-RCH" : true, "GB-RCT" : true, "GB-RDB" : true, "GB-RDG" : true, "GB-RFW" : true,
+ "GB-RIC" : true, "GB-ROT" : true, "GB-RUT" : true, "GB-SAW" : true, "GB-SAY" : true,
+ "GB-SCB" : true, "GB-SCT" : true, "GB-SFK" : true, "GB-SFT" : true, "GB-SGC" : true,
+ "GB-SHF" : true, "GB-SHN" : true, "GB-SHR" : true, "GB-SKP" : true, "GB-SLF" : true,
+ "GB-SLG" : true, "GB-SLK" : true, "GB-SND" : true, "GB-SOL" : true, "GB-SOM" : true,
+ "GB-SOS" : true, "GB-SRY" : true, "GB-STE" : true, "GB-STG" : true, "GB-STH" : true,
+ "GB-STN" : true, "GB-STS" : true, "GB-STT" : true, "GB-STY" : true, "GB-SWA" : true,
+ "GB-SWD" : true, "GB-SWK" : true, "GB-TAM" : true, "GB-TFW" : true, "GB-THR" : true,
+ "GB-TOB" : true, "GB-TOF" : true, "GB-TRF" : true, "GB-TWH" : true, "GB-UKM" : true,
+ "GB-VGL" : true, "GB-WAR" : true, "GB-WBK" : true, "GB-WDU" : true, "GB-WFT" : true,
+ "GB-WGN" : true, "GB-WIL" : true, "GB-WKF" : true, "GB-WLL" : true, "GB-WLN" : true,
+ "GB-WLS" : true, "GB-WLV" : true, "GB-WND" : true, "GB-WNM" : true, "GB-WOK" : true,
+ "GB-WOR" : true, "GB-WRL" : true, "GB-WRT" : true, "GB-WRX" : true, "GB-WSM" : true,
+ "GB-WSX" : true, "GB-YOR" : true, "GB-ZET" : true, "GD-02" : true, "GD-03" : true,
+ "GD-04" : true, "GD-05" : true, "GD-06" : true, "GD-10" : true, "GE-AB" : true,
+ "GE-AJ" : true, "GE-GU" : true, "GE-IM" : true, "GE-KA" : true, "GE-KK" : true,
+ "GE-MM" : true, "GE-RL" : true, "GE-SJ" : true, "GE-SK" : true, "GE-SZ" : true,
+ "GE-TB" : true, "GH-AA" : true, "GH-AH" : true, "GH-BA" : true, "GH-CP" : true,
+ "GH-EP" : true, "GH-NP" : true, "GH-TV" : true, "GH-UE" : true, "GH-UW" : true,
+ "GH-WP" : true, "GL-KU" : true, "GL-QA" : true, "GL-QE" : true, "GL-SM" : true,
+ "GM-B" : true, "GM-L" : true, "GM-M" : true, "GM-N" : true, "GM-U" : true,
+ "GM-W" : true, "GN-B" : true, "GN-BE" : true, "GN-BF" : true, "GN-BK" : true,
+ "GN-C" : true, "GN-CO" : true, "GN-D" : true, "GN-DB" : true, "GN-DI" : true,
+ "GN-DL" : true, "GN-DU" : true, "GN-F" : true, "GN-FA" : true, "GN-FO" : true,
+ "GN-FR" : true, "GN-GA" : true, "GN-GU" : true, "GN-K" : true, "GN-KA" : true,
+ "GN-KB" : true, "GN-KD" : true, "GN-KE" : true, "GN-KN" : true, "GN-KO" : true,
+ "GN-KS" : true, "GN-L" : true, "GN-LA" : true, "GN-LE" : true, "GN-LO" : true,
+ "GN-M" : true, "GN-MC" : true, "GN-MD" : true, "GN-ML" : true, "GN-MM" : true,
+ "GN-N" : true, "GN-NZ" : true, "GN-PI" : true, "GN-SI" : true, "GN-TE" : true,
+ "GN-TO" : true, "GN-YO" : true, "GQ-AN" : true, "GQ-BN" : true, "GQ-BS" : true,
+ "GQ-C" : true, "GQ-CS" : true, "GQ-I" : true, "GQ-KN" : true, "GQ-LI" : true,
+ "GQ-WN" : true, "GR-01" : true, "GR-03" : true, "GR-04" : true, "GR-05" : true,
+ "GR-06" : true, "GR-07" : true, "GR-11" : true, "GR-12" : true, "GR-13" : true,
+ "GR-14" : true, "GR-15" : true, "GR-16" : true, "GR-17" : true, "GR-21" : true,
+ "GR-22" : true, "GR-23" : true, "GR-24" : true, "GR-31" : true, "GR-32" : true,
+ "GR-33" : true, "GR-34" : true, "GR-41" : true, "GR-42" : true, "GR-43" : true,
+ "GR-44" : true, "GR-51" : true, "GR-52" : true, "GR-53" : true, "GR-54" : true,
+ "GR-55" : true, "GR-56" : true, "GR-57" : true, "GR-58" : true, "GR-59" : true,
+ "GR-61" : true, "GR-62" : true, "GR-63" : true, "GR-64" : true, "GR-69" : true,
+ "GR-71" : true, "GR-72" : true, "GR-73" : true, "GR-81" : true, "GR-82" : true,
+ "GR-83" : true, "GR-84" : true, "GR-85" : true, "GR-91" : true, "GR-92" : true,
+ "GR-93" : true, "GR-94" : true, "GR-A" : true, "GR-A1" : true, "GR-B" : true,
+ "GR-C" : true, "GR-D" : true, "GR-E" : true, "GR-F" : true, "GR-G" : true,
+ "GR-H" : true, "GR-I" : true, "GR-J" : true, "GR-K" : true, "GR-L" : true,
+ "GR-M" : true, "GT-AV" : true, "GT-BV" : true, "GT-CM" : true, "GT-CQ" : true,
+ "GT-ES" : true, "GT-GU" : true, "GT-HU" : true, "GT-IZ" : true, "GT-JA" : true,
+ "GT-JU" : true, "GT-PE" : true, "GT-PR" : true, "GT-QC" : true, "GT-QZ" : true,
+ "GT-RE" : true, "GT-SA" : true, "GT-SM" : true, "GT-SO" : true, "GT-SR" : true,
+ "GT-SU" : true, "GT-TO" : true, "GT-ZA" : true, "GW-BA" : true, "GW-BL" : true,
+ "GW-BM" : true, "GW-BS" : true, "GW-CA" : true, "GW-GA" : true, "GW-L" : true,
+ "GW-N" : true, "GW-OI" : true, "GW-QU" : true, "GW-S" : true, "GW-TO" : true,
+ "GY-BA" : true, "GY-CU" : true, "GY-DE" : true, "GY-EB" : true, "GY-ES" : true,
+ "GY-MA" : true, "GY-PM" : true, "GY-PT" : true, "GY-UD" : true, "GY-UT" : true,
+ "HN-AT" : true, "HN-CH" : true, "HN-CL" : true, "HN-CM" : true, "HN-CP" : true,
+ "HN-CR" : true, "HN-EP" : true, "HN-FM" : true, "HN-GD" : true, "HN-IB" : true,
+ "HN-IN" : true, "HN-LE" : true, "HN-LP" : true, "HN-OC" : true, "HN-OL" : true,
+ "HN-SB" : true, "HN-VA" : true, "HN-YO" : true, "HR-01" : true, "HR-02" : true,
+ "HR-03" : true, "HR-04" : true, "HR-05" : true, "HR-06" : true, "HR-07" : true,
+ "HR-08" : true, "HR-09" : true, "HR-10" : true, "HR-11" : true, "HR-12" : true,
+ "HR-13" : true, "HR-14" : true, "HR-15" : true, "HR-16" : true, "HR-17" : true,
+ "HR-18" : true, "HR-19" : true, "HR-20" : true, "HR-21" : true, "HT-AR" : true,
+ "HT-CE" : true, "HT-GA" : true, "HT-ND" : true, "HT-NE" : true, "HT-NO" : true,
+ "HT-OU" : true, "HT-SD" : true, "HT-SE" : true, "HU-BA" : true, "HU-BC" : true,
+ "HU-BE" : true, "HU-BK" : true, "HU-BU" : true, "HU-BZ" : true, "HU-CS" : true,
+ "HU-DE" : true, "HU-DU" : true, "HU-EG" : true, "HU-ER" : true, "HU-FE" : true,
+ "HU-GS" : true, "HU-GY" : true, "HU-HB" : true, "HU-HE" : true, "HU-HV" : true,
+ "HU-JN" : true, "HU-KE" : true, "HU-KM" : true, "HU-KV" : true, "HU-MI" : true,
+ "HU-NK" : true, "HU-NO" : true, "HU-NY" : true, "HU-PE" : true, "HU-PS" : true,
+ "HU-SD" : true, "HU-SF" : true, "HU-SH" : true, "HU-SK" : true, "HU-SN" : true,
+ "HU-SO" : true, "HU-SS" : true, "HU-ST" : true, "HU-SZ" : true, "HU-TB" : true,
+ "HU-TO" : true, "HU-VA" : true, "HU-VE" : true, "HU-VM" : true, "HU-ZA" : true,
+ "HU-ZE" : true, "ID-AC" : true, "ID-BA" : true, "ID-BB" : true, "ID-BE" : true,
+ "ID-BT" : true, "ID-GO" : true, "ID-IJ" : true, "ID-JA" : true, "ID-JB" : true,
+ "ID-JI" : true, "ID-JK" : true, "ID-JT" : true, "ID-JW" : true, "ID-KA" : true,
+ "ID-KB" : true, "ID-KI" : true, "ID-KR" : true, "ID-KS" : true, "ID-KT" : true,
+ "ID-LA" : true, "ID-MA" : true, "ID-ML" : true, "ID-MU" : true, "ID-NB" : true,
+ "ID-NT" : true, "ID-NU" : true, "ID-PA" : true, "ID-PB" : true, "ID-RI" : true,
+ "ID-SA" : true, "ID-SB" : true, "ID-SG" : true, "ID-SL" : true, "ID-SM" : true,
+ "ID-SN" : true, "ID-SR" : true, "ID-SS" : true, "ID-ST" : true, "ID-SU" : true,
+ "ID-YO" : true, "IE-C" : true, "IE-CE" : true, "IE-CN" : true, "IE-CO" : true,
+ "IE-CW" : true, "IE-D" : true, "IE-DL" : true, "IE-G" : true, "IE-KE" : true,
+ "IE-KK" : true, "IE-KY" : true, "IE-L" : true, "IE-LD" : true, "IE-LH" : true,
+ "IE-LK" : true, "IE-LM" : true, "IE-LS" : true, "IE-M" : true, "IE-MH" : true,
+ "IE-MN" : true, "IE-MO" : true, "IE-OY" : true, "IE-RN" : true, "IE-SO" : true,
+ "IE-TA" : true, "IE-U" : true, "IE-WD" : true, "IE-WH" : true, "IE-WW" : true,
+ "IE-WX" : true, "IL-D" : true, "IL-HA" : true, "IL-JM" : true, "IL-M" : true,
+ "IL-TA" : true, "IL-Z" : true, "IN-AN" : true, "IN-AP" : true, "IN-AR" : true,
+ "IN-AS" : true, "IN-BR" : true, "IN-CH" : true, "IN-CT" : true, "IN-DD" : true,
+ "IN-DL" : true, "IN-DN" : true, "IN-GA" : true, "IN-GJ" : true, "IN-HP" : true,
+ "IN-HR" : true, "IN-JH" : true, "IN-JK" : true, "IN-KA" : true, "IN-KL" : true,
+ "IN-LD" : true, "IN-MH" : true, "IN-ML" : true, "IN-MN" : true, "IN-MP" : true,
+ "IN-MZ" : true, "IN-NL" : true, "IN-OR" : true, "IN-PB" : true, "IN-PY" : true,
+ "IN-RJ" : true, "IN-SK" : true, "IN-TN" : true, "IN-TR" : true, "IN-UP" : true,
+ "IN-UT" : true, "IN-WB" : true, "IQ-AN" : true, "IQ-AR" : true, "IQ-BA" : true,
+ "IQ-BB" : true, "IQ-BG" : true, "IQ-DA" : true, "IQ-DI" : true, "IQ-DQ" : true,
+ "IQ-KA" : true, "IQ-MA" : true, "IQ-MU" : true, "IQ-NA" : true, "IQ-NI" : true,
+ "IQ-QA" : true, "IQ-SD" : true, "IQ-SW" : true, "IQ-TS" : true, "IQ-WA" : true,
+ "IR-01" : true, "IR-02" : true, "IR-03" : true, "IR-04" : true, "IR-05" : true,
+ "IR-06" : true, "IR-07" : true, "IR-08" : true, "IR-10" : true, "IR-11" : true,
+ "IR-12" : true, "IR-13" : true, "IR-14" : true, "IR-15" : true, "IR-16" : true,
+ "IR-17" : true, "IR-18" : true, "IR-19" : true, "IR-20" : true, "IR-21" : true,
+ "IR-22" : true, "IR-23" : true, "IR-24" : true, "IR-25" : true, "IR-26" : true,
+ "IR-27" : true, "IR-28" : true, "IR-29" : true, "IR-30" : true, "IR-31" : true,
+ "IS-0" : true, "IS-1" : true, "IS-2" : true, "IS-3" : true, "IS-4" : true,
+ "IS-5" : true, "IS-6" : true, "IS-7" : true, "IS-8" : true, "IT-21" : true,
+ "IT-23" : true, "IT-25" : true, "IT-32" : true, "IT-34" : true, "IT-36" : true,
+ "IT-42" : true, "IT-45" : true, "IT-52" : true, "IT-55" : true, "IT-57" : true,
+ "IT-62" : true, "IT-65" : true, "IT-67" : true, "IT-72" : true, "IT-75" : true,
+ "IT-77" : true, "IT-78" : true, "IT-82" : true, "IT-88" : true, "IT-AG" : true,
+ "IT-AL" : true, "IT-AN" : true, "IT-AO" : true, "IT-AP" : true, "IT-AQ" : true,
+ "IT-AR" : true, "IT-AT" : true, "IT-AV" : true, "IT-BA" : true, "IT-BG" : true,
+ "IT-BI" : true, "IT-BL" : true, "IT-BN" : true, "IT-BO" : true, "IT-BR" : true,
+ "IT-BS" : true, "IT-BT" : true, "IT-BZ" : true, "IT-CA" : true, "IT-CB" : true,
+ "IT-CE" : true, "IT-CH" : true, "IT-CI" : true, "IT-CL" : true, "IT-CN" : true,
+ "IT-CO" : true, "IT-CR" : true, "IT-CS" : true, "IT-CT" : true, "IT-CZ" : true,
+ "IT-EN" : true, "IT-FC" : true, "IT-FE" : true, "IT-FG" : true, "IT-FI" : true,
+ "IT-FM" : true, "IT-FR" : true, "IT-GE" : true, "IT-GO" : true, "IT-GR" : true,
+ "IT-IM" : true, "IT-IS" : true, "IT-KR" : true, "IT-LC" : true, "IT-LE" : true,
+ "IT-LI" : true, "IT-LO" : true, "IT-LT" : true, "IT-LU" : true, "IT-MB" : true,
+ "IT-MC" : true, "IT-ME" : true, "IT-MI" : true, "IT-MN" : true, "IT-MO" : true,
+ "IT-MS" : true, "IT-MT" : true, "IT-NA" : true, "IT-NO" : true, "IT-NU" : true,
+ "IT-OG" : true, "IT-OR" : true, "IT-OT" : true, "IT-PA" : true, "IT-PC" : true,
+ "IT-PD" : true, "IT-PE" : true, "IT-PG" : true, "IT-PI" : true, "IT-PN" : true,
+ "IT-PO" : true, "IT-PR" : true, "IT-PT" : true, "IT-PU" : true, "IT-PV" : true,
+ "IT-PZ" : true, "IT-RA" : true, "IT-RC" : true, "IT-RE" : true, "IT-RG" : true,
+ "IT-RI" : true, "IT-RM" : true, "IT-RN" : true, "IT-RO" : true, "IT-SA" : true,
+ "IT-SI" : true, "IT-SO" : true, "IT-SP" : true, "IT-SR" : true, "IT-SS" : true,
+ "IT-SV" : true, "IT-TA" : true, "IT-TE" : true, "IT-TN" : true, "IT-TO" : true,
+ "IT-TP" : true, "IT-TR" : true, "IT-TS" : true, "IT-TV" : true, "IT-UD" : true,
+ "IT-VA" : true, "IT-VB" : true, "IT-VC" : true, "IT-VE" : true, "IT-VI" : true,
+ "IT-VR" : true, "IT-VS" : true, "IT-VT" : true, "IT-VV" : true, "JM-01" : true,
+ "JM-02" : true, "JM-03" : true, "JM-04" : true, "JM-05" : true, "JM-06" : true,
+ "JM-07" : true, "JM-08" : true, "JM-09" : true, "JM-10" : true, "JM-11" : true,
+ "JM-12" : true, "JM-13" : true, "JM-14" : true, "JO-AJ" : true, "JO-AM" : true,
+ "JO-AQ" : true, "JO-AT" : true, "JO-AZ" : true, "JO-BA" : true, "JO-IR" : true,
+ "JO-JA" : true, "JO-KA" : true, "JO-MA" : true, "JO-MD" : true, "JO-MN" : true,
+ "JP-01" : true, "JP-02" : true, "JP-03" : true, "JP-04" : true, "JP-05" : true,
+ "JP-06" : true, "JP-07" : true, "JP-08" : true, "JP-09" : true, "JP-10" : true,
+ "JP-11" : true, "JP-12" : true, "JP-13" : true, "JP-14" : true, "JP-15" : true,
+ "JP-16" : true, "JP-17" : true, "JP-18" : true, "JP-19" : true, "JP-20" : true,
+ "JP-21" : true, "JP-22" : true, "JP-23" : true, "JP-24" : true, "JP-25" : true,
+ "JP-26" : true, "JP-27" : true, "JP-28" : true, "JP-29" : true, "JP-30" : true,
+ "JP-31" : true, "JP-32" : true, "JP-33" : true, "JP-34" : true, "JP-35" : true,
+ "JP-36" : true, "JP-37" : true, "JP-38" : true, "JP-39" : true, "JP-40" : true,
+ "JP-41" : true, "JP-42" : true, "JP-43" : true, "JP-44" : true, "JP-45" : true,
+ "JP-46" : true, "JP-47" : true, "KE-110" : true, "KE-200" : true, "KE-300" : true,
+ "KE-400" : true, "KE-500" : true, "KE-700" : true, "KE-800" : true, "KG-B" : true,
+ "KG-C" : true, "KG-GB" : true, "KG-J" : true, "KG-N" : true, "KG-O" : true,
+ "KG-T" : true, "KG-Y" : true, "KH-1" : true, "KH-10" : true, "KH-11" : true,
+ "KH-12" : true, "KH-13" : true, "KH-14" : true, "KH-15" : true, "KH-16" : true,
+ "KH-17" : true, "KH-18" : true, "KH-19" : true, "KH-2" : true, "KH-20" : true,
+ "KH-21" : true, "KH-22" : true, "KH-23" : true, "KH-24" : true, "KH-3" : true,
+ "KH-4" : true, "KH-5" : true, "KH-6" : true, "KH-7" : true, "KH-8" : true,
+ "KH-9" : true, "KI-G" : true, "KI-L" : true, "KI-P" : true, "KM-A" : true,
+ "KM-G" : true, "KM-M" : true, "KN-01" : true, "KN-02" : true, "KN-03" : true,
+ "KN-04" : true, "KN-05" : true, "KN-06" : true, "KN-07" : true, "KN-08" : true,
+ "KN-09" : true, "KN-10" : true, "KN-11" : true, "KN-12" : true, "KN-13" : true,
+ "KN-15" : true, "KN-K" : true, "KN-N" : true, "KP-01" : true, "KP-02" : true,
+ "KP-03" : true, "KP-04" : true, "KP-05" : true, "KP-06" : true, "KP-07" : true,
+ "KP-08" : true, "KP-09" : true, "KP-10" : true, "KP-13" : true, "KR-11" : true,
+ "KR-26" : true, "KR-27" : true, "KR-28" : true, "KR-29" : true, "KR-30" : true,
+ "KR-31" : true, "KR-41" : true, "KR-42" : true, "KR-43" : true, "KR-44" : true,
+ "KR-45" : true, "KR-46" : true, "KR-47" : true, "KR-48" : true, "KR-49" : true,
+ "KW-AH" : true, "KW-FA" : true, "KW-HA" : true, "KW-JA" : true, "KW-KU" : true,
+ "KW-MU" : true, "KZ-AKM" : true, "KZ-AKT" : true, "KZ-ALA" : true, "KZ-ALM" : true,
+ "KZ-AST" : true, "KZ-ATY" : true, "KZ-KAR" : true, "KZ-KUS" : true, "KZ-KZY" : true,
+ "KZ-MAN" : true, "KZ-PAV" : true, "KZ-SEV" : true, "KZ-VOS" : true, "KZ-YUZ" : true,
+ "KZ-ZAP" : true, "KZ-ZHA" : true, "LA-AT" : true, "LA-BK" : true, "LA-BL" : true,
+ "LA-CH" : true, "LA-HO" : true, "LA-KH" : true, "LA-LM" : true, "LA-LP" : true,
+ "LA-OU" : true, "LA-PH" : true, "LA-SL" : true, "LA-SV" : true, "LA-VI" : true,
+ "LA-VT" : true, "LA-XA" : true, "LA-XE" : true, "LA-XI" : true, "LA-XS" : true,
+ "LB-AK" : true, "LB-AS" : true, "LB-BA" : true, "LB-BH" : true, "LB-BI" : true,
+ "LB-JA" : true, "LB-JL" : true, "LB-NA" : true, "LI-01" : true, "LI-02" : true,
+ "LI-03" : true, "LI-04" : true, "LI-05" : true, "LI-06" : true, "LI-07" : true,
+ "LI-08" : true, "LI-09" : true, "LI-10" : true, "LI-11" : true, "LK-1" : true,
+ "LK-11" : true, "LK-12" : true, "LK-13" : true, "LK-2" : true, "LK-21" : true,
+ "LK-22" : true, "LK-23" : true, "LK-3" : true, "LK-31" : true, "LK-32" : true,
+ "LK-33" : true, "LK-4" : true, "LK-41" : true, "LK-42" : true, "LK-43" : true,
+ "LK-44" : true, "LK-45" : true, "LK-5" : true, "LK-51" : true, "LK-52" : true,
+ "LK-53" : true, "LK-6" : true, "LK-61" : true, "LK-62" : true, "LK-7" : true,
+ "LK-71" : true, "LK-72" : true, "LK-8" : true, "LK-81" : true, "LK-82" : true,
+ "LK-9" : true, "LK-91" : true, "LK-92" : true, "LR-BG" : true, "LR-BM" : true,
+ "LR-CM" : true, "LR-GB" : true, "LR-GG" : true, "LR-GK" : true, "LR-LO" : true,
+ "LR-MG" : true, "LR-MO" : true, "LR-MY" : true, "LR-NI" : true, "LR-RI" : true,
+ "LR-SI" : true, "LS-A" : true, "LS-B" : true, "LS-C" : true, "LS-D" : true,
+ "LS-E" : true, "LS-F" : true, "LS-G" : true, "LS-H" : true, "LS-J" : true,
+ "LS-K" : true, "LT-AL" : true, "LT-KL" : true, "LT-KU" : true, "LT-MR" : true,
+ "LT-PN" : true, "LT-SA" : true, "LT-TA" : true, "LT-TE" : true, "LT-UT" : true,
+ "LT-VL" : true, "LU-D" : true, "LU-G" : true, "LU-L" : true, "LV-001" : true,
+ "LV-002" : true, "LV-003" : true, "LV-004" : true, "LV-005" : true, "LV-006" : true,
+ "LV-007" : true, "LV-008" : true, "LV-009" : true, "LV-010" : true, "LV-011" : true,
+ "LV-012" : true, "LV-013" : true, "LV-014" : true, "LV-015" : true, "LV-016" : true,
+ "LV-017" : true, "LV-018" : true, "LV-019" : true, "LV-020" : true, "LV-021" : true,
+ "LV-022" : true, "LV-023" : true, "LV-024" : true, "LV-025" : true, "LV-026" : true,
+ "LV-027" : true, "LV-028" : true, "LV-029" : true, "LV-030" : true, "LV-031" : true,
+ "LV-032" : true, "LV-033" : true, "LV-034" : true, "LV-035" : true, "LV-036" : true,
+ "LV-037" : true, "LV-038" : true, "LV-039" : true, "LV-040" : true, "LV-041" : true,
+ "LV-042" : true, "LV-043" : true, "LV-044" : true, "LV-045" : true, "LV-046" : true,
+ "LV-047" : true, "LV-048" : true, "LV-049" : true, "LV-050" : true, "LV-051" : true,
+ "LV-052" : true, "LV-053" : true, "LV-054" : true, "LV-055" : true, "LV-056" : true,
+ "LV-057" : true, "LV-058" : true, "LV-059" : true, "LV-060" : true, "LV-061" : true,
+ "LV-062" : true, "LV-063" : true, "LV-064" : true, "LV-065" : true, "LV-066" : true,
+ "LV-067" : true, "LV-068" : true, "LV-069" : true, "LV-070" : true, "LV-071" : true,
+ "LV-072" : true, "LV-073" : true, "LV-074" : true, "LV-075" : true, "LV-076" : true,
+ "LV-077" : true, "LV-078" : true, "LV-079" : true, "LV-080" : true, "LV-081" : true,
+ "LV-082" : true, "LV-083" : true, "LV-084" : true, "LV-085" : true, "LV-086" : true,
+ "LV-087" : true, "LV-088" : true, "LV-089" : true, "LV-090" : true, "LV-091" : true,
+ "LV-092" : true, "LV-093" : true, "LV-094" : true, "LV-095" : true, "LV-096" : true,
+ "LV-097" : true, "LV-098" : true, "LV-099" : true, "LV-100" : true, "LV-101" : true,
+ "LV-102" : true, "LV-103" : true, "LV-104" : true, "LV-105" : true, "LV-106" : true,
+ "LV-107" : true, "LV-108" : true, "LV-109" : true, "LV-110" : true, "LV-DGV" : true,
+ "LV-JEL" : true, "LV-JKB" : true, "LV-JUR" : true, "LV-LPX" : true, "LV-REZ" : true,
+ "LV-RIX" : true, "LV-VEN" : true, "LV-VMR" : true, "LY-BA" : true, "LY-BU" : true,
+ "LY-DR" : true, "LY-GT" : true, "LY-JA" : true, "LY-JB" : true, "LY-JG" : true,
+ "LY-JI" : true, "LY-JU" : true, "LY-KF" : true, "LY-MB" : true, "LY-MI" : true,
+ "LY-MJ" : true, "LY-MQ" : true, "LY-NL" : true, "LY-NQ" : true, "LY-SB" : true,
+ "LY-SR" : true, "LY-TB" : true, "LY-WA" : true, "LY-WD" : true, "LY-WS" : true,
+ "LY-ZA" : true, "MA-01" : true, "MA-02" : true, "MA-03" : true, "MA-04" : true,
+ "MA-05" : true, "MA-06" : true, "MA-07" : true, "MA-08" : true, "MA-09" : true,
+ "MA-10" : true, "MA-11" : true, "MA-12" : true, "MA-13" : true, "MA-14" : true,
+ "MA-15" : true, "MA-16" : true, "MA-AGD" : true, "MA-AOU" : true, "MA-ASZ" : true,
+ "MA-AZI" : true, "MA-BEM" : true, "MA-BER" : true, "MA-BES" : true, "MA-BOD" : true,
+ "MA-BOM" : true, "MA-CAS" : true, "MA-CHE" : true, "MA-CHI" : true, "MA-CHT" : true,
+ "MA-ERR" : true, "MA-ESI" : true, "MA-ESM" : true, "MA-FAH" : true, "MA-FES" : true,
+ "MA-FIG" : true, "MA-GUE" : true, "MA-HAJ" : true, "MA-HAO" : true, "MA-HOC" : true,
+ "MA-IFR" : true, "MA-INE" : true, "MA-JDI" : true, "MA-JRA" : true, "MA-KEN" : true,
+ "MA-KES" : true, "MA-KHE" : true, "MA-KHN" : true, "MA-KHO" : true, "MA-LAA" : true,
+ "MA-LAR" : true, "MA-MED" : true, "MA-MEK" : true, "MA-MMD" : true, "MA-MMN" : true,
+ "MA-MOH" : true, "MA-MOU" : true, "MA-NAD" : true, "MA-NOU" : true, "MA-OUA" : true,
+ "MA-OUD" : true, "MA-OUJ" : true, "MA-RAB" : true, "MA-SAF" : true, "MA-SAL" : true,
+ "MA-SEF" : true, "MA-SET" : true, "MA-SIK" : true, "MA-SKH" : true, "MA-SYB" : true,
+ "MA-TAI" : true, "MA-TAO" : true, "MA-TAR" : true, "MA-TAT" : true, "MA-TAZ" : true,
+ "MA-TET" : true, "MA-TIZ" : true, "MA-TNG" : true, "MA-TNT" : true, "MA-ZAG" : true,
+ "MC-CL" : true, "MC-CO" : true, "MC-FO" : true, "MC-GA" : true, "MC-JE" : true,
+ "MC-LA" : true, "MC-MA" : true, "MC-MC" : true, "MC-MG" : true, "MC-MO" : true,
+ "MC-MU" : true, "MC-PH" : true, "MC-SD" : true, "MC-SO" : true, "MC-SP" : true,
+ "MC-SR" : true, "MC-VR" : true, "MD-AN" : true, "MD-BA" : true, "MD-BD" : true,
+ "MD-BR" : true, "MD-BS" : true, "MD-CA" : true, "MD-CL" : true, "MD-CM" : true,
+ "MD-CR" : true, "MD-CS" : true, "MD-CT" : true, "MD-CU" : true, "MD-DO" : true,
+ "MD-DR" : true, "MD-DU" : true, "MD-ED" : true, "MD-FA" : true, "MD-FL" : true,
+ "MD-GA" : true, "MD-GL" : true, "MD-HI" : true, "MD-IA" : true, "MD-LE" : true,
+ "MD-NI" : true, "MD-OC" : true, "MD-OR" : true, "MD-RE" : true, "MD-RI" : true,
+ "MD-SD" : true, "MD-SI" : true, "MD-SN" : true, "MD-SO" : true, "MD-ST" : true,
+ "MD-SV" : true, "MD-TA" : true, "MD-TE" : true, "MD-UN" : true, "ME-01" : true,
+ "ME-02" : true, "ME-03" : true, "ME-04" : true, "ME-05" : true, "ME-06" : true,
+ "ME-07" : true, "ME-08" : true, "ME-09" : true, "ME-10" : true, "ME-11" : true,
+ "ME-12" : true, "ME-13" : true, "ME-14" : true, "ME-15" : true, "ME-16" : true,
+ "ME-17" : true, "ME-18" : true, "ME-19" : true, "ME-20" : true, "ME-21" : true,
+ "MG-A" : true, "MG-D" : true, "MG-F" : true, "MG-M" : true, "MG-T" : true,
+ "MG-U" : true, "MH-ALK" : true, "MH-ALL" : true, "MH-ARN" : true, "MH-AUR" : true,
+ "MH-EBO" : true, "MH-ENI" : true, "MH-JAB" : true, "MH-JAL" : true, "MH-KIL" : true,
+ "MH-KWA" : true, "MH-L" : true, "MH-LAE" : true, "MH-LIB" : true, "MH-LIK" : true,
+ "MH-MAJ" : true, "MH-MAL" : true, "MH-MEJ" : true, "MH-MIL" : true, "MH-NMK" : true,
+ "MH-NMU" : true, "MH-RON" : true, "MH-T" : true, "MH-UJA" : true, "MH-UTI" : true,
+ "MH-WTJ" : true, "MH-WTN" : true, "MK-01" : true, "MK-02" : true, "MK-03" : true,
+ "MK-04" : true, "MK-05" : true, "MK-06" : true, "MK-07" : true, "MK-08" : true,
+ "MK-09" : true, "MK-10" : true, "MK-11" : true, "MK-12" : true, "MK-13" : true,
+ "MK-14" : true, "MK-15" : true, "MK-16" : true, "MK-17" : true, "MK-18" : true,
+ "MK-19" : true, "MK-20" : true, "MK-21" : true, "MK-22" : true, "MK-23" : true,
+ "MK-24" : true, "MK-25" : true, "MK-26" : true, "MK-27" : true, "MK-28" : true,
+ "MK-29" : true, "MK-30" : true, "MK-31" : true, "MK-32" : true, "MK-33" : true,
+ "MK-34" : true, "MK-35" : true, "MK-36" : true, "MK-37" : true, "MK-38" : true,
+ "MK-39" : true, "MK-40" : true, "MK-41" : true, "MK-42" : true, "MK-43" : true,
+ "MK-44" : true, "MK-45" : true, "MK-46" : true, "MK-47" : true, "MK-48" : true,
+ "MK-49" : true, "MK-50" : true, "MK-51" : true, "MK-52" : true, "MK-53" : true,
+ "MK-54" : true, "MK-55" : true, "MK-56" : true, "MK-57" : true, "MK-58" : true,
+ "MK-59" : true, "MK-60" : true, "MK-61" : true, "MK-62" : true, "MK-63" : true,
+ "MK-64" : true, "MK-65" : true, "MK-66" : true, "MK-67" : true, "MK-68" : true,
+ "MK-69" : true, "MK-70" : true, "MK-71" : true, "MK-72" : true, "MK-73" : true,
+ "MK-74" : true, "MK-75" : true, "MK-76" : true, "MK-77" : true, "MK-78" : true,
+ "MK-79" : true, "MK-80" : true, "MK-81" : true, "MK-82" : true, "MK-83" : true,
+ "MK-84" : true, "ML-1" : true, "ML-2" : true, "ML-3" : true, "ML-4" : true,
+ "ML-5" : true, "ML-6" : true, "ML-7" : true, "ML-8" : true, "ML-BK0" : true,
+ "MM-01" : true, "MM-02" : true, "MM-03" : true, "MM-04" : true, "MM-05" : true,
+ "MM-06" : true, "MM-07" : true, "MM-11" : true, "MM-12" : true, "MM-13" : true,
+ "MM-14" : true, "MM-15" : true, "MM-16" : true, "MM-17" : true, "MN-035" : true,
+ "MN-037" : true, "MN-039" : true, "MN-041" : true, "MN-043" : true, "MN-046" : true,
+ "MN-047" : true, "MN-049" : true, "MN-051" : true, "MN-053" : true, "MN-055" : true,
+ "MN-057" : true, "MN-059" : true, "MN-061" : true, "MN-063" : true, "MN-064" : true,
+ "MN-065" : true, "MN-067" : true, "MN-069" : true, "MN-071" : true, "MN-073" : true,
+ "MN-1" : true, "MR-01" : true, "MR-02" : true, "MR-03" : true, "MR-04" : true,
+ "MR-05" : true, "MR-06" : true, "MR-07" : true, "MR-08" : true, "MR-09" : true,
+ "MR-10" : true, "MR-11" : true, "MR-12" : true, "MR-NKC" : true, "MT-01" : true,
+ "MT-02" : true, "MT-03" : true, "MT-04" : true, "MT-05" : true, "MT-06" : true,
+ "MT-07" : true, "MT-08" : true, "MT-09" : true, "MT-10" : true, "MT-11" : true,
+ "MT-12" : true, "MT-13" : true, "MT-14" : true, "MT-15" : true, "MT-16" : true,
+ "MT-17" : true, "MT-18" : true, "MT-19" : true, "MT-20" : true, "MT-21" : true,
+ "MT-22" : true, "MT-23" : true, "MT-24" : true, "MT-25" : true, "MT-26" : true,
+ "MT-27" : true, "MT-28" : true, "MT-29" : true, "MT-30" : true, "MT-31" : true,
+ "MT-32" : true, "MT-33" : true, "MT-34" : true, "MT-35" : true, "MT-36" : true,
+ "MT-37" : true, "MT-38" : true, "MT-39" : true, "MT-40" : true, "MT-41" : true,
+ "MT-42" : true, "MT-43" : true, "MT-44" : true, "MT-45" : true, "MT-46" : true,
+ "MT-47" : true, "MT-48" : true, "MT-49" : true, "MT-50" : true, "MT-51" : true,
+ "MT-52" : true, "MT-53" : true, "MT-54" : true, "MT-55" : true, "MT-56" : true,
+ "MT-57" : true, "MT-58" : true, "MT-59" : true, "MT-60" : true, "MT-61" : true,
+ "MT-62" : true, "MT-63" : true, "MT-64" : true, "MT-65" : true, "MT-66" : true,
+ "MT-67" : true, "MT-68" : true, "MU-AG" : true, "MU-BL" : true, "MU-BR" : true,
+ "MU-CC" : true, "MU-CU" : true, "MU-FL" : true, "MU-GP" : true, "MU-MO" : true,
+ "MU-PA" : true, "MU-PL" : true, "MU-PU" : true, "MU-PW" : true, "MU-QB" : true,
+ "MU-RO" : true, "MU-RP" : true, "MU-SA" : true, "MU-VP" : true, "MV-00" : true,
+ "MV-01" : true, "MV-02" : true, "MV-03" : true, "MV-04" : true, "MV-05" : true,
+ "MV-07" : true, "MV-08" : true, "MV-12" : true, "MV-13" : true, "MV-14" : true,
+ "MV-17" : true, "MV-20" : true, "MV-23" : true, "MV-24" : true, "MV-25" : true,
+ "MV-26" : true, "MV-27" : true, "MV-28" : true, "MV-29" : true, "MV-CE" : true,
+ "MV-MLE" : true, "MV-NC" : true, "MV-NO" : true, "MV-SC" : true, "MV-SU" : true,
+ "MV-UN" : true, "MV-US" : true, "MW-BA" : true, "MW-BL" : true, "MW-C" : true,
+ "MW-CK" : true, "MW-CR" : true, "MW-CT" : true, "MW-DE" : true, "MW-DO" : true,
+ "MW-KR" : true, "MW-KS" : true, "MW-LI" : true, "MW-LK" : true, "MW-MC" : true,
+ "MW-MG" : true, "MW-MH" : true, "MW-MU" : true, "MW-MW" : true, "MW-MZ" : true,
+ "MW-N" : true, "MW-NB" : true, "MW-NE" : true, "MW-NI" : true, "MW-NK" : true,
+ "MW-NS" : true, "MW-NU" : true, "MW-PH" : true, "MW-RU" : true, "MW-S" : true,
+ "MW-SA" : true, "MW-TH" : true, "MW-ZO" : true, "MX-AGU" : true, "MX-BCN" : true,
+ "MX-BCS" : true, "MX-CAM" : true, "MX-CHH" : true, "MX-CHP" : true, "MX-COA" : true,
+ "MX-COL" : true, "MX-DIF" : true, "MX-DUR" : true, "MX-GRO" : true, "MX-GUA" : true,
+ "MX-HID" : true, "MX-JAL" : true, "MX-MEX" : true, "MX-MIC" : true, "MX-MOR" : true,
+ "MX-NAY" : true, "MX-NLE" : true, "MX-OAX" : true, "MX-PUE" : true, "MX-QUE" : true,
+ "MX-ROO" : true, "MX-SIN" : true, "MX-SLP" : true, "MX-SON" : true, "MX-TAB" : true,
+ "MX-TAM" : true, "MX-TLA" : true, "MX-VER" : true, "MX-YUC" : true, "MX-ZAC" : true,
+ "MY-01" : true, "MY-02" : true, "MY-03" : true, "MY-04" : true, "MY-05" : true,
+ "MY-06" : true, "MY-07" : true, "MY-08" : true, "MY-09" : true, "MY-10" : true,
+ "MY-11" : true, "MY-12" : true, "MY-13" : true, "MY-14" : true, "MY-15" : true,
+ "MY-16" : true, "MZ-A" : true, "MZ-B" : true, "MZ-G" : true, "MZ-I" : true,
+ "MZ-L" : true, "MZ-MPM" : true, "MZ-N" : true, "MZ-P" : true, "MZ-Q" : true,
+ "MZ-S" : true, "MZ-T" : true, "NA-CA" : true, "NA-ER" : true, "NA-HA" : true,
+ "NA-KA" : true, "NA-KH" : true, "NA-KU" : true, "NA-OD" : true, "NA-OH" : true,
+ "NA-OK" : true, "NA-ON" : true, "NA-OS" : true, "NA-OT" : true, "NA-OW" : true,
+ "NE-1" : true, "NE-2" : true, "NE-3" : true, "NE-4" : true, "NE-5" : true,
+ "NE-6" : true, "NE-7" : true, "NE-8" : true, "NG-AB" : true, "NG-AD" : true,
+ "NG-AK" : true, "NG-AN" : true, "NG-BA" : true, "NG-BE" : true, "NG-BO" : true,
+ "NG-BY" : true, "NG-CR" : true, "NG-DE" : true, "NG-EB" : true, "NG-ED" : true,
+ "NG-EK" : true, "NG-EN" : true, "NG-FC" : true, "NG-GO" : true, "NG-IM" : true,
+ "NG-JI" : true, "NG-KD" : true, "NG-KE" : true, "NG-KN" : true, "NG-KO" : true,
+ "NG-KT" : true, "NG-KW" : true, "NG-LA" : true, "NG-NA" : true, "NG-NI" : true,
+ "NG-OG" : true, "NG-ON" : true, "NG-OS" : true, "NG-OY" : true, "NG-PL" : true,
+ "NG-RI" : true, "NG-SO" : true, "NG-TA" : true, "NG-YO" : true, "NG-ZA" : true,
+ "NI-AN" : true, "NI-AS" : true, "NI-BO" : true, "NI-CA" : true, "NI-CI" : true,
+ "NI-CO" : true, "NI-ES" : true, "NI-GR" : true, "NI-JI" : true, "NI-LE" : true,
+ "NI-MD" : true, "NI-MN" : true, "NI-MS" : true, "NI-MT" : true, "NI-NS" : true,
+ "NI-RI" : true, "NI-SJ" : true, "NL-AW" : true, "NL-BQ1" : true, "NL-BQ2" : true,
+ "NL-BQ3" : true, "NL-CW" : true, "NL-DR" : true, "NL-FL" : true, "NL-FR" : true,
+ "NL-GE" : true, "NL-GR" : true, "NL-LI" : true, "NL-NB" : true, "NL-NH" : true,
+ "NL-OV" : true, "NL-SX" : true, "NL-UT" : true, "NL-ZE" : true, "NL-ZH" : true,
+ "NO-01" : true, "NO-02" : true, "NO-03" : true, "NO-04" : true, "NO-05" : true,
+ "NO-06" : true, "NO-07" : true, "NO-08" : true, "NO-09" : true, "NO-10" : true,
+ "NO-11" : true, "NO-12" : true, "NO-14" : true, "NO-15" : true, "NO-16" : true,
+ "NO-17" : true, "NO-18" : true, "NO-19" : true, "NO-20" : true, "NO-21" : true,
+ "NO-22" : true, "NP-1" : true, "NP-2" : true, "NP-3" : true, "NP-4" : true,
+ "NP-5" : true, "NP-BA" : true, "NP-BH" : true, "NP-DH" : true, "NP-GA" : true,
+ "NP-JA" : true, "NP-KA" : true, "NP-KO" : true, "NP-LU" : true, "NP-MA" : true,
+ "NP-ME" : true, "NP-NA" : true, "NP-RA" : true, "NP-SA" : true, "NP-SE" : true,
+ "NR-01" : true, "NR-02" : true, "NR-03" : true, "NR-04" : true, "NR-05" : true,
+ "NR-06" : true, "NR-07" : true, "NR-08" : true, "NR-09" : true, "NR-10" : true,
+ "NR-11" : true, "NR-12" : true, "NR-13" : true, "NR-14" : true, "NZ-AUK" : true,
+ "NZ-BOP" : true, "NZ-CAN" : true, "NZ-CIT" : true, "NZ-GIS" : true, "NZ-HKB" : true,
+ "NZ-MBH" : true, "NZ-MWT" : true, "NZ-N" : true, "NZ-NSN" : true, "NZ-NTL" : true,
+ "NZ-OTA" : true, "NZ-S" : true, "NZ-STL" : true, "NZ-TAS" : true, "NZ-TKI" : true,
+ "NZ-WGN" : true, "NZ-WKO" : true, "NZ-WTC" : true, "OM-BA" : true, "OM-BU" : true,
+ "OM-DA" : true, "OM-MA" : true, "OM-MU" : true, "OM-SH" : true, "OM-WU" : true,
+ "OM-ZA" : true, "OM-ZU" : true, "PA-1" : true, "PA-2" : true, "PA-3" : true,
+ "PA-4" : true, "PA-5" : true, "PA-6" : true, "PA-7" : true, "PA-8" : true,
+ "PA-9" : true, "PA-EM" : true, "PA-KY" : true, "PA-NB" : true, "PE-AMA" : true,
+ "PE-ANC" : true, "PE-APU" : true, "PE-ARE" : true, "PE-AYA" : true, "PE-CAJ" : true,
+ "PE-CAL" : true, "PE-CUS" : true, "PE-HUC" : true, "PE-HUV" : true, "PE-ICA" : true,
+ "PE-JUN" : true, "PE-LAL" : true, "PE-LAM" : true, "PE-LIM" : true, "PE-LMA" : true,
+ "PE-LOR" : true, "PE-MDD" : true, "PE-MOQ" : true, "PE-PAS" : true, "PE-PIU" : true,
+ "PE-PUN" : true, "PE-SAM" : true, "PE-TAC" : true, "PE-TUM" : true, "PE-UCA" : true,
+ "PG-CPK" : true, "PG-CPM" : true, "PG-EBR" : true, "PG-EHG" : true, "PG-EPW" : true,
+ "PG-ESW" : true, "PG-GPK" : true, "PG-MBA" : true, "PG-MPL" : true, "PG-MPM" : true,
+ "PG-MRL" : true, "PG-NCD" : true, "PG-NIK" : true, "PG-NPP" : true, "PG-NSB" : true,
+ "PG-SAN" : true, "PG-SHM" : true, "PG-WBK" : true, "PG-WHM" : true, "PG-WPD" : true,
+ "PH-00" : true, "PH-01" : true, "PH-02" : true, "PH-03" : true, "PH-05" : true,
+ "PH-06" : true, "PH-07" : true, "PH-08" : true, "PH-09" : true, "PH-10" : true,
+ "PH-11" : true, "PH-12" : true, "PH-13" : true, "PH-14" : true, "PH-15" : true,
+ "PH-40" : true, "PH-41" : true, "PH-ABR" : true, "PH-AGN" : true, "PH-AGS" : true,
+ "PH-AKL" : true, "PH-ALB" : true, "PH-ANT" : true, "PH-APA" : true, "PH-AUR" : true,
+ "PH-BAN" : true, "PH-BAS" : true, "PH-BEN" : true, "PH-BIL" : true, "PH-BOH" : true,
+ "PH-BTG" : true, "PH-BTN" : true, "PH-BUK" : true, "PH-BUL" : true, "PH-CAG" : true,
+ "PH-CAM" : true, "PH-CAN" : true, "PH-CAP" : true, "PH-CAS" : true, "PH-CAT" : true,
+ "PH-CAV" : true, "PH-CEB" : true, "PH-COM" : true, "PH-DAO" : true, "PH-DAS" : true,
+ "PH-DAV" : true, "PH-DIN" : true, "PH-EAS" : true, "PH-GUI" : true, "PH-IFU" : true,
+ "PH-ILI" : true, "PH-ILN" : true, "PH-ILS" : true, "PH-ISA" : true, "PH-KAL" : true,
+ "PH-LAG" : true, "PH-LAN" : true, "PH-LAS" : true, "PH-LEY" : true, "PH-LUN" : true,
+ "PH-MAD" : true, "PH-MAG" : true, "PH-MAS" : true, "PH-MDC" : true, "PH-MDR" : true,
+ "PH-MOU" : true, "PH-MSC" : true, "PH-MSR" : true, "PH-NCO" : true, "PH-NEC" : true,
+ "PH-NER" : true, "PH-NSA" : true, "PH-NUE" : true, "PH-NUV" : true, "PH-PAM" : true,
+ "PH-PAN" : true, "PH-PLW" : true, "PH-QUE" : true, "PH-QUI" : true, "PH-RIZ" : true,
+ "PH-ROM" : true, "PH-SAR" : true, "PH-SCO" : true, "PH-SIG" : true, "PH-SLE" : true,
+ "PH-SLU" : true, "PH-SOR" : true, "PH-SUK" : true, "PH-SUN" : true, "PH-SUR" : true,
+ "PH-TAR" : true, "PH-TAW" : true, "PH-WSA" : true, "PH-ZAN" : true, "PH-ZAS" : true,
+ "PH-ZMB" : true, "PH-ZSI" : true, "PK-BA" : true, "PK-GB" : true, "PK-IS" : true,
+ "PK-JK" : true, "PK-KP" : true, "PK-PB" : true, "PK-SD" : true, "PK-TA" : true,
+ "PL-DS" : true, "PL-KP" : true, "PL-LB" : true, "PL-LD" : true, "PL-LU" : true,
+ "PL-MA" : true, "PL-MZ" : true, "PL-OP" : true, "PL-PD" : true, "PL-PK" : true,
+ "PL-PM" : true, "PL-SK" : true, "PL-SL" : true, "PL-WN" : true, "PL-WP" : true,
+ "PL-ZP" : true, "PS-BTH" : true, "PS-DEB" : true, "PS-GZA" : true, "PS-HBN" : true,
+ "PS-JEM" : true, "PS-JEN" : true, "PS-JRH" : true, "PS-KYS" : true, "PS-NBS" : true,
+ "PS-NGZ" : true, "PS-QQA" : true, "PS-RBH" : true, "PS-RFH" : true, "PS-SLT" : true,
+ "PS-TBS" : true, "PS-TKM" : true, "PT-01" : true, "PT-02" : true, "PT-03" : true,
+ "PT-04" : true, "PT-05" : true, "PT-06" : true, "PT-07" : true, "PT-08" : true,
+ "PT-09" : true, "PT-10" : true, "PT-11" : true, "PT-12" : true, "PT-13" : true,
+ "PT-14" : true, "PT-15" : true, "PT-16" : true, "PT-17" : true, "PT-18" : true,
+ "PT-20" : true, "PT-30" : true, "PW-002" : true, "PW-004" : true, "PW-010" : true,
+ "PW-050" : true, "PW-100" : true, "PW-150" : true, "PW-212" : true, "PW-214" : true,
+ "PW-218" : true, "PW-222" : true, "PW-224" : true, "PW-226" : true, "PW-227" : true,
+ "PW-228" : true, "PW-350" : true, "PW-370" : true, "PY-1" : true, "PY-10" : true,
+ "PY-11" : true, "PY-12" : true, "PY-13" : true, "PY-14" : true, "PY-15" : true,
+ "PY-16" : true, "PY-19" : true, "PY-2" : true, "PY-3" : true, "PY-4" : true,
+ "PY-5" : true, "PY-6" : true, "PY-7" : true, "PY-8" : true, "PY-9" : true,
+ "PY-ASU" : true, "QA-DA" : true, "QA-KH" : true, "QA-MS" : true, "QA-RA" : true,
+ "QA-US" : true, "QA-WA" : true, "QA-ZA" : true, "RO-AB" : true, "RO-AG" : true,
+ "RO-AR" : true, "RO-B" : true, "RO-BC" : true, "RO-BH" : true, "RO-BN" : true,
+ "RO-BR" : true, "RO-BT" : true, "RO-BV" : true, "RO-BZ" : true, "RO-CJ" : true,
+ "RO-CL" : true, "RO-CS" : true, "RO-CT" : true, "RO-CV" : true, "RO-DB" : true,
+ "RO-DJ" : true, "RO-GJ" : true, "RO-GL" : true, "RO-GR" : true, "RO-HD" : true,
+ "RO-HR" : true, "RO-IF" : true, "RO-IL" : true, "RO-IS" : true, "RO-MH" : true,
+ "RO-MM" : true, "RO-MS" : true, "RO-NT" : true, "RO-OT" : true, "RO-PH" : true,
+ "RO-SB" : true, "RO-SJ" : true, "RO-SM" : true, "RO-SV" : true, "RO-TL" : true,
+ "RO-TM" : true, "RO-TR" : true, "RO-VL" : true, "RO-VN" : true, "RO-VS" : true,
+ "RS-00" : true, "RS-01" : true, "RS-02" : true, "RS-03" : true, "RS-04" : true,
+ "RS-05" : true, "RS-06" : true, "RS-07" : true, "RS-08" : true, "RS-09" : true,
+ "RS-10" : true, "RS-11" : true, "RS-12" : true, "RS-13" : true, "RS-14" : true,
+ "RS-15" : true, "RS-16" : true, "RS-17" : true, "RS-18" : true, "RS-19" : true,
+ "RS-20" : true, "RS-21" : true, "RS-22" : true, "RS-23" : true, "RS-24" : true,
+ "RS-25" : true, "RS-26" : true, "RS-27" : true, "RS-28" : true, "RS-29" : true,
+ "RS-KM" : true, "RS-VO" : true, "RU-AD" : true, "RU-AL" : true, "RU-ALT" : true,
+ "RU-AMU" : true, "RU-ARK" : true, "RU-AST" : true, "RU-BA" : true, "RU-BEL" : true,
+ "RU-BRY" : true, "RU-BU" : true, "RU-CE" : true, "RU-CHE" : true, "RU-CHU" : true,
+ "RU-CU" : true, "RU-DA" : true, "RU-IN" : true, "RU-IRK" : true, "RU-IVA" : true,
+ "RU-KAM" : true, "RU-KB" : true, "RU-KC" : true, "RU-KDA" : true, "RU-KEM" : true,
+ "RU-KGD" : true, "RU-KGN" : true, "RU-KHA" : true, "RU-KHM" : true, "RU-KIR" : true,
+ "RU-KK" : true, "RU-KL" : true, "RU-KLU" : true, "RU-KO" : true, "RU-KOS" : true,
+ "RU-KR" : true, "RU-KRS" : true, "RU-KYA" : true, "RU-LEN" : true, "RU-LIP" : true,
+ "RU-MAG" : true, "RU-ME" : true, "RU-MO" : true, "RU-MOS" : true, "RU-MOW" : true,
+ "RU-MUR" : true, "RU-NEN" : true, "RU-NGR" : true, "RU-NIZ" : true, "RU-NVS" : true,
+ "RU-OMS" : true, "RU-ORE" : true, "RU-ORL" : true, "RU-PER" : true, "RU-PNZ" : true,
+ "RU-PRI" : true, "RU-PSK" : true, "RU-ROS" : true, "RU-RYA" : true, "RU-SA" : true,
+ "RU-SAK" : true, "RU-SAM" : true, "RU-SAR" : true, "RU-SE" : true, "RU-SMO" : true,
+ "RU-SPE" : true, "RU-STA" : true, "RU-SVE" : true, "RU-TA" : true, "RU-TAM" : true,
+ "RU-TOM" : true, "RU-TUL" : true, "RU-TVE" : true, "RU-TY" : true, "RU-TYU" : true,
+ "RU-UD" : true, "RU-ULY" : true, "RU-VGG" : true, "RU-VLA" : true, "RU-VLG" : true,
+ "RU-VOR" : true, "RU-YAN" : true, "RU-YAR" : true, "RU-YEV" : true, "RU-ZAB" : true,
+ "RW-01" : true, "RW-02" : true, "RW-03" : true, "RW-04" : true, "RW-05" : true,
+ "SA-01" : true, "SA-02" : true, "SA-03" : true, "SA-04" : true, "SA-05" : true,
+ "SA-06" : true, "SA-07" : true, "SA-08" : true, "SA-09" : true, "SA-10" : true,
+ "SA-11" : true, "SA-12" : true, "SA-14" : true, "SB-CE" : true, "SB-CH" : true,
+ "SB-CT" : true, "SB-GU" : true, "SB-IS" : true, "SB-MK" : true, "SB-ML" : true,
+ "SB-RB" : true, "SB-TE" : true, "SB-WE" : true, "SC-01" : true, "SC-02" : true,
+ "SC-03" : true, "SC-04" : true, "SC-05" : true, "SC-06" : true, "SC-07" : true,
+ "SC-08" : true, "SC-09" : true, "SC-10" : true, "SC-11" : true, "SC-12" : true,
+ "SC-13" : true, "SC-14" : true, "SC-15" : true, "SC-16" : true, "SC-17" : true,
+ "SC-18" : true, "SC-19" : true, "SC-20" : true, "SC-21" : true, "SC-22" : true,
+ "SC-23" : true, "SC-24" : true, "SC-25" : true, "SD-DC" : true, "SD-DE" : true,
+ "SD-DN" : true, "SD-DS" : true, "SD-DW" : true, "SD-GD" : true, "SD-GZ" : true,
+ "SD-KA" : true, "SD-KH" : true, "SD-KN" : true, "SD-KS" : true, "SD-NB" : true,
+ "SD-NO" : true, "SD-NR" : true, "SD-NW" : true, "SD-RS" : true, "SD-SI" : true,
+ "SE-AB" : true, "SE-AC" : true, "SE-BD" : true, "SE-C" : true, "SE-D" : true,
+ "SE-E" : true, "SE-F" : true, "SE-G" : true, "SE-H" : true, "SE-I" : true,
+ "SE-K" : true, "SE-M" : true, "SE-N" : true, "SE-O" : true, "SE-S" : true,
+ "SE-T" : true, "SE-U" : true, "SE-W" : true, "SE-X" : true, "SE-Y" : true,
+ "SE-Z" : true, "SG-01" : true, "SG-02" : true, "SG-03" : true, "SG-04" : true,
+ "SG-05" : true, "SH-AC" : true, "SH-HL" : true, "SH-TA" : true, "SI-001" : true,
+ "SI-002" : true, "SI-003" : true, "SI-004" : true, "SI-005" : true, "SI-006" : true,
+ "SI-007" : true, "SI-008" : true, "SI-009" : true, "SI-010" : true, "SI-011" : true,
+ "SI-012" : true, "SI-013" : true, "SI-014" : true, "SI-015" : true, "SI-016" : true,
+ "SI-017" : true, "SI-018" : true, "SI-019" : true, "SI-020" : true, "SI-021" : true,
+ "SI-022" : true, "SI-023" : true, "SI-024" : true, "SI-025" : true, "SI-026" : true,
+ "SI-027" : true, "SI-028" : true, "SI-029" : true, "SI-030" : true, "SI-031" : true,
+ "SI-032" : true, "SI-033" : true, "SI-034" : true, "SI-035" : true, "SI-036" : true,
+ "SI-037" : true, "SI-038" : true, "SI-039" : true, "SI-040" : true, "SI-041" : true,
+ "SI-042" : true, "SI-043" : true, "SI-044" : true, "SI-045" : true, "SI-046" : true,
+ "SI-047" : true, "SI-048" : true, "SI-049" : true, "SI-050" : true, "SI-051" : true,
+ "SI-052" : true, "SI-053" : true, "SI-054" : true, "SI-055" : true, "SI-056" : true,
+ "SI-057" : true, "SI-058" : true, "SI-059" : true, "SI-060" : true, "SI-061" : true,
+ "SI-062" : true, "SI-063" : true, "SI-064" : true, "SI-065" : true, "SI-066" : true,
+ "SI-067" : true, "SI-068" : true, "SI-069" : true, "SI-070" : true, "SI-071" : true,
+ "SI-072" : true, "SI-073" : true, "SI-074" : true, "SI-075" : true, "SI-076" : true,
+ "SI-077" : true, "SI-078" : true, "SI-079" : true, "SI-080" : true, "SI-081" : true,
+ "SI-082" : true, "SI-083" : true, "SI-084" : true, "SI-085" : true, "SI-086" : true,
+ "SI-087" : true, "SI-088" : true, "SI-089" : true, "SI-090" : true, "SI-091" : true,
+ "SI-092" : true, "SI-093" : true, "SI-094" : true, "SI-095" : true, "SI-096" : true,
+ "SI-097" : true, "SI-098" : true, "SI-099" : true, "SI-100" : true, "SI-101" : true,
+ "SI-102" : true, "SI-103" : true, "SI-104" : true, "SI-105" : true, "SI-106" : true,
+ "SI-107" : true, "SI-108" : true, "SI-109" : true, "SI-110" : true, "SI-111" : true,
+ "SI-112" : true, "SI-113" : true, "SI-114" : true, "SI-115" : true, "SI-116" : true,
+ "SI-117" : true, "SI-118" : true, "SI-119" : true, "SI-120" : true, "SI-121" : true,
+ "SI-122" : true, "SI-123" : true, "SI-124" : true, "SI-125" : true, "SI-126" : true,
+ "SI-127" : true, "SI-128" : true, "SI-129" : true, "SI-130" : true, "SI-131" : true,
+ "SI-132" : true, "SI-133" : true, "SI-134" : true, "SI-135" : true, "SI-136" : true,
+ "SI-137" : true, "SI-138" : true, "SI-139" : true, "SI-140" : true, "SI-141" : true,
+ "SI-142" : true, "SI-143" : true, "SI-144" : true, "SI-146" : true, "SI-147" : true,
+ "SI-148" : true, "SI-149" : true, "SI-150" : true, "SI-151" : true, "SI-152" : true,
+ "SI-153" : true, "SI-154" : true, "SI-155" : true, "SI-156" : true, "SI-157" : true,
+ "SI-158" : true, "SI-159" : true, "SI-160" : true, "SI-161" : true, "SI-162" : true,
+ "SI-163" : true, "SI-164" : true, "SI-165" : true, "SI-166" : true, "SI-167" : true,
+ "SI-168" : true, "SI-169" : true, "SI-170" : true, "SI-171" : true, "SI-172" : true,
+ "SI-173" : true, "SI-174" : true, "SI-175" : true, "SI-176" : true, "SI-177" : true,
+ "SI-178" : true, "SI-179" : true, "SI-180" : true, "SI-181" : true, "SI-182" : true,
+ "SI-183" : true, "SI-184" : true, "SI-185" : true, "SI-186" : true, "SI-187" : true,
+ "SI-188" : true, "SI-189" : true, "SI-190" : true, "SI-191" : true, "SI-192" : true,
+ "SI-193" : true, "SI-194" : true, "SI-195" : true, "SI-196" : true, "SI-197" : true,
+ "SI-198" : true, "SI-199" : true, "SI-200" : true, "SI-201" : true, "SI-202" : true,
+ "SI-203" : true, "SI-204" : true, "SI-205" : true, "SI-206" : true, "SI-207" : true,
+ "SI-208" : true, "SI-209" : true, "SI-210" : true, "SI-211" : true, "SK-BC" : true,
+ "SK-BL" : true, "SK-KI" : true, "SK-NI" : true, "SK-PV" : true, "SK-TA" : true,
+ "SK-TC" : true, "SK-ZI" : true, "SL-E" : true, "SL-N" : true, "SL-S" : true,
+ "SL-W" : true, "SM-01" : true, "SM-02" : true, "SM-03" : true, "SM-04" : true,
+ "SM-05" : true, "SM-06" : true, "SM-07" : true, "SM-08" : true, "SM-09" : true,
+ "SN-DB" : true, "SN-DK" : true, "SN-FK" : true, "SN-KA" : true, "SN-KD" : true,
+ "SN-KE" : true, "SN-KL" : true, "SN-LG" : true, "SN-MT" : true, "SN-SE" : true,
+ "SN-SL" : true, "SN-TC" : true, "SN-TH" : true, "SN-ZG" : true, "SO-AW" : true,
+ "SO-BK" : true, "SO-BN" : true, "SO-BR" : true, "SO-BY" : true, "SO-GA" : true,
+ "SO-GE" : true, "SO-HI" : true, "SO-JD" : true, "SO-JH" : true, "SO-MU" : true,
+ "SO-NU" : true, "SO-SA" : true, "SO-SD" : true, "SO-SH" : true, "SO-SO" : true,
+ "SO-TO" : true, "SO-WO" : true, "SR-BR" : true, "SR-CM" : true, "SR-CR" : true,
+ "SR-MA" : true, "SR-NI" : true, "SR-PM" : true, "SR-PR" : true, "SR-SA" : true,
+ "SR-SI" : true, "SR-WA" : true, "SS-BN" : true, "SS-BW" : true, "SS-EC" : true,
+ "SS-EE8" : true, "SS-EW" : true, "SS-JG" : true, "SS-LK" : true, "SS-NU" : true,
+ "SS-UY" : true, "SS-WR" : true, "ST-P" : true, "ST-S" : true, "SV-AH" : true,
+ "SV-CA" : true, "SV-CH" : true, "SV-CU" : true, "SV-LI" : true, "SV-MO" : true,
+ "SV-PA" : true, "SV-SA" : true, "SV-SM" : true, "SV-SO" : true, "SV-SS" : true,
+ "SV-SV" : true, "SV-UN" : true, "SV-US" : true, "SY-DI" : true, "SY-DR" : true,
+ "SY-DY" : true, "SY-HA" : true, "SY-HI" : true, "SY-HL" : true, "SY-HM" : true,
+ "SY-ID" : true, "SY-LA" : true, "SY-QU" : true, "SY-RA" : true, "SY-RD" : true,
+ "SY-SU" : true, "SY-TA" : true, "SZ-HH" : true, "SZ-LU" : true, "SZ-MA" : true,
+ "SZ-SH" : true, "TD-BA" : true, "TD-BG" : true, "TD-BO" : true, "TD-CB" : true,
+ "TD-EN" : true, "TD-GR" : true, "TD-HL" : true, "TD-KA" : true, "TD-LC" : true,
+ "TD-LO" : true, "TD-LR" : true, "TD-MA" : true, "TD-MC" : true, "TD-ME" : true,
+ "TD-MO" : true, "TD-ND" : true, "TD-OD" : true, "TD-SA" : true, "TD-SI" : true,
+ "TD-TA" : true, "TD-TI" : true, "TD-WF" : true, "TG-C" : true, "TG-K" : true,
+ "TG-M" : true, "TG-P" : true, "TG-S" : true, "TH-10" : true, "TH-11" : true,
+ "TH-12" : true, "TH-13" : true, "TH-14" : true, "TH-15" : true, "TH-16" : true,
+ "TH-17" : true, "TH-18" : true, "TH-19" : true, "TH-20" : true, "TH-21" : true,
+ "TH-22" : true, "TH-23" : true, "TH-24" : true, "TH-25" : true, "TH-26" : true,
+ "TH-27" : true, "TH-30" : true, "TH-31" : true, "TH-32" : true, "TH-33" : true,
+ "TH-34" : true, "TH-35" : true, "TH-36" : true, "TH-37" : true, "TH-39" : true,
+ "TH-40" : true, "TH-41" : true, "TH-42" : true, "TH-43" : true, "TH-44" : true,
+ "TH-45" : true, "TH-46" : true, "TH-47" : true, "TH-48" : true, "TH-49" : true,
+ "TH-50" : true, "TH-51" : true, "TH-52" : true, "TH-53" : true, "TH-54" : true,
+ "TH-55" : true, "TH-56" : true, "TH-57" : true, "TH-58" : true, "TH-60" : true,
+ "TH-61" : true, "TH-62" : true, "TH-63" : true, "TH-64" : true, "TH-65" : true,
+ "TH-66" : true, "TH-67" : true, "TH-70" : true, "TH-71" : true, "TH-72" : true,
+ "TH-73" : true, "TH-74" : true, "TH-75" : true, "TH-76" : true, "TH-77" : true,
+ "TH-80" : true, "TH-81" : true, "TH-82" : true, "TH-83" : true, "TH-84" : true,
+ "TH-85" : true, "TH-86" : true, "TH-90" : true, "TH-91" : true, "TH-92" : true,
+ "TH-93" : true, "TH-94" : true, "TH-95" : true, "TH-96" : true, "TH-S" : true,
+ "TJ-GB" : true, "TJ-KT" : true, "TJ-SU" : true, "TL-AL" : true, "TL-AN" : true,
+ "TL-BA" : true, "TL-BO" : true, "TL-CO" : true, "TL-DI" : true, "TL-ER" : true,
+ "TL-LA" : true, "TL-LI" : true, "TL-MF" : true, "TL-MT" : true, "TL-OE" : true,
+ "TL-VI" : true, "TM-A" : true, "TM-B" : true, "TM-D" : true, "TM-L" : true,
+ "TM-M" : true, "TM-S" : true, "TN-11" : true, "TN-12" : true, "TN-13" : true,
+ "TN-14" : true, "TN-21" : true, "TN-22" : true, "TN-23" : true, "TN-31" : true,
+ "TN-32" : true, "TN-33" : true, "TN-34" : true, "TN-41" : true, "TN-42" : true,
+ "TN-43" : true, "TN-51" : true, "TN-52" : true, "TN-53" : true, "TN-61" : true,
+ "TN-71" : true, "TN-72" : true, "TN-73" : true, "TN-81" : true, "TN-82" : true,
+ "TN-83" : true, "TO-01" : true, "TO-02" : true, "TO-03" : true, "TO-04" : true,
+ "TO-05" : true, "TR-01" : true, "TR-02" : true, "TR-03" : true, "TR-04" : true,
+ "TR-05" : true, "TR-06" : true, "TR-07" : true, "TR-08" : true, "TR-09" : true,
+ "TR-10" : true, "TR-11" : true, "TR-12" : true, "TR-13" : true, "TR-14" : true,
+ "TR-15" : true, "TR-16" : true, "TR-17" : true, "TR-18" : true, "TR-19" : true,
+ "TR-20" : true, "TR-21" : true, "TR-22" : true, "TR-23" : true, "TR-24" : true,
+ "TR-25" : true, "TR-26" : true, "TR-27" : true, "TR-28" : true, "TR-29" : true,
+ "TR-30" : true, "TR-31" : true, "TR-32" : true, "TR-33" : true, "TR-34" : true,
+ "TR-35" : true, "TR-36" : true, "TR-37" : true, "TR-38" : true, "TR-39" : true,
+ "TR-40" : true, "TR-41" : true, "TR-42" : true, "TR-43" : true, "TR-44" : true,
+ "TR-45" : true, "TR-46" : true, "TR-47" : true, "TR-48" : true, "TR-49" : true,
+ "TR-50" : true, "TR-51" : true, "TR-52" : true, "TR-53" : true, "TR-54" : true,
+ "TR-55" : true, "TR-56" : true, "TR-57" : true, "TR-58" : true, "TR-59" : true,
+ "TR-60" : true, "TR-61" : true, "TR-62" : true, "TR-63" : true, "TR-64" : true,
+ "TR-65" : true, "TR-66" : true, "TR-67" : true, "TR-68" : true, "TR-69" : true,
+ "TR-70" : true, "TR-71" : true, "TR-72" : true, "TR-73" : true, "TR-74" : true,
+ "TR-75" : true, "TR-76" : true, "TR-77" : true, "TR-78" : true, "TR-79" : true,
+ "TR-80" : true, "TR-81" : true, "TT-ARI" : true, "TT-CHA" : true, "TT-CTT" : true,
+ "TT-DMN" : true, "TT-ETO" : true, "TT-PED" : true, "TT-POS" : true, "TT-PRT" : true,
+ "TT-PTF" : true, "TT-RCM" : true, "TT-SFO" : true, "TT-SGE" : true, "TT-SIP" : true,
+ "TT-SJL" : true, "TT-TUP" : true, "TT-WTO" : true, "TV-FUN" : true, "TV-NIT" : true,
+ "TV-NKF" : true, "TV-NKL" : true, "TV-NMA" : true, "TV-NMG" : true, "TV-NUI" : true,
+ "TV-VAI" : true, "TW-CHA" : true, "TW-CYI" : true, "TW-CYQ" : true, "TW-HSQ" : true,
+ "TW-HSZ" : true, "TW-HUA" : true, "TW-ILA" : true, "TW-KEE" : true, "TW-KHH" : true,
+ "TW-KHQ" : true, "TW-MIA" : true, "TW-NAN" : true, "TW-PEN" : true, "TW-PIF" : true,
+ "TW-TAO" : true, "TW-TNN" : true, "TW-TNQ" : true, "TW-TPE" : true, "TW-TPQ" : true,
+ "TW-TTT" : true, "TW-TXG" : true, "TW-TXQ" : true, "TW-YUN" : true, "TZ-01" : true,
+ "TZ-02" : true, "TZ-03" : true, "TZ-04" : true, "TZ-05" : true, "TZ-06" : true,
+ "TZ-07" : true, "TZ-08" : true, "TZ-09" : true, "TZ-10" : true, "TZ-11" : true,
+ "TZ-12" : true, "TZ-13" : true, "TZ-14" : true, "TZ-15" : true, "TZ-16" : true,
+ "TZ-17" : true, "TZ-18" : true, "TZ-19" : true, "TZ-20" : true, "TZ-21" : true,
+ "TZ-22" : true, "TZ-23" : true, "TZ-24" : true, "TZ-25" : true, "TZ-26" : true,
+ "UA-05" : true, "UA-07" : true, "UA-09" : true, "UA-12" : true, "UA-14" : true,
+ "UA-18" : true, "UA-21" : true, "UA-23" : true, "UA-26" : true, "UA-30" : true,
+ "UA-32" : true, "UA-35" : true, "UA-40" : true, "UA-43" : true, "UA-46" : true,
+ "UA-48" : true, "UA-51" : true, "UA-53" : true, "UA-56" : true, "UA-59" : true,
+ "UA-61" : true, "UA-63" : true, "UA-65" : true, "UA-68" : true, "UA-71" : true,
+ "UA-74" : true, "UA-77" : true, "UG-101" : true, "UG-102" : true, "UG-103" : true,
+ "UG-104" : true, "UG-105" : true, "UG-106" : true, "UG-107" : true, "UG-108" : true,
+ "UG-109" : true, "UG-110" : true, "UG-111" : true, "UG-112" : true, "UG-113" : true,
+ "UG-114" : true, "UG-115" : true, "UG-116" : true, "UG-201" : true, "UG-202" : true,
+ "UG-203" : true, "UG-204" : true, "UG-205" : true, "UG-206" : true, "UG-207" : true,
+ "UG-208" : true, "UG-209" : true, "UG-210" : true, "UG-211" : true, "UG-212" : true,
+ "UG-213" : true, "UG-214" : true, "UG-215" : true, "UG-216" : true, "UG-217" : true,
+ "UG-218" : true, "UG-219" : true, "UG-220" : true, "UG-221" : true, "UG-222" : true,
+ "UG-223" : true, "UG-224" : true, "UG-301" : true, "UG-302" : true, "UG-303" : true,
+ "UG-304" : true, "UG-305" : true, "UG-306" : true, "UG-307" : true, "UG-308" : true,
+ "UG-309" : true, "UG-310" : true, "UG-311" : true, "UG-312" : true, "UG-313" : true,
+ "UG-314" : true, "UG-315" : true, "UG-316" : true, "UG-317" : true, "UG-318" : true,
+ "UG-319" : true, "UG-320" : true, "UG-321" : true, "UG-401" : true, "UG-402" : true,
+ "UG-403" : true, "UG-404" : true, "UG-405" : true, "UG-406" : true, "UG-407" : true,
+ "UG-408" : true, "UG-409" : true, "UG-410" : true, "UG-411" : true, "UG-412" : true,
+ "UG-413" : true, "UG-414" : true, "UG-415" : true, "UG-416" : true, "UG-417" : true,
+ "UG-418" : true, "UG-419" : true, "UG-C" : true, "UG-E" : true, "UG-N" : true,
+ "UG-W" : true, "UM-67" : true, "UM-71" : true, "UM-76" : true, "UM-79" : true,
+ "UM-81" : true, "UM-84" : true, "UM-86" : true, "UM-89" : true, "UM-95" : true,
+ "US-AK" : true, "US-AL" : true, "US-AR" : true, "US-AS" : true, "US-AZ" : true,
+ "US-CA" : true, "US-CO" : true, "US-CT" : true, "US-DC" : true, "US-DE" : true,
+ "US-FL" : true, "US-GA" : true, "US-GU" : true, "US-HI" : true, "US-IA" : true,
+ "US-ID" : true, "US-IL" : true, "US-IN" : true, "US-KS" : true, "US-KY" : true,
+ "US-LA" : true, "US-MA" : true, "US-MD" : true, "US-ME" : true, "US-MI" : true,
+ "US-MN" : true, "US-MO" : true, "US-MP" : true, "US-MS" : true, "US-MT" : true,
+ "US-NC" : true, "US-ND" : true, "US-NE" : true, "US-NH" : true, "US-NJ" : true,
+ "US-NM" : true, "US-NV" : true, "US-NY" : true, "US-OH" : true, "US-OK" : true,
+ "US-OR" : true, "US-PA" : true, "US-PR" : true, "US-RI" : true, "US-SC" : true,
+ "US-SD" : true, "US-TN" : true, "US-TX" : true, "US-UM" : true, "US-UT" : true,
+ "US-VA" : true, "US-VI" : true, "US-VT" : true, "US-WA" : true, "US-WI" : true,
+ "US-WV" : true, "US-WY" : true, "UY-AR" : true, "UY-CA" : true, "UY-CL" : true,
+ "UY-CO" : true, "UY-DU" : true, "UY-FD" : true, "UY-FS" : true, "UY-LA" : true,
+ "UY-MA" : true, "UY-MO" : true, "UY-PA" : true, "UY-RN" : true, "UY-RO" : true,
+ "UY-RV" : true, "UY-SA" : true, "UY-SJ" : true, "UY-SO" : true, "UY-TA" : true,
+ "UY-TT" : true, "UZ-AN" : true, "UZ-BU" : true, "UZ-FA" : true, "UZ-JI" : true,
+ "UZ-NG" : true, "UZ-NW" : true, "UZ-QA" : true, "UZ-QR" : true, "UZ-SA" : true,
+ "UZ-SI" : true, "UZ-SU" : true, "UZ-TK" : true, "UZ-TO" : true, "UZ-XO" : true,
+ "VC-01" : true, "VC-02" : true, "VC-03" : true, "VC-04" : true, "VC-05" : true,
+ "VC-06" : true, "VE-A" : true, "VE-B" : true, "VE-C" : true, "VE-D" : true,
+ "VE-E" : true, "VE-F" : true, "VE-G" : true, "VE-H" : true, "VE-I" : true,
+ "VE-J" : true, "VE-K" : true, "VE-L" : true, "VE-M" : true, "VE-N" : true,
+ "VE-O" : true, "VE-P" : true, "VE-R" : true, "VE-S" : true, "VE-T" : true,
+ "VE-U" : true, "VE-V" : true, "VE-W" : true, "VE-X" : true, "VE-Y" : true,
+ "VE-Z" : true, "VN-01" : true, "VN-02" : true, "VN-03" : true, "VN-04" : true,
+ "VN-05" : true, "VN-06" : true, "VN-07" : true, "VN-09" : true, "VN-13" : true,
+ "VN-14" : true, "VN-15" : true, "VN-18" : true, "VN-20" : true, "VN-21" : true,
+ "VN-22" : true, "VN-23" : true, "VN-24" : true, "VN-25" : true, "VN-26" : true,
+ "VN-27" : true, "VN-28" : true, "VN-29" : true, "VN-30" : true, "VN-31" : true,
+ "VN-32" : true, "VN-33" : true, "VN-34" : true, "VN-35" : true, "VN-36" : true,
+ "VN-37" : true, "VN-39" : true, "VN-40" : true, "VN-41" : true, "VN-43" : true,
+ "VN-44" : true, "VN-45" : true, "VN-46" : true, "VN-47" : true, "VN-49" : true,
+ "VN-50" : true, "VN-51" : true, "VN-52" : true, "VN-53" : true, "VN-54" : true,
+ "VN-55" : true, "VN-56" : true, "VN-57" : true, "VN-58" : true, "VN-59" : true,
+ "VN-61" : true, "VN-63" : true, "VN-66" : true, "VN-67" : true, "VN-68" : true,
+ "VN-69" : true, "VN-70" : true, "VN-71" : true, "VN-72" : true, "VN-73" : true,
+ "VN-CT" : true, "VN-DN" : true, "VN-HN" : true, "VN-HP" : true, "VN-SG" : true,
+ "VU-MAP" : true, "VU-PAM" : true, "VU-SAM" : true, "VU-SEE" : true, "VU-TAE" : true,
+ "VU-TOB" : true, "WS-AA" : true, "WS-AL" : true, "WS-AT" : true, "WS-FA" : true,
+ "WS-GE" : true, "WS-GI" : true, "WS-PA" : true, "WS-SA" : true, "WS-TU" : true,
+ "WS-VF" : true, "WS-VS" : true, "YE-AB" : true, "YE-AD" : true, "YE-AM" : true,
+ "YE-BA" : true, "YE-DA" : true, "YE-DH" : true, "YE-HD" : true, "YE-HJ" : true,
+ "YE-IB" : true, "YE-JA" : true, "YE-LA" : true, "YE-MA" : true, "YE-MR" : true,
+ "YE-MU" : true, "YE-MW" : true, "YE-RA" : true, "YE-SD" : true, "YE-SH" : true,
+ "YE-SN" : true, "YE-TA" : true, "ZA-EC" : true, "ZA-FS" : true, "ZA-GP" : true,
+ "ZA-LP" : true, "ZA-MP" : true, "ZA-NC" : true, "ZA-NW" : true, "ZA-WC" : true,
+ "ZA-ZN" : true, "ZM-01" : true, "ZM-02" : true, "ZM-03" : true, "ZM-04" : true,
+ "ZM-05" : true, "ZM-06" : true, "ZM-07" : true, "ZM-08" : true, "ZM-09" : true,
+ "ZW-BU" : true, "ZW-HA" : true, "ZW-MA" : true, "ZW-MC" : true, "ZW-ME" : true,
+ "ZW-MI" : true, "ZW-MN" : true, "ZW-MS" : true, "ZW-MV" : true, "ZW-MW" : true,
+}
diff --git a/doc.go b/doc.go
index eafad0d..cf1376b 100644
--- a/doc.go
+++ b/doc.go
@@ -811,6 +811,12 @@ This validates that a string value is valid JSON
Usage: json
+JWT String
+
+This validates that a string value is a valid JWT
+
+ Usage: jwt
+
File path
This validates that a string value contains a valid file path and that
diff --git a/go.mod b/go.mod
index 53c4820..786b8ca 100644
--- a/go.mod
+++ b/go.mod
@@ -6,7 +6,8 @@ require (
github.com/go-playground/assert/v2 v2.0.1
github.com/go-playground/locales v0.13.0
github.com/go-playground/universal-translator v0.17.0
- github.com/leodido/go-urn v1.2.0
- golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9
- golang.org/x/text v0.3.2 // indirect
+ github.com/leodido/go-urn v1.2.1
+ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97
+ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect
+ golang.org/x/text v0.3.6
)
diff --git a/go.sum b/go.sum
index 4b00cf6..e0c6781 100644
--- a/go.sum
+++ b/go.sum
@@ -6,28 +6,27 @@ github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8c
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
-github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
-github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
+github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
+github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
-github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ=
-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
-golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
+github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI=
+golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e h1:FDhOuMEY4JVRztM/gsbk+IKUQ8kj74bxZrgw87eMMVc=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/regexes.go b/regexes.go
index 9ecf4b1..df00c4e 100644
--- a/regexes.go
+++ b/regexes.go
@@ -45,9 +45,10 @@ const (
ethAddressRegexString = `^0x[0-9a-fA-F]{40}$`
ethAddressUpperRegexString = `^0x[0-9A-F]{40}$`
ethAddressLowerRegexString = `^0x[0-9a-f]{40}$`
- uRLEncodedRegexString = `(%[A-Fa-f0-9]{2})`
+ uRLEncodedRegexString = `^(?:[^%]|%[0-9A-Fa-f]{2})*$`
hTMLEncodedRegexString = `[x]?([0-9a-fA-F]{2})|(>)|(<)|(")|(&)+[;]?`
hTMLRegexString = `<[/]?([a-zA-Z]+).*?>`
+ jWTRegexString = "^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$"
splitParamsRegexString = `'[^']*'|\S+`
bicRegexString = `^[A-Za-z]{6}[A-Za-z0-9]{2}([A-Za-z0-9]{3})?$`
)
@@ -98,6 +99,7 @@ var (
uRLEncodedRegex = regexp.MustCompile(uRLEncodedRegexString)
hTMLEncodedRegex = regexp.MustCompile(hTMLEncodedRegexString)
hTMLRegex = regexp.MustCompile(hTMLRegexString)
+ jWTRegex = regexp.MustCompile(jWTRegexString)
splitParamsRegex = regexp.MustCompile(splitParamsRegexString)
bicRegex = regexp.MustCompile(bicRegexString)
)
diff --git a/translations/en/en.go b/translations/en/en.go
index 3bbca51..b95f7dd 100644
--- a/translations/en/en.go
+++ b/translations/en/en.go
@@ -1284,6 +1284,11 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er
translation: "{0} must be a valid json string",
override: false,
},
+ {
+ tag: "jwt",
+ translation: "{0} must be a valid jwt string",
+ override: false,
+ },
{
tag: "lowercase",
translation: "{0} must be a lowercase string",
diff --git a/translations/en/en_test.go b/translations/en/en_test.go
index fd8df77..0f20768 100644
--- a/translations/en/en_test.go
+++ b/translations/en/en_test.go
@@ -141,6 +141,7 @@ func TestTranslations(t *testing.T) {
UniqueArray [3]string `validate:"unique"`
UniqueMap map[string]string `validate:"unique"`
JSONString string `validate:"json"`
+ JWTString string `validate:"jwt"`
LowercaseString string `validate:"lowercase"`
UppercaseString string `validate:"uppercase"`
Datetime string `validate:"datetime=2006-01-02"`
@@ -646,6 +647,10 @@ func TestTranslations(t *testing.T) {
ns: "Test.JSONString",
expected: "JSONString must be a valid json string",
},
+ {
+ ns: "Test.JWTString",
+ expected: "JWTString must be a valid jwt string",
+ },
{
ns: "Test.LowercaseString",
expected: "LowercaseString must be a lowercase string",
diff --git a/translations/fa/fa.go b/translations/fa/fa.go
new file mode 100644
index 0000000..fc21aa0
--- /dev/null
+++ b/translations/fa/fa.go
@@ -0,0 +1,1379 @@
+package fa
+
+import (
+ "fmt"
+ "log"
+ "reflect"
+ "strconv"
+ "strings"
+ "time"
+
+ "github.com/go-playground/locales"
+ ut "github.com/go-playground/universal-translator"
+ "github.com/go-playground/validator/v10"
+)
+
+// RegisterDefaultTranslations registers a set of default translations
+// for all built in tag's in validator; you may add your own as desired.
+func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {
+ translations := []struct {
+ tag string
+ translation string
+ override bool
+ customRegisFunc validator.RegisterTranslationsFunc
+ customTransFunc validator.TranslationFunc
+ }{
+ {
+ tag: "required",
+ translation: "فیلد {0} اجباری میباشد",
+ override: false,
+ },
+ {
+ tag: "len",
+ customRegisFunc: func(ut ut.Translator) (err error) {
+ if err = ut.Add("len-string", "طول {0} باید {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("len-string-character", "{0} کاراکتر", locales.PluralRuleOne, false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("len-string-character", "{0} کاراکتر", locales.PluralRuleOther, false); err != nil {
+ return
+ }
+
+ if err = ut.Add("len-number", "طول {0} باید برابر {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.Add("len-items", "تعداد {0} باید برابر {1} باشد", false); err != nil {
+ return
+ }
+ if err = ut.AddCardinal("len-items-item", "{0} آیتم", locales.PluralRuleOne, false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("len-items-item", "{0} آیتم", locales.PluralRuleOther, false); err != nil {
+ return
+ }
+
+ return
+ },
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ var err error
+ var t string
+
+ var digits uint64
+ var kind reflect.Kind
+
+ if idx := strings.Index(fe.Param(), "."); idx != -1 {
+ digits = uint64(len(fe.Param()[idx+1:]))
+ }
+
+ f64, err := strconv.ParseFloat(fe.Param(), 64)
+ if err != nil {
+ goto END
+ }
+
+ kind = fe.Kind()
+ if kind == reflect.Ptr {
+ kind = fe.Type().Elem().Kind()
+ }
+
+ switch kind {
+ case reflect.String:
+
+ var c string
+
+ c, err = ut.C("len-string-character", f64, digits, ut.FmtNumber(f64, digits))
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("len-string", fe.Field(), c)
+
+ case reflect.Slice, reflect.Map, reflect.Array:
+ var c string
+
+ c, err = ut.C("len-items-item", f64, digits, ut.FmtNumber(f64, digits))
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("len-items", fe.Field(), c)
+
+ default:
+ t, err = ut.T("len-number", fe.Field(), ut.FmtNumber(f64, digits))
+ }
+
+ END:
+ if err != nil {
+ fmt.Printf("warning: error translating FieldError: %s", err)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "min",
+ customRegisFunc: func(ut ut.Translator) (err error) {
+ if err = ut.Add("min-string", "طول {0} باید حداقل {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("min-string-character", "{0} کاراکتر", locales.PluralRuleOne, false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("min-string-character", "{0} کاراکتر", locales.PluralRuleOther, false); err != nil {
+ return
+ }
+
+ if err = ut.Add("min-number", "{0} باید بزرگتر یا برابر {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.Add("min-items", "{0} باید شامل حداقل {1} باشد", false); err != nil {
+ return
+ }
+ if err = ut.AddCardinal("min-items-item", "{0} آیتم", locales.PluralRuleOne, false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("min-items-item", "{0} آیتم", locales.PluralRuleOther, false); err != nil {
+ return
+ }
+
+ return
+ },
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ var err error
+ var t string
+
+ var digits uint64
+ var kind reflect.Kind
+
+ if idx := strings.Index(fe.Param(), "."); idx != -1 {
+ digits = uint64(len(fe.Param()[idx+1:]))
+ }
+
+ f64, err := strconv.ParseFloat(fe.Param(), 64)
+ if err != nil {
+ goto END
+ }
+
+ kind = fe.Kind()
+ if kind == reflect.Ptr {
+ kind = fe.Type().Elem().Kind()
+ }
+
+ switch kind {
+ case reflect.String:
+
+ var c string
+
+ c, err = ut.C("min-string-character", f64, digits, ut.FmtNumber(f64, digits))
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("min-string", fe.Field(), c)
+
+ case reflect.Slice, reflect.Map, reflect.Array:
+ var c string
+
+ c, err = ut.C("min-items-item", f64, digits, ut.FmtNumber(f64, digits))
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("min-items", fe.Field(), c)
+
+ default:
+ t, err = ut.T("min-number", fe.Field(), ut.FmtNumber(f64, digits))
+ }
+
+ END:
+ if err != nil {
+ fmt.Printf("warning: error translating FieldError: %s", err)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "max",
+ customRegisFunc: func(ut ut.Translator) (err error) {
+ if err = ut.Add("max-string", "طول {0} باید حداکثر {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("max-string-character", "{0} کاراکتر", locales.PluralRuleOne, false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("max-string-character", "{0} کاراکتر", locales.PluralRuleOther, false); err != nil {
+ return
+ }
+
+ if err = ut.Add("max-number", "{0} باید کمتر یا برابر {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.Add("max-items", "{0} باید شامل حداکثر {1} باشد", false); err != nil {
+ return
+ }
+ if err = ut.AddCardinal("max-items-item", "{0} آیتم", locales.PluralRuleOne, false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("max-items-item", "{0} آیتم", locales.PluralRuleOther, false); err != nil {
+ return
+ }
+
+ return
+ },
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ var err error
+ var t string
+
+ var digits uint64
+ var kind reflect.Kind
+
+ if idx := strings.Index(fe.Param(), "."); idx != -1 {
+ digits = uint64(len(fe.Param()[idx+1:]))
+ }
+
+ f64, err := strconv.ParseFloat(fe.Param(), 64)
+ if err != nil {
+ goto END
+ }
+
+ kind = fe.Kind()
+ if kind == reflect.Ptr {
+ kind = fe.Type().Elem().Kind()
+ }
+
+ switch kind {
+ case reflect.String:
+
+ var c string
+
+ c, err = ut.C("max-string-character", f64, digits, ut.FmtNumber(f64, digits))
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("max-string", fe.Field(), c)
+
+ case reflect.Slice, reflect.Map, reflect.Array:
+ var c string
+
+ c, err = ut.C("max-items-item", f64, digits, ut.FmtNumber(f64, digits))
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("max-items", fe.Field(), c)
+
+ default:
+ t, err = ut.T("max-number", fe.Field(), ut.FmtNumber(f64, digits))
+ }
+
+ END:
+ if err != nil {
+ fmt.Printf("warning: error translating FieldError: %s", err)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "eq",
+ translation: "{0} برابر {1} نمیباشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ fmt.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "ne",
+ translation: "{0} نباید برابر {1} باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ fmt.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "lt",
+ customRegisFunc: func(ut ut.Translator) (err error) {
+ if err = ut.Add("lt-string", "طول {0} باید کمتر از {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("lt-string-character", "{0} کاراکتر", locales.PluralRuleOne, false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("lt-string-character", "{0} کاراکتر", locales.PluralRuleOther, false); err != nil {
+ return
+ }
+
+ if err = ut.Add("lt-number", "{0} باید کمتر از {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.Add("lt-items", "{0} باید دارای کمتر از {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("lt-items-item", "{0} آیتم", locales.PluralRuleOne, false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("lt-items-item", "{0} آیتم", locales.PluralRuleOther, false); err != nil {
+ return
+ }
+
+ if err = ut.Add("lt-datetime", "{0} باید قبل از تاریخ و زمان کنونی باشد", false); err != nil {
+ return
+ }
+
+ return
+ },
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ var err error
+ var t string
+ var f64 float64
+ var digits uint64
+ var kind reflect.Kind
+
+ fn := func() (err error) {
+ if idx := strings.Index(fe.Param(), "."); idx != -1 {
+ digits = uint64(len(fe.Param()[idx+1:]))
+ }
+
+ f64, err = strconv.ParseFloat(fe.Param(), 64)
+
+ return
+ }
+
+ kind = fe.Kind()
+ if kind == reflect.Ptr {
+ kind = fe.Type().Elem().Kind()
+ }
+
+ switch kind {
+ case reflect.String:
+
+ var c string
+
+ err = fn()
+ if err != nil {
+ goto END
+ }
+
+ c, err = ut.C("lt-string-character", f64, digits, ut.FmtNumber(f64, digits))
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("lt-string", fe.Field(), c)
+
+ case reflect.Slice, reflect.Map, reflect.Array:
+ var c string
+
+ err = fn()
+ if err != nil {
+ goto END
+ }
+
+ c, err = ut.C("lt-items-item", f64, digits, ut.FmtNumber(f64, digits))
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("lt-items", fe.Field(), c)
+
+ case reflect.Struct:
+ if fe.Type() != reflect.TypeOf(time.Time{}) {
+ err = fmt.Errorf("tag '%s' cannot be used on a struct type", fe.Tag())
+ goto END
+ }
+
+ t, err = ut.T("lt-datetime", fe.Field())
+
+ default:
+ err = fn()
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("lt-number", fe.Field(), ut.FmtNumber(f64, digits))
+ }
+
+ END:
+ if err != nil {
+ fmt.Printf("warning: error translating FieldError: %s", err)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "lte",
+ customRegisFunc: func(ut ut.Translator) (err error) {
+ if err = ut.Add("lte-string", "طول {0} باید حداکثر {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("lte-string-character", "{0} کاراکتر", locales.PluralRuleOne, false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("lte-string-character", "{0} کاراکتر", locales.PluralRuleOther, false); err != nil {
+ return
+ }
+
+ if err = ut.Add("lte-number", "{0} باید کمتر یا برابر {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.Add("lte-items", "{0} باید حداکثر شامل {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("lte-items-item", "{0} آیتم", locales.PluralRuleOne, false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("lte-items-item", "{0} آیتم", locales.PluralRuleOther, false); err != nil {
+ return
+ }
+
+ if err = ut.Add("lte-datetime", "{0} باید قبل یا برابر تاریخ و زمان کنونی باشد", false); err != nil {
+ return
+ }
+
+ return
+ },
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ var err error
+ var t string
+ var f64 float64
+ var digits uint64
+ var kind reflect.Kind
+
+ fn := func() (err error) {
+ if idx := strings.Index(fe.Param(), "."); idx != -1 {
+ digits = uint64(len(fe.Param()[idx+1:]))
+ }
+
+ f64, err = strconv.ParseFloat(fe.Param(), 64)
+
+ return
+ }
+
+ kind = fe.Kind()
+ if kind == reflect.Ptr {
+ kind = fe.Type().Elem().Kind()
+ }
+
+ switch kind {
+ case reflect.String:
+
+ var c string
+
+ err = fn()
+ if err != nil {
+ goto END
+ }
+
+ c, err = ut.C("lte-string-character", f64, digits, ut.FmtNumber(f64, digits))
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("lte-string", fe.Field(), c)
+
+ case reflect.Slice, reflect.Map, reflect.Array:
+ var c string
+
+ err = fn()
+ if err != nil {
+ goto END
+ }
+
+ c, err = ut.C("lte-items-item", f64, digits, ut.FmtNumber(f64, digits))
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("lte-items", fe.Field(), c)
+
+ case reflect.Struct:
+ if fe.Type() != reflect.TypeOf(time.Time{}) {
+ err = fmt.Errorf("tag '%s' cannot be used on a struct type", fe.Tag())
+ goto END
+ }
+
+ t, err = ut.T("lte-datetime", fe.Field())
+
+ default:
+ err = fn()
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("lte-number", fe.Field(), ut.FmtNumber(f64, digits))
+ }
+
+ END:
+ if err != nil {
+ fmt.Printf("warning: error translating FieldError: %s", err)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "gt",
+ customRegisFunc: func(ut ut.Translator) (err error) {
+ if err = ut.Add("gt-string", "طول {0} باید بیشتر از {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("gt-string-character", "{0} کاراکتر", locales.PluralRuleOne, false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("gt-string-character", "{0} کاراکتر", locales.PluralRuleOther, false); err != nil {
+ return
+ }
+
+ if err = ut.Add("gt-number", "{0} باید بیشتر از {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.Add("gt-items", "{0} باید دارای بیشتر از {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("gt-items-item", "{0} آیتم", locales.PluralRuleOne, false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("gt-items-item", "{0} آیتم", locales.PluralRuleOther, false); err != nil {
+ return
+ }
+
+ if err = ut.Add("gt-datetime", "{0} باید بعد از تاریخ و زمان کنونی باشد", false); err != nil {
+ return
+ }
+
+ return
+ },
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ var err error
+ var t string
+ var f64 float64
+ var digits uint64
+ var kind reflect.Kind
+
+ fn := func() (err error) {
+ if idx := strings.Index(fe.Param(), "."); idx != -1 {
+ digits = uint64(len(fe.Param()[idx+1:]))
+ }
+
+ f64, err = strconv.ParseFloat(fe.Param(), 64)
+
+ return
+ }
+
+ kind = fe.Kind()
+ if kind == reflect.Ptr {
+ kind = fe.Type().Elem().Kind()
+ }
+
+ switch kind {
+ case reflect.String:
+
+ var c string
+
+ err = fn()
+ if err != nil {
+ goto END
+ }
+
+ c, err = ut.C("gt-string-character", f64, digits, ut.FmtNumber(f64, digits))
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("gt-string", fe.Field(), c)
+
+ case reflect.Slice, reflect.Map, reflect.Array:
+ var c string
+
+ err = fn()
+ if err != nil {
+ goto END
+ }
+
+ c, err = ut.C("gt-items-item", f64, digits, ut.FmtNumber(f64, digits))
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("gt-items", fe.Field(), c)
+
+ case reflect.Struct:
+ if fe.Type() != reflect.TypeOf(time.Time{}) {
+ err = fmt.Errorf("tag '%s' cannot be used on a struct type", fe.Tag())
+ goto END
+ }
+
+ t, err = ut.T("gt-datetime", fe.Field())
+
+ default:
+ err = fn()
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("gt-number", fe.Field(), ut.FmtNumber(f64, digits))
+ }
+
+ END:
+ if err != nil {
+ fmt.Printf("warning: error translating FieldError: %s", err)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "gte",
+ customRegisFunc: func(ut ut.Translator) (err error) {
+ if err = ut.Add("gte-string", "طول {0} باید حداقل {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("gte-string-character", "{0} کاراکتر", locales.PluralRuleOne, false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("gte-string-character", "{0} کاراکتر", locales.PluralRuleOther, false); err != nil {
+ return
+ }
+
+ if err = ut.Add("gte-number", "{0} باید بیشتر یا برابر {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.Add("gte-items", "{0} باید شامل حداقل {1} باشد", false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("gte-items-item", "{0} آیتم", locales.PluralRuleOne, false); err != nil {
+ return
+ }
+
+ if err = ut.AddCardinal("gte-items-item", "{0} آیتم", locales.PluralRuleOther, false); err != nil {
+ return
+ }
+
+ if err = ut.Add("gte-datetime", "{0} باید بعد یا برابر تاریخ و زمان کنونی باشد", false); err != nil {
+ return
+ }
+
+ return
+ },
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ var err error
+ var t string
+ var f64 float64
+ var digits uint64
+ var kind reflect.Kind
+
+ fn := func() (err error) {
+ if idx := strings.Index(fe.Param(), "."); idx != -1 {
+ digits = uint64(len(fe.Param()[idx+1:]))
+ }
+
+ f64, err = strconv.ParseFloat(fe.Param(), 64)
+
+ return
+ }
+
+ kind = fe.Kind()
+ if kind == reflect.Ptr {
+ kind = fe.Type().Elem().Kind()
+ }
+
+ switch kind {
+ case reflect.String:
+
+ var c string
+
+ err = fn()
+ if err != nil {
+ goto END
+ }
+
+ c, err = ut.C("gte-string-character", f64, digits, ut.FmtNumber(f64, digits))
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("gte-string", fe.Field(), c)
+
+ case reflect.Slice, reflect.Map, reflect.Array:
+ var c string
+
+ err = fn()
+ if err != nil {
+ goto END
+ }
+
+ c, err = ut.C("gte-items-item", f64, digits, ut.FmtNumber(f64, digits))
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("gte-items", fe.Field(), c)
+
+ case reflect.Struct:
+ if fe.Type() != reflect.TypeOf(time.Time{}) {
+ err = fmt.Errorf("tag '%s' cannot be used on a struct type", fe.Tag())
+ goto END
+ }
+
+ t, err = ut.T("gte-datetime", fe.Field())
+
+ default:
+ err = fn()
+ if err != nil {
+ goto END
+ }
+
+ t, err = ut.T("gte-number", fe.Field(), ut.FmtNumber(f64, digits))
+ }
+
+ END:
+ if err != nil {
+ fmt.Printf("warning: error translating FieldError: %s", err)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "eqfield",
+ translation: "{0} باید برابر {1} باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "eqcsfield",
+ translation: "{0} باید برابر {1} باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "necsfield",
+ translation: "{0} نمیتواند برابر {1} باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "gtcsfield",
+ translation: "طول {0} باید بیشتر از {1} باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "gtecsfield",
+ translation: "طول {0} باید بیشتر یا برابر {1} باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "ltcsfield",
+ translation: "طول {0} باید کمتر از {1} باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "ltecsfield",
+ translation: "طول {0} باید کمتر یا برابر {1} باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "nefield",
+ translation: "{0} نمیتواند برابر {1} باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "gtfield",
+ translation: "طول {0} باید بیشتر از {1} باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "gtefield",
+ translation: "طول {0} باید بیشتر یا برابر {1} باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "ltfield",
+ translation: "طول {0} باید کمتر از {1} باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "ltefield",
+ translation: "طول {0} باید کمتر یا برابر {1} باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "alpha",
+ translation: "{0} میتواند فقط شامل حروف باشد",
+ override: false,
+ },
+ {
+ tag: "alphanum",
+ translation: "{0} میتواند فقط شامل حروف و اعداد باشد",
+ override: false,
+ },
+ {
+ tag: "numeric",
+ translation: "{0} باید یک عدد معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "number",
+ translation: "{0} باید یک عدد معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "hexadecimal",
+ translation: "{0} باید یک عدد درمبنای16 باشد",
+ override: false,
+ },
+ {
+ tag: "hexcolor",
+ translation: "{0} باید یک کد رنگ HEX باشد",
+ override: false,
+ },
+ {
+ tag: "rgb",
+ translation: "{0} باید یک کد رنگ RGB باشد",
+ override: false,
+ },
+ {
+ tag: "rgba",
+ translation: "{0} باید یک کد رنگ RGBA باشد",
+ override: false,
+ },
+ {
+ tag: "hsl",
+ translation: "{0} باید یک کد رنگ HSL باشد",
+ override: false,
+ },
+ {
+ tag: "hsla",
+ translation: "{0} باید یک کد رنگ HSLA باشد",
+ override: false,
+ },
+ {
+ tag: "e164",
+ translation: "{0} باید یک شمارهتلفن معتبر با فرمت E.164 باشد",
+ override: false,
+ },
+ {
+ tag: "email",
+ translation: "{0} باید یک ایمیل معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "url",
+ translation: "{0} باید یک آدرس اینترنتی معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "uri",
+ translation: "{0} باید یک URI معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "base64",
+ translation: "{0} باید یک متن درمبنای64 معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "contains",
+ translation: "{0} باید شامل '{1}' باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "containsany",
+ translation: "{0} باید شامل کاراکترهای '{1}' باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "excludes",
+ translation: "{0} نمیتواند شامل '{1}' باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "excludesall",
+ translation: "{0} نمیتواند شامل کاراکترهای '{1}' باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "excludesrune",
+ translation: "{0} نمیتواند شامل '{1}' باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "isbn",
+ translation: "{0} باید یک شابک معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "isbn10",
+ translation: "{0} باید یک شابک(ISBN-10) معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "isbn13",
+ translation: "{0} باید یک شابک(ISBN-13) معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "uuid",
+ translation: "{0} باید یک UUID معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "uuid3",
+ translation: "{0} باید یک UUID نسخه 3 معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "uuid4",
+ translation: "{0} باید یک UUID نسخه 4 معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "uuid5",
+ translation: "{0} باید یک UUID نسخه 5 معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "ascii",
+ translation: "{0} باید فقط شامل کاراکترهای اسکی باشد",
+ override: false,
+ },
+ {
+ tag: "printascii",
+ translation: "{0} باید فقط شامل کاراکترهای اسکی قابل چاپ باشد",
+ override: false,
+ },
+ {
+ tag: "multibyte",
+ translation: "{0} باید شامل کاراکترهای چندبایته باشد",
+ override: false,
+ },
+ {
+ tag: "datauri",
+ translation: "{0} باید یک Data URI معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "latitude",
+ translation: "{0} باید یک عرض جغرافیایی معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "longitude",
+ translation: "{0} باید یک طول جغرافیایی معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "ssn",
+ translation: "{0} باید یک شماره SSN معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "ipv4",
+ translation: "{0} باید یک آدرس آیپی IPv4 معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "ipv6",
+ translation: "{0} باید یک آدرس آیپی IPv6 معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "ip",
+ translation: "{0} باید یک آدرس آیپی معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "cidr",
+ translation: "{0} باید یک نشانهگذاری CIDR معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "cidrv4",
+ translation: "{0} باید یک نشانهگذاری CIDR معتبر برای آدرس آیپی IPv4 باشد",
+ override: false,
+ },
+ {
+ tag: "cidrv6",
+ translation: "{0} باید یک نشانهگذاری CIDR معتبر برای آدرس آیپی IPv6 باشد",
+ override: false,
+ },
+ {
+ tag: "tcp_addr",
+ translation: "{0} باید یک آدرس TCP معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "tcp4_addr",
+ translation: "{0} باید یک آدرس TCP IPv4 معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "tcp6_addr",
+ translation: "{0} باید یک آدرس TCP IPv6 معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "udp_addr",
+ translation: "{0} باید یک آدرس UDP معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "udp4_addr",
+ translation: "{0} باید یک آدرس UDP IPv4 معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "udp6_addr",
+ translation: "{0} باید یک آدرس UDP IPv6 معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "ip_addr",
+ translation: "{0} باید یک آدرس آیپی قابل دسترس باشد",
+ override: false,
+ },
+ {
+ tag: "ip4_addr",
+ translation: "{0} باید یک آدرس آیپی IPv4 قابل دسترس باشد",
+ override: false,
+ },
+ {
+ tag: "ip6_addr",
+ translation: "{0} باید یک آدرس آیپی IPv6 قابل دسترس باشد",
+ override: false,
+ },
+ {
+ tag: "unix_addr",
+ translation: "{0} باید یک آدرس UNIX معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "mac",
+ translation: "{0} باید یک مکآدرس معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "unique",
+ translation: "{0} باید شامل مقادیر منحصربفرد باشد",
+ override: false,
+ },
+ {
+ tag: "iscolor",
+ translation: "{0} باید یک رنگ معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "oneof",
+ translation: "{0} باید یکی از مقادیر [{1}] باشد",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ s, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+ return s
+ },
+ },
+ {
+ tag: "json",
+ translation: "{0} باید یک json معتبر باشد",
+ override: false,
+ },
+ {
+ tag: "lowercase",
+ translation: "{0} باید یک متن با حروف کوچک باشد",
+ override: false,
+ },
+ {
+ tag: "uppercase",
+ translation: "{0} باید یک متن با حروف بزرگ باشد",
+ override: false,
+ },
+ {
+ tag: "datetime",
+ translation: "فرمت {0} با {1} سازگار نیست",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "postcode_iso3166_alpha2",
+ translation: "{0} یک کدپستی معتبر کشور {1} نیست",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "postcode_iso3166_alpha2_field",
+ translation: "{0} یک کدپستی معتبر کشور فیلد {1} نیست",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ }
+
+ for _, t := range translations {
+
+ if t.customTransFunc != nil && t.customRegisFunc != nil {
+ err = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)
+ } else if t.customTransFunc != nil && t.customRegisFunc == nil {
+ err = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)
+ } else if t.customTransFunc == nil && t.customRegisFunc != nil {
+ err = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)
+ } else {
+ err = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)
+ }
+
+ if err != nil {
+ return
+ }
+ }
+
+ return
+}
+
+func registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {
+ return func(ut ut.Translator) (err error) {
+ if err = ut.Add(tag, translation, override); err != nil {
+ return
+ }
+
+ return
+ }
+}
+
+func translateFunc(ut ut.Translator, fe validator.FieldError) string {
+ t, err := ut.T(fe.Tag(), fe.Field())
+ if err != nil {
+ log.Printf("warning: error translating FieldError: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+}
diff --git a/translations/fa/fa_test.go b/translations/fa/fa_test.go
new file mode 100644
index 0000000..611f23e
--- /dev/null
+++ b/translations/fa/fa_test.go
@@ -0,0 +1,685 @@
+package fa
+
+import (
+ "testing"
+ "time"
+
+ . "github.com/go-playground/assert/v2"
+ english "github.com/go-playground/locales/en"
+ ut "github.com/go-playground/universal-translator"
+ "github.com/go-playground/validator/v10"
+)
+
+func TestTranslations(t *testing.T) {
+ eng := english.New()
+ uni := ut.New(eng, eng)
+ trans, _ := uni.GetTranslator("en")
+
+ validate := validator.New()
+
+ err := RegisterDefaultTranslations(validate, trans)
+ Equal(t, err, nil)
+
+ type Inner struct {
+ EqCSFieldString string
+ NeCSFieldString string
+ GtCSFieldString string
+ GteCSFieldString string
+ LtCSFieldString string
+ LteCSFieldString string
+ }
+
+ type Test struct {
+ Inner Inner
+ RequiredString string `validate:"required"`
+ RequiredNumber int `validate:"required"`
+ RequiredMultiple []string `validate:"required"`
+ LenString string `validate:"len=1"`
+ LenNumber float64 `validate:"len=1113.00"`
+ LenMultiple []string `validate:"len=7"`
+ MinString string `validate:"min=1"`
+ MinNumber float64 `validate:"min=1113.00"`
+ MinMultiple []string `validate:"min=7"`
+ MaxString string `validate:"max=3"`
+ MaxNumber float64 `validate:"max=1113.00"`
+ MaxMultiple []string `validate:"max=7"`
+ EqString string `validate:"eq=3"`
+ EqNumber float64 `validate:"eq=2.33"`
+ EqMultiple []string `validate:"eq=7"`
+ NeString string `validate:"ne="`
+ NeNumber float64 `validate:"ne=0.00"`
+ NeMultiple []string `validate:"ne=0"`
+ LtString string `validate:"lt=3"`
+ LtNumber float64 `validate:"lt=5.56"`
+ LtMultiple []string `validate:"lt=2"`
+ LtTime time.Time `validate:"lt"`
+ LteString string `validate:"lte=3"`
+ LteNumber float64 `validate:"lte=5.56"`
+ LteMultiple []string `validate:"lte=2"`
+ LteTime time.Time `validate:"lte"`
+ GtString string `validate:"gt=3"`
+ GtNumber float64 `validate:"gt=5.56"`
+ GtMultiple []string `validate:"gt=2"`
+ GtTime time.Time `validate:"gt"`
+ GteString string `validate:"gte=3"`
+ GteNumber float64 `validate:"gte=5.56"`
+ GteMultiple []string `validate:"gte=2"`
+ GteTime time.Time `validate:"gte"`
+ EqFieldString string `validate:"eqfield=MaxString"`
+ EqCSFieldString string `validate:"eqcsfield=Inner.EqCSFieldString"`
+ NeCSFieldString string `validate:"necsfield=Inner.NeCSFieldString"`
+ GtCSFieldString string `validate:"gtcsfield=Inner.GtCSFieldString"`
+ GteCSFieldString string `validate:"gtecsfield=Inner.GteCSFieldString"`
+ LtCSFieldString string `validate:"ltcsfield=Inner.LtCSFieldString"`
+ LteCSFieldString string `validate:"ltecsfield=Inner.LteCSFieldString"`
+ NeFieldString string `validate:"nefield=EqFieldString"`
+ GtFieldString string `validate:"gtfield=MaxString"`
+ GteFieldString string `validate:"gtefield=MaxString"`
+ LtFieldString string `validate:"ltfield=MaxString"`
+ LteFieldString string `validate:"ltefield=MaxString"`
+ AlphaString string `validate:"alpha"`
+ AlphanumString string `validate:"alphanum"`
+ NumericString string `validate:"numeric"`
+ NumberString string `validate:"number"`
+ HexadecimalString string `validate:"hexadecimal"`
+ HexColorString string `validate:"hexcolor"`
+ RGBColorString string `validate:"rgb"`
+ RGBAColorString string `validate:"rgba"`
+ HSLColorString string `validate:"hsl"`
+ HSLAColorString string `validate:"hsla"`
+ Email string `validate:"email"`
+ URL string `validate:"url"`
+ URI string `validate:"uri"`
+ Base64 string `validate:"base64"`
+ Contains string `validate:"contains=purpose"`
+ ContainsAny string `validate:"containsany=!@#$"`
+ Excludes string `validate:"excludes=text"`
+ ExcludesAll string `validate:"excludesall=!@#$"`
+ ExcludesRune string `validate:"excludesrune=☻"`
+ ISBN string `validate:"isbn"`
+ ISBN10 string `validate:"isbn10"`
+ ISBN13 string `validate:"isbn13"`
+ UUID string `validate:"uuid"`
+ UUID3 string `validate:"uuid3"`
+ UUID4 string `validate:"uuid4"`
+ UUID5 string `validate:"uuid5"`
+ ASCII string `validate:"ascii"`
+ PrintableASCII string `validate:"printascii"`
+ MultiByte string `validate:"multibyte"`
+ DataURI string `validate:"datauri"`
+ Latitude string `validate:"latitude"`
+ Longitude string `validate:"longitude"`
+ SSN string `validate:"ssn"`
+ IP string `validate:"ip"`
+ IPv4 string `validate:"ipv4"`
+ IPv6 string `validate:"ipv6"`
+ CIDR string `validate:"cidr"`
+ CIDRv4 string `validate:"cidrv4"`
+ CIDRv6 string `validate:"cidrv6"`
+ TCPAddr string `validate:"tcp_addr"`
+ TCPAddrv4 string `validate:"tcp4_addr"`
+ TCPAddrv6 string `validate:"tcp6_addr"`
+ UDPAddr string `validate:"udp_addr"`
+ UDPAddrv4 string `validate:"udp4_addr"`
+ UDPAddrv6 string `validate:"udp6_addr"`
+ IPAddr string `validate:"ip_addr"`
+ IPAddrv4 string `validate:"ip4_addr"`
+ IPAddrv6 string `validate:"ip6_addr"`
+ UinxAddr string `validate:"unix_addr"` // can't fail from within Go's net package currently, but maybe in the future
+ MAC string `validate:"mac"`
+ IsColor string `validate:"iscolor"`
+ StrPtrMinLen *string `validate:"min=10"`
+ StrPtrMaxLen *string `validate:"max=1"`
+ StrPtrLen *string `validate:"len=2"`
+ StrPtrLt *string `validate:"lt=1"`
+ StrPtrLte *string `validate:"lte=1"`
+ StrPtrGt *string `validate:"gt=10"`
+ StrPtrGte *string `validate:"gte=10"`
+ OneOfString string `validate:"oneof=red green"`
+ OneOfInt int `validate:"oneof=5 63"`
+ UniqueSlice []string `validate:"unique"`
+ UniqueArray [3]string `validate:"unique"`
+ UniqueMap map[string]string `validate:"unique"`
+ JSONString string `validate:"json"`
+ LowercaseString string `validate:"lowercase"`
+ UppercaseString string `validate:"uppercase"`
+ Datetime string `validate:"datetime=2006-01-02"`
+ PostCode string `validate:"postcode_iso3166_alpha2=SG"`
+ PostCodeCountry string
+ PostCodeByField string `validate:"postcode_iso3166_alpha2_field=PostCodeCountry"`
+ }
+
+ var test Test
+
+ test.Inner.EqCSFieldString = "1234"
+ test.Inner.GtCSFieldString = "1234"
+ test.Inner.GteCSFieldString = "1234"
+
+ test.MaxString = "1234"
+ test.MaxNumber = 2000
+ test.MaxMultiple = make([]string, 9)
+
+ test.LtString = "1234"
+ test.LtNumber = 6
+ test.LtMultiple = make([]string, 3)
+ test.LtTime = time.Now().Add(time.Hour * 24)
+
+ test.LteString = "1234"
+ test.LteNumber = 6
+ test.LteMultiple = make([]string, 3)
+ test.LteTime = time.Now().Add(time.Hour * 24)
+
+ test.LtFieldString = "12345"
+ test.LteFieldString = "12345"
+
+ test.LtCSFieldString = "1234"
+ test.LteCSFieldString = "1234"
+
+ test.AlphaString = "abc3"
+ test.AlphanumString = "abc3!"
+ test.NumericString = "12E.00"
+ test.NumberString = "12E"
+
+ test.Excludes = "this is some test text"
+ test.ExcludesAll = "This is Great!"
+ test.ExcludesRune = "Love it ☻"
+
+ test.ASCII = "カタカナ"
+ test.PrintableASCII = "カタカナ"
+
+ test.MultiByte = "1234feerf"
+
+ test.LowercaseString = "ABCDEFG"
+ test.UppercaseString = "abcdefg"
+
+ s := "toolong"
+ test.StrPtrMaxLen = &s
+ test.StrPtrLen = &s
+
+ test.UniqueSlice = []string{"1234", "1234"}
+ test.UniqueMap = map[string]string{"key1": "1234", "key2": "1234"}
+ test.Datetime = "2008-Feb-01"
+
+ err = validate.Struct(test)
+ NotEqual(t, err, nil)
+
+ errs, ok := err.(validator.ValidationErrors)
+ Equal(t, ok, true)
+
+ tests := []struct {
+ ns string
+ expected string
+ }{
+ {
+ ns: "Test.IsColor",
+ expected: "IsColor باید یک رنگ معتبر باشد",
+ },
+ {
+ ns: "Test.MAC",
+ expected: "MAC باید یک مکآدرس معتبر باشد",
+ },
+ {
+ ns: "Test.IPAddr",
+ expected: "IPAddr باید یک آدرس آیپی قابل دسترس باشد",
+ },
+ {
+ ns: "Test.IPAddrv4",
+ expected: "IPAddrv4 باید یک آدرس آیپی IPv4 قابل دسترس باشد",
+ },
+ {
+ ns: "Test.IPAddrv6",
+ expected: "IPAddrv6 باید یک آدرس آیپی IPv6 قابل دسترس باشد",
+ },
+ {
+ ns: "Test.UDPAddr",
+ expected: "UDPAddr باید یک آدرس UDP معتبر باشد",
+ },
+ {
+ ns: "Test.UDPAddrv4",
+ expected: "UDPAddrv4 باید یک آدرس UDP IPv4 معتبر باشد",
+ },
+ {
+ ns: "Test.UDPAddrv6",
+ expected: "UDPAddrv6 باید یک آدرس UDP IPv6 معتبر باشد",
+ },
+ {
+ ns: "Test.TCPAddr",
+ expected: "TCPAddr باید یک آدرس TCP معتبر باشد",
+ },
+ {
+ ns: "Test.TCPAddrv4",
+ expected: "TCPAddrv4 باید یک آدرس TCP IPv4 معتبر باشد",
+ },
+ {
+ ns: "Test.TCPAddrv6",
+ expected: "TCPAddrv6 باید یک آدرس TCP IPv6 معتبر باشد",
+ },
+ {
+ ns: "Test.CIDR",
+ expected: "CIDR باید یک نشانهگذاری CIDR معتبر باشد",
+ },
+ {
+ ns: "Test.CIDRv4",
+ expected: "CIDRv4 باید یک نشانهگذاری CIDR معتبر برای آدرس آیپی IPv4 باشد",
+ },
+ {
+ ns: "Test.CIDRv6",
+ expected: "CIDRv6 باید یک نشانهگذاری CIDR معتبر برای آدرس آیپی IPv6 باشد",
+ },
+ {
+ ns: "Test.SSN",
+ expected: "SSN باید یک شماره SSN معتبر باشد",
+ },
+ {
+ ns: "Test.IP",
+ expected: "IP باید یک آدرس آیپی معتبر باشد",
+ },
+ {
+ ns: "Test.IPv4",
+ expected: "IPv4 باید یک آدرس آیپی IPv4 معتبر باشد",
+ },
+ {
+ ns: "Test.IPv6",
+ expected: "IPv6 باید یک آدرس آیپی IPv6 معتبر باشد",
+ },
+ {
+ ns: "Test.DataURI",
+ expected: "DataURI باید یک Data URI معتبر باشد",
+ },
+ {
+ ns: "Test.Latitude",
+ expected: "Latitude باید یک عرض جغرافیایی معتبر باشد",
+ },
+ {
+ ns: "Test.Longitude",
+ expected: "Longitude باید یک طول جغرافیایی معتبر باشد",
+ },
+ {
+ ns: "Test.MultiByte",
+ expected: "MultiByte باید شامل کاراکترهای چندبایته باشد",
+ },
+ {
+ ns: "Test.ASCII",
+ expected: "ASCII باید فقط شامل کاراکترهای اسکی باشد",
+ },
+ {
+ ns: "Test.PrintableASCII",
+ expected: "PrintableASCII باید فقط شامل کاراکترهای اسکی قابل چاپ باشد",
+ },
+ {
+ ns: "Test.UUID",
+ expected: "UUID باید یک UUID معتبر باشد",
+ },
+ {
+ ns: "Test.UUID3",
+ expected: "UUID3 باید یک UUID نسخه 3 معتبر باشد",
+ },
+ {
+ ns: "Test.UUID4",
+ expected: "UUID4 باید یک UUID نسخه 4 معتبر باشد",
+ },
+ {
+ ns: "Test.UUID5",
+ expected: "UUID5 باید یک UUID نسخه 5 معتبر باشد",
+ },
+ {
+ ns: "Test.ISBN",
+ expected: "ISBN باید یک شابک معتبر باشد",
+ },
+ {
+ ns: "Test.ISBN10",
+ expected: "ISBN10 باید یک شابک(ISBN-10) معتبر باشد",
+ },
+ {
+ ns: "Test.ISBN13",
+ expected: "ISBN13 باید یک شابک(ISBN-13) معتبر باشد",
+ },
+ {
+ ns: "Test.Excludes",
+ expected: "Excludes نمیتواند شامل 'text' باشد",
+ },
+ {
+ ns: "Test.ExcludesAll",
+ expected: "ExcludesAll نمیتواند شامل کاراکترهای '!@#$' باشد",
+ },
+ {
+ ns: "Test.ExcludesRune",
+ expected: "ExcludesRune نمیتواند شامل '☻' باشد",
+ },
+ {
+ ns: "Test.ContainsAny",
+ expected: "ContainsAny باید شامل کاراکترهای '!@#$' باشد",
+ },
+ {
+ ns: "Test.Contains",
+ expected: "Contains باید شامل 'purpose' باشد",
+ },
+ {
+ ns: "Test.Base64",
+ expected: "Base64 باید یک متن درمبنای64 معتبر باشد",
+ },
+ {
+ ns: "Test.Email",
+ expected: "Email باید یک ایمیل معتبر باشد",
+ },
+ {
+ ns: "Test.URL",
+ expected: "URL باید یک آدرس اینترنتی معتبر باشد",
+ },
+ {
+ ns: "Test.URI",
+ expected: "URI باید یک URI معتبر باشد",
+ },
+ {
+ ns: "Test.RGBColorString",
+ expected: "RGBColorString باید یک کد رنگ RGB باشد",
+ },
+ {
+ ns: "Test.RGBAColorString",
+ expected: "RGBAColorString باید یک کد رنگ RGBA باشد",
+ },
+ {
+ ns: "Test.HSLColorString",
+ expected: "HSLColorString باید یک کد رنگ HSL باشد",
+ },
+ {
+ ns: "Test.HSLAColorString",
+ expected: "HSLAColorString باید یک کد رنگ HSLA باشد",
+ },
+ {
+ ns: "Test.HexadecimalString",
+ expected: "HexadecimalString باید یک عدد درمبنای16 باشد",
+ },
+ {
+ ns: "Test.HexColorString",
+ expected: "HexColorString باید یک کد رنگ HEX باشد",
+ },
+ {
+ ns: "Test.NumberString",
+ expected: "NumberString باید یک عدد معتبر باشد",
+ },
+ {
+ ns: "Test.NumericString",
+ expected: "NumericString باید یک عدد معتبر باشد",
+ },
+ {
+ ns: "Test.AlphanumString",
+ expected: "AlphanumString میتواند فقط شامل حروف و اعداد باشد",
+ },
+ {
+ ns: "Test.AlphaString",
+ expected: "AlphaString میتواند فقط شامل حروف باشد",
+ },
+ {
+ ns: "Test.LtFieldString",
+ expected: "طول LtFieldString باید کمتر از MaxString باشد",
+ },
+ {
+ ns: "Test.LteFieldString",
+ expected: "طول LteFieldString باید کمتر یا برابر MaxString باشد",
+ },
+ {
+ ns: "Test.GtFieldString",
+ expected: "طول GtFieldString باید بیشتر از MaxString باشد",
+ },
+ {
+ ns: "Test.GteFieldString",
+ expected: "طول GteFieldString باید بیشتر یا برابر MaxString باشد",
+ },
+ {
+ ns: "Test.NeFieldString",
+ expected: "NeFieldString نمیتواند برابر EqFieldString باشد",
+ },
+ {
+ ns: "Test.LtCSFieldString",
+ expected: "طول LtCSFieldString باید کمتر از Inner.LtCSFieldString باشد",
+ },
+ {
+ ns: "Test.LteCSFieldString",
+ expected: "طول LteCSFieldString باید کمتر یا برابر Inner.LteCSFieldString باشد",
+ },
+ {
+ ns: "Test.GtCSFieldString",
+ expected: "طول GtCSFieldString باید بیشتر از Inner.GtCSFieldString باشد",
+ },
+ {
+ ns: "Test.GteCSFieldString",
+ expected: "طول GteCSFieldString باید بیشتر یا برابر Inner.GteCSFieldString باشد",
+ },
+ {
+ ns: "Test.NeCSFieldString",
+ expected: "NeCSFieldString نمیتواند برابر Inner.NeCSFieldString باشد",
+ },
+ {
+ ns: "Test.EqCSFieldString",
+ expected: "EqCSFieldString باید برابر Inner.EqCSFieldString باشد",
+ },
+ {
+ ns: "Test.EqFieldString",
+ expected: "EqFieldString باید برابر MaxString باشد",
+ },
+ {
+ ns: "Test.GteString",
+ expected: "طول GteString باید حداقل 3 کاراکتر باشد",
+ },
+ {
+ ns: "Test.GteNumber",
+ expected: "GteNumber باید بیشتر یا برابر 5.56 باشد",
+ },
+ {
+ ns: "Test.GteMultiple",
+ expected: "GteMultiple باید شامل حداقل 2 آیتم باشد",
+ },
+ {
+ ns: "Test.GteTime",
+ expected: "GteTime باید بعد یا برابر تاریخ و زمان کنونی باشد",
+ },
+ {
+ ns: "Test.GtString",
+ expected: "طول GtString باید بیشتر از 3 کاراکتر باشد",
+ },
+ {
+ ns: "Test.GtNumber",
+ expected: "GtNumber باید بیشتر از 5.56 باشد",
+ },
+ {
+ ns: "Test.GtMultiple",
+ expected: "GtMultiple باید دارای بیشتر از 2 آیتم باشد",
+ },
+ {
+ ns: "Test.GtTime",
+ expected: "GtTime باید بعد از تاریخ و زمان کنونی باشد",
+ },
+ {
+ ns: "Test.LteString",
+ expected: "طول LteString باید حداکثر 3 کاراکتر باشد",
+ },
+ {
+ ns: "Test.LteNumber",
+ expected: "LteNumber باید کمتر یا برابر 5.56 باشد",
+ },
+ {
+ ns: "Test.LteMultiple",
+ expected: "LteMultiple باید حداکثر شامل 2 آیتم باشد",
+ },
+ {
+ ns: "Test.LteTime",
+ expected: "LteTime باید قبل یا برابر تاریخ و زمان کنونی باشد",
+ },
+ {
+ ns: "Test.LtString",
+ expected: "طول LtString باید کمتر از 3 کاراکتر باشد",
+ },
+ {
+ ns: "Test.LtNumber",
+ expected: "LtNumber باید کمتر از 5.56 باشد",
+ },
+ {
+ ns: "Test.LtMultiple",
+ expected: "LtMultiple باید دارای کمتر از 2 آیتم باشد",
+ },
+ {
+ ns: "Test.LtTime",
+ expected: "LtTime باید قبل از تاریخ و زمان کنونی باشد",
+ },
+ {
+ ns: "Test.NeString",
+ expected: "NeString نباید برابر باشد",
+ },
+ {
+ ns: "Test.NeNumber",
+ expected: "NeNumber نباید برابر 0.00 باشد",
+ },
+ {
+ ns: "Test.NeMultiple",
+ expected: "NeMultiple نباید برابر 0 باشد",
+ },
+ {
+ ns: "Test.EqString",
+ expected: "EqString برابر 3 نمیباشد",
+ },
+ {
+ ns: "Test.EqNumber",
+ expected: "EqNumber برابر 2.33 نمیباشد",
+ },
+ {
+ ns: "Test.EqMultiple",
+ expected: "EqMultiple برابر 7 نمیباشد",
+ },
+ {
+ ns: "Test.MaxString",
+ expected: "طول MaxString باید حداکثر 3 کاراکتر باشد",
+ },
+ {
+ ns: "Test.MaxNumber",
+ expected: "MaxNumber باید کمتر یا برابر 1,113.00 باشد",
+ },
+ {
+ ns: "Test.MaxMultiple",
+ expected: "MaxMultiple باید شامل حداکثر 7 آیتم باشد",
+ },
+ {
+ ns: "Test.MinString",
+ expected: "طول MinString باید حداقل 1 کاراکتر باشد",
+ },
+ {
+ ns: "Test.MinNumber",
+ expected: "MinNumber باید بزرگتر یا برابر 1,113.00 باشد",
+ },
+ {
+ ns: "Test.MinMultiple",
+ expected: "MinMultiple باید شامل حداقل 7 آیتم باشد",
+ },
+ {
+ ns: "Test.LenString",
+ expected: "طول LenString باید 1 کاراکتر باشد",
+ },
+ {
+ ns: "Test.LenNumber",
+ expected: "طول LenNumber باید برابر 1,113.00 باشد",
+ },
+ {
+ ns: "Test.LenMultiple",
+ expected: "تعداد LenMultiple باید برابر 7 آیتم باشد",
+ },
+ {
+ ns: "Test.RequiredString",
+ expected: "فیلد RequiredString اجباری میباشد",
+ },
+ {
+ ns: "Test.RequiredNumber",
+ expected: "فیلد RequiredNumber اجباری میباشد",
+ },
+ {
+ ns: "Test.RequiredMultiple",
+ expected: "فیلد RequiredMultiple اجباری میباشد",
+ },
+ {
+ ns: "Test.StrPtrMinLen",
+ expected: "طول StrPtrMinLen باید حداقل 10 کاراکتر باشد",
+ },
+ {
+ ns: "Test.StrPtrMaxLen",
+ expected: "طول StrPtrMaxLen باید حداکثر 1 کاراکتر باشد",
+ },
+ {
+ ns: "Test.StrPtrLen",
+ expected: "طول StrPtrLen باید 2 کاراکتر باشد",
+ },
+ {
+ ns: "Test.StrPtrLt",
+ expected: "طول StrPtrLt باید کمتر از 1 کاراکتر باشد",
+ },
+ {
+ ns: "Test.StrPtrLte",
+ expected: "طول StrPtrLte باید حداکثر 1 کاراکتر باشد",
+ },
+ {
+ ns: "Test.StrPtrGt",
+ expected: "طول StrPtrGt باید بیشتر از 10 کاراکتر باشد",
+ },
+ {
+ ns: "Test.StrPtrGte",
+ expected: "طول StrPtrGte باید حداقل 10 کاراکتر باشد",
+ },
+ {
+ ns: "Test.OneOfString",
+ expected: "OneOfString باید یکی از مقادیر [red green] باشد",
+ },
+ {
+ ns: "Test.OneOfInt",
+ expected: "OneOfInt باید یکی از مقادیر [5 63] باشد",
+ },
+ {
+ ns: "Test.UniqueSlice",
+ expected: "UniqueSlice باید شامل مقادیر منحصربفرد باشد",
+ },
+ {
+ ns: "Test.UniqueArray",
+ expected: "UniqueArray باید شامل مقادیر منحصربفرد باشد",
+ },
+ {
+ ns: "Test.UniqueMap",
+ expected: "UniqueMap باید شامل مقادیر منحصربفرد باشد",
+ },
+ {
+ ns: "Test.JSONString",
+ expected: "JSONString باید یک json معتبر باشد",
+ },
+ {
+ ns: "Test.LowercaseString",
+ expected: "LowercaseString باید یک متن با حروف کوچک باشد",
+ },
+ {
+ ns: "Test.UppercaseString",
+ expected: "UppercaseString باید یک متن با حروف بزرگ باشد",
+ },
+ {
+ ns: "Test.Datetime",
+ expected: "فرمت Datetime با 2006-01-02 سازگار نیست",
+ },
+ {
+ ns: "Test.PostCode",
+ expected: "PostCode یک کدپستی معتبر کشور SG نیست",
+ },
+ {
+ ns: "Test.PostCodeByField",
+ expected: "PostCodeByField یک کدپستی معتبر کشور فیلد PostCodeCountry نیست",
+ },
+ }
+
+ for _, tt := range tests {
+
+ var fe validator.FieldError
+
+ for _, e := range errs {
+ if tt.ns == e.Namespace() {
+ fe = e
+ break
+ }
+ }
+
+ NotEqual(t, fe, nil)
+ Equal(t, tt.expected, fe.Translate(trans))
+ }
+}
diff --git a/translations/ja/ja.go b/translations/ja/ja.go
index 43ec648..7b887c0 100644
--- a/translations/ja/ja.go
+++ b/translations/ja/ja.go
@@ -1226,7 +1226,7 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er
},
{
tag: "uuid5",
- translation: "{0}はバージョンが4の正しいUUIDでなければなりません",
+ translation: "{0}はバージョンが5の正しいUUIDでなければなりません",
override: false,
},
{
diff --git a/translations/ja/ja_test.go b/translations/ja/ja_test.go
index 0120760..eaa2743 100644
--- a/translations/ja/ja_test.go
+++ b/translations/ja/ja_test.go
@@ -304,7 +304,7 @@ func TestTranslations(t *testing.T) {
},
{
ns: "Test.UUID5",
- expected: "UUID5はバージョンが4の正しいUUIDでなければなりません",
+ expected: "UUID5はバージョンが5の正しいUUIDでなければなりません",
},
{
ns: "Test.ISBN",
diff --git a/translations/zh/zh.go b/translations/zh/zh.go
index 6b6cce1..5fff6b4 100644
--- a/translations/zh/zh.go
+++ b/translations/zh/zh.go
@@ -1000,6 +1000,16 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er
translation: "{0}只能包含字母和数字",
override: false,
},
+ {
+ tag: "alphanumunicode",
+ translation: "{0}只能包含字母数字和Unicode字符",
+ override: false,
+ },
+ {
+ tag: "alphaunicode",
+ translation: "{0}只能包含字母和Unicode字符",
+ override: false,
+ },
{
tag: "numeric",
translation: "{0}必须是一个有效的数值",
@@ -1090,6 +1100,21 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er
return t
},
},
+ {
+ tag: "containsrune",
+ translation: "{0}必须包含字符'{1}'",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("警告: 翻译字段错误: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
{
tag: "excludes",
translation: "{0}不能包含文本'{1}'",
@@ -1135,6 +1160,36 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er
return t
},
},
+ {
+ tag: "endswith",
+ translation: "{0}必须以文本'{1}'结尾",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("警告: 翻译字段错误: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
+ {
+ tag: "startswith",
+ translation: "{0}必须以文本'{1}'开头",
+ override: false,
+ customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
+
+ t, err := ut.T(fe.Tag(), fe.Field(), fe.Param())
+ if err != nil {
+ log.Printf("警告: 翻译字段错误: %#v", fe)
+ return fe.(error).Error()
+ }
+
+ return t
+ },
+ },
{
tag: "isbn",
translation: "{0}必须是一个有效的ISBN编号",
diff --git a/translations/zh/zh_test.go b/translations/zh/zh_test.go
index d106e0d..1d73c65 100644
--- a/translations/zh/zh_test.go
+++ b/translations/zh/zh_test.go
@@ -31,117 +31,122 @@ func TestTranslations(t *testing.T) {
}
type Test struct {
- Inner Inner
- RequiredString string `validate:"required"`
- RequiredNumber int `validate:"required"`
- RequiredMultiple []string `validate:"required"`
- LenString string `validate:"len=1"`
- LenNumber float64 `validate:"len=1113.00"`
- LenMultiple []string `validate:"len=7"`
- MinString string `validate:"min=1"`
- MinNumber float64 `validate:"min=1113.00"`
- MinMultiple []string `validate:"min=7"`
- MaxString string `validate:"max=3"`
- MaxNumber float64 `validate:"max=1113.00"`
- MaxMultiple []string `validate:"max=7"`
- EqString string `validate:"eq=3"`
- EqNumber float64 `validate:"eq=2.33"`
- EqMultiple []string `validate:"eq=7"`
- NeString string `validate:"ne="`
- NeNumber float64 `validate:"ne=0.00"`
- NeMultiple []string `validate:"ne=0"`
- LtString string `validate:"lt=3"`
- LtNumber float64 `validate:"lt=5.56"`
- LtMultiple []string `validate:"lt=2"`
- LtTime time.Time `validate:"lt"`
- LteString string `validate:"lte=3"`
- LteNumber float64 `validate:"lte=5.56"`
- LteMultiple []string `validate:"lte=2"`
- LteTime time.Time `validate:"lte"`
- GtString string `validate:"gt=3"`
- GtNumber float64 `validate:"gt=5.56"`
- GtMultiple []string `validate:"gt=2"`
- GtTime time.Time `validate:"gt"`
- GteString string `validate:"gte=3"`
- GteNumber float64 `validate:"gte=5.56"`
- GteMultiple []string `validate:"gte=2"`
- GteTime time.Time `validate:"gte"`
- EqFieldString string `validate:"eqfield=MaxString"`
- EqCSFieldString string `validate:"eqcsfield=Inner.EqCSFieldString"`
- NeCSFieldString string `validate:"necsfield=Inner.NeCSFieldString"`
- GtCSFieldString string `validate:"gtcsfield=Inner.GtCSFieldString"`
- GteCSFieldString string `validate:"gtecsfield=Inner.GteCSFieldString"`
- LtCSFieldString string `validate:"ltcsfield=Inner.LtCSFieldString"`
- LteCSFieldString string `validate:"ltecsfield=Inner.LteCSFieldString"`
- NeFieldString string `validate:"nefield=EqFieldString"`
- GtFieldString string `validate:"gtfield=MaxString"`
- GteFieldString string `validate:"gtefield=MaxString"`
- LtFieldString string `validate:"ltfield=MaxString"`
- LteFieldString string `validate:"ltefield=MaxString"`
- AlphaString string `validate:"alpha"`
- AlphanumString string `validate:"alphanum"`
- NumericString string `validate:"numeric"`
- NumberString string `validate:"number"`
- HexadecimalString string `validate:"hexadecimal"`
- HexColorString string `validate:"hexcolor"`
- RGBColorString string `validate:"rgb"`
- RGBAColorString string `validate:"rgba"`
- HSLColorString string `validate:"hsl"`
- HSLAColorString string `validate:"hsla"`
- Email string `validate:"email"`
- URL string `validate:"url"`
- URI string `validate:"uri"`
- Base64 string `validate:"base64"`
- Contains string `validate:"contains=purpose"`
- ContainsAny string `validate:"containsany=!@#$"`
- Excludes string `validate:"excludes=text"`
- ExcludesAll string `validate:"excludesall=!@#$"`
- ExcludesRune string `validate:"excludesrune=☻"`
- ISBN string `validate:"isbn"`
- ISBN10 string `validate:"isbn10"`
- ISBN13 string `validate:"isbn13"`
- UUID string `validate:"uuid"`
- UUID3 string `validate:"uuid3"`
- UUID4 string `validate:"uuid4"`
- UUID5 string `validate:"uuid5"`
- ASCII string `validate:"ascii"`
- PrintableASCII string `validate:"printascii"`
- MultiByte string `validate:"multibyte"`
- DataURI string `validate:"datauri"`
- Latitude string `validate:"latitude"`
- Longitude string `validate:"longitude"`
- SSN string `validate:"ssn"`
- IP string `validate:"ip"`
- IPv4 string `validate:"ipv4"`
- IPv6 string `validate:"ipv6"`
- CIDR string `validate:"cidr"`
- CIDRv4 string `validate:"cidrv4"`
- CIDRv6 string `validate:"cidrv6"`
- TCPAddr string `validate:"tcp_addr"`
- TCPAddrv4 string `validate:"tcp4_addr"`
- TCPAddrv6 string `validate:"tcp6_addr"`
- UDPAddr string `validate:"udp_addr"`
- UDPAddrv4 string `validate:"udp4_addr"`
- UDPAddrv6 string `validate:"udp6_addr"`
- IPAddr string `validate:"ip_addr"`
- IPAddrv4 string `validate:"ip4_addr"`
- IPAddrv6 string `validate:"ip6_addr"`
- UinxAddr string `validate:"unix_addr"` // can't fail from within Go's net package currently, but maybe in the future
- MAC string `validate:"mac"`
- IsColor string `validate:"iscolor"`
- StrPtrMinLen *string `validate:"min=10"`
- StrPtrMaxLen *string `validate:"max=1"`
- StrPtrLen *string `validate:"len=2"`
- StrPtrLt *string `validate:"lt=1"`
- StrPtrLte *string `validate:"lte=1"`
- StrPtrGt *string `validate:"gt=10"`
- StrPtrGte *string `validate:"gte=10"`
- OneOfString string `validate:"oneof=red green"`
- OneOfInt int `validate:"oneof=5 63"`
- JsonString string `validate:"json"`
- LowercaseString string `validate:"lowercase"`
- UppercaseString string `validate:"uppercase"`
- Datetime string `validate:"datetime=2006-01-02"`
+ Inner Inner
+ RequiredString string `validate:"required"`
+ RequiredNumber int `validate:"required"`
+ RequiredMultiple []string `validate:"required"`
+ LenString string `validate:"len=1"`
+ LenNumber float64 `validate:"len=1113.00"`
+ LenMultiple []string `validate:"len=7"`
+ MinString string `validate:"min=1"`
+ MinNumber float64 `validate:"min=1113.00"`
+ MinMultiple []string `validate:"min=7"`
+ MaxString string `validate:"max=3"`
+ MaxNumber float64 `validate:"max=1113.00"`
+ MaxMultiple []string `validate:"max=7"`
+ EqString string `validate:"eq=3"`
+ EqNumber float64 `validate:"eq=2.33"`
+ EqMultiple []string `validate:"eq=7"`
+ NeString string `validate:"ne="`
+ NeNumber float64 `validate:"ne=0.00"`
+ NeMultiple []string `validate:"ne=0"`
+ LtString string `validate:"lt=3"`
+ LtNumber float64 `validate:"lt=5.56"`
+ LtMultiple []string `validate:"lt=2"`
+ LtTime time.Time `validate:"lt"`
+ LteString string `validate:"lte=3"`
+ LteNumber float64 `validate:"lte=5.56"`
+ LteMultiple []string `validate:"lte=2"`
+ LteTime time.Time `validate:"lte"`
+ GtString string `validate:"gt=3"`
+ GtNumber float64 `validate:"gt=5.56"`
+ GtMultiple []string `validate:"gt=2"`
+ GtTime time.Time `validate:"gt"`
+ GteString string `validate:"gte=3"`
+ GteNumber float64 `validate:"gte=5.56"`
+ GteMultiple []string `validate:"gte=2"`
+ GteTime time.Time `validate:"gte"`
+ EqFieldString string `validate:"eqfield=MaxString"`
+ EqCSFieldString string `validate:"eqcsfield=Inner.EqCSFieldString"`
+ NeCSFieldString string `validate:"necsfield=Inner.NeCSFieldString"`
+ GtCSFieldString string `validate:"gtcsfield=Inner.GtCSFieldString"`
+ GteCSFieldString string `validate:"gtecsfield=Inner.GteCSFieldString"`
+ LtCSFieldString string `validate:"ltcsfield=Inner.LtCSFieldString"`
+ LteCSFieldString string `validate:"ltecsfield=Inner.LteCSFieldString"`
+ NeFieldString string `validate:"nefield=EqFieldString"`
+ GtFieldString string `validate:"gtfield=MaxString"`
+ GteFieldString string `validate:"gtefield=MaxString"`
+ LtFieldString string `validate:"ltfield=MaxString"`
+ LteFieldString string `validate:"ltefield=MaxString"`
+ AlphaString string `validate:"alpha"`
+ AlphanumString string `validate:"alphanum"`
+ AlphanumUnicodeString string `validate:"alphanumunicode"`
+ AlphaUnicodeString string `validate:"alphaunicode"`
+ NumericString string `validate:"numeric"`
+ NumberString string `validate:"number"`
+ HexadecimalString string `validate:"hexadecimal"`
+ HexColorString string `validate:"hexcolor"`
+ RGBColorString string `validate:"rgb"`
+ RGBAColorString string `validate:"rgba"`
+ HSLColorString string `validate:"hsl"`
+ HSLAColorString string `validate:"hsla"`
+ Email string `validate:"email"`
+ URL string `validate:"url"`
+ URI string `validate:"uri"`
+ Base64 string `validate:"base64"`
+ Contains string `validate:"contains=purpose"`
+ ContainsAny string `validate:"containsany=!@#$"`
+ ContainsRune string `validate:"containsrune=☻"`
+ Excludes string `validate:"excludes=text"`
+ ExcludesAll string `validate:"excludesall=!@#$"`
+ ExcludesRune string `validate:"excludesrune=☻"`
+ EndsWith string `validate:"endswith=end"`
+ StartsWith string `validate:"startswith=start"`
+ ISBN string `validate:"isbn"`
+ ISBN10 string `validate:"isbn10"`
+ ISBN13 string `validate:"isbn13"`
+ UUID string `validate:"uuid"`
+ UUID3 string `validate:"uuid3"`
+ UUID4 string `validate:"uuid4"`
+ UUID5 string `validate:"uuid5"`
+ ASCII string `validate:"ascii"`
+ PrintableASCII string `validate:"printascii"`
+ MultiByte string `validate:"multibyte"`
+ DataURI string `validate:"datauri"`
+ Latitude string `validate:"latitude"`
+ Longitude string `validate:"longitude"`
+ SSN string `validate:"ssn"`
+ IP string `validate:"ip"`
+ IPv4 string `validate:"ipv4"`
+ IPv6 string `validate:"ipv6"`
+ CIDR string `validate:"cidr"`
+ CIDRv4 string `validate:"cidrv4"`
+ CIDRv6 string `validate:"cidrv6"`
+ TCPAddr string `validate:"tcp_addr"`
+ TCPAddrv4 string `validate:"tcp4_addr"`
+ TCPAddrv6 string `validate:"tcp6_addr"`
+ UDPAddr string `validate:"udp_addr"`
+ UDPAddrv4 string `validate:"udp4_addr"`
+ UDPAddrv6 string `validate:"udp6_addr"`
+ IPAddr string `validate:"ip_addr"`
+ IPAddrv4 string `validate:"ip4_addr"`
+ IPAddrv6 string `validate:"ip6_addr"`
+ UinxAddr string `validate:"unix_addr"` // can't fail from within Go's net package currently, but maybe in the future
+ MAC string `validate:"mac"`
+ IsColor string `validate:"iscolor"`
+ StrPtrMinLen *string `validate:"min=10"`
+ StrPtrMaxLen *string `validate:"max=1"`
+ StrPtrLen *string `validate:"len=2"`
+ StrPtrLt *string `validate:"lt=1"`
+ StrPtrLte *string `validate:"lte=1"`
+ StrPtrGt *string `validate:"gt=10"`
+ StrPtrGte *string `validate:"gte=10"`
+ OneOfString string `validate:"oneof=red green"`
+ OneOfInt int `validate:"oneof=5 63"`
+ JsonString string `validate:"json"`
+ LowercaseString string `validate:"lowercase"`
+ UppercaseString string `validate:"uppercase"`
+ Datetime string `validate:"datetime=2006-01-02"`
}
var test Test
@@ -172,6 +177,8 @@ func TestTranslations(t *testing.T) {
test.AlphaString = "abc3"
test.AlphanumString = "abc3!"
+ test.AlphanumUnicodeString = "abc3啊!"
+ test.AlphaUnicodeString = "abc3啊"
test.NumericString = "12E.00"
test.NumberString = "12E"
@@ -179,6 +186,9 @@ func TestTranslations(t *testing.T) {
test.ExcludesAll = "This is Great!"
test.ExcludesRune = "Love it ☻"
+ test.EndsWith = "this is some test text"
+ test.StartsWith = "this is some test text"
+
test.ASCII = "カタカナ"
test.PrintableASCII = "カタカナ"
@@ -329,6 +339,14 @@ func TestTranslations(t *testing.T) {
ns: "Test.ISBN13",
expected: "ISBN13必须是一个有效的ISBN-13编号",
},
+ {
+ ns: "Test.EndsWith",
+ expected: "EndsWith必须以文本'end'结尾",
+ },
+ {
+ ns: "Test.StartsWith",
+ expected: "StartsWith必须以文本'start'开头",
+ },
{
ns: "Test.Excludes",
expected: "Excludes不能包含文本'text'",
@@ -341,6 +359,10 @@ func TestTranslations(t *testing.T) {
ns: "Test.ExcludesRune",
expected: "ExcludesRune不能包含'☻'",
},
+ {
+ ns: "Test.ContainsRune",
+ expected: "ContainsRune必须包含字符'☻'",
+ },
{
ns: "Test.ContainsAny",
expected: "ContainsAny必须包含至少一个以下字符'!@#$'",
@@ -397,6 +419,14 @@ func TestTranslations(t *testing.T) {
ns: "Test.NumericString",
expected: "NumericString必须是一个有效的数值",
},
+ {
+ ns: "Test.AlphaUnicodeString",
+ expected: "AlphaUnicodeString只能包含字母和Unicode字符",
+ },
+ {
+ ns: "Test.AlphanumUnicodeString",
+ expected: "AlphanumUnicodeString只能包含字母数字和Unicode字符",
+ },
{
ns: "Test.AlphanumString",
expected: "AlphanumString只能包含字母和数字",
diff --git a/validator.go b/validator.go
index 9569c0d..2a4fad0 100644
--- a/validator.go
+++ b/validator.go
@@ -227,7 +227,7 @@ func (v *validate) traverseField(ctx context.Context, parent reflect.Value, curr
}
}
- if !ct.hasTag {
+ if ct == nil || !ct.hasTag {
return
}
diff --git a/validator_instance.go b/validator_instance.go
index 8e27707..96e777f 100644
--- a/validator_instance.go
+++ b/validator_instance.go
@@ -207,11 +207,11 @@ func (v *Validate) RegisterValidationCtx(tag string, fn FuncCtx, callValidationE
func (v *Validate) registerValidation(tag string, fn FuncCtx, bakedIn bool, nilCheckable bool) error {
if len(tag) == 0 {
- return errors.New("Function Key cannot be empty")
+ return errors.New("function Key cannot be empty")
}
if fn == nil {
- return errors.New("Function cannot be empty")
+ return errors.New("function cannot be empty")
}
_, ok := restrictedTags[tag]
diff --git a/validator_test.go b/validator_test.go
index 8554e81..39ef250 100644
--- a/validator_test.go
+++ b/validator_test.go
@@ -14,7 +14,6 @@ import (
"testing"
"time"
- "github.com/go-playground/assert/v2"
. "github.com/go-playground/assert/v2"
"github.com/go-playground/locales/en"
"github.com/go-playground/locales/fr"
@@ -3285,6 +3284,21 @@ func TestMapDiveValidation(t *testing.T) {
s := fmt.Sprint(errs.Error())
NotEqual(t, s, "")
+ type TestMapInterface struct {
+ Errs map[int]interface{} `validate:"dive"`
+ }
+
+ mit := map[int]interface{}{0: Inner{"ok"}, 1: Inner{""}, 3: nil, 5: "string", 6: 33}
+
+ msi := &TestMapInterface{
+ Errs: mit,
+ }
+
+ errs = validate.Struct(msi)
+ NotEqual(t, errs, nil)
+ Equal(t, len(errs.(ValidationErrors)), 1)
+ AssertError(t, errs, "TestMapInterface.Errs[1].Name", "TestMapInterface.Errs[1].Name", "Name", "Name", "required")
+
type TestMapTimeStruct struct {
Errs map[int]*time.Time `validate:"gt=0,dive,required"`
}
@@ -9537,6 +9551,9 @@ func TestURLEncodedValidation(t *testing.T) {
{"a%b", false},
{"1%2", false},
{"%%a%%", false},
+ {"hello", true},
+ {"", true},
+ {"+", true},
}
validate := New()
@@ -9621,7 +9638,7 @@ func TestKeys(t *testing.T) {
AssertError(t, err.(ValidationErrors), "Test2.NestedKeys", "Test2.NestedKeys", "NestedKeys", "NestedKeys", "gt")
tst2.NestedKeys = map[[1]string]string{
- [1]string{"innertestkey"}: "outertestval",
+ {"innertestkey"}: "outertestval",
}
err = validate.Struct(tst2)
@@ -10769,6 +10786,42 @@ func TestJSONValidation(t *testing.T) {
}, "Bad field type int")
}
+func TestJWTValidation(t *testing.T) {
+ tests := []struct {
+ param string
+ expected bool
+ }{
+ {"eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiZ29waGVyIn0.O_bROM_szPq9qBql-XDHMranHwP48ODdoLICWzqBr_U", true},
+ {"acb123-_.def456-_.ghi789-_", true},
+ {"eyJhbGciOiJOT05FIn0.e30.", true},
+ {"eyJhbGciOiJOT05FIn0.e30.\n", false},
+ {"\x00.\x00.\x00", false},
+ {"", false},
+ }
+
+ validate := New()
+
+ for i, test := range tests {
+
+ errs := validate.Var(test.param, "jwt")
+
+ if test.expected {
+ if !IsEqual(errs, nil) {
+ t.Fatalf("Index: %d jwt failed Error: %s", i, errs)
+ }
+ } else {
+ if IsEqual(errs, nil) {
+ t.Fatalf("Index: %d jwt failed Error: %s", i, errs)
+ } else {
+ val := getError(errs, "", "")
+ if val.Tag() != "jwt" {
+ t.Fatalf("Index: %d jwt failed Error: %s", i, errs)
+ }
+ }
+ }
+ }
+}
+
func Test_hostnameport_validator(t *testing.T) {
type Host struct {
Addr string `validate:"hostname_port"`
@@ -10938,6 +10991,34 @@ func TestIsIso3166Alpha2Validation(t *testing.T) {
}
}
+func TestIsIso31662Validation(t *testing.T) {
+ tests := []struct {
+ value string `validate:"iso3166_2"`
+ expected bool
+ }{
+ {"US-FL", true},
+ {"US-F", false},
+ {"US", false},
+ }
+
+ validate := New()
+
+ for i, test := range tests {
+
+ errs := validate.Var(test.value, "iso3166_2")
+
+ if test.expected {
+ if !IsEqual(errs, nil) {
+ t.Fatalf("Index: %d iso3166_2 failed Error: %s", i, errs)
+ }
+ } else {
+ if IsEqual(errs, nil) {
+ t.Fatalf("Index: %d iso3166_2 failed Error: %s", i, errs)
+ }
+ }
+ }
+}
+
func TestIsIso3166Alpha3Validation(t *testing.T) {
tests := []struct {
value string `validate:"iso3166_1_alpha3"`
@@ -11252,7 +11333,7 @@ func TestPostCodeByIso3166Alpha2Field_WrongField(t *testing.T) {
}
errs := New().Struct(test{"ABC", "VN", false})
- assert.NotEqual(t, nil, errs)
+ NotEqual(t, nil, errs)
}
func TestPostCodeByIso3166Alpha2Field_MissingParam(t *testing.T) {
@@ -11263,7 +11344,7 @@ func TestPostCodeByIso3166Alpha2Field_MissingParam(t *testing.T) {
}
errs := New().Struct(test{"ABC", "VN", false})
- assert.NotEqual(t, nil, errs)
+ NotEqual(t, nil, errs)
}
func TestPostCodeByIso3166Alpha2Field_InvalidKind(t *testing.T) {