GeoIP Detection - Version 4.1.0

Version Description

  • NEW: An else shortcode for geoip_detect2_show_if and geoip_detect2_hide_if: [geoip_detect2_show_if city="Berlin"]Hallo Berlin![else]Not in Berlin[/geoip_detect2_show_if]
  • FIX: The JS for AJAX wasn't working for Safari browsers
  • FIX: Improving some edge cases of Record.get_with_locales() and other methods of Record to be consistent with non-AJAX mode
  • FIX: Revert more Maxmind libraries to fix incompatibility with WooCommerce
Download this release

Release Info

Developer benjamin4
Plugin Icon 128x128 GeoIP Detection
Version 4.1.0
Comparing to
See all releases

Code changes from version 4.0.1 to 4.1.0

Files changed (50) hide show
  1. composer.json +8 -6
  2. composer.lock +163 -45
  3. geoip-detect.php +2 -2
  4. js/body_classes.js +10 -6
  5. js/body_classes.test.js +30 -0
  6. js/dist/frontend.1115d690.js +41 -0
  7. js/dist/frontend.1115d690.js.map +1 -0
  8. js/dist/parcel.js +2 -2
  9. js/dist/parcel.json +1 -1
  10. js/dist/parcel.urls +1 -1
  11. js/models/record.js +49 -23
  12. js/models/record.test.js +69 -3
  13. package.json +11 -11
  14. readme.txt +8 -1
  15. renovate.json +42 -0
  16. shortcodes/show_if.php +24 -9
  17. vendor/composer/autoload_classmap.php +0 -1
  18. vendor/composer/autoload_static.php +0 -1
  19. vendor/composer/installed.json +39 -40
  20. vendor/maxmind-db/reader/CHANGELOG.md +0 -35
  21. vendor/maxmind-db/reader/README.md +5 -12
  22. vendor/maxmind-db/reader/autoload.php +5 -7
  23. vendor/maxmind-db/reader/composer.json +6 -7
  24. vendor/maxmind-db/reader/ext/maxminddb.c +238 -340
  25. vendor/maxmind-db/reader/ext/php_maxminddb.h +1 -1
  26. vendor/maxmind-db/reader/src/MaxMind/Db/Reader.php +49 -95
  27. vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php +82 -111
  28. vendor/maxmind-db/reader/src/MaxMind/Db/Reader/InvalidDatabaseException.php +0 -2
  29. vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Metadata.php +62 -86
  30. vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Util.php +2 -8
  31. vendor/maxmind/web-service-common/CHANGELOG.md +0 -15
  32. vendor/maxmind/web-service-common/README.md +1 -1
  33. vendor/maxmind/web-service-common/composer.json +2 -2
  34. vendor/maxmind/web-service-common/src/Exception/AuthenticationException.php +0 -2
  35. vendor/maxmind/web-service-common/src/Exception/HttpException.php +5 -7
  36. vendor/maxmind/web-service-common/src/Exception/InsufficientFundsException.php +0 -2
  37. vendor/maxmind/web-service-common/src/Exception/InvalidInputException.php +0 -2
  38. vendor/maxmind/web-service-common/src/Exception/InvalidRequestException.php +6 -8
  39. vendor/maxmind/web-service-common/src/Exception/IpAddressNotFoundException.php +0 -2
  40. vendor/maxmind/web-service-common/src/Exception/PermissionRequiredException.php +0 -2
  41. vendor/maxmind/web-service-common/src/Exception/WebServiceException.php +0 -2
  42. vendor/maxmind/web-service-common/src/WebService/Client.php +49 -51
  43. vendor/maxmind/web-service-common/src/WebService/Http/CurlRequest.php +15 -15
  44. vendor/maxmind/web-service-common/src/WebService/Http/Request.php +15 -5
  45. vendor/maxmind/web-service-common/src/WebService/Http/RequestFactory.php +4 -3
  46. vendor/symfony/property-info/Extractor/PhpDocExtractor.php +32 -2
  47. vendor/symfony/property-info/Extractor/ReflectionExtractor.php +2 -2
  48. vendor/symfony/property-info/Util/PhpDocTypeHelper.php +4 -0
  49. vendor/symfony/string/Resources/functions.php +19 -13
  50. yarn.lock +513 -32
composer.json CHANGED
@@ -4,7 +4,7 @@
4
  "type": "wordpress-plugin",
5
  "authors": [
6
  {
7
- "name": "Benjamin Pick (wp-geoip-detect| |posteo.de)"
8
  }
9
  ],
10
  "keywords": [],
@@ -15,13 +15,15 @@
15
  "require": {
16
  "php": ">=7.2.5",
17
  "geoip2/geoip2": "2.10.0",
18
- "symfony/property-access": "^5.2",
19
- "symfony/http-foundation": "^5.2"
 
 
20
  },
21
  "require-dev": {
22
- "phpunit/phpunit": "^7.5",
23
- "roots/wordpress": "5.6",
24
- "wp-phpunit/wp-phpunit": "5.6"
25
  },
26
  "scripts": {
27
  "test": "phpunit"
4
  "type": "wordpress-plugin",
5
  "authors": [
6
  {
7
+ "name": "Benjamin Pick (wp-geoip-detect posteo de)"
8
  }
9
  ],
10
  "keywords": [],
15
  "require": {
16
  "php": ">=7.2.5",
17
  "geoip2/geoip2": "2.10.0",
18
+ "maxmind-db/reader": "1.6.0",
19
+ "maxmind/web-service-common": "0.7.0",
20
+ "symfony/property-access": "5.2.4",
21
+ "symfony/http-foundation": "5.2.4"
22
  },
23
  "require-dev": {
24
+ "phpunit/phpunit": "7.5.20",
25
+ "roots/wordpress": "5.6.2",
26
+ "wp-phpunit/wp-phpunit": "5.6.2"
27
  },
28
  "scripts": {
29
  "test": "phpunit"
composer.lock CHANGED
@@ -4,7 +4,7 @@
4
  "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
  "This file is @generated automatically"
6
  ],
7
- "content-hash": "0d123e07b2ea190b37b3dd96baaa0fc6",
8
  "packages": [
9
  {
10
  "name": "composer/ca-bundle",
@@ -118,30 +118,29 @@
118
  },
119
  {
120
  "name": "maxmind-db/reader",
121
- "version": "v1.10.0",
122
  "source": {
123
  "type": "git",
124
  "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
125
- "reference": "07f84d969cfc527ce49388558a366ad376f1f35c"
126
  },
127
  "dist": {
128
  "type": "zip",
129
- "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/07f84d969cfc527ce49388558a366ad376f1f35c",
130
- "reference": "07f84d969cfc527ce49388558a366ad376f1f35c",
131
  "shasum": ""
132
  },
133
  "require": {
134
- "php": ">=7.2"
135
  },
136
  "conflict": {
137
- "ext-maxminddb": "<1.10.0,>=2.0.0"
138
  },
139
  "require-dev": {
140
- "friendsofphp/php-cs-fixer": "*",
141
  "php-coveralls/php-coveralls": "^2.1",
142
- "phpstan/phpstan": "*",
143
- "phpunit/phpcov": ">=6.0.0",
144
- "phpunit/phpunit": ">=8.0.0,<10.0.0",
145
  "squizlabs/php_codesniffer": "3.*"
146
  },
147
  "suggest": {
@@ -175,31 +174,31 @@
175
  "geolocation",
176
  "maxmind"
177
  ],
178
- "time": "2021-02-09T17:52:47+00:00"
179
  },
180
  {
181
  "name": "maxmind/web-service-common",
182
- "version": "v0.8.1",
183
  "source": {
184
  "type": "git",
185
  "url": "https://github.com/maxmind/web-service-common-php.git",
186
- "reference": "32f274051c543fc865e5a84d3a2c703913641ea8"
187
  },
188
  "dist": {
189
  "type": "zip",
190
- "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/32f274051c543fc865e5a84d3a2c703913641ea8",
191
- "reference": "32f274051c543fc865e5a84d3a2c703913641ea8",
192
  "shasum": ""
193
  },
194
  "require": {
195
  "composer/ca-bundle": "^1.0.3",
196
  "ext-curl": "*",
197
  "ext-json": "*",
198
- "php": ">=7.2"
199
  },
200
  "require-dev": {
201
  "friendsofphp/php-cs-fixer": "2.*",
202
- "phpunit/phpunit": "^8.0 || ^9.0",
203
  "squizlabs/php_codesniffer": "3.*"
204
  },
205
  "type": "library",
@@ -221,7 +220,7 @@
221
  ],
222
  "description": "Internal MaxMind Web Service API",
223
  "homepage": "https://github.com/maxmind/web-service-common-php",
224
- "time": "2020-11-02T17:00:53+00:00"
225
  },
226
  {
227
  "name": "symfony/deprecation-contracts",
@@ -275,16 +274,16 @@
275
  },
276
  {
277
  "name": "symfony/http-foundation",
278
- "version": "v5.2.3",
279
  "source": {
280
  "type": "git",
281
  "url": "https://github.com/symfony/http-foundation.git",
282
- "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36"
283
  },
284
  "dist": {
285
  "type": "zip",
286
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/20c554c0f03f7cde5ce230ed248470cccbc34c36",
287
- "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36",
288
  "shasum": ""
289
  },
290
  "require": {
@@ -327,7 +326,7 @@
327
  ],
328
  "description": "Defines an object-oriented layer for the HTTP specification",
329
  "homepage": "https://symfony.com",
330
- "time": "2021-02-03T04:42:09+00:00"
331
  },
332
  {
333
  "name": "symfony/polyfill-ctype",
@@ -653,7 +652,7 @@
653
  },
654
  {
655
  "name": "symfony/property-access",
656
- "version": "v5.2.3",
657
  "source": {
658
  "type": "git",
659
  "url": "https://github.com/symfony/property-access.git",
@@ -717,16 +716,16 @@
717
  },
718
  {
719
  "name": "symfony/property-info",
720
- "version": "v5.2.3",
721
  "source": {
722
  "type": "git",
723
  "url": "https://github.com/symfony/property-info.git",
724
- "reference": "4e4f368c3737b1c175d66f4fc0b99a5bcd161a77"
725
  },
726
  "dist": {
727
  "type": "zip",
728
- "url": "https://api.github.com/repos/symfony/property-info/zipball/4e4f368c3737b1c175d66f4fc0b99a5bcd161a77",
729
- "reference": "4e4f368c3737b1c175d66f4fc0b99a5bcd161a77",
730
  "shasum": ""
731
  },
732
  "require": {
@@ -786,20 +785,20 @@
786
  "type",
787
  "validator"
788
  ],
789
- "time": "2021-01-27T10:15:41+00:00"
790
  },
791
  {
792
  "name": "symfony/string",
793
- "version": "v5.2.3",
794
  "source": {
795
  "type": "git",
796
  "url": "https://github.com/symfony/string.git",
797
- "reference": "c95468897f408dd0aca2ff582074423dd0455122"
798
  },
799
  "dist": {
800
  "type": "zip",
801
- "url": "https://api.github.com/repos/symfony/string/zipball/c95468897f408dd0aca2ff582074423dd0455122",
802
- "reference": "c95468897f408dd0aca2ff582074423dd0455122",
803
  "shasum": ""
804
  },
805
  "require": {
@@ -852,7 +851,7 @@
852
  "utf-8",
853
  "utf8"
854
  ],
855
- "time": "2021-01-25T15:14:59+00:00"
856
  }
857
  ],
858
  "packages-dev": [
@@ -905,6 +904,20 @@
905
  "constructor",
906
  "instantiate"
907
  ],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
908
  "time": "2020-11-10T18:47:58+00:00"
909
  },
910
  {
@@ -953,6 +966,12 @@
953
  "object",
954
  "object graph"
955
  ],
 
 
 
 
 
 
956
  "time": "2020-11-13T09:40:50+00:00"
957
  },
958
  {
@@ -1377,6 +1396,12 @@
1377
  "filesystem",
1378
  "iterator"
1379
  ],
 
 
 
 
 
 
1380
  "time": "2020-11-30T08:25:21+00:00"
1381
  },
1382
  {
@@ -1467,6 +1492,12 @@
1467
  "keywords": [
1468
  "timer"
1469
  ],
 
 
 
 
 
 
1470
  "time": "2020-11-30T08:20:02+00:00"
1471
  },
1472
  {
@@ -1516,6 +1547,12 @@
1516
  "keywords": [
1517
  "tokenizer"
1518
  ],
 
 
 
 
 
 
1519
  "abandoned": true,
1520
  "time": "2020-11-30T08:38:46+00:00"
1521
  },
@@ -1605,15 +1642,15 @@
1605
  },
1606
  {
1607
  "name": "roots/wordpress",
1608
- "version": "5.6",
1609
  "source": {
1610
  "type": "git",
1611
  "url": "https://github.com/WordPress/WordPress.git",
1612
- "reference": "5.6"
1613
  },
1614
  "dist": {
1615
  "type": "zip",
1616
- "url": "https://api.github.com/repos/WordPress/WordPress/zipball/5.6"
1617
  },
1618
  "require": {
1619
  "php": ">=5.3.2",
@@ -1637,7 +1674,17 @@
1637
  "cms",
1638
  "wordpress"
1639
  ],
1640
- "time": "2020-12-08T22:15:57+00:00"
 
 
 
 
 
 
 
 
 
 
1641
  },
1642
  {
1643
  "name": "roots/wordpress-core-installer",
@@ -1694,6 +1741,16 @@
1694
  "keywords": [
1695
  "wordpress"
1696
  ],
 
 
 
 
 
 
 
 
 
 
1697
  "time": "2020-08-20T00:27:30+00:00"
1698
  },
1699
  {
@@ -1739,6 +1796,12 @@
1739
  ],
1740
  "description": "Looks up which function or method a line of code belongs to",
1741
  "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
 
 
 
 
 
 
1742
  "time": "2020-11-30T08:15:22+00:00"
1743
  },
1744
  {
@@ -1803,6 +1866,12 @@
1803
  "compare",
1804
  "equality"
1805
  ],
 
 
 
 
 
 
1806
  "time": "2020-11-30T08:04:30+00:00"
1807
  },
1808
  {
@@ -1859,6 +1928,12 @@
1859
  "unidiff",
1860
  "unified diff"
1861
  ],
 
 
 
 
 
 
1862
  "time": "2020-11-30T07:59:04+00:00"
1863
  },
1864
  {
@@ -1912,6 +1987,12 @@
1912
  "environment",
1913
  "hhvm"
1914
  ],
 
 
 
 
 
 
1915
  "time": "2020-11-30T07:53:42+00:00"
1916
  },
1917
  {
@@ -1979,6 +2060,12 @@
1979
  "export",
1980
  "exporter"
1981
  ],
 
 
 
 
 
 
1982
  "time": "2020-11-30T07:47:53+00:00"
1983
  },
1984
  {
@@ -2077,6 +2164,12 @@
2077
  ],
2078
  "description": "Traverses array structures and object graphs to enumerate all referenced objects",
2079
  "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
 
 
 
 
 
 
2080
  "time": "2020-11-30T07:40:27+00:00"
2081
  },
2082
  {
@@ -2122,6 +2215,12 @@
2122
  ],
2123
  "description": "Allows reflection of object attributes, including inherited and non-public ones",
2124
  "homepage": "https://github.com/sebastianbergmann/object-reflector/",
 
 
 
 
 
 
2125
  "time": "2020-11-30T07:37:18+00:00"
2126
  },
2127
  {
@@ -2175,6 +2274,12 @@
2175
  ],
2176
  "description": "Provides functionality to recursively process PHP variables",
2177
  "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
 
 
 
 
 
 
2178
  "time": "2020-11-30T07:34:24+00:00"
2179
  },
2180
  {
@@ -2217,6 +2322,12 @@
2217
  ],
2218
  "description": "Provides a list of PHP built-in functions that operate on resources",
2219
  "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
 
 
 
 
 
 
2220
  "time": "2020-11-30T07:30:19+00:00"
2221
  },
2222
  {
@@ -2300,6 +2411,12 @@
2300
  }
2301
  ],
2302
  "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
 
 
 
 
 
 
2303
  "time": "2020-07-12T23:59:07+00:00"
2304
  },
2305
  {
@@ -2353,16 +2470,16 @@
2353
  },
2354
  {
2355
  "name": "wp-phpunit/wp-phpunit",
2356
- "version": "5.6.0",
2357
  "source": {
2358
  "type": "git",
2359
  "url": "https://github.com/wp-phpunit/wp-phpunit.git",
2360
- "reference": "7130a214573cc8c12a0f8fe8a74b18b453bce1e9"
2361
  },
2362
  "dist": {
2363
  "type": "zip",
2364
- "url": "https://api.github.com/repos/wp-phpunit/wp-phpunit/zipball/7130a214573cc8c12a0f8fe8a74b18b453bce1e9",
2365
- "reference": "7130a214573cc8c12a0f8fe8a74b18b453bce1e9",
2366
  "shasum": ""
2367
  },
2368
  "type": "library",
@@ -2392,7 +2509,7 @@
2392
  "test",
2393
  "wordpress"
2394
  ],
2395
- "time": "2020-12-09T18:06:02+00:00"
2396
  }
2397
  ],
2398
  "aliases": [],
@@ -2403,5 +2520,6 @@
2403
  "platform": {
2404
  "php": ">=7.2.5"
2405
  },
2406
- "platform-dev": []
 
2407
  }
4
  "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
  "This file is @generated automatically"
6
  ],
7
+ "content-hash": "43cdc359395ba142c745e032b2f10112",
8
  "packages": [
9
  {
10
  "name": "composer/ca-bundle",
118
  },
119
  {
120
  "name": "maxmind-db/reader",
121
+ "version": "v1.6.0",
122
  "source": {
123
  "type": "git",
124
  "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
125
+ "reference": "febd4920bf17c1da84cef58e56a8227dfb37fbe4"
126
  },
127
  "dist": {
128
  "type": "zip",
129
+ "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/febd4920bf17c1da84cef58e56a8227dfb37fbe4",
130
+ "reference": "febd4920bf17c1da84cef58e56a8227dfb37fbe4",
131
  "shasum": ""
132
  },
133
  "require": {
134
+ "php": ">=5.6"
135
  },
136
  "conflict": {
137
+ "ext-maxminddb": "<1.6.0,>=2.0.0"
138
  },
139
  "require-dev": {
140
+ "friendsofphp/php-cs-fixer": "2.*",
141
  "php-coveralls/php-coveralls": "^2.1",
142
+ "phpunit/phpcov": "^3.0",
143
+ "phpunit/phpunit": "5.*",
 
144
  "squizlabs/php_codesniffer": "3.*"
145
  },
146
  "suggest": {
174
  "geolocation",
175
  "maxmind"
176
  ],
177
+ "time": "2019-12-19T22:59:03+00:00"
178
  },
179
  {
180
  "name": "maxmind/web-service-common",
181
+ "version": "v0.7.0",
182
  "source": {
183
  "type": "git",
184
  "url": "https://github.com/maxmind/web-service-common-php.git",
185
+ "reference": "74c996c218ada5c639c8c2f076756e059f5552fc"
186
  },
187
  "dist": {
188
  "type": "zip",
189
+ "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/74c996c218ada5c639c8c2f076756e059f5552fc",
190
+ "reference": "74c996c218ada5c639c8c2f076756e059f5552fc",
191
  "shasum": ""
192
  },
193
  "require": {
194
  "composer/ca-bundle": "^1.0.3",
195
  "ext-curl": "*",
196
  "ext-json": "*",
197
+ "php": ">=5.6"
198
  },
199
  "require-dev": {
200
  "friendsofphp/php-cs-fixer": "2.*",
201
+ "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0",
202
  "squizlabs/php_codesniffer": "3.*"
203
  },
204
  "type": "library",
220
  ],
221
  "description": "Internal MaxMind Web Service API",
222
  "homepage": "https://github.com/maxmind/web-service-common-php",
223
+ "time": "2020-05-06T14:07:26+00:00"
224
  },
225
  {
226
  "name": "symfony/deprecation-contracts",
274
  },
275
  {
276
  "name": "symfony/http-foundation",
277
+ "version": "v5.2.4",
278
  "source": {
279
  "type": "git",
280
  "url": "https://github.com/symfony/http-foundation.git",
281
+ "reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf"
282
  },
283
  "dist": {
284
  "type": "zip",
285
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/54499baea7f7418bce7b5ec92770fd0799e8e9bf",
286
+ "reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf",
287
  "shasum": ""
288
  },
289
  "require": {
326
  ],
327
  "description": "Defines an object-oriented layer for the HTTP specification",
328
  "homepage": "https://symfony.com",
329
+ "time": "2021-02-25T17:16:57+00:00"
330
  },
331
  {
332
  "name": "symfony/polyfill-ctype",
652
  },
653
  {
654
  "name": "symfony/property-access",
655
+ "version": "v5.2.4",
656
  "source": {
657
  "type": "git",
658
  "url": "https://github.com/symfony/property-access.git",
716
  },
717
  {
718
  "name": "symfony/property-info",
719
+ "version": "v5.2.4",
720
  "source": {
721
  "type": "git",
722
  "url": "https://github.com/symfony/property-info.git",
723
+ "reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189"
724
  },
725
  "dist": {
726
  "type": "zip",
727
+ "url": "https://api.github.com/repos/symfony/property-info/zipball/7185bbc74e6f49c3f1b5936b4d9e4ca133921189",
728
+ "reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189",
729
  "shasum": ""
730
  },
731
  "require": {
785
  "type",
786
  "validator"
787
  ],
788
+ "time": "2021-02-17T15:24:54+00:00"
789
  },
790
  {
791
  "name": "symfony/string",
792
+ "version": "v5.2.4",
793
  "source": {
794
  "type": "git",
795
  "url": "https://github.com/symfony/string.git",
796
+ "reference": "4e78d7d47061fa183639927ec40d607973699609"
797
  },
798
  "dist": {
799
  "type": "zip",
800
+ "url": "https://api.github.com/repos/symfony/string/zipball/4e78d7d47061fa183639927ec40d607973699609",
801
+ "reference": "4e78d7d47061fa183639927ec40d607973699609",
802
  "shasum": ""
803
  },
804
  "require": {
851
  "utf-8",
852
  "utf8"
853
  ],
854
+ "time": "2021-02-16T10:20:28+00:00"
855
  }
856
  ],
857
  "packages-dev": [
904
  "constructor",
905
  "instantiate"
906
  ],
907
+ "funding": [
908
+ {
909
+ "url": "https://www.doctrine-project.org/sponsorship.html",
910
+ "type": "custom"
911
+ },
912
+ {
913
+ "url": "https://www.patreon.com/phpdoctrine",
914
+ "type": "patreon"
915
+ },
916
+ {
917
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
918
+ "type": "tidelift"
919
+ }
920
+ ],
921
  "time": "2020-11-10T18:47:58+00:00"
922
  },
923
  {
966
  "object",
967
  "object graph"
968
  ],
969
+ "funding": [
970
+ {
971
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
972
+ "type": "tidelift"
973
+ }
974
+ ],
975
  "time": "2020-11-13T09:40:50+00:00"
976
  },
977
  {
1396
  "filesystem",
1397
  "iterator"
1398
  ],
1399
+ "funding": [
1400
+ {
1401
+ "url": "https://github.com/sebastianbergmann",
1402
+ "type": "github"
1403
+ }
1404
+ ],
1405
  "time": "2020-11-30T08:25:21+00:00"
1406
  },
1407
  {
1492
  "keywords": [
1493
  "timer"
1494
  ],
1495
+ "funding": [
1496
+ {
1497
+ "url": "https://github.com/sebastianbergmann",
1498
+ "type": "github"
1499
+ }
1500
+ ],
1501
  "time": "2020-11-30T08:20:02+00:00"
1502
  },
1503
  {
1547
  "keywords": [
1548
  "tokenizer"
1549
  ],
1550
+ "funding": [
1551
+ {
1552
+ "url": "https://github.com/sebastianbergmann",
1553
+ "type": "github"
1554
+ }
1555
+ ],
1556
  "abandoned": true,
1557
  "time": "2020-11-30T08:38:46+00:00"
1558
  },
1642
  },
1643
  {
1644
  "name": "roots/wordpress",
1645
+ "version": "5.6.2",
1646
  "source": {
1647
  "type": "git",
1648
  "url": "https://github.com/WordPress/WordPress.git",
1649
+ "reference": "5.6.2"
1650
  },
1651
  "dist": {
1652
  "type": "zip",
1653
+ "url": "https://api.github.com/repos/WordPress/WordPress/zipball/5.6.2"
1654
  },
1655
  "require": {
1656
  "php": ">=5.3.2",
1674
  "cms",
1675
  "wordpress"
1676
  ],
1677
+ "funding": [
1678
+ {
1679
+ "url": "https://github.com/roots",
1680
+ "type": "github"
1681
+ },
1682
+ {
1683
+ "url": "https://www.patreon.com/rootsdev",
1684
+ "type": "patreon"
1685
+ }
1686
+ ],
1687
+ "time": "2021-02-22T15:12:53+00:00"
1688
  },
1689
  {
1690
  "name": "roots/wordpress-core-installer",
1741
  "keywords": [
1742
  "wordpress"
1743
  ],
1744
+ "funding": [
1745
+ {
1746
+ "url": "https://github.com/roots",
1747
+ "type": "github"
1748
+ },
1749
+ {
1750
+ "url": "https://www.patreon.com/rootsdev",
1751
+ "type": "patreon"
1752
+ }
1753
+ ],
1754
  "time": "2020-08-20T00:27:30+00:00"
1755
  },
1756
  {
1796
  ],
1797
  "description": "Looks up which function or method a line of code belongs to",
1798
  "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
1799
+ "funding": [
1800
+ {
1801
+ "url": "https://github.com/sebastianbergmann",
1802
+ "type": "github"
1803
+ }
1804
+ ],
1805
  "time": "2020-11-30T08:15:22+00:00"
1806
  },
1807
  {
1866
  "compare",
1867
  "equality"
1868
  ],
1869
+ "funding": [
1870
+ {
1871
+ "url": "https://github.com/sebastianbergmann",
1872
+ "type": "github"
1873
+ }
1874
+ ],
1875
  "time": "2020-11-30T08:04:30+00:00"
1876
  },
1877
  {
1928
  "unidiff",
1929
  "unified diff"
1930
  ],
1931
+ "funding": [
1932
+ {
1933
+ "url": "https://github.com/sebastianbergmann",
1934
+ "type": "github"
1935
+ }
1936
+ ],
1937
  "time": "2020-11-30T07:59:04+00:00"
1938
  },
1939
  {
1987
  "environment",
1988
  "hhvm"
1989
  ],
1990
+ "funding": [
1991
+ {
1992
+ "url": "https://github.com/sebastianbergmann",
1993
+ "type": "github"
1994
+ }
1995
+ ],
1996
  "time": "2020-11-30T07:53:42+00:00"
1997
  },
1998
  {
2060
  "export",
2061
  "exporter"
2062
  ],
2063
+ "funding": [
2064
+ {
2065
+ "url": "https://github.com/sebastianbergmann",
2066
+ "type": "github"
2067
+ }
2068
+ ],
2069
  "time": "2020-11-30T07:47:53+00:00"
2070
  },
2071
  {
2164
  ],
2165
  "description": "Traverses array structures and object graphs to enumerate all referenced objects",
2166
  "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
2167
+ "funding": [
2168
+ {
2169
+ "url": "https://github.com/sebastianbergmann",
2170
+ "type": "github"
2171
+ }
2172
+ ],
2173
  "time": "2020-11-30T07:40:27+00:00"
2174
  },
2175
  {
2215
  ],
2216
  "description": "Allows reflection of object attributes, including inherited and non-public ones",
2217
  "homepage": "https://github.com/sebastianbergmann/object-reflector/",
2218
+ "funding": [
2219
+ {
2220
+ "url": "https://github.com/sebastianbergmann",
2221
+ "type": "github"
2222
+ }
2223
+ ],
2224
  "time": "2020-11-30T07:37:18+00:00"
2225
  },
2226
  {
2274
  ],
2275
  "description": "Provides functionality to recursively process PHP variables",
2276
  "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
2277
+ "funding": [
2278
+ {
2279
+ "url": "https://github.com/sebastianbergmann",
2280
+ "type": "github"
2281
+ }
2282
+ ],
2283
  "time": "2020-11-30T07:34:24+00:00"
2284
  },
2285
  {
2322
  ],
2323
  "description": "Provides a list of PHP built-in functions that operate on resources",
2324
  "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
2325
+ "funding": [
2326
+ {
2327
+ "url": "https://github.com/sebastianbergmann",
2328
+ "type": "github"
2329
+ }
2330
+ ],
2331
  "time": "2020-11-30T07:30:19+00:00"
2332
  },
2333
  {
2411
  }
2412
  ],
2413
  "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
2414
+ "funding": [
2415
+ {
2416
+ "url": "https://github.com/theseer",
2417
+ "type": "github"
2418
+ }
2419
+ ],
2420
  "time": "2020-07-12T23:59:07+00:00"
2421
  },
2422
  {
2470
  },
2471
  {
2472
  "name": "wp-phpunit/wp-phpunit",
2473
+ "version": "5.6.2",
2474
  "source": {
2475
  "type": "git",
2476
  "url": "https://github.com/wp-phpunit/wp-phpunit.git",
2477
+ "reference": "f6b3fb65bccc0ff70b3bc7cc241935597dbd5562"
2478
  },
2479
  "dist": {
2480
  "type": "zip",
2481
+ "url": "https://api.github.com/repos/wp-phpunit/wp-phpunit/zipball/f6b3fb65bccc0ff70b3bc7cc241935597dbd5562",
2482
+ "reference": "f6b3fb65bccc0ff70b3bc7cc241935597dbd5562",
2483
  "shasum": ""
2484
  },
2485
  "type": "library",
2509
  "test",
2510
  "wordpress"
2511
  ],
2512
+ "time": "2021-02-04T18:24:14+00:00"
2513
  }
2514
  ],
2515
  "aliases": [],
2520
  "platform": {
2521
  "php": ">=7.2.5"
2522
  },
2523
+ "platform-dev": [],
2524
+ "plugin-api-version": "1.1.0"
2525
  }
geoip-detect.php CHANGED
@@ -5,7 +5,7 @@ Plugin URI: http://www.yellowtree.de
5
  Description: Retrieving Geo-Information using the Maxmind GeoIP (Lite) Database.
6
  Author: Yellow Tree (Benjamin Pick)
7
  Author URI: http://www.yellowtree.de
8
- Version: 4.0.1
9
  License: GPLv3 or later
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
  Text Domain: geoip-detect
@@ -16,7 +16,7 @@ Requires WP: 5.0
16
  Requires PHP: 7.2.5
17
  */
18
 
19
- define('GEOIP_DETECT_VERSION', '4.0.1');
20
 
21
  /*
22
  Copyright 2013-2021 Yellow Tree, Siegen, Germany
5
  Description: Retrieving Geo-Information using the Maxmind GeoIP (Lite) Database.
6
  Author: Yellow Tree (Benjamin Pick)
7
  Author URI: http://www.yellowtree.de
8
+ Version: 4.1.0
9
  License: GPLv3 or later
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
  Text Domain: geoip-detect
16
  Requires PHP: 7.2.5
17
  */
18
 
19
+ define('GEOIP_DETECT_VERSION', '4.1.0');
20
 
21
  /*
22
  Copyright 2013-2021 Yellow Tree, Siegen, Germany
js/body_classes.js CHANGED
@@ -1,6 +1,15 @@
1
  import { domReady } from './lib/html';
2
  import { get_info } from './lookup';
3
 
 
 
 
 
 
 
 
 
 
4
  export async function add_body_classes() {
5
  const record = await get_info();
6
 
@@ -9,12 +18,7 @@ export async function add_body_classes() {
9
  return;
10
  }
11
 
12
- const css_classes = {
13
- country: record.get('country.iso_code'),
14
- 'country-is-in-european-union': record.has_property('country.is_in_european_union') && record.get('country.is_in_european_union'),
15
- continent: record.get('continent.code'),
16
- province: record.get('most_specific_subdivision.iso_code'),
17
- };
18
 
19
  await domReady;
20
 
1
  import { domReady } from './lib/html';
2
  import { get_info } from './lookup';
3
 
4
+ export function calc_classes(record) {
5
+ return {
6
+ country: record.get('country.iso_code'),
7
+ 'country-is-in-european-union': record.get('country.is_in_european_union', false),
8
+ continent: record.get('continent.code'),
9
+ province: record.get('most_specific_subdivision.iso_code'),
10
+ };
11
+ }
12
+
13
  export async function add_body_classes() {
14
  const record = await get_info();
15
 
18
  return;
19
  }
20
 
21
+ const css_classes = calc_classes(record);
 
 
 
 
 
22
 
23
  await domReady;
24
 
js/body_classes.test.js ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { getTestRecord, getTestRecordError } from "./test-lib/test-records";
2
+ import { calc_classes } from "./body_classes";
3
+ import Record from "./models/record";
4
+
5
+
6
+ const emptyRecord = new Record();
7
+ const defaultRecord = getTestRecord();
8
+ const errorRecord = getTestRecordError();
9
+
10
+ test('calc_classes', () => {
11
+ expect(calc_classes(defaultRecord)).toStrictEqual({
12
+ "continent": "EU",
13
+ "country": "DE",
14
+ "country-is-in-european-union": false, /* because the test data set has EU not set yet */
15
+ "province": "HE",
16
+ });
17
+ expect(calc_classes(errorRecord)).toStrictEqual({
18
+ "continent": "",
19
+ "country": "",
20
+ "country-is-in-european-union": false,
21
+ "province": "",
22
+ });
23
+ expect(calc_classes(emptyRecord)).toStrictEqual({
24
+ "continent": "",
25
+ "country": "",
26
+ "country-is-in-european-union": false,
27
+ "province": "",
28
+ });
29
+
30
+ });
js/dist/frontend.1115d690.js ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"LNzP":[function(require,module,exports) {
2
+ function o(t){return"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?module.exports=o=function(o){return typeof o}:module.exports=o=function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},o(t)}module.exports=o;
3
+ },{}],"fwsn":[function(require,module,exports) {
4
+ function n(n,t,o,r,e,i,u){try{var c=n[i](u),v=c.value}catch(a){return void o(a)}c.done?t(v):Promise.resolve(v).then(r,e)}function t(t){return function(){var o=this,r=arguments;return new Promise(function(e,i){var u=t.apply(o,r);function c(t){n(u,e,i,c,v,"next",t)}function v(t){n(u,e,i,c,v,"throw",t)}c(void 0)})}}module.exports=t;
5
+ },{}],"KA2S":[function(require,module,exports) {
6
+ var define;
7
+ var t,r=function(t){"use strict";var r,e=Object.prototype,n=e.hasOwnProperty,o="function"==typeof Symbol?Symbol:{},i=o.iterator||"@@iterator",a=o.asyncIterator||"@@asyncIterator",c=o.toStringTag||"@@toStringTag";function u(t,r,e){return Object.defineProperty(t,r,{value:e,enumerable:!0,configurable:!0,writable:!0}),t[r]}try{u({},"")}catch(P){u=function(t,r,e){return t[r]=e}}function h(t,r,e,n){var o=r&&r.prototype instanceof d?r:d,i=Object.create(o.prototype),a=new G(n||[]);return i._invoke=function(t,r,e){var n=l;return function(o,i){if(n===p)throw new Error("Generator is already running");if(n===y){if("throw"===o)throw i;return F()}for(e.method=o,e.arg=i;;){var a=e.delegate;if(a){var c=j(a,e);if(c){if(c===v)continue;return c}}if("next"===e.method)e.sent=e._sent=e.arg;else if("throw"===e.method){if(n===l)throw n=y,e.arg;e.dispatchException(e.arg)}else"return"===e.method&&e.abrupt("return",e.arg);n=p;var u=f(t,r,e);if("normal"===u.type){if(n=e.done?y:s,u.arg===v)continue;return{value:u.arg,done:e.done}}"throw"===u.type&&(n=y,e.method="throw",e.arg=u.arg)}}}(t,e,a),i}function f(t,r,e){try{return{type:"normal",arg:t.call(r,e)}}catch(P){return{type:"throw",arg:P}}}t.wrap=h;var l="suspendedStart",s="suspendedYield",p="executing",y="completed",v={};function d(){}function g(){}function m(){}var w={};w[i]=function(){return this};var L=Object.getPrototypeOf,x=L&&L(L(N([])));x&&x!==e&&n.call(x,i)&&(w=x);var b=m.prototype=d.prototype=Object.create(w);function E(t){["next","throw","return"].forEach(function(r){u(t,r,function(t){return this._invoke(r,t)})})}function _(t,r){var e;this._invoke=function(o,i){function a(){return new r(function(e,a){!function e(o,i,a,c){var u=f(t[o],t,i);if("throw"!==u.type){var h=u.arg,l=h.value;return l&&"object"==typeof l&&n.call(l,"__await")?r.resolve(l.__await).then(function(t){e("next",t,a,c)},function(t){e("throw",t,a,c)}):r.resolve(l).then(function(t){h.value=t,a(h)},function(t){return e("throw",t,a,c)})}c(u.arg)}(o,i,e,a)})}return e=e?e.then(a,a):a()}}function j(t,e){var n=t.iterator[e.method];if(n===r){if(e.delegate=null,"throw"===e.method){if(t.iterator.return&&(e.method="return",e.arg=r,j(t,e),"throw"===e.method))return v;e.method="throw",e.arg=new TypeError("The iterator does not provide a 'throw' method")}return v}var o=f(n,t.iterator,e.arg);if("throw"===o.type)return e.method="throw",e.arg=o.arg,e.delegate=null,v;var i=o.arg;return i?i.done?(e[t.resultName]=i.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=r),e.delegate=null,v):i:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,v)}function O(t){var r={tryLoc:t[0]};1 in t&&(r.catchLoc=t[1]),2 in t&&(r.finallyLoc=t[2],r.afterLoc=t[3]),this.tryEntries.push(r)}function k(t){var r=t.completion||{};r.type="normal",delete r.arg,t.completion=r}function G(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(O,this),this.reset(!0)}function N(t){if(t){var e=t[i];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,a=function e(){for(;++o<t.length;)if(n.call(t,o))return e.value=t[o],e.done=!1,e;return e.value=r,e.done=!0,e};return a.next=a}}return{next:F}}function F(){return{value:r,done:!0}}return g.prototype=b.constructor=m,m.constructor=g,g.displayName=u(m,c,"GeneratorFunction"),t.isGeneratorFunction=function(t){var r="function"==typeof t&&t.constructor;return!!r&&(r===g||"GeneratorFunction"===(r.displayName||r.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,m):(t.__proto__=m,u(t,c,"GeneratorFunction")),t.prototype=Object.create(b),t},t.awrap=function(t){return{__await:t}},E(_.prototype),_.prototype[a]=function(){return this},t.AsyncIterator=_,t.async=function(r,e,n,o,i){void 0===i&&(i=Promise);var a=new _(h(r,e,n,o),i);return t.isGeneratorFunction(e)?a:a.next().then(function(t){return t.done?t.value:a.next()})},E(b),u(b,c,"Generator"),b[i]=function(){return this},b.toString=function(){return"[object Generator]"},t.keys=function(t){var r=[];for(var e in t)r.push(e);return r.reverse(),function e(){for(;r.length;){var n=r.pop();if(n in t)return e.value=n,e.done=!1,e}return e.done=!0,e}},t.values=N,G.prototype={constructor:G,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=r,this.done=!1,this.delegate=null,this.method="next",this.arg=r,this.tryEntries.forEach(k),!t)for(var e in this)"t"===e.charAt(0)&&n.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=r)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function o(n,o){return c.type="throw",c.arg=t,e.next=n,o&&(e.method="next",e.arg=r),!!o}for(var i=this.tryEntries.length-1;i>=0;--i){var a=this.tryEntries[i],c=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var u=n.call(a,"catchLoc"),h=n.call(a,"finallyLoc");if(u&&h){if(this.prev<a.catchLoc)return o(a.catchLoc,!0);if(this.prev<a.finallyLoc)return o(a.finallyLoc)}else if(u){if(this.prev<a.catchLoc)return o(a.catchLoc,!0)}else{if(!h)throw new Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return o(a.finallyLoc)}}}},abrupt:function(t,r){for(var e=this.tryEntries.length-1;e>=0;--e){var o=this.tryEntries[e];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===t||"continue"===t)&&i.tryLoc<=r&&r<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=t,a.arg=r,i?(this.method="next",this.next=i.finallyLoc,v):this.complete(a)},complete:function(t,r){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&r&&(this.next=r),v},finish:function(t){for(var r=this.tryEntries.length-1;r>=0;--r){var e=this.tryEntries[r];if(e.finallyLoc===t)return this.complete(e.completion,e.afterLoc),k(e),v}},catch:function(t){for(var r=this.tryEntries.length-1;r>=0;--r){var e=this.tryEntries[r];if(e.tryLoc===t){var n=e.completion;if("throw"===n.type){var o=n.arg;k(e)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:N(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=r),v}},t}("object"==typeof module?module.exports:{});try{regeneratorRuntime=r}catch(e){Function("r","regeneratorRuntime = r")(r)}
8
+ },{}],"m4eR":[function(require,module,exports) {
9
+ module.exports=require("regenerator-runtime");
10
+ },{"regenerator-runtime":"KA2S"}],"ZBnv":[function(require,module,exports) {
11
+ function n(n,o){if(!(n instanceof o))throw new TypeError("Cannot call a class as a function")}module.exports=n;
12
+ },{}],"NoOd":[function(require,module,exports) {
13
+ function e(e,r){for(var n=0;n<r.length;n++){var t=r[n];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(e,t.key,t)}}function r(r,n,t){return n&&e(r.prototype,n),t&&e(r,t),r}module.exports=r;
14
+ },{}],"AuD4":[function(require,module,exports) {
15
+ var global = arguments[3];
16
+ var define;
17
+ var t,n=arguments[3],r=e(require("@babel/runtime/helpers/typeof"));function e(t){return t&&t.__esModule?t:{default:t}}(function(){var e,u="Expected a function",o="__lodash_hash_undefined__",i=500,a=800,c=16,f=1/0,l=9007199254740991,s="[object AsyncFunction]",h="[object Function]",p="[object GeneratorFunction]",_="[object Null]",d="[object Proxy]",y="[object Symbol]",v="[object Undefined]",g=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,b=/^\w*$/,j=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,m=/\\(\\)?/g,O=/^\[object .+?Constructor\]$/,w="object"==(void 0===n?"undefined":(0,r.default)(n))&&n&&n.Object===Object&&n,z="object"==("undefined"==typeof self?"undefined":(0,r.default)(self))&&self&&self.Object===Object&&self,A=w||z||Function("return this")(),x="object"==("undefined"==typeof exports?"undefined":(0,r.default)(exports))&&exports&&!exports.nodeType&&exports,S=x&&"object"==("undefined"==typeof module?"undefined":(0,r.default)(module))&&module&&!module.nodeType&&module;function $(t,n){return!!(null==t?0:t.length)&&function(t,n,r){return n==n?function(t,n,r){var e=r-1,u=t.length;for(;++e<u;)if(t[e]===n)return e;return-1}(t,n,r):function(t,n,r,e){var u=t.length,o=r+(e?1:-1);for(;e?o--:++o<u;)if(n(t[o],o,t))return o;return-1}(t,E,r)}(t,n,0)>-1}function F(t,n,r){for(var e=-1,u=null==t?0:t.length;++e<u;)if(r(n,t[e]))return!0;return!1}function k(t,n){for(var r=-1,e=null==t?0:t.length,u=Array(e);++r<e;)u[r]=n(t[r],r,t);return u}function E(t){return t!=t}function P(t){return function(n){return t(n)}}function T(t,n){return t.has(n)}var C,L=Array.prototype,M=Function.prototype,R=Object.prototype,q=A["__core-js_shared__"],I=M.toString,N=R.hasOwnProperty,D=(C=/[^.]+$/.exec(q&&q.keys&&q.keys.IE_PROTO||""))?"Symbol(src)_1."+C:"",G=R.toString,U=RegExp("^"+I.call(N).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),V=A.Symbol,B=L.splice,H=V?V.toStringTag:e,J=function(){try{var t=pt(Object,"defineProperty");return t({},"",{}),t}catch(n){}}(),K=Math.max,Q=Math.min,W=Date.now,X=pt(A,"Map"),Y=pt(Object,"create"),Z=V?V.prototype:e,tt=Z?Z.toString:e;function nt(){}function rt(t){var n=-1,r=null==t?0:t.length;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function et(t){var n=-1,r=null==t?0:t.length;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function ut(t){var n=-1,r=null==t?0:t.length;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function ot(t){var n=-1,r=null==t?0:t.length;for(this.__data__=new ut;++n<r;)this.add(t[n])}function it(t,n){for(var r=t.length;r--;)if(Ot(t[r][0],n))return r;return-1}function at(t,n){for(var u=0,o=(n=function(t,n){if(wt(t))return t;return function(t,n){if(wt(t))return!1;var e=(0,r.default)(t);if("number"==e||"symbol"==e||"boolean"==e||null==t||kt(t))return!0;return b.test(t)||!g.test(t)||null!=n&&t in Object(n)}(t,n)?[t]:gt(Et(t))}(n,t)).length;null!=t&&u<o;)t=t[bt(n[u++])];return u&&u==o?t:e}function ct(t){return null==t?t===e?v:_:H&&H in Object(t)?function(t){var n=N.call(t,H),r=t[H];try{t[H]=e;var u=!0}catch(i){}var o=G.call(t);u&&(n?t[H]=r:delete t[H]);return o}(t):function(t){return G.call(t)}(t)}function ft(t){return!(!$t(t)||(n=t,D&&D in n))&&(xt(t)?U:O).test(function(t){if(null!=t){try{return I.call(t)}catch(n){}try{return t+""}catch(n){}}return""}(t));var n}function lt(t){if("string"==typeof t)return t;if(wt(t))return k(t,lt)+"";if(kt(t))return tt?tt.call(t):"";var n=t+"";return"0"==n&&1/t==-f?"-0":n}function st(t){return At(t)?t:[]}function ht(t,n){var e,u,o=t.__data__;return e=n,("string"==(u=(0,r.default)(e))||"number"==u||"symbol"==u||"boolean"==u?"__proto__"!==e:null===e)?o["string"==typeof n?"string":"hash"]:o.map}function pt(t,n){var r=function(t,n){return null==t?e:t[n]}(t,n);return ft(r)?r:e}rt.prototype.clear=function(){this.__data__=Y?Y(null):{},this.size=0},rt.prototype.delete=function(t){var n=this.has(t)&&delete this.__data__[t];return this.size-=n?1:0,n},rt.prototype.get=function(t){var n=this.__data__;if(Y){var r=n[t];return r===o?e:r}return N.call(n,t)?n[t]:e},rt.prototype.has=function(t){var n=this.__data__;return Y?n[t]!==e:N.call(n,t)},rt.prototype.set=function(t,n){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=Y&&n===e?o:n,this},et.prototype.clear=function(){this.__data__=[],this.size=0},et.prototype.delete=function(t){var n=this.__data__,r=it(n,t);return!(r<0||(r==n.length-1?n.pop():B.call(n,r,1),--this.size,0))},et.prototype.get=function(t){var n=this.__data__,r=it(n,t);return r<0?e:n[r][1]},et.prototype.has=function(t){return it(this.__data__,t)>-1},et.prototype.set=function(t,n){var r=this.__data__,e=it(r,t);return e<0?(++this.size,r.push([t,n])):r[e][1]=n,this},ut.prototype.clear=function(){this.size=0,this.__data__={hash:new rt,map:new(X||et),string:new rt}},ut.prototype.delete=function(t){var n=ht(this,t).delete(t);return this.size-=n?1:0,n},ut.prototype.get=function(t){return ht(this,t).get(t)},ut.prototype.has=function(t){return ht(this,t).has(t)},ut.prototype.set=function(t,n){var r=ht(this,t),e=r.size;return r.set(t,n),this.size+=r.size==e?0:1,this},ot.prototype.add=ot.prototype.push=function(t){return this.__data__.set(t,o),this},ot.prototype.has=function(t){return this.__data__.has(t)};var _t,dt,yt,vt=(_t=J?function(t,n){return J(t,"toString",{configurable:!0,enumerable:!1,value:Pt(n),writable:!0})}:Tt,dt=0,yt=0,function(){var t=W(),n=c-(t-yt);if(yt=t,n>0){if(++dt>=a)return arguments[0]}else dt=0;return _t.apply(e,arguments)});var gt=function(t){var n=mt(t,function(t){return r.size===i&&r.clear(),t}),r=n.cache;return n}(function(t){var n=[];return 46===t.charCodeAt(0)&&n.push(""),t.replace(j,function(t,r,e,u){n.push(e?u.replace(m,"$1"):r||t)}),n});function bt(t){if("string"==typeof t||kt(t))return t;var n=t+"";return"0"==n&&1/t==-f?"-0":n}var jt=function(t,n){return vt(function(t,n,r){return n=K(n===e?t.length-1:n,0),function(){for(var e=arguments,u=-1,o=K(e.length-n,0),i=Array(o);++u<o;)i[u]=e[n+u];u=-1;for(var a=Array(n+1);++u<n;)a[u]=e[u];return a[n]=r(i),function(t,n,r){switch(r.length){case 0:return t.call(n);case 1:return t.call(n,r[0]);case 2:return t.call(n,r[0],r[1]);case 3:return t.call(n,r[0],r[1],r[2])}return t.apply(n,r)}(t,this,a)}}(t,n,Tt),t+"")}(function(t){var n=k(t,st);return n.length&&n[0]===t[0]?function(t,n,r){for(var u=r?F:$,o=t[0].length,i=t.length,a=i,c=Array(i),f=1/0,l=[];a--;){var s=t[a];a&&n&&(s=k(s,P(n))),f=Q(s.length,f),c[a]=!r&&(n||o>=120&&s.length>=120)?new ot(a&&s):e}s=t[0];var h=-1,p=c[0];t:for(;++h<o&&l.length<f;){var _=s[h],d=n?n(_):_;if(_=r||0!==_?_:0,!(p?T(p,d):u(l,d,r))){for(a=i;--a;){var y=c[a];if(!(y?T(y,d):u(t[a],d,r)))continue t}p&&p.push(d),l.push(_)}}return l}(n):[]});function mt(t,n){if("function"!=typeof t||null!=n&&"function"!=typeof n)throw new TypeError(u);var r=function r(){var e=arguments,u=n?n.apply(this,e):e[0],o=r.cache;if(o.has(u))return o.get(u);var i=t.apply(this,e);return r.cache=o.set(u,i)||o,i};return r.cache=new(mt.Cache||ut),r}function Ot(t,n){return t===n||t!=t&&n!=n}mt.Cache=ut;var wt=Array.isArray;function zt(t){return null!=t&&St(t.length)&&!xt(t)}function At(t){return Ft(t)&&zt(t)}function xt(t){if(!$t(t))return!1;var n=ct(t);return n==h||n==p||n==s||n==d}function St(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=l}function $t(t){var n=(0,r.default)(t);return null!=t&&("object"==n||"function"==n)}function Ft(t){return null!=t&&"object"==(0,r.default)(t)}function kt(t){return"symbol"==(0,r.default)(t)||Ft(t)&&ct(t)==y}function Et(t){return null==t?"":lt(t)}function Pt(t){return function(){return t}}function Tt(t){return t}nt.constant=Pt,nt.intersection=jt,nt.memoize=mt,nt.eq=Ot,nt.get=function(t,n,r){var u=null==t?e:at(t,n);return u===e?r:u},nt.identity=Tt,nt.isArray=wt,nt.isArrayLike=zt,nt.isArrayLikeObject=At,nt.isFunction=xt,nt.isLength=St,nt.isObject=$t,nt.isObjectLike=Ft,nt.isSymbol=kt,nt.toString=Et,nt.VERSION="4.17.5","function"==typeof t&&"object"==(0,r.default)(t.amd)&&t.amd?(A._=nt,t(function(){return nt})):S?((S.exports=nt)._=nt,x._=nt):A._=nt}).call(void 0);
18
+ },{"@babel/runtime/helpers/typeof":"LNzP"}],"yK6K":[function(require,module,exports) {
19
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.camelToUnderscore=void 0;var e=l(require("@babel/runtime/helpers/classCallCheck")),t=l(require("@babel/runtime/helpers/createClass")),r=l(require("@babel/runtime/helpers/typeof")),a=l(require("../lodash.custom"));function l(e){return e&&e.__esModule?e:{default:e}}var o=function(e,t){if("object"===(0,r.default)(e)&&null!==e){if("object"===(0,r.default)(e.names)&&"object"===(0,r.default)(t))for(var a=0;a<t.length;a++){var l=t[a];if(e.names[l])return e.names[l]}return e.name?e.name:""}return e},s=function(e){return e=e.split(".").map(function(e){return"string"!=typeof e||"string"!=typeof e[0]?"":e=(e=e[0].toLowerCase()+e.slice(1)).replace(/([A-Z])/g,"_$1").toLowerCase()}).join(".")};exports.camelToUnderscore=s;var n=function(){function l(t,r){(0,e.default)(this,l),this.data={},this.default_locales=[],this.data=t||{is_empty:!0},this.default_locales=["en"],this.default_locales=this._process_locales(r)}return(0,t.default)(l,[{key:"get",value:function(e,t){return this.get_with_locales(e,null,t)}},{key:"get_raw",value:function(e){return e=s(e),a.default.get(this.data,e,null)}},{key:"has_property",value:function(e){return null!==this._lookup_with_locales(e,this.default_locales,null)}},{key:"_lookup_with_locales",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";t=this._process_locales(t),".name"===e.substr(-5)&&(e=e.substr(0,e.length-5));var a=this.get_raw(e);return null!==(a=o(a,t))&&""!==a||(a=r),a}},{key:"_process_locales",value:function(e){return"string"==typeof e&&(e=[e]),Array.isArray(e)&&0!==e.length||(e=this.default_locales),e}},{key:"get_with_locales",value:function(e,t,a){var l=this._lookup_with_locales(e,t,a);return"object"===(0,r.default)(l)&&console.warn('Geolocation IP Detection: The property "'+e+'" is of type "'+(0,r.default)(l)+'", should be string or similar',l),void 0===l?(console.warn('Geolocation IP Detection: The property "'+e+'" is not defined, please check spelling or maybe you need a different data source',{data:this.data}),""):l}},{key:"get_country_iso",value:function(){var e=this.get("country.iso_code");return e&&(e=e.substr(0,2).toLowerCase()),e}},{key:"is_empty",value:function(){return this.get("is_empty",!1)}},{key:"error",value:function(){return this.get_raw("extra.error")||""}},{key:"serialize",value:function(){return this.data}}]),l}(),u=n;exports.default=u;
20
+ },{"@babel/runtime/helpers/classCallCheck":"ZBnv","@babel/runtime/helpers/createClass":"NoOd","@babel/runtime/helpers/typeof":"LNzP","../lodash.custom":"AuD4"}],"VVpI":[function(require,module,exports) {
21
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getLocalStorage=exports.setLocalStorage=void 0;var e=function(e,t,r){var a={value:t,expires_at:(new Date).getTime()+1e3*r/1};localStorage.setItem(e.toString(),JSON.stringify(a))};exports.setLocalStorage=e;var t=function(e){var t=null;try{t=JSON.parse(localStorage.getItem(e.toString()))}catch(r){return null}if(null!==t){if(!(null!==t.expires_at&&t.expires_at<(new Date).getTime()))return t.value;localStorage.removeItem(e.toString())}return null};exports.getLocalStorage=t;
22
+ },{}],"jf5f":[function(require,module,exports) {
23
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.makeJSONRequest=exports.makeRequest=void 0;var e=r(require("@babel/runtime/helpers/asyncToGenerator")),t=r(require("@babel/runtime/regenerator"));function r(e){return e&&e.__esModule?e:{default:e}}var n=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"GET",r=new XMLHttpRequest;return new Promise(function(n,u){r.onreadystatechange=function(){4===r.readyState&&(r.status>=200&&r.status<300?n(r):u({status:r.status,statusText:r.statusText,request:r}))},r.open(t||"GET",e,!0),r.send()})};exports.makeRequest=n;var u=function(e){try{return JSON.parse(e)}catch(t){return e}},s=function(){var r=(0,e.default)(t.default.mark(function e(r){var s,a,o=arguments;return t.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return s=o.length>1&&void 0!==o[1]?o[1]:"GET",e.prev=1,e.next=4,n(r,s);case 4:return a=e.sent,e.abrupt("return",u(a.responseText));case 8:return e.prev=8,e.t0=e.catch(1),e.abrupt("return",u(e.t0.request.responseText));case 11:case"end":return e.stop()}},e,null,[[1,8]])}));return function(e){return r.apply(this,arguments)}}();exports.makeJSONRequest=s;
24
+ },{"@babel/runtime/helpers/asyncToGenerator":"fwsn","@babel/runtime/regenerator":"m4eR"}],"yyFn":[function(require,module,exports) {
25
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.set_override=_,exports.remove_override=x,exports.get_info=m,exports.options=void 0;var e,r=s(require("@babel/runtime/helpers/typeof")),t=s(require("@babel/runtime/helpers/asyncToGenerator")),o=s(require("@babel/runtime/regenerator")),n=s(require("./models/record")),a=require("./lib/localStorageAccess"),i=s(require("./lodash.custom")),u=require("./lib/xhr");function s(e){return e&&e.__esModule?e:{default:e}}var c=(null===(e=window.geoip_detect)||void 0===e?void 0:e.options)||{ajaxurl:"/wp-admin/admin-ajax.php",default_locales:["en"],cookie_duration_in_days:7,cookie_name:"geoip-detect-result"};exports.options=c;var l=null;function d(){if(!l){var e=c.ajaxurl+"?action=geoip_detect2_get_info_from_current_ip";l=(0,u.makeJSONRequest)(e)}return l}function p(){return f.apply(this,arguments)}function f(){return(f=(0,t.default)(o.default.mark(function e(){var r,t,n,i;return o.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(r=!1,t=!1,!c.cookie_name){e.next=6;break}if(!(t=(0,a.getLocalStorage)(c.cookie_name))||!t.extra){e.next=6;break}return e.abrupt("return",t);case 6:return e.prev=6,e.next=9,d();case 9:r=e.sent,e.next=15;break;case 12:e.prev=12,e.t0=e.catch(6),r=e.t0.responseJSON||e.t0;case 15:if(!c.cookie_name){e.next=20;break}if(t=(0,a.getLocalStorage)(c.cookie_name),!0!==(null===(n=t)||void 0===n?void 0:null===(i=n.extra)||void 0===i?void 0:i.override)){e.next=19;break}return e.abrupt("return",t);case 19:(0,a.setLocalStorage)(c.cookie_name,r,24*c.cookie_duration_in_days*60*60);case 20:return e.abrupt("return",r);case 21:case"end":return e.stop()}},e,null,[[6,12]])}))).apply(this,arguments)}function _(e,r){return e&&"function"==typeof e.serialize&&(e=e.serialize()),(r=r||c.cookie_duration_in_days)<0?(console.warn("set_override_data() did nothing: A negative duration doesn't make sense. If you want to remove the override, use remove_override() instead."),!1):v(e,r)}function v(e,r){return e||(e={}),e.extra||(e.extra={}),e.extra.override=!0,(0,a.setLocalStorage)(c.cookie_name,e,24*r*60*60),!0}function x(){return(0,a.setLocalStorage)(c.cookie_name,{},-1),!0}function m(){return k.apply(this,arguments)}function k(){return(k=(0,t.default)(o.default.mark(function e(){var t,a;return o.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p();case 2:return t=e.sent,"object"!==(0,r.default)(t)&&(console.error("Geoip-detect: Record should be an object, not a "+(0,r.default)(t),t),t={extra:{error:t||"Network error, look at the original server response ..."}}),a=new n.default(t,c.default_locales),e.abrupt("return",a);case 6:case"end":return e.stop()}},e)}))).apply(this,arguments)}
26
+ },{"@babel/runtime/helpers/typeof":"LNzP","@babel/runtime/helpers/asyncToGenerator":"fwsn","@babel/runtime/regenerator":"m4eR","./models/record":"yK6K","./lib/localStorageAccess":"VVpI","./lodash.custom":"AuD4","./lib/xhr":"jf5f"}],"YIwO":[function(require,module,exports) {
27
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.selectItemByValue=t,exports.selectItemByAttribute=n,exports.triggerNativeEvent=o,exports.domReady=void 0;var e=new Promise(function(e){"loading"===document.readyState?document.addEventListener?document.addEventListener("DOMContentLoaded",e):document.attachEvent("onreadystatechange",function(){"loading"!=document.readyState&&e()}):e()});function t(e,t){for(var n=0;n<e.options.length;n++)if(e.options[n].value===t){e.selectedIndex=n;break}}function n(e,t,n){for(var o=0;o<e.options.length;o++)if(e.options[o].getAttribute(t)===n){e.selectedIndex=o;break}}function o(e,t){if(document.createEvent){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!1),e.dispatchEvent(n)}else e.fireEvent("on"+t)}exports.domReady=e;
28
+ },{}],"IyEz":[function(require,module,exports) {
29
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.get_options=o,exports.action_on_elements=a,exports.get_value_from_record=s;var e=n(require("@babel/runtime/helpers/asyncToGenerator")),r=n(require("@babel/runtime/regenerator")),t=require("../lookup");function n(e){return e&&e.__esModule?e:{default:e}}function o(e){var r=e.getAttribute("data-options");try{return JSON.parse(r)}catch(t){return{}}}function a(e,r,t){return u.apply(this,arguments)}function u(){return(u=(0,e.default)(r.default.mark(function e(n,o,a){var u,s;return r.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if((u=document.getElementsByClassName(n)).length){e.next=3;break}return e.abrupt("return");case 3:return e.next=5,(0,t.get_info)();case 5:if(!(s=e.sent).error()){e.next=9;break}return console.error("Geolocation IP Detection Error ("+o+"): "+s.error()),e.abrupt("return");case 9:Array.from(u).forEach(function(e){return a(e,s)});case 10:case"end":return e.stop()}},e)}))).apply(this,arguments)}function s(e,r){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=o(e);return t=t||n.property,n.skip_cache&&console.warn("Geolocation IP Detection: The property 'skip_cache' is ignored in AJAX mode. You could disable the response caching on the server by setting the constant GEOIP_DETECT_READER_CACHE_TIME."),r.get_with_locales(t,n.lang,n.default)}
30
+ },{"@babel/runtime/helpers/asyncToGenerator":"fwsn","@babel/runtime/regenerator":"m4eR","../lookup":"yyFn"}],"AwHB":[function(require,module,exports) {
31
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.do_shortcode_normal=o,exports.do_shortcode_flags=r,exports.do_shortcode_country_select=_,exports.do_shortcode_text_input=c;var e=require("../lib/html"),t=require("./helpers");function o(e,o){e.innerText=(0,t.get_value_from_record)(e,o)}function r(e,o){var r=o.get_country_iso()||(0,t.get_options)(e).default;r&&e.classList.add("flag-icon-"+r)}function _(t,o){var r=o.get_country_iso();(0,e.selectItemByAttribute)(t,"data-c",r),(0,e.triggerNativeEvent)(t,"change")}function c(o,r){o.value=(0,t.get_value_from_record)(o,r),(0,e.triggerNativeEvent)(o,"change")}
32
+ },{"../lib/html":"YIwO","./helpers":"IyEz"}],"jiwS":[function(require,module,exports) {
33
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.do_shortcode_show_if=r,exports.geoip_detect2_shortcode_evaluate_conditions=i;var e=n(require("@babel/runtime/helpers/typeof")),o=require("./helpers"),t=n(require("../lodash.custom"));function n(e){return e&&e.__esModule?e:{default:e}}function r(e,t){var n=(0,o.get_options)(e),r=i(n.parsed,n,t);e.style.display=r?"":"none !important"}function i(o,t,n){var r=["name","iso_code","iso_code3","code","geoname_id"],i="or"!==o.op;return o.conditions.forEach(function(u){var a=!1,c=[],l=n.get_raw(u.p);null===l?a=!1:"object"===(0,e.default)(l)?r.forEach(function(e){l[e]?c.push(l[e]):"name"==e&&c.push(n.get_with_locales(u.p,t.lang))}):c=[l],a=s(u.v,c),u.not&&(a=!a),i="or"===o.op?i||a:i&&a}),o.not&&(i=!i),i}function s(e,o){return!0===o[0]?o=["true","yes","y","1"]:!1===o[0]&&(o=["false","no","n","0",""]),o=o.map(function(e){return String(e).toLowerCase()}),e=e.split(","),t.default.intersection(e,o).length>0}
34
+ },{"@babel/runtime/helpers/typeof":"LNzP","./helpers":"IyEz","../lodash.custom":"AuD4"}],"d5ii":[function(require,module,exports) {
35
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.do_shortcodes=void 0;var e=c(require("@babel/runtime/helpers/asyncToGenerator")),t=c(require("@babel/runtime/regenerator")),o=require("../lib/html"),r=require("./helpers"),n=require("./normal"),s=require("./show-if");function c(e){return e&&e.__esModule?e:{default:e}}var i=function(){var c=(0,e.default)(t.default.mark(function e(){return t.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,o.domReady;case 2:(0,r.action_on_elements)("js-geoip-detect-shortcode","could not execute shortcode(s) [geoip_detect2]",n.do_shortcode_normal),(0,r.action_on_elements)("js-geoip-detect-flag","could not configure the flag(s)",n.do_shortcode_flags),(0,r.action_on_elements)("js-geoip-text-input","could not set the value of the text input field(s)",n.do_shortcode_text_input),(0,r.action_on_elements)("js-geoip-detect-country-select","could not set the value of the select field(s)",n.do_shortcode_country_select),(0,r.action_on_elements)("js-geoip-detect-show-if","could not execute the show-if/hide-if conditions",s.do_shortcode_show_if);case 7:case"end":return e.stop()}},e)}));return function(){return c.apply(this,arguments)}}();exports.do_shortcodes=i;
36
+ },{"@babel/runtime/helpers/asyncToGenerator":"fwsn","@babel/runtime/regenerator":"m4eR","../lib/html":"YIwO","./helpers":"IyEz","./normal":"AwHB","./show-if":"jiwS"}],"EtfF":[function(require,module,exports) {
37
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.calc_classes=s,exports.add_body_classes=c;var e=o(require("@babel/runtime/helpers/asyncToGenerator")),r=o(require("@babel/runtime/regenerator")),t=require("./lib/html"),n=require("./lookup");function o(e){return e&&e.__esModule?e:{default:e}}function s(e){return{country:e.get("country.iso_code"),"country-is-in-european-union":e.get("country.is_in_european_union",!1),continent:e.get("continent.code"),province:e.get("most_specific_subdivision.iso_code")}}function c(){return a.apply(this,arguments)}function a(){return(a=(0,e.default)(r.default.mark(function e(){var o,c,a,u,i,d,l;return r.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,(0,n.get_info)();case 2:if(!(o=e.sent).error()){e.next=6;break}return console.error("Geodata Error (could not add CSS-classes to body): "+o.error()),e.abrupt("return");case 6:return c=s(o),e.next=9,t.domReady;case 9:for(a=document.getElementsByTagName("body")[0],u=0,i=Object.keys(c);u<i.length;u++)d=i[u],(l=c[d])&&("string"==typeof l?a.classList.add("geoip-".concat(d,"-").concat(l)):a.classList.add("geoip-".concat(d)));case 11:case"end":return e.stop()}},e)}))).apply(this,arguments)}
38
+ },{"@babel/runtime/helpers/asyncToGenerator":"fwsn","@babel/runtime/regenerator":"m4eR","./lib/html":"YIwO","./lookup":"yyFn"}],"ZVsn":[function(require,module,exports) {
39
+ "use strict";var e=require("./lookup"),o=require("./shortcodes/index"),d=require("./body_classes");e.options.do_body_classes&&(0,d.add_body_classes)(),e.options.do_shortcodes&&(0,o.do_shortcodes)(),window.geoip_detect.get_info=e.get_info,window.geoip_detect.set_override=e.set_override,window.geoip_detect.remove_override=e.remove_override;
40
+ },{"./lookup":"yyFn","./shortcodes/index":"d5ii","./body_classes":"EtfF"}]},{},["ZVsn"], null)
41
+ //# sourceMappingURL=frontend.1115d690.js.map
js/dist/frontend.1115d690.js.map ADDED
@@ -0,0 +1 @@
 
1
+ {"version":3,"sources":["node_modules/@babel/runtime/helpers/typeof.js","node_modules/@babel/runtime/helpers/asyncToGenerator.js","node_modules/regenerator-runtime/runtime.js","node_modules/@babel/runtime/regenerator/index.js","node_modules/@babel/runtime/helpers/classCallCheck.js","node_modules/@babel/runtime/helpers/createClass.js","js/lodash.custom.js","js/models/record.js","js/lib/localStorageAccess.js","js/lib/xhr.js","js/lookup.js","js/lib/html.js","js/shortcodes/helpers.js","js/shortcodes/normal.js","js/shortcodes/show-if.js","js/shortcodes/index.js","js/body_classes.js","js/frontend.js"],"names":["undefined","FUNC_ERROR_TEXT","HASH_UNDEFINED","MAX_MEMOIZE_SIZE","HOT_COUNT","HOT_SPAN","INFINITY","MAX_SAFE_INTEGER","asyncTag","funcTag","genTag","nullTag","proxyTag","symbolTag","undefinedTag","reIsDeepProp","reIsPlainProp","rePropName","reEscapeChar","reIsHostCtor","freeGlobal","global","Object","freeSelf","self","root","Function","freeExports","exports","nodeType","freeModule","module","arrayIncludes","array","value","length","baseIndexOf","fromIndex","strictIndexOf","index","baseFindIndex","predicate","fromRight","baseIsNaN","arrayIncludesWith","comparator","arrayMap","iteratee","result","Array","baseUnary","func","cacheHas","cache","key","has","arrayProto","uid","prototype","funcProto","objectProto","coreJsData","funcToString","toString","hasOwnProperty","maskSrcKey","exec","keys","IE_PROTO","nativeObjectToString","reIsNative","RegExp","call","replace","Symbol","splice","symToStringTag","toStringTag","defineProperty","getNative","e","nativeMax","Math","max","nativeMin","min","nativeNow","Date","now","Map","nativeCreate","symbolProto","symbolToString","lodash","Hash","entries","clear","entry","set","ListCache","MapCache","SetCache","values","__data__","add","assocIndexOf","eq","baseGet","object","path","castPath","isArray","isKey","type","isSymbol","test","stringToPath","toKey","baseGetTag","getRawTag","isOwn","tag","unmasked","objectToString","baseIsNative","isObject","isFunction","toSource","isMasked","baseToString","castArrayLikeObject","isArrayLikeObject","getMapData","map","data","isKeyable","getValue","hashClear","size","hashDelete","get","hashGet","hashHas","hashSet","listCacheClear","listCacheDelete","pop","listCacheGet","listCacheHas","listCacheSet","push","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","setCacheAdd","setCacheHas","setToString","count","lastCalled","string","constant","identity","stamp","remaining","arguments","apply","memoizeCapped","memoize","charCodeAt","match","number","quote","subString","intersection","baseRest","start","overRest","transform","args","otherArgs","thisArg","arrays","mapped","baseIntersection","othIndex","includes","othLength","caches","maxLength","Infinity","seen","outer","computed","resolver","TypeError","memoized","Cache","other","isArrayLike","isLength","isObjectLike","defaultValue","VERSION","define","amd","_","Record","_get_localized","ret","locales","names","i","locale","name","camelToUnderscore","split","x","toLowerCase","slice","join","default_locales","is_empty","_process_locales","prop","default_value","get_with_locales","_lookup_with_locales","substr","get_raw","console","warn","country","setLocalStorage","variable","ttl_sec","expires_at","getTime","localStorage","setItem","JSON","stringify","getLocalStorage","parse","getItem","removeItem","makeRequest","url","method","request","XMLHttpRequest","Promise","resolve","reject","onreadystatechange","readyState","status","statusText","open","send","jsonDecodeIfPossible","str","makeJSONRequest","responseText","options","window","geoip_detect","ajaxurl","cookie_duration_in_days","cookie_name","ajaxPromise","get_info_raw","get_info_cached","response","storedResponse","extra","responseJSON","override","set_override","record","duration_in_days","serialize","set_override_data","remove_override","get_info","error","domReady","document","addEventListener","attachEvent","selectItemByValue","el","selectedIndex","selectItemByAttribute","attributeName","attributeValue","getAttribute","triggerNativeEvent","createEvent","event","initEvent","dispatchEvent","fireEvent","get_options","raw","action_on_elements","className","errorMessage","callback","elements","getElementsByClassName","from","forEach","get_value_from_record","property","opt","skip_cache","lang","default","do_shortcode_normal","innerText","do_shortcode_flags","get_country_iso","classList","do_shortcode_country_select","do_shortcode_text_input","do_shortcode_show_if","evaluated","geoip_detect2_shortcode_evaluate_conditions","parsed","style","display","alternativePropertyNames","isConditionMatching","op","conditions","c","subConditionMatching","raw_value","p","geoip_detect2_shortcode_check_subcondition","v","not","expectedValues","actualValues","intersect","String","do_shortcodes","calc_classes","continent","province","add_body_classes","css_classes","body","getElementsByTagName","do_body_classes"],"mappings":"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","file":"frontend.1115d690.js","sourceRoot":"../..","sourcesContent":["function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\n\nmodule.exports = _asyncToGenerator;","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","module.exports = require(\"regenerator-runtime\");\n","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","/**\n * @license\n * Lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash include=\"get,intersection\" -o js/lodash.custom.js`\n * Copyright JS Foundation and other contributors <https://js.foundation/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n var undefined;\n\n /** Used as the semantic version number. */\n var VERSION = '4.17.5';\n\n /** Error message constants. */\n var FUNC_ERROR_TEXT = 'Expected a function';\n\n /** Used to stand-in for `undefined` hash values. */\n var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n /** Used as the maximum memoize cache size. */\n var MAX_MEMOIZE_SIZE = 500;\n\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\n var HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n /** Used as references for various `Number` constants. */\n var INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991;\n\n /** `Object#toString` result references. */\n var asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n nullTag = '[object Null]',\n proxyTag = '[object Proxy]',\n symbolTag = '[object Symbol]',\n undefinedTag = '[object Undefined]';\n\n /** Used to match property names within property paths. */\n var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n /**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\n var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n /** Used to match backslashes in property paths. */\n var reEscapeChar = /\\\\(\\\\)?/g;\n\n /** Used to detect host constructors (Safari). */\n var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n /** Detect free variable `global` from Node.js. */\n var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n /** Detect free variable `self`. */\n var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n /** Used as a reference to the global object. */\n var root = freeGlobal || freeSelf || Function('return this')();\n\n /** Detect free variable `exports`. */\n var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n /** Detect free variable `module`. */\n var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\n function apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n }\n\n /**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n }\n\n /**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n }\n\n /**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\n function baseIsNaN(value) {\n return value !== value;\n }\n\n /**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\n function baseUnary(func) {\n return function(value) {\n return func(value);\n };\n }\n\n /**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function cacheHas(cache, key) {\n return cache.has(key);\n }\n\n /**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n function getValue(object, key) {\n return object == null ? undefined : object[key];\n }\n\n /**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n /*--------------------------------------------------------------------------*/\n\n /** Used for built-in method references. */\n var arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n /** Used to detect overreaching core-js shims. */\n var coreJsData = root['__core-js_shared__'];\n\n /** Used to resolve the decompiled source of functions. */\n var funcToString = funcProto.toString;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to detect methods masquerading as native. */\n var maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n }());\n\n /**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n var nativeObjectToString = objectProto.toString;\n\n /** Used to detect if a method is native. */\n var reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n );\n\n /** Built-in value references. */\n var Symbol = root.Symbol,\n splice = arrayProto.splice,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n var defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n }());\n\n /* Built-in method references for those with the same name as other `lodash` methods. */\n var nativeMax = Math.max,\n nativeMin = Math.min,\n nativeNow = Date.now;\n\n /* Built-in method references that are verified to be native. */\n var Map = getNative(root, 'Map'),\n nativeCreate = getNative(Object, 'create');\n\n /** Used to lookup unminified function names. */\n var realNames = {};\n\n /** Used to convert symbols to primitives and strings. */\n var symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\n function lodash() {\n // No operation performed.\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\n function hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n }\n\n /**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n }\n\n /**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\n function hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n }\n\n // Add methods to `Hash`.\n Hash.prototype.clear = hashClear;\n Hash.prototype['delete'] = hashDelete;\n Hash.prototype.get = hashGet;\n Hash.prototype.has = hashHas;\n Hash.prototype.set = hashSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\n function listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n }\n\n /**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n }\n\n /**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n }\n\n /**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\n function listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n }\n\n // Add methods to `ListCache`.\n ListCache.prototype.clear = listCacheClear;\n ListCache.prototype['delete'] = listCacheDelete;\n ListCache.prototype.get = listCacheGet;\n ListCache.prototype.has = listCacheHas;\n ListCache.prototype.set = listCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\n function mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n }\n\n /**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function mapCacheGet(key) {\n return getMapData(this, key).get(key);\n }\n\n /**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function mapCacheHas(key) {\n return getMapData(this, key).has(key);\n }\n\n /**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\n function mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n }\n\n // Add methods to `MapCache`.\n MapCache.prototype.clear = mapCacheClear;\n MapCache.prototype['delete'] = mapCacheDelete;\n MapCache.prototype.get = mapCacheGet;\n MapCache.prototype.has = mapCacheHas;\n MapCache.prototype.set = mapCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\n function SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n }\n\n /**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\n function setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n }\n\n /**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\n function setCacheHas(value) {\n return this.__data__.has(value);\n }\n\n // Add methods to `SetCache`.\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n SetCache.prototype.has = setCacheHas;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\n function baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n }\n\n /**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n function baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n }\n\n /**\n * The base implementation of methods like `_.intersection`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\n function baseIntersection(arrays, iteratee, comparator) {\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\n length = arrays[0].length,\n othLength = arrays.length,\n othIndex = othLength,\n caches = Array(othLength),\n maxLength = Infinity,\n result = [];\n\n while (othIndex--) {\n var array = arrays[othIndex];\n if (othIndex && iteratee) {\n array = arrayMap(array, baseUnary(iteratee));\n }\n maxLength = nativeMin(array.length, maxLength);\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n ? new SetCache(othIndex && array)\n : undefined;\n }\n array = arrays[0];\n\n var index = -1,\n seen = caches[0];\n\n outer:\n while (++index < length && result.length < maxLength) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (!(seen\n ? cacheHas(seen, computed)\n : includes(result, computed, comparator)\n )) {\n othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if (!(cache\n ? cacheHas(cache, computed)\n : includes(arrays[othIndex], computed, comparator))\n ) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\n function baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n }\n\n /**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\n function baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n }\n\n /**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n };\n\n /**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\n function baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * Casts `value` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\n function castArrayLikeObject(value) {\n return isArrayLikeObject(value) ? value : [];\n }\n\n /**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\n function castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n }\n\n /**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\n function getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n }\n\n /**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\n function getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n }\n\n /**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\n function getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n }\n\n /**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\n function isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n }\n\n /**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\n function isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n }\n\n /**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\n function isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n }\n\n /**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\n function memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n }\n\n /**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\n function objectToString(value) {\n return nativeObjectToString.call(value);\n }\n\n /**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\n function overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n }\n\n /**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var setToString = shortOut(baseSetToString);\n\n /**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\n function shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n }\n\n /**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\n var stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n });\n\n /**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\n function toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\n function toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of unique values that are included in all given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\n var intersection = baseRest(function(arrays) {\n var mapped = arrayMap(arrays, castArrayLikeObject);\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped)\n : [];\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\n function memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n }\n\n // Expose `MapCache`.\n memoize.Cache = MapCache;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\n function eq(value, other) {\n return value === other || (value !== value && other !== other);\n }\n\n /**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\n var isArray = Array.isArray;\n\n /**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\n function isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n }\n\n /**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\n function isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n }\n\n /**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\n function isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n }\n\n /**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\n function isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\n function isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n }\n\n /**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\n function isObjectLike(value) {\n return value != null && typeof value == 'object';\n }\n\n /**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\n function isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n }\n\n /**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\n function toString(value) {\n return value == null ? '' : baseToString(value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\n function get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\n function constant(value) {\n return function() {\n return value;\n };\n }\n\n /**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\n function identity(value) {\n return value;\n }\n\n /*------------------------------------------------------------------------*/\n\n // Add methods that return wrapped values in chain sequences.\n lodash.constant = constant;\n lodash.intersection = intersection;\n lodash.memoize = memoize;\n\n /*------------------------------------------------------------------------*/\n\n // Add methods that return unwrapped values in chain sequences.\n lodash.eq = eq;\n lodash.get = get;\n lodash.identity = identity;\n lodash.isArray = isArray;\n lodash.isArrayLike = isArrayLike;\n lodash.isArrayLikeObject = isArrayLikeObject;\n lodash.isFunction = isFunction;\n lodash.isLength = isLength;\n lodash.isObject = isObject;\n lodash.isObjectLike = isObjectLike;\n lodash.isSymbol = isSymbol;\n lodash.toString = toString;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The semantic version number.\n *\n * @static\n * @memberOf _\n * @type {string}\n */\n lodash.VERSION = VERSION;\n\n /*--------------------------------------------------------------------------*/\n\n // Some AMD build optimizers, like r.js, check for condition patterns like:\n if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n // Expose Lodash on the global object to prevent errors when Lodash is\n // loaded by a script tag in the presence of an AMD loader.\n // See http://requirejs.org/docs/errors.html#mismatch for more details.\n // Use `_.noConflict` to remove Lodash from the global object.\n root._ = lodash;\n\n // Define as an anonymous module so, through path mapping, it can be\n // referenced as the \"underscore\" module.\n define(function() {\n return lodash;\n });\n }\n // Check for `exports` after `define` in case a build optimizer adds it.\n else if (freeModule) {\n // Export for Node.js.\n (freeModule.exports = lodash)._ = lodash;\n // Export for CommonJS support.\n freeExports._ = lodash;\n }\n else {\n // Export to the global object.\n root._ = lodash;\n }\n}.call(this));\n","\nimport _ from '../lodash.custom';\n\n\nconst _get_localized = function(ret, locales) {\n if (typeof(ret) === 'object' && ret !== null) {\n if (typeof (ret.names) === 'object' && typeof (locales) === 'object') {\n for (let i = 0 ; i < locales.length ; i++) {\n let locale = locales[i];\n\n if (ret.names[locale]) {\n return ret.names[locale];\n }\n }\n }\n\n if (ret.name) {\n return ret.name;\n }\n\n return '';\n }\n return ret;\n}\n\nexport const camelToUnderscore = function(key) {\n key = key.split('.').map((x) => {\n if (typeof (x) !== 'string' || typeof (x[0]) !== 'string') {\n return '';\n }\n x = x[0].toLowerCase() + x.slice(1); // to allow \"MostSpecificSubdivision\"\n x = x.replace(/([A-Z])/g, \"_$1\").toLowerCase();\n return x;\n }).join('.');\n\n return key;\n}\n\nclass Record {\n data = {};\n default_locales = [];\n\n constructor(data, default_locales) {\n this.data = data || { is_empty: true };\n \n this.default_locales = ['en']; \n this.default_locales = this._process_locales(default_locales);\n }\n\n get(prop, default_value) {\n return this.get_with_locales(prop, null, default_value);\n }\n\n get_raw(prop) {\n prop = camelToUnderscore(prop);\n return _.get(this.data, prop, null);\n }\n \n has_property(prop) {\n const ret = this._lookup_with_locales(prop, this.default_locales, null)\n return ret !== null;\n }\n\n _lookup_with_locales(prop, locales, default_value = '') {\n locales = this._process_locales(locales);\n\n // Treat pseudo-property 'name' as if it never existed\n if (prop.substr(-5) === '.name') {\n prop = prop.substr(0, prop.length - 5);\n }\n\n let ret = this.get_raw(prop);\n \n // Localize property, if possible\n ret = _get_localized(ret, locales);\n \n if (ret === null || ret === '') {\n ret = default_value;\n }\n\n return ret;\n }\n \n _process_locales(locales) {\n if (typeof(locales) === 'string') {\n locales = [ locales ];\n }\n if (!Array.isArray(locales) || locales.length === 0) {\n locales = this.default_locales;\n }\n return locales;\n }\n\n get_with_locales(prop, locales, default_value) {\n const ret = this._lookup_with_locales(prop, locales, default_value);\n\n if (typeof(ret) === 'object') {\n console.warn('Geolocation IP Detection: The property \"' + prop + '\" is of type \"' + typeof (ret) + '\", should be string or similar', ret)\n }\n if (typeof(ret) === 'undefined') {\n console.warn('Geolocation IP Detection: The property \"' + prop + '\" is not defined, please check spelling or maybe you need a different data source', { data: this.data })\n return '';\n }\n\n return ret;\n }\n\n get_country_iso() {\n let country = this.get('country.iso_code');\n if(country) {\n country = country.substr(0, 2).toLowerCase();\n }\n return country;\n }\n\n /**\n * Check if there is information available for this IP\n * @returns boolean \n */\n is_empty() {\n return this.get('is_empty', false);\n }\n \n /**\n * Get error message, if any\n * @return string Error Message\n */\n error() {\n return this.get_raw('extra.error') || '';\n }\n\n /**\n * Get the raw data of this object\n * @returns object\n */\n serialize() {\n return this.data;\n }\n}\n\nexport default Record;","export const setLocalStorage = function (variable, value, ttl_sec) {\n var data = { value: value, expires_at: new Date().getTime() + (ttl_sec * 1000) / 1 };\n localStorage.setItem(variable.toString(), JSON.stringify(data));\n};\n\nexport const getLocalStorage = function (variable) {\n let data = null;\n try {\n data = JSON.parse(localStorage.getItem(variable.toString()));\n } catch(e) {\n return null;\n }\n if (data !== null) {\n if (data.expires_at !== null && data.expires_at < new Date().getTime()) {\n localStorage.removeItem(variable.toString());\n } else {\n return data.value;\n }\n }\n return null;\n}\n","// @see https://gomakethings.com/promise-based-xhr/\n\nexport const makeRequest = function (url, method = 'GET') {\n\n // Create the XHR request\n var request = new XMLHttpRequest();\n\n // Return it as a Promise\n return new Promise(function (resolve, reject) {\n\n // Setup our listener to process compeleted requests\n request.onreadystatechange = function () {\n\n // Only run if the request is complete\n if (request.readyState !== 4) return;\n\n // Process the response\n if (request.status >= 200 && request.status < 300) {\n // If successful\n resolve(request);\n } else {\n // If failed\n reject({\n status: request.status,\n statusText: request.statusText,\n request: request\n });\n }\n\n };\n\n // Setup our HTTP request\n request.open(method || 'GET', url, true);\n\n // Send the request\n request.send();\n\n });\n};\n\nconst jsonDecodeIfPossible = function(str) {\n try {\n return JSON.parse(str);\n } catch(e) {\n return str;\n }\n}\n\nexport const makeJSONRequest = async function(url, method = 'GET') {\n try {\n const request = await makeRequest(url, method);\n return jsonDecodeIfPossible(request.responseText);\n } catch(e) {\n return jsonDecodeIfPossible(e.request.responseText);\n }\n}\n","import Record from './models/record';\nimport { getLocalStorage, setLocalStorage } from './lib/localStorageAccess';\nimport _ from './lodash.custom';\nimport { makeJSONRequest } from './lib/xhr';\n\n\nexport const options = window.geoip_detect?.options || {\n ajaxurl: \"/wp-admin/admin-ajax.php\",\n default_locales: ['en'],\n cookie_duration_in_days: 7,\n cookie_name: 'geoip-detect-result'\n};\n\nlet ajaxPromise = null;\n\nfunction get_info_raw() {\n if (!ajaxPromise) {\n // Do Ajax Request only once per page load\n const url = options.ajaxurl + '?action=geoip_detect2_get_info_from_current_ip'\n\n ajaxPromise = makeJSONRequest(url);\n }\n\n return ajaxPromise;\n}\n\nasync function get_info_cached() {\n let response = false;\n let storedResponse = false;\n\n // 1) Load Info from localstorage cookie cache, if possible\n if (options.cookie_name) {\n storedResponse = getLocalStorage(options.cookie_name)\n if (storedResponse && storedResponse.extra) {\n return storedResponse;\n }\n }\n\n // 2) Get response\n try {\n response = await get_info_raw();\n } catch (err) {\n response = err.responseJSON || err;\n }\n\n // 3) Save info to localstorage cookie cache\n if (options.cookie_name) {\n storedResponse = getLocalStorage(options.cookie_name)\n if (storedResponse?.extra?.override === true) {\n return storedResponse;\n }\n\n // This might be an error object - cache it anyway\n setLocalStorage(options.cookie_name, response, options.cookie_duration_in_days * 24 * 60 * 60);\n }\n\n return response;\n}\n\n\n/**\n * This functions allows to override the geodetected data manually (e.g. a country selector)\n * \n * @api\n * @param {*} record \n * @param {number} duration_in_days When this override expires (default: 1 week later)\n * @return boolean\n */\nexport function set_override(record, duration_in_days) {\n if (record && typeof(record.serialize) === 'function') {\n record = record.serialize();\n }\n\n duration_in_days = duration_in_days || options.cookie_duration_in_days;\n if (duration_in_days < 0) {\n console.warn('set_override_data() did nothing: A negative duration doesn\\'t make sense. If you want to remove the override, use remove_override() instead.');\n return false;\n }\n\n return set_override_data(record, duration_in_days);\n}\nfunction set_override_data(data, duration_in_days) {\n if (!data) {\n data = {};\n }\n if (!data.extra) {\n data.extra = {};\n }\n data.extra.override = true;\n\n setLocalStorage(options.cookie_name, data, duration_in_days * 24 * 60 * 60);\n return true;\n}\n\n/**\n * Remove the override data.\n * On next page load, the record data will be loaded from the server again.\n * \n * @return boolean\n */\nexport function remove_override() {\n setLocalStorage(options.cookie_name, {}, -1);\n return true;\n}\n\n\n/**\n * Load the data from the server\n * \n * (It can also be loaded from the browser localstorage, if the record data is present there already.)\n * \n * @api\n * @return Promise(Record)\n */\nexport async function get_info() {\n let response = await get_info_cached();\n\n if (typeof (response) !== 'object') {\n console.error('Geoip-detect: Record should be an object, not a ' + typeof (response), response);\n response = { 'extra': { 'error': response || 'Network error, look at the original server response ...' } };\n }\n\n const record = new Record(response, options.default_locales);\n return record;\n}","export const domReady = new Promise(resolve => {\n if (document.readyState === \"loading\") {\n if (document.addEventListener) {\n document.addEventListener('DOMContentLoaded', resolve);\n } else {\n document.attachEvent('onreadystatechange', function () {\n if (document.readyState != 'loading')\n resolve();\n });\n }\n }\n else {\n resolve();\n }\n});\n\nexport function selectItemByValue(el, value) {\n for (var i = 0; i < el.options.length; i++) {\n if (el.options[i].value === value) {\n el.selectedIndex = i;\n break;\n }\n }\n}\n\nexport function selectItemByAttribute(el, attributeName, attributeValue) {\n for (var i = 0; i < el.options.length; i++) {\n if (el.options[i].getAttribute(attributeName) === attributeValue) {\n el.selectedIndex = i;\n break;\n }\n }\n}\n\n\nexport function triggerNativeEvent(el, name) {\n if (document.createEvent) {\n const event = document.createEvent('HTMLEvents');\n event.initEvent(name, true, false);\n el.dispatchEvent(event);\n } else {\n el.fireEvent('on' + name);\n }\n}","import { get_info } from \"../lookup\";\n\n// Get Options from data-options and json parse them\nexport function get_options(el) {\n const raw = el.getAttribute('data-options');\n try {\n return JSON.parse(raw);\n } catch (e) {\n return {};\n }\n}\n\nexport async function action_on_elements(className, errorMessage, callback) {\n const elements = document.getElementsByClassName(className);\n if (!elements.length) return;\n\n const record = await get_info();\n\n if (record.error()) {\n console.error('Geolocation IP Detection Error (' + errorMessage + '): ' + record.error());\n return;\n }\n\n Array.from(elements)\n .forEach(el => callback(el, record));\n}\n\nexport function get_value_from_record(el, record, property = null) {\n const opt = get_options(el);\n property = property || opt.property;\n if (opt.skip_cache) {\n console.warn(\"Geolocation IP Detection: The property 'skip_cache' is ignored in AJAX mode. You could disable the response caching on the server by setting the constant GEOIP_DETECT_READER_CACHE_TIME.\");\n }\n\n return record.get_with_locales(property, opt.lang, opt.default);\n}","import { selectItemByAttribute, triggerNativeEvent } from \"../lib/html\";\nimport { get_value_from_record, get_options } from \"./helpers\";\n\nexport function do_shortcode_normal(el, record) {\n el.innerText = get_value_from_record(el, record);\n}\n\nexport function do_shortcode_flags(el, record) {\n const country = record.get_country_iso() || get_options(el).default;\n if (country) {\n el.classList.add('flag-icon-' + country)\n }\n}\n\nexport function do_shortcode_country_select(el, record) {\n let country = record.get_country_iso();\n\n selectItemByAttribute(el, 'data-c', country);\n triggerNativeEvent(el, 'change');\n}\n\nexport function do_shortcode_text_input(el, record) {\n el.value = get_value_from_record(el, record);\n triggerNativeEvent(el, 'change');\n}","import { get_options } from './helpers';\nimport _ from '../lodash.custom'; // we might use lodash-es in the future\n\n\nexport function do_shortcode_show_if(el, record) {\n const opt = get_options(el);\n const evaluated = geoip_detect2_shortcode_evaluate_conditions(opt.parsed, opt, record);\n\n if (!evaluated) {\n el.style.display = \"none !important\";\n } else {\n el.style.display = '';\n }\n}\n\nexport function geoip_detect2_shortcode_evaluate_conditions(parsed, opt, record) {\n const alternativePropertyNames = [\n 'name',\n 'iso_code',\n 'iso_code3',\n 'code',\n 'geoname_id',\n ];\n\n let isConditionMatching = (parsed.op === 'or') ? false : true;\n\n parsed.conditions.forEach(c => {\n let subConditionMatching = false;\n let values = [];\n\n const raw_value = record.get_raw(c.p);\n\n if (raw_value === null) {\n subConditionMatching = false;\n } else {\n if (typeof (raw_value) === 'object') {\n alternativePropertyNames.forEach(name => {\n if (raw_value[name]) {\n values.push(raw_value[name]);\n } else if (name == 'name') {\n values.push(record.get_with_locales(c.p, opt.lang));\n }\n })\n } else {\n values = [raw_value]\n }\n }\n\n subConditionMatching = geoip_detect2_shortcode_check_subcondition(c.v, values);\n\n if (c.not) {\n subConditionMatching = !subConditionMatching;\n }\n\n if (parsed.op === 'or') {\n isConditionMatching = isConditionMatching || subConditionMatching;\n } else {\n isConditionMatching = isConditionMatching && subConditionMatching;\n }\n\n });\n\n if (parsed.not) {\n isConditionMatching = !isConditionMatching;\n }\n\n return isConditionMatching;\n}\n\nfunction geoip_detect2_shortcode_check_subcondition(expectedValues, actualValues) {\n if (actualValues[0] === true) {\n actualValues = ['true', 'yes', 'y', '1'];\n } else if (actualValues[0] === false) {\n actualValues = ['false', 'no', 'n', '0', ''];\n }\n\n actualValues = actualValues.map(x => String(x).toLowerCase())\n\n expectedValues = expectedValues.split(',');\n\n const intersect = _.intersection(expectedValues, actualValues);\n\n return intersect.length > 0;\n}","import { domReady } from \"../lib/html\";\nimport { action_on_elements } from \"./helpers\";\nimport { do_shortcode_country_select, do_shortcode_flags, do_shortcode_normal, do_shortcode_text_input } from \"./normal\";\nimport { do_shortcode_show_if } from \"./show-if\";\n\n\nexport const do_shortcodes = async function do_shortcodes() {\n await domReady;\n\n // These are called in parallel, as they are async functions\n action_on_elements('js-geoip-detect-shortcode',\n 'could not execute shortcode(s) [geoip_detect2]', do_shortcode_normal);\n\n action_on_elements('js-geoip-detect-flag',\n 'could not configure the flag(s)', do_shortcode_flags);\n\n action_on_elements('js-geoip-text-input',\n 'could not set the value of the text input field(s)', do_shortcode_text_input);\n\n action_on_elements('js-geoip-detect-country-select',\n 'could not set the value of the select field(s)', do_shortcode_country_select);\n\n action_on_elements('js-geoip-detect-show-if',\n 'could not execute the show-if/hide-if conditions', do_shortcode_show_if);\n\n};","import { domReady } from './lib/html';\nimport { get_info } from './lookup';\n\nexport function calc_classes(record) {\n return {\n country: record.get('country.iso_code'),\n 'country-is-in-european-union': record.get('country.is_in_european_union', false),\n continent: record.get('continent.code'),\n province: record.get('most_specific_subdivision.iso_code'),\n };\n}\n\nexport async function add_body_classes() {\n const record = await get_info();\n\n if (record.error()) {\n console.error('Geodata Error (could not add CSS-classes to body): ' + record.error());\n return;\n }\n\n const css_classes = calc_classes(record);\n\n await domReady;\n\n const body = document.getElementsByTagName('body')[0];\n for (let key of Object.keys(css_classes)) {\n const value = css_classes[key];\n if (value) {\n if (typeof (value) == 'string') {\n body.classList.add(`geoip-${key}-${value}`);\n } else {\n body.classList.add(`geoip-${key}`);\n }\n }\n }\n}","import { get_info, options, remove_override, set_override } from './lookup';\nimport { do_shortcodes } from './shortcodes/index';\nimport { add_body_classes } from './body_classes';\n\n\n\nif (options.do_body_classes) {\n add_body_classes();\n}\nif (options.do_shortcodes) {\n do_shortcodes();\n}\n\n// Extend window object \nwindow.geoip_detect.get_info = get_info;\n\nwindow.geoip_detect.set_override = set_override;\nwindow.geoip_detect.remove_override = remove_override;"]}
js/dist/parcel.js CHANGED
@@ -1,3 +1,3 @@
1
  parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"mzZo":[function(require,module,exports) {
2
- module.exports={frontendJS:"frontend.2e78f904.js",backendJS:"backend.f84e1103.js"};
3
- },{"./js/frontend.js":[["frontend.2e78f904.js","ZVsn"],"frontend.2e78f904.js.map","ZVsn"],"./js/backend.js":[["backend.f84e1103.js","gP7L"],"backend.f84e1103.js.map","gP7L"]}]},{},[], null)
1
  parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"mzZo":[function(require,module,exports) {
2
+ module.exports={frontendJS:"frontend.1115d690.js",backendJS:"backend.f84e1103.js"};
3
+ },{"./js/frontend.js":[["frontend.1115d690.js","ZVsn"],"frontend.1115d690.js.map","ZVsn"],"./js/backend.js":[["backend.f84e1103.js","gP7L"],"backend.f84e1103.js.map","gP7L"]}]},{},[], null)
js/dist/parcel.json CHANGED
@@ -1,4 +1,4 @@
1
  {
2
- "frontendJS": "frontend.2e78f904.js",
3
  "backendJS": "backend.f84e1103.js"
4
  }
1
  {
2
+ "frontendJS": "frontend.1115d690.js",
3
  "backendJS": "backend.f84e1103.js"
4
  }
js/dist/parcel.urls CHANGED
@@ -1,2 +1,2 @@
1
- frontendJS: frontend.2e78f904.js
2
  backendJS: backend.f84e1103.js
1
+ frontendJS: frontend.1115d690.js
2
  backendJS: backend.f84e1103.js
js/models/record.js CHANGED
@@ -3,16 +3,8 @@ import _ from '../lodash.custom';
3
 
4
 
5
  const _get_localized = function(ret, locales) {
6
- if (typeof(ret) === 'object') {
7
-
8
- if (typeof(locales) === 'string') {
9
- locales = [ locales ];
10
- }
11
- if (typeof(locales) !== 'object') {
12
- locales = [];
13
- }
14
-
15
- if (typeof(ret.names) === 'object') {
16
  for (let i = 0 ; i < locales.length ; i++) {
17
  let locale = locales[i];
18
 
@@ -25,13 +17,23 @@ const _get_localized = function(ret, locales) {
25
  if (ret.name) {
26
  return ret.name;
27
  }
 
 
28
  }
29
  return ret;
30
  }
31
 
32
  export const camelToUnderscore = function(key) {
33
- // Tolerate PascalCase. But _key stays _key [ (?<=[a-z0-9]) means Look-ahead]
34
- return key.replace(/(?<=[a-z0-9])([A-Z])/g, "_$1").toLowerCase();
 
 
 
 
 
 
 
 
35
  }
36
 
37
  class Record {
@@ -39,8 +41,10 @@ class Record {
39
  default_locales = [];
40
 
41
  constructor(data, default_locales) {
42
- this.data = data || {};
43
- this.default_locales = default_locales || ['en'];
 
 
44
  }
45
 
46
  get(prop, default_value) {
@@ -53,31 +57,41 @@ class Record {
53
  }
54
 
55
  has_property(prop) {
56
- const ret = this._lookup_with_locales(prop, this.default_locales)
57
- return typeof(ret) !== 'undefined';
58
  }
59
 
60
  _lookup_with_locales(prop, locales, default_value = '') {
61
- prop = camelToUnderscore(prop);
62
-
63
  // Treat pseudo-property 'name' as if it never existed
64
  if (prop.substr(-5) === '.name') {
65
  prop = prop.substr(0, prop.length - 5);
66
  }
67
-
68
- let ret = _.get(this.data, prop, default_value);
69
-
70
  // Localize property, if possible
71
  ret = _get_localized(ret, locales);
 
 
 
 
72
 
73
  return ret;
74
  }
75
 
76
- get_with_locales(prop, locales, default_value) {
 
 
 
77
  if (!Array.isArray(locales) || locales.length === 0) {
78
  locales = this.default_locales;
79
  }
 
 
80
 
 
81
  const ret = this._lookup_with_locales(prop, locales, default_value);
82
 
83
  if (typeof(ret) === 'object') {
@@ -98,15 +112,27 @@ class Record {
98
  }
99
  return country;
100
  }
 
 
 
 
 
 
 
 
101
 
102
  /**
103
  * Get error message, if any
104
  * @return string Error Message
105
  */
106
  error() {
107
- return _.get(this.data, 'extra.error', '');
108
  }
109
 
 
 
 
 
110
  serialize() {
111
  return this.data;
112
  }
3
 
4
 
5
  const _get_localized = function(ret, locales) {
6
+ if (typeof(ret) === 'object' && ret !== null) {
7
+ if (typeof (ret.names) === 'object' && typeof (locales) === 'object') {
 
 
 
 
 
 
 
 
8
  for (let i = 0 ; i < locales.length ; i++) {
9
  let locale = locales[i];
10
 
17
  if (ret.name) {
18
  return ret.name;
19
  }
20
+
21
+ return '';
22
  }
23
  return ret;
24
  }
25
 
26
  export const camelToUnderscore = function(key) {
27
+ key = key.split('.').map((x) => {
28
+ if (typeof (x) !== 'string' || typeof (x[0]) !== 'string') {
29
+ return '';
30
+ }
31
+ x = x[0].toLowerCase() + x.slice(1); // to allow "MostSpecificSubdivision"
32
+ x = x.replace(/([A-Z])/g, "_$1").toLowerCase();
33
+ return x;
34
+ }).join('.');
35
+
36
+ return key;
37
  }
38
 
39
  class Record {
41
  default_locales = [];
42
 
43
  constructor(data, default_locales) {
44
+ this.data = data || { is_empty: true };
45
+
46
+ this.default_locales = ['en'];
47
+ this.default_locales = this._process_locales(default_locales);
48
  }
49
 
50
  get(prop, default_value) {
57
  }
58
 
59
  has_property(prop) {
60
+ const ret = this._lookup_with_locales(prop, this.default_locales, null)
61
+ return ret !== null;
62
  }
63
 
64
  _lookup_with_locales(prop, locales, default_value = '') {
65
+ locales = this._process_locales(locales);
66
+
67
  // Treat pseudo-property 'name' as if it never existed
68
  if (prop.substr(-5) === '.name') {
69
  prop = prop.substr(0, prop.length - 5);
70
  }
71
+
72
+ let ret = this.get_raw(prop);
73
+
74
  // Localize property, if possible
75
  ret = _get_localized(ret, locales);
76
+
77
+ if (ret === null || ret === '') {
78
+ ret = default_value;
79
+ }
80
 
81
  return ret;
82
  }
83
 
84
+ _process_locales(locales) {
85
+ if (typeof(locales) === 'string') {
86
+ locales = [ locales ];
87
+ }
88
  if (!Array.isArray(locales) || locales.length === 0) {
89
  locales = this.default_locales;
90
  }
91
+ return locales;
92
+ }
93
 
94
+ get_with_locales(prop, locales, default_value) {
95
  const ret = this._lookup_with_locales(prop, locales, default_value);
96
 
97
  if (typeof(ret) === 'object') {
112
  }
113
  return country;
114
  }
115
+
116
+ /**
117
+ * Check if there is information available for this IP
118
+ * @returns boolean
119
+ */
120
+ is_empty() {
121
+ return this.get('is_empty', false);
122
+ }
123
 
124
  /**
125
  * Get error message, if any
126
  * @return string Error Message
127
  */
128
  error() {
129
+ return this.get_raw('extra.error') || '';
130
  }
131
 
132
+ /**
133
+ * Get the raw data of this object
134
+ * @returns object
135
+ */
136
  serialize() {
137
  return this.data;
138
  }
js/models/record.test.js CHANGED
@@ -1,25 +1,64 @@
1
  import { getTestRecord, getTestRecordError } from "../test-lib/test-records";
2
- import Record from "./record";
3
 
4
 
5
  const emptyRecord = new Record();
6
  const defaultRecord = getTestRecord();
7
  const errorRecord = getTestRecordError();
8
 
 
 
 
 
 
 
 
 
9
  test('get error message', () => {
10
  expect(emptyRecord.error()).toBe('');
11
  expect(defaultRecord.error()).toBe('');
12
  expect(errorRecord.error()).not.toBe('');
13
  })
14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  test('localisation variants', () => {
16
  expect(defaultRecord.get_with_locales('country.name', ['de', 'en'])).toBe('Deutschland');
17
  expect(defaultRecord.get_with_locales('country', ['de', 'en'])).toBe('Deutschland');
18
  expect(defaultRecord.get_with_locales('country.names.de', ['de', 'en'])).toBe('Deutschland');
19
  expect(defaultRecord.get_with_locales('country.names.en', ['de', 'en'])).toBe('Germany');
20
-
21
  expect(defaultRecord.get_with_locales('most_specific_subdivision', ['de', 'en'])).toBe('Hessen');
22
- expect(defaultRecord.get_with_locales('mostSpecificSubdivision', ['de', 'en'])).toBe('Hessen');
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  });
24
 
25
  test('localisation', () => {
@@ -27,9 +66,36 @@ test('localisation', () => {
27
  expect(defaultRecord.get_with_locales('country.name', ['en', 'de'])).toBe('Germany');
28
  expect(defaultRecord.get_with_locales('country.name', ['nn', 'mm', 'de', 'en'])).toBe('Deutschland');
29
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
  test('country iso', () => {
32
  expect(defaultRecord.get_country_iso()).toBe('de');
33
  expect(emptyRecord.get_country_iso()).toBe('');
34
  expect(errorRecord.get_country_iso()).toBe('');
 
 
 
 
 
 
 
 
 
 
 
35
  });
1
  import { getTestRecord, getTestRecordError } from "../test-lib/test-records";
2
+ import Record, { camelToUnderscore } from "./record";
3
 
4
 
5
  const emptyRecord = new Record();
6
  const defaultRecord = getTestRecord();
7
  const errorRecord = getTestRecordError();
8
 
9
+ test('serialize', () => {
10
+ const testData = {a: '1', c: { names: {de: 'b', en: 'a'} } };
11
+ const testRecord = new Record(testData)
12
+ expect(testRecord.serialize()).toStrictEqual(testData);
13
+ expect(testRecord.get_with_locales('c')).toBe('a');
14
+ expect(emptyRecord.serialize()).toStrictEqual({'is_empty': true});
15
+ });
16
+
17
  test('get error message', () => {
18
  expect(emptyRecord.error()).toBe('');
19
  expect(defaultRecord.error()).toBe('');
20
  expect(errorRecord.error()).not.toBe('');
21
  })
22
 
23
+ test('get with default', () => {
24
+ expect(defaultRecord.get('')).toBe('');
25
+ expect(defaultRecord.get('', 'default')).toBe('default');
26
+ expect(defaultRecord.get('xyz', 'default')).toBe('default');
27
+ expect(defaultRecord.get('city.xyz', 'default')).toBe('default');
28
+ expect(defaultRecord.get('city', 'default')).toBe('Eschborn');
29
+ });
30
+
31
+ test('is_empty', () => {
32
+ expect(defaultRecord.get('is_empty', 'default')).toBe(false);
33
+ expect(emptyRecord.get('is_empty', 'default')).toBe(true);
34
+ expect(errorRecord.get('is_empty', 'default')).toBe(true);
35
+
36
+ expect(defaultRecord.is_empty()).toBe(false);
37
+ expect(emptyRecord.is_empty()).toBe(true);
38
+ expect(errorRecord.is_empty()).toBe(true);
39
+ })
40
+
41
  test('localisation variants', () => {
42
  expect(defaultRecord.get_with_locales('country.name', ['de', 'en'])).toBe('Deutschland');
43
  expect(defaultRecord.get_with_locales('country', ['de', 'en'])).toBe('Deutschland');
44
  expect(defaultRecord.get_with_locales('country.names.de', ['de', 'en'])).toBe('Deutschland');
45
  expect(defaultRecord.get_with_locales('country.names.en', ['de', 'en'])).toBe('Germany');
46
+
47
  expect(defaultRecord.get_with_locales('most_specific_subdivision', ['de', 'en'])).toBe('Hessen');
48
+
49
+ const otherRecord = new Record({country: {name: 'Deutschland'}});
50
+ expect(otherRecord.get_with_locales('country.name', ['de', 'en'])).toBe('Deutschland');
51
+
52
+ expect(defaultRecord.get_with_locales('extra', ['de', 'en'])).toBe('');
53
+ expect(defaultRecord.get_with_locales('xyz.name', ['de', 'en'])).toBe('');
54
+ expect(otherRecord.get_with_locales('city.name', ['de', 'en'])).toBe('');
55
+
56
+ expect(defaultRecord.get_with_locales('country.name', 'de')).toBe('Deutschland');
57
+ expect(defaultRecord.get_with_locales('country.name', [])).toBe('Germany');
58
+ expect(defaultRecord.get_with_locales('country.name', null)).toBe('Germany');
59
+ expect(defaultRecord.get_with_locales('country.name', undefined)).toBe('Germany');
60
+ expect(defaultRecord.get_with_locales('country.name')).toBe('Germany');
61
+ expect(defaultRecord.get('country.name')).toBe('Germany');
62
  });
63
 
64
  test('localisation', () => {
66
  expect(defaultRecord.get_with_locales('country.name', ['en', 'de'])).toBe('Germany');
67
  expect(defaultRecord.get_with_locales('country.name', ['nn', 'mm', 'de', 'en'])).toBe('Deutschland');
68
  });
69
+ test('localisation with defaults', () => {
70
+ expect(defaultRecord.get_with_locales('unknownAttribute', ['en'], 'default')).toBe('default');
71
+ expect(defaultRecord.get_with_locales('country.name', ['xs'])).toBe('');
72
+ expect(defaultRecord.get_with_locales('country.name', ['xs'], 'default')).toBe('default');
73
+ });
74
+
75
+ test('camelCase', () => {
76
+ expect(camelToUnderscore('_specific_subdivision')).toBe('_specific_subdivision');
77
+ expect(camelToUnderscore('MostSpecificSubdivision')).toBe('most_specific_subdivision');
78
+ expect(camelToUnderscore('mostSpecificSubdivision')).toBe('most_specific_subdivision');
79
+ expect(camelToUnderscore('mostSpecificSubdivision.isoCode')).toBe('most_specific_subdivision.iso_code');
80
+ expect(camelToUnderscore('most_specific_subdivision')).toBe('most_specific_subdivision');
81
+ expect(camelToUnderscore('country.iso_code')).toBe('country.iso_code');
82
+ expect(camelToUnderscore('country.iso_code.0')).toBe('country.iso_code.0');
83
+ expect(camelToUnderscore('Country.IsoCode')).toBe('country.iso_code');
84
+ });
85
 
86
  test('country iso', () => {
87
  expect(defaultRecord.get_country_iso()).toBe('de');
88
  expect(emptyRecord.get_country_iso()).toBe('');
89
  expect(errorRecord.get_country_iso()).toBe('');
90
+ });
91
+
92
+ test('has_property', () => {
93
+ expect(defaultRecord.has_property('country')).toBe(true);
94
+ expect(emptyRecord.has_property('country')).toBe(false);
95
+ expect(defaultRecord.has_property('xyz')).toBe(false);
96
+ expect(defaultRecord.has_property('is_empty')).toBe(true);
97
+ expect(emptyRecord.has_property('is_empty')).toBe(true);
98
+
99
+ expect(defaultRecord.has_property('country.name')).toBe(true);
100
+ expect(emptyRecord.has_property('country')).toBe(false);
101
  });
package.json CHANGED
@@ -11,7 +11,7 @@
11
  "build-lodash": "lodash include=get,intersection -o js/lodash.custom.js",
12
  "start": "rm -rf js/dist && parcel parcel.urls --out-dir js/dist --public-url .",
13
  "build": "rm -rf js/dist && parcel build parcel.urls --out-dir js/dist --public-url .",
14
- "test": "jest"
15
  },
16
  "private": false,
17
  "dependencies": {
@@ -19,16 +19,16 @@
19
  "emoji-flags": ">=1.3.0"
20
  },
21
  "devDependencies": {
22
- "@babel/core": "^7.12.13",
23
- "@babel/plugin-transform-runtime": ">=7.6.2",
24
- "@babel/preset-env": "^7.12.13",
25
- "babel-jest": "^26.6.3",
26
- "babel-plugin-transform-class-properties": "^6.24.1",
27
- "eslint": "^7.19.0",
28
- "jest": "^26.6.3",
29
- "lodash-cli": ">=4.17.5",
30
- "parcel-bundler": ">=1.12.4",
31
- "parcel-plugin-assets-list": ">=1.7.1"
32
  },
33
  "resolutions": {
34
  "node-forge": "0.10.0"
11
  "build-lodash": "lodash include=get,intersection -o js/lodash.custom.js",
12
  "start": "rm -rf js/dist && parcel parcel.urls --out-dir js/dist --public-url .",
13
  "build": "rm -rf js/dist && parcel build parcel.urls --out-dir js/dist --public-url .",
14
+ "test": "jest --coverage"
15
  },
16
  "private": false,
17
  "dependencies": {
19
  "emoji-flags": ">=1.3.0"
20
  },
21
  "devDependencies": {
22
+ "@babel/core": "7.13.8",
23
+ "@babel/plugin-transform-runtime": "7.13.9",
24
+ "@babel/preset-env": "7.13.9",
25
+ "babel-jest": "26.6.3",
26
+ "babel-plugin-transform-class-properties": "6.24.1",
27
+ "eslint": "7.21.0",
28
+ "jest": "26.6.3",
29
+ "lodash-cli": "4.17.5",
30
+ "parcel-bundler": "1.12.4",
31
+ "parcel-plugin-assets-list": "1.7.1"
32
  },
33
  "resolutions": {
34
  "node-forge": "0.10.0"
readme.txt CHANGED
@@ -163,8 +163,15 @@ If you use Maxmind "Automatic download" then you need to upgrade to this plugin
163
 
164
  == Changelog ==
165
 
 
 
 
 
 
 
 
166
  = 4.0.1 =
167
- * Revert Maxmind library to 2.10.0 for now as the most current version seems to be incompatible with Wordfence and other plugins using the older version of the Maxmind library
168
 
169
  = 4.0.0 =
170
  This version has many changes regarding the Shortcodes API. It is a major version because it increases some system requirements (see below).
163
 
164
  == Changelog ==
165
 
166
+
167
+ = 4.1.0 =
168
+ * NEW: An `else` shortcode for `geoip_detect2_show_if` and `geoip_detect2_hide_if`: `[geoip_detect2_show_if city="Berlin"]Hallo Berlin![else]Not in Berlin[/geoip_detect2_show_if]`
169
+ * FIX: The JS for AJAX wasn't working for Safari browsers
170
+ * FIX: Improving some edge cases of `Record.get_with_locales()` and other methods of `Record` to be consistent with non-AJAX mode
171
+ * FIX: Revert more Maxmind libraries to fix incompatibility with WooCommerce
172
+
173
  = 4.0.1 =
174
+ * FIX: Revert Maxmind library to 2.10.0 for now as the most current version seems to be incompatible with Wordfence and other plugins using the older version of the Maxmind library
175
 
176
  = 4.0.0 =
177
  This version has many changes regarding the Shortcodes API. It is a major version because it increases some system requirements (see below).
renovate.json ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "extends": [
3
+ "config:base"
4
+ ],
5
+ "ignoreDeps": ["geoip2/geoip2", "maxmind-db/reader", "maxmind/web-service-common"],
6
+ "packageRules": [
7
+ {
8
+ "matchPackagePatterns": [
9
+ "eslint",
10
+ "jest"
11
+ ],
12
+ "groupName": "testing (JS)",
13
+ "schedule": [
14
+ "before 2am on monday"
15
+ ],
16
+ "automerge": true,
17
+ "automergeType": "branch"
18
+ },
19
+ {
20
+ "matchPackagePatterns": [
21
+ "phpunit",
22
+ "roots/wordpress"
23
+ ],
24
+ "groupName": "testing (PHP)",
25
+ "schedule": [
26
+ "before 2am on monday"
27
+ ],
28
+ "automerge": true,
29
+ "automergeType": "branch"
30
+ },
31
+ {
32
+ "matchPackagePatterns": [
33
+ "symfony"
34
+ ],
35
+ "groupName": "symfony",
36
+ "schedule": [
37
+ "before 3am on the first day of the month"
38
+ ],
39
+ "automerge": false
40
+ }
41
+ ]
42
+ }
shortcodes/show_if.php CHANGED
@@ -62,26 +62,42 @@
62
  * Show TEXT if the visitor is from Berlin OR France (since 4.0.0)
63
  * `[geoip_detect2_show_if city="Berlin" operator="or" country="France"]TEXT[/geoip_detect2_show_if]`
64
  *
 
 
 
65
  * LIMITATIONS:
66
  * - You cannot nest several of these shortcodes within one another. Instead, seperate them into several blocks of shortcodes.
67
  * - City names can be ambigous. For example, [geoip_detect2_show_if country="US,FR" not_city="Paris"] will exclude both Paris in France and Paris in Texas, US. Instead, you can find out the geoname_id or seperate the shortcode to make it more specific.
68
  * - Conditions can either be combined by AND or OR. It is not possible to write this condition within a shortcode: (city = Berlin AND country = Germany) OR country = France
69
  */
70
- function geoip_detect2_shortcode_show_if($attr, $content = null, $shortcodeName = '') {
71
  $shortcode_options = _geoip_detect2_shortcode_options($attr);
72
  $options = array('skipCache' => $shortcode_options['skip_cache']);
73
 
74
  $showContentIfMatch = ($shortcodeName === 'geoip_detect2_show_if');
75
 
76
  $attr = (array) $attr;
 
 
 
 
 
77
 
78
  $parsed = geoip_detect2_shortcode_parse_conditions_from_attributes($attr, !$showContentIfMatch);
79
 
80
  if (geoip_detect2_shortcode_is_ajax_mode($attr)) {
81
  geoip_detect2_enqueue_javascript('shortcode');
 
82
  $shortcode_options['parsed'] = $parsed;
83
- $innerHTML= do_shortcode($content);
84
- return _geoip_detect2_create_placeholder('span', [ 'class' => 'js-geoip-detect-show-if', 'style' => 'display: none !important' ], $shortcode_options, $innerHTML);
 
 
 
 
 
 
 
85
  } else {
86
  $info = geoip_detect2_get_info_from_current_ip($shortcode_options['lang'], $options);
87
 
@@ -97,11 +113,12 @@ function geoip_detect2_shortcode_show_if($attr, $content = null, $shortcodeName
97
  $info = apply_filters('geoip_detect2_shortcode_show_if_ip_info_override', $info, $attr, $showContentIfMatch);
98
 
99
  $evaluated = geoip_detect2_shortcode_evaluate_conditions($parsed, $info);
100
- // All Criteria Passed?
101
  if ($evaluated) {
102
- return do_shortcode($content);
 
 
103
  }
104
- return '';
105
  }
106
  }
107
  add_shortcode('geoip_detect2_show_if', 'geoip_detect2_shortcode_show_if');
@@ -130,9 +147,7 @@ function geoip_detect2_shortcode_parse_conditions_from_attributes(array $attr, b
130
  $parsed = [
131
  'op' => ( !empty($attr['operator']) && strtolower($attr['operator']) === 'or' ) ? 'or' : 'and',
132
  ];
133
- if ($hide_if) {
134
- $parsed['not'] = 1;
135
- }
136
 
137
  $conditions = [];
138
 
62
  * Show TEXT if the visitor is from Berlin OR France (since 4.0.0)
63
  * `[geoip_detect2_show_if city="Berlin" operator="or" country="France"]TEXT[/geoip_detect2_show_if]`
64
  *
65
+ * Show TEXT if the visitor is from Berlin, otherwise show OTHER (since 4.1.0)
66
+ * `[geoip_detect2_show_if city="Berlin"]TEXT[else]OTHER[/geoip_detect2_show_if]`
67
+ *
68
  * LIMITATIONS:
69
  * - You cannot nest several of these shortcodes within one another. Instead, seperate them into several blocks of shortcodes.
70
  * - City names can be ambigous. For example, [geoip_detect2_show_if country="US,FR" not_city="Paris"] will exclude both Paris in France and Paris in Texas, US. Instead, you can find out the geoname_id or seperate the shortcode to make it more specific.
71
  * - Conditions can either be combined by AND or OR. It is not possible to write this condition within a shortcode: (city = Berlin AND country = Germany) OR country = France
72
  */
73
+ function geoip_detect2_shortcode_show_if($attr, $content = '', $shortcodeName = '') {
74
  $shortcode_options = _geoip_detect2_shortcode_options($attr);
75
  $options = array('skipCache' => $shortcode_options['skip_cache']);
76
 
77
  $showContentIfMatch = ($shortcodeName === 'geoip_detect2_show_if');
78
 
79
  $attr = (array) $attr;
80
+
81
+ $else_seperator = apply_filters('geoip_detect2_shortcode_show_if_else_seperator', '[else]');
82
+ $parts = explode($else_seperator, $content, 2);
83
+ $content_if = $parts[0];
84
+ $content_else = isset($parts[1]) ? $parts[1] : '';
85
 
86
  $parsed = geoip_detect2_shortcode_parse_conditions_from_attributes($attr, !$showContentIfMatch);
87
 
88
  if (geoip_detect2_shortcode_is_ajax_mode($attr)) {
89
  geoip_detect2_enqueue_javascript('shortcode');
90
+
91
  $shortcode_options['parsed'] = $parsed;
92
+ $span_attributes = [ 'class' => 'js-geoip-detect-show-if', 'style' => 'display: none !important' ];
93
+ $span_tagname = 'span'; // TODO: Should be 'div' under certain cirumstances, to test
94
+
95
+ $span_if = _geoip_detect2_create_placeholder($span_tagname, $span_attributes, $shortcode_options, do_shortcode($content_if));
96
+
97
+ $shortcode_options['parsed']['not'] = ($shortcode_options['parsed']['not'] === 1 ? 0 : 1); // negate
98
+ $span_else = _geoip_detect2_create_placeholder($span_tagname, $span_attributes, $shortcode_options, do_shortcode($content_else));
99
+
100
+ return $span_if . $span_else;
101
  } else {
102
  $info = geoip_detect2_get_info_from_current_ip($shortcode_options['lang'], $options);
103
 
113
  $info = apply_filters('geoip_detect2_shortcode_show_if_ip_info_override', $info, $attr, $showContentIfMatch);
114
 
115
  $evaluated = geoip_detect2_shortcode_evaluate_conditions($parsed, $info);
116
+
117
  if ($evaluated) {
118
+ return do_shortcode($content_if);
119
+ } else {
120
+ return do_shortcode($content_else);
121
  }
 
122
  }
123
  }
124
  add_shortcode('geoip_detect2_show_if', 'geoip_detect2_shortcode_show_if');
147
  $parsed = [
148
  'op' => ( !empty($attr['operator']) && strtolower($attr['operator']) === 'or' ) ? 'or' : 'and',
149
  ];
150
+ $parsed['not'] = $hide_if ? 1 : 0;
 
 
151
 
152
  $conditions = [];
153
 
vendor/composer/autoload_classmap.php CHANGED
@@ -160,7 +160,6 @@ return array(
160
  'Symfony\\Component\\PropertyAccess\\PropertyPathInterface' => $vendorDir . '/symfony/property-access/PropertyPathInterface.php',
161
  'Symfony\\Component\\PropertyAccess\\PropertyPathIterator' => $vendorDir . '/symfony/property-access/PropertyPathIterator.php',
162
  'Symfony\\Component\\PropertyAccess\\PropertyPathIteratorInterface' => $vendorDir . '/symfony/property-access/PropertyPathIteratorInterface.php',
163
- 'Symfony\\Component\\PropertyAccess\\StringUtil' => $vendorDir . '/symfony/property-access/StringUtil.php',
164
  'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoConstructorPass' => $vendorDir . '/symfony/property-info/DependencyInjection/PropertyInfoConstructorPass.php',
165
  'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoPass' => $vendorDir . '/symfony/property-info/DependencyInjection/PropertyInfoPass.php',
166
  'Symfony\\Component\\PropertyInfo\\Extractor\\ConstructorArgumentTypeExtractorInterface' => $vendorDir . '/symfony/property-info/Extractor/ConstructorArgumentTypeExtractorInterface.php',
160
  'Symfony\\Component\\PropertyAccess\\PropertyPathInterface' => $vendorDir . '/symfony/property-access/PropertyPathInterface.php',
161
  'Symfony\\Component\\PropertyAccess\\PropertyPathIterator' => $vendorDir . '/symfony/property-access/PropertyPathIterator.php',
162
  'Symfony\\Component\\PropertyAccess\\PropertyPathIteratorInterface' => $vendorDir . '/symfony/property-access/PropertyPathIteratorInterface.php',
 
163
  'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoConstructorPass' => $vendorDir . '/symfony/property-info/DependencyInjection/PropertyInfoConstructorPass.php',
164
  'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoPass' => $vendorDir . '/symfony/property-info/DependencyInjection/PropertyInfoPass.php',
165
  'Symfony\\Component\\PropertyInfo\\Extractor\\ConstructorArgumentTypeExtractorInterface' => $vendorDir . '/symfony/property-info/Extractor/ConstructorArgumentTypeExtractorInterface.php',
vendor/composer/autoload_static.php CHANGED
@@ -259,7 +259,6 @@ class ComposerStaticInit18fc54d84025f2e5d2b2ac2dd487f107
259
  'Symfony\\Component\\PropertyAccess\\PropertyPathInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathInterface.php',
260
  'Symfony\\Component\\PropertyAccess\\PropertyPathIterator' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathIterator.php',
261
  'Symfony\\Component\\PropertyAccess\\PropertyPathIteratorInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathIteratorInterface.php',
262
- 'Symfony\\Component\\PropertyAccess\\StringUtil' => __DIR__ . '/..' . '/symfony/property-access/StringUtil.php',
263
  'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoConstructorPass' => __DIR__ . '/..' . '/symfony/property-info/DependencyInjection/PropertyInfoConstructorPass.php',
264
  'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoPass' => __DIR__ . '/..' . '/symfony/property-info/DependencyInjection/PropertyInfoPass.php',
265
  'Symfony\\Component\\PropertyInfo\\Extractor\\ConstructorArgumentTypeExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/Extractor/ConstructorArgumentTypeExtractorInterface.php',
259
  'Symfony\\Component\\PropertyAccess\\PropertyPathInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathInterface.php',
260
  'Symfony\\Component\\PropertyAccess\\PropertyPathIterator' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathIterator.php',
261
  'Symfony\\Component\\PropertyAccess\\PropertyPathIteratorInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathIteratorInterface.php',
 
262
  'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoConstructorPass' => __DIR__ . '/..' . '/symfony/property-info/DependencyInjection/PropertyInfoConstructorPass.php',
263
  'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoPass' => __DIR__ . '/..' . '/symfony/property-info/DependencyInjection/PropertyInfoPass.php',
264
  'Symfony\\Component\\PropertyInfo\\Extractor\\ConstructorArgumentTypeExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/Extractor/ConstructorArgumentTypeExtractorInterface.php',
vendor/composer/installed.json CHANGED
@@ -115,31 +115,30 @@
115
  },
116
  {
117
  "name": "maxmind-db/reader",
118
- "version": "v1.10.0",
119
- "version_normalized": "1.10.0.0",
120
  "source": {
121
  "type": "git",
122
  "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
123
- "reference": "07f84d969cfc527ce49388558a366ad376f1f35c"
124
  },
125
  "dist": {
126
  "type": "zip",
127
- "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/07f84d969cfc527ce49388558a366ad376f1f35c",
128
- "reference": "07f84d969cfc527ce49388558a366ad376f1f35c",
129
  "shasum": ""
130
  },
131
  "require": {
132
- "php": ">=7.2"
133
  },
134
  "conflict": {
135
- "ext-maxminddb": "<1.10.0,>=2.0.0"
136
  },
137
  "require-dev": {
138
- "friendsofphp/php-cs-fixer": "*",
139
  "php-coveralls/php-coveralls": "^2.1",
140
- "phpstan/phpstan": "*",
141
- "phpunit/phpcov": ">=6.0.0",
142
- "phpunit/phpunit": ">=8.0.0,<10.0.0",
143
  "squizlabs/php_codesniffer": "3.*"
144
  },
145
  "suggest": {
@@ -147,7 +146,7 @@
147
  "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
148
  "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
149
  },
150
- "time": "2021-02-09T17:52:47+00:00",
151
  "type": "library",
152
  "installation-source": "dist",
153
  "autoload": {
@@ -178,31 +177,31 @@
178
  },
179
  {
180
  "name": "maxmind/web-service-common",
181
- "version": "v0.8.1",
182
- "version_normalized": "0.8.1.0",
183
  "source": {
184
  "type": "git",
185
  "url": "https://github.com/maxmind/web-service-common-php.git",
186
- "reference": "32f274051c543fc865e5a84d3a2c703913641ea8"
187
  },
188
  "dist": {
189
  "type": "zip",
190
- "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/32f274051c543fc865e5a84d3a2c703913641ea8",
191
- "reference": "32f274051c543fc865e5a84d3a2c703913641ea8",
192
  "shasum": ""
193
  },
194
  "require": {
195
  "composer/ca-bundle": "^1.0.3",
196
  "ext-curl": "*",
197
  "ext-json": "*",
198
- "php": ">=7.2"
199
  },
200
  "require-dev": {
201
  "friendsofphp/php-cs-fixer": "2.*",
202
- "phpunit/phpunit": "^8.0 || ^9.0",
203
  "squizlabs/php_codesniffer": "3.*"
204
  },
205
- "time": "2020-11-02T17:00:53+00:00",
206
  "type": "library",
207
  "installation-source": "dist",
208
  "autoload": {
@@ -278,17 +277,17 @@
278
  },
279
  {
280
  "name": "symfony/http-foundation",
281
- "version": "v5.2.3",
282
- "version_normalized": "5.2.3.0",
283
  "source": {
284
  "type": "git",
285
  "url": "https://github.com/symfony/http-foundation.git",
286
- "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36"
287
  },
288
  "dist": {
289
  "type": "zip",
290
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/20c554c0f03f7cde5ce230ed248470cccbc34c36",
291
- "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36",
292
  "shasum": ""
293
  },
294
  "require": {
@@ -306,7 +305,7 @@
306
  "suggest": {
307
  "symfony/mime": "To use the file extension guesser"
308
  },
309
- "time": "2021-02-03T04:42:09+00:00",
310
  "type": "library",
311
  "installation-source": "dist",
312
  "autoload": {
@@ -668,8 +667,8 @@
668
  },
669
  {
670
  "name": "symfony/property-access",
671
- "version": "v5.2.3",
672
- "version_normalized": "5.2.3.0",
673
  "source": {
674
  "type": "git",
675
  "url": "https://github.com/symfony/property-access.git",
@@ -734,17 +733,17 @@
734
  },
735
  {
736
  "name": "symfony/property-info",
737
- "version": "v5.2.3",
738
- "version_normalized": "5.2.3.0",
739
  "source": {
740
  "type": "git",
741
  "url": "https://github.com/symfony/property-info.git",
742
- "reference": "4e4f368c3737b1c175d66f4fc0b99a5bcd161a77"
743
  },
744
  "dist": {
745
  "type": "zip",
746
- "url": "https://api.github.com/repos/symfony/property-info/zipball/4e4f368c3737b1c175d66f4fc0b99a5bcd161a77",
747
- "reference": "4e4f368c3737b1c175d66f4fc0b99a5bcd161a77",
748
  "shasum": ""
749
  },
750
  "require": {
@@ -771,7 +770,7 @@
771
  "symfony/doctrine-bridge": "To use Doctrine metadata",
772
  "symfony/serializer": "To use Serializer metadata"
773
  },
774
- "time": "2021-01-27T10:15:41+00:00",
775
  "type": "library",
776
  "installation-source": "dist",
777
  "autoload": {
@@ -809,17 +808,17 @@
809
  },
810
  {
811
  "name": "symfony/string",
812
- "version": "v5.2.3",
813
- "version_normalized": "5.2.3.0",
814
  "source": {
815
  "type": "git",
816
  "url": "https://github.com/symfony/string.git",
817
- "reference": "c95468897f408dd0aca2ff582074423dd0455122"
818
  },
819
  "dist": {
820
  "type": "zip",
821
- "url": "https://api.github.com/repos/symfony/string/zipball/c95468897f408dd0aca2ff582074423dd0455122",
822
- "reference": "c95468897f408dd0aca2ff582074423dd0455122",
823
  "shasum": ""
824
  },
825
  "require": {
@@ -836,7 +835,7 @@
836
  "symfony/translation-contracts": "^1.1|^2",
837
  "symfony/var-exporter": "^4.4|^5.0"
838
  },
839
- "time": "2021-01-25T15:14:59+00:00",
840
  "type": "library",
841
  "installation-source": "dist",
842
  "autoload": {
115
  },
116
  {
117
  "name": "maxmind-db/reader",
118
+ "version": "v1.6.0",
119
+ "version_normalized": "1.6.0.0",
120
  "source": {
121
  "type": "git",
122
  "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
123
+ "reference": "febd4920bf17c1da84cef58e56a8227dfb37fbe4"
124
  },
125
  "dist": {
126
  "type": "zip",
127
+ "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/febd4920bf17c1da84cef58e56a8227dfb37fbe4",
128
+ "reference": "febd4920bf17c1da84cef58e56a8227dfb37fbe4",
129
  "shasum": ""
130
  },
131
  "require": {
132
+ "php": ">=5.6"
133
  },
134
  "conflict": {
135
+ "ext-maxminddb": "<1.6.0,>=2.0.0"
136
  },
137
  "require-dev": {
138
+ "friendsofphp/php-cs-fixer": "2.*",
139
  "php-coveralls/php-coveralls": "^2.1",
140
+ "phpunit/phpcov": "^3.0",
141
+ "phpunit/phpunit": "5.*",
 
142
  "squizlabs/php_codesniffer": "3.*"
143
  },
144
  "suggest": {
146
  "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
147
  "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
148
  },
149
+ "time": "2019-12-19T22:59:03+00:00",
150
  "type": "library",
151
  "installation-source": "dist",
152
  "autoload": {
177
  },
178
  {
179
  "name": "maxmind/web-service-common",
180
+ "version": "v0.7.0",
181
+ "version_normalized": "0.7.0.0",
182
  "source": {
183
  "type": "git",
184
  "url": "https://github.com/maxmind/web-service-common-php.git",
185
+ "reference": "74c996c218ada5c639c8c2f076756e059f5552fc"
186
  },
187
  "dist": {
188
  "type": "zip",
189
+ "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/74c996c218ada5c639c8c2f076756e059f5552fc",
190
+ "reference": "74c996c218ada5c639c8c2f076756e059f5552fc",
191
  "shasum": ""
192
  },
193
  "require": {
194
  "composer/ca-bundle": "^1.0.3",
195
  "ext-curl": "*",
196
  "ext-json": "*",
197
+ "php": ">=5.6"
198
  },
199
  "require-dev": {
200
  "friendsofphp/php-cs-fixer": "2.*",
201
+ "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0",
202
  "squizlabs/php_codesniffer": "3.*"
203
  },
204
+ "time": "2020-05-06T14:07:26+00:00",
205
  "type": "library",
206
  "installation-source": "dist",
207
  "autoload": {
277
  },
278
  {
279
  "name": "symfony/http-foundation",
280
+ "version": "v5.2.4",
281
+ "version_normalized": "5.2.4.0",
282
  "source": {
283
  "type": "git",
284
  "url": "https://github.com/symfony/http-foundation.git",
285
+ "reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf"
286
  },
287
  "dist": {
288
  "type": "zip",
289
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/54499baea7f7418bce7b5ec92770fd0799e8e9bf",
290
+ "reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf",
291
  "shasum": ""
292
  },
293
  "require": {
305
  "suggest": {
306
  "symfony/mime": "To use the file extension guesser"
307
  },
308
+ "time": "2021-02-25T17:16:57+00:00",
309
  "type": "library",
310
  "installation-source": "dist",
311
  "autoload": {
667
  },
668
  {
669
  "name": "symfony/property-access",
670
+ "version": "v5.2.4",
671
+ "version_normalized": "5.2.4.0",
672
  "source": {
673
  "type": "git",
674
  "url": "https://github.com/symfony/property-access.git",
733
  },
734
  {
735
  "name": "symfony/property-info",
736
+ "version": "v5.2.4",
737
+ "version_normalized": "5.2.4.0",
738
  "source": {
739
  "type": "git",
740
  "url": "https://github.com/symfony/property-info.git",
741
+ "reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189"
742
  },
743
  "dist": {
744
  "type": "zip",
745
+ "url": "https://api.github.com/repos/symfony/property-info/zipball/7185bbc74e6f49c3f1b5936b4d9e4ca133921189",
746
+ "reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189",
747
  "shasum": ""
748
  },
749
  "require": {
770
  "symfony/doctrine-bridge": "To use Doctrine metadata",
771
  "symfony/serializer": "To use Serializer metadata"
772
  },
773
+ "time": "2021-02-17T15:24:54+00:00",
774
  "type": "library",
775
  "installation-source": "dist",
776
  "autoload": {
808
  },
809
  {
810
  "name": "symfony/string",
811
+ "version": "v5.2.4",
812
+ "version_normalized": "5.2.4.0",
813
  "source": {
814
  "type": "git",
815
  "url": "https://github.com/symfony/string.git",
816
+ "reference": "4e78d7d47061fa183639927ec40d607973699609"
817
  },
818
  "dist": {
819
  "type": "zip",
820
+ "url": "https://api.github.com/repos/symfony/string/zipball/4e78d7d47061fa183639927ec40d607973699609",
821
+ "reference": "4e78d7d47061fa183639927ec40d607973699609",
822
  "shasum": ""
823
  },
824
  "require": {
835
  "symfony/translation-contracts": "^1.1|^2",
836
  "symfony/var-exporter": "^4.4|^5.0"
837
  },
838
+ "time": "2021-02-16T10:20:28+00:00",
839
  "type": "library",
840
  "installation-source": "dist",
841
  "autoload": {
vendor/maxmind-db/reader/CHANGELOG.md CHANGED
@@ -1,41 +1,6 @@
1
  CHANGELOG
2
  =========
3
 
4
- 1.10.0 (2021-02-09)
5
- -------------------
6
-
7
- * When using the pure PHP reader, unsigned integers up to PHP_MAX_INT
8
- will now be integers in PHP rather than strings. Previously integers
9
- greater than 2^24 on 32-bit platforms and 2^56 on 64-bit platforms
10
- would be strings due to the use of `gmp` or `bcmath` to decode them.
11
- Reported by Alejandro Celaya. GitHub #119.
12
-
13
- 1.9.0 (2021-01-07)
14
- ------------------
15
-
16
- * The `maxminddb` extension is now buildable on Windows. Pull request
17
- by Jan Ehrhardt. GitHub #115.
18
-
19
- 1.8.0 (2020-10-01)
20
- ------------------
21
-
22
- * Fixes for PHP 8.0. Pull Request by Remi Collet. GitHub #108.
23
-
24
- 1.7.0 (2020-08-07)
25
- ------------------
26
-
27
- * IMPORTANT: PHP 7.2 or greater is now required.
28
- * The extension no longer depends on the pure PHP classes in
29
- `maxmind-db/reader`. You can use it independently.
30
- * Type hints have been added to both the pure PHP implementation
31
- and the extension.
32
- * The `metadata` method on the reader now returns a new copy of the
33
- metadata object rather than the actual object used by the reader.
34
- * Work around PHP `is_readable()` bug. Reported by Ben Roberts. GitHub
35
- #92.
36
- * This is the first release of the extension as a PECL package.
37
- GitHub #34.
38
-
39
  1.6.0 (2019-12-19)
40
  ------------------
41
 
1
  CHANGELOG
2
  =========
3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  1.6.0 (2019-12-19)
5
  ------------------
6
 
vendor/maxmind-db/reader/README.md CHANGED
@@ -112,16 +112,9 @@ you are using an autoloader, no changes to your code should be necessary.
112
 
113
  First install [libmaxminddb](https://github.com/maxmind/libmaxminddb) as
114
  described in its [README.md
115
- file](https://github.com/maxmind/libmaxminddb/blob/main/README.md#installing-from-a-tarball).
116
- After successfully installing libmaxmindb, you may install the extension
117
- from [pecl](https://pecl.php.net/package/maxminddb):
118
-
119
- ```
120
- pecl install maxminddb
121
- ```
122
-
123
- Alternatively, you may install it from the source. To do so, run the following
124
- commands from the top-level directory of this distribution:
125
 
126
  ```
127
  cd ext
@@ -164,7 +157,7 @@ client API, please see [our support page](https://www.maxmind.com/en/support).
164
 
165
  ## Requirements ##
166
 
167
- This library requires PHP 7.2 or greater.
168
 
169
  The GMP or BCMath extension may be required to read some databases
170
  using the pure PHP API.
@@ -180,6 +173,6 @@ The MaxMind DB Reader PHP API uses [Semantic Versioning](https://semver.org/).
180
 
181
  ## Copyright and License ##
182
 
183
- This software is Copyright (c) 2014-2020 by MaxMind, Inc.
184
 
185
  This is free software, licensed under the Apache License, Version 2.0.
112
 
113
  First install [libmaxminddb](https://github.com/maxmind/libmaxminddb) as
114
  described in its [README.md
115
+ file](https://github.com/maxmind/libmaxminddb/blob/master/README.md#installing-from-a-tarball).
116
+ After successfully installing libmaxmindb, run the following commands from the
117
+ top-level directory of this distribution:
 
 
 
 
 
 
 
118
 
119
  ```
120
  cd ext
157
 
158
  ## Requirements ##
159
 
160
+ This library requires PHP 5.6 or greater.
161
 
162
  The GMP or BCMath extension may be required to read some databases
163
  using the pure PHP API.
173
 
174
  ## Copyright and License ##
175
 
176
+ This software is Copyright (c) 2014-2019 by MaxMind, Inc.
177
 
178
  This is free software, licensed under the Apache License, Version 2.0.
vendor/maxmind-db/reader/autoload.php CHANGED
@@ -1,7 +1,5 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  /**
6
  * PSR-4 autoloader implementation for the MaxMind\DB namespace.
7
  * First we define the 'mmdb_autoload' function, and then we register
@@ -16,7 +14,7 @@ declare(strict_types=1);
16
  * @param string $class
17
  * the name of the class to load
18
  */
19
- function mmdb_autoload($class): void
20
  {
21
  /*
22
  * A project-specific mapping between the namespaces and where
@@ -28,16 +26,16 @@ function mmdb_autoload($class): void
28
  $namespace_map = ['MaxMind\\Db\\' => __DIR__ . '/src/MaxMind/Db/'];
29
 
30
  foreach ($namespace_map as $prefix => $dir) {
31
- // First swap out the namespace prefix with a directory...
32
  $path = str_replace($prefix, $dir, $class);
33
 
34
- // replace the namespace separator with a directory separator...
35
  $path = str_replace('\\', '/', $path);
36
 
37
- // and finally, add the PHP file extension to the result.
38
  $path = $path . '.php';
39
 
40
- // $path should now contain the path to a PHP file defining $class
41
  if (file_exists($path)) {
42
  include $path;
43
  }
1
  <?php
2
 
 
 
3
  /**
4
  * PSR-4 autoloader implementation for the MaxMind\DB namespace.
5
  * First we define the 'mmdb_autoload' function, and then we register
14
  * @param string $class
15
  * the name of the class to load
16
  */
17
+ function mmdb_autoload($class)
18
  {
19
  /*
20
  * A project-specific mapping between the namespaces and where
26
  $namespace_map = ['MaxMind\\Db\\' => __DIR__ . '/src/MaxMind/Db/'];
27
 
28
  foreach ($namespace_map as $prefix => $dir) {
29
+ /* First swap out the namespace prefix with a directory... */
30
  $path = str_replace($prefix, $dir, $class);
31
 
32
+ /* replace the namespace separator with a directory separator... */
33
  $path = str_replace('\\', '/', $path);
34
 
35
+ /* and finally, add the PHP file extension to the result. */
36
  $path = $path . '.php';
37
 
38
+ /* $path should now contain the path to a PHP file defining $class */
39
  if (file_exists($path)) {
40
  include $path;
41
  }
vendor/maxmind-db/reader/composer.json CHANGED
@@ -13,7 +13,7 @@
13
  }
14
  ],
15
  "require": {
16
- "php": ">=7.2"
17
  },
18
  "suggest": {
19
  "ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
@@ -21,15 +21,14 @@
21
  "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
22
  },
23
  "conflict": {
24
- "ext-maxminddb": "<1.10.0,>=2.0.0"
25
  },
26
  "require-dev": {
27
- "friendsofphp/php-cs-fixer": "*",
28
- "phpunit/phpunit": ">=8.0.0,<10.0.0",
29
  "php-coveralls/php-coveralls": "^2.1",
30
- "phpunit/phpcov": ">=6.0.0",
31
- "squizlabs/php_codesniffer": "3.*",
32
- "phpstan/phpstan": "*"
33
  },
34
  "autoload": {
35
  "psr-4": {
13
  }
14
  ],
15
  "require": {
16
+ "php": ">=5.6"
17
  },
18
  "suggest": {
19
  "ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
21
  "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
22
  },
23
  "conflict": {
24
+ "ext-maxminddb": "<1.6.0,>=2.0.0"
25
  },
26
  "require-dev": {
27
+ "friendsofphp/php-cs-fixer": "2.*",
28
+ "phpunit/phpunit": "5.*",
29
  "php-coveralls/php-coveralls": "^2.1",
30
+ "phpunit/phpcov": "^3.0",
31
+ "squizlabs/php_codesniffer": "3.*"
 
32
  },
33
  "autoload": {
34
  "psr-4": {
vendor/maxmind-db/reader/ext/maxminddb.c CHANGED
@@ -21,8 +21,6 @@
21
  #include <zend.h>
22
 
23
  #include "Zend/zend_exceptions.h"
24
- #include "Zend/zend_types.h"
25
- #include "ext/spl/spl_exceptions.h"
26
  #include "ext/standard/info.h"
27
  #include <maxminddb.h>
28
 
@@ -35,44 +33,49 @@
35
 
36
  #define PHP_MAXMINDDB_NS ZEND_NS_NAME("MaxMind", "Db")
37
  #define PHP_MAXMINDDB_READER_NS ZEND_NS_NAME(PHP_MAXMINDDB_NS, "Reader")
38
- #define PHP_MAXMINDDB_METADATA_NS \
39
- ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, "Metadata")
40
  #define PHP_MAXMINDDB_READER_EX_NS \
41
  ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, "InvalidDatabaseException")
42
 
 
43
  #define Z_MAXMINDDB_P(zv) php_maxminddb_fetch_object(Z_OBJ_P(zv))
 
 
44
  typedef size_t strsize_t;
45
  typedef zend_object free_obj_t;
46
-
47
- /* For PHP 8 compatibility */
48
- #if PHP_VERSION_ID < 80000
49
-
50
- #define PROP_OBJ(zv) (zv)
51
-
52
  #else
 
 
 
 
 
 
 
53
 
54
- #define PROP_OBJ(zv) Z_OBJ_P(zv)
55
-
56
  #define TSRMLS_C
 
 
57
  #define TSRMLS_CC
 
 
58
  #define TSRMLS_DC
59
-
60
- /* End PHP 8 compatibility */
61
  #endif
62
-
63
  #ifndef ZEND_ACC_CTOR
64
  #define ZEND_ACC_CTOR 0
65
  #endif
66
 
67
- /* IS_MIXED was added in 2020 */
68
- #ifndef IS_MIXED
69
- #define IS_MIXED IS_UNDEF
70
- #endif
71
-
72
  typedef struct _maxminddb_obj {
73
  MMDB_s *mmdb;
74
  zend_object std;
75
  } maxminddb_obj;
 
 
 
 
 
 
76
 
77
  PHP_FUNCTION(maxminddb);
78
 
@@ -93,6 +96,7 @@ static void handle_uint64(const MMDB_entry_data_list_s *entry_data_list,
93
  zval *z_value TSRMLS_DC);
94
  static void handle_uint32(const MMDB_entry_data_list_s *entry_data_list,
95
  zval *z_value TSRMLS_DC);
 
96
 
97
  #define CHECK_ALLOCATED(val) \
98
  if (!val) { \
@@ -100,16 +104,38 @@ static void handle_uint32(const MMDB_entry_data_list_s *entry_data_list,
100
  return; \
101
  }
102
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  static zend_object_handlers maxminddb_obj_handlers;
104
- static zend_class_entry *maxminddb_ce, *maxminddb_exception_ce, *metadata_ce;
105
 
106
  static inline maxminddb_obj *
107
  php_maxminddb_fetch_object(zend_object *obj TSRMLS_DC) {
 
108
  return (maxminddb_obj *)((char *)(obj)-XtOffsetOf(maxminddb_obj, std));
 
 
 
109
  }
110
 
111
- ZEND_BEGIN_ARG_INFO_EX(arginfo_maxminddbreader_construct, 0, 0, 1)
112
- ZEND_ARG_TYPE_INFO(0, db_file, IS_STRING, 0)
113
  ZEND_END_ARG_INFO()
114
 
115
  PHP_METHOD(MaxMind_Db_Reader, __construct) {
@@ -124,16 +150,16 @@ PHP_METHOD(MaxMind_Db_Reader, __construct) {
124
  maxminddb_ce,
125
  &db_file,
126
  &name_len) == FAILURE) {
 
 
127
  return;
128
  }
129
 
130
  if (0 != php_check_open_basedir(db_file TSRMLS_CC) ||
131
  0 != access(db_file, R_OK)) {
132
- zend_throw_exception_ex(
133
- spl_ce_InvalidArgumentException,
134
- 0 TSRMLS_CC,
135
- "The file \"%s\" does not exist or is not readable.",
136
- db_file);
137
  return;
138
  }
139
 
@@ -141,12 +167,10 @@ PHP_METHOD(MaxMind_Db_Reader, __construct) {
141
  uint16_t status = MMDB_open(db_file, MMDB_MODE_MMAP, mmdb);
142
 
143
  if (MMDB_SUCCESS != status) {
144
- zend_throw_exception_ex(
145
- maxminddb_exception_ce,
146
- 0 TSRMLS_CC,
147
- "Error opening database file (%s). Is this a valid "
148
- "MaxMind DB file?",
149
- db_file);
150
  efree(mmdb);
151
  return;
152
  }
@@ -155,9 +179,8 @@ PHP_METHOD(MaxMind_Db_Reader, __construct) {
155
  mmdb_obj->mmdb = mmdb;
156
  }
157
 
158
- ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(
159
- arginfo_maxminddbreader_get, 0, 1, IS_MIXED, 1)
160
- ZEND_ARG_TYPE_INFO(0, ip_address, IS_STRING, 0)
161
  ZEND_END_ARG_INFO()
162
 
163
  PHP_METHOD(MaxMind_Db_Reader, get) {
@@ -165,41 +188,45 @@ PHP_METHOD(MaxMind_Db_Reader, get) {
165
  get_record(INTERNAL_FUNCTION_PARAM_PASSTHRU, return_value, &prefix_len);
166
  }
167
 
168
- ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(
169
- arginfo_maxminddbreader_getWithPrefixLen, 0, 1, IS_ARRAY, 1)
170
- ZEND_ARG_TYPE_INFO(0, ip_address, IS_STRING, 0)
171
- ZEND_END_ARG_INFO()
172
-
173
  PHP_METHOD(MaxMind_Db_Reader, getWithPrefixLen) {
174
- zval record, z_prefix_len;
 
 
 
 
 
 
 
 
175
 
176
  int prefix_len = 0;
177
- if (get_record(INTERNAL_FUNCTION_PARAM_PASSTHRU, &record, &prefix_len) ==
178
- FAILURE) {
179
  return;
180
  }
181
 
182
  array_init(return_value);
183
- add_next_index_zval(return_value, &record);
184
 
185
- ZVAL_LONG(&z_prefix_len, prefix_len);
186
- add_next_index_zval(return_value, &z_prefix_len);
187
  }
188
 
189
  static int
190
  get_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len) {
191
  char *ip_address = NULL;
192
  strsize_t name_len;
193
- zval *this_zval = NULL;
194
 
195
  if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
196
  getThis(),
197
  "Os",
198
- &this_zval,
199
  maxminddb_ce,
200
  &ip_address,
201
  &name_len) == FAILURE) {
202
- return FAILURE;
 
 
203
  }
204
 
205
  const maxminddb_obj *mmdb_obj = (maxminddb_obj *)Z_MAXMINDDB_P(getThis());
@@ -207,33 +234,30 @@ get_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len) {
207
  MMDB_s *mmdb = mmdb_obj->mmdb;
208
 
209
  if (NULL == mmdb) {
210
- zend_throw_exception_ex(spl_ce_BadMethodCallException,
211
- 0 TSRMLS_CC,
212
- "Attempt to read from a closed MaxMind DB.");
213
- return FAILURE;
214
  }
215
 
216
  struct addrinfo hints = {
217
  .ai_family = AF_UNSPEC,
218
  .ai_flags = AI_NUMERICHOST,
219
- /* We set ai_socktype so that we only get one result back */
220
  .ai_socktype = SOCK_STREAM};
221
 
222
  struct addrinfo *addresses = NULL;
223
  int gai_status = getaddrinfo(ip_address, NULL, &hints, &addresses);
224
  if (gai_status) {
225
- zend_throw_exception_ex(spl_ce_InvalidArgumentException,
226
- 0 TSRMLS_CC,
227
- "The value \"%s\" is not a valid IP address.",
228
- ip_address);
229
- return FAILURE;
230
  }
231
  if (!addresses || !addresses->ai_addr) {
232
- zend_throw_exception_ex(
233
- spl_ce_InvalidArgumentException,
234
- 0 TSRMLS_CC,
235
  "getaddrinfo was successful but failed to set the addrinfo");
236
- return FAILURE;
237
  }
238
 
239
  int sa_family = addresses->ai_addr->sa_family;
@@ -245,127 +269,132 @@ get_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len) {
245
  freeaddrinfo(addresses);
246
 
247
  if (MMDB_SUCCESS != mmdb_error) {
248
- zend_class_entry *ex;
249
  if (MMDB_IPV6_LOOKUP_IN_IPV4_DATABASE_ERROR == mmdb_error) {
250
- ex = spl_ce_InvalidArgumentException;
251
  } else {
252
- ex = maxminddb_exception_ce;
253
  }
254
- zend_throw_exception_ex(ex,
255
- 0 TSRMLS_CC,
256
- "Error looking up %s. %s",
257
- ip_address,
258
- MMDB_strerror(mmdb_error));
259
- return FAILURE;
260
  }
261
 
262
  *prefix_len = result.netmask;
263
 
264
  if (sa_family == AF_INET && mmdb->metadata.ip_version == 6) {
265
- /* We return the prefix length given the IPv4 address. If there is
266
- no IPv4 subtree, we return a prefix length of 0. */
267
  *prefix_len = *prefix_len >= 96 ? *prefix_len - 96 : 0;
268
  }
269
 
270
  if (!result.found_entry) {
271
  ZVAL_NULL(record);
272
- return SUCCESS;
273
  }
274
 
275
  MMDB_entry_data_list_s *entry_data_list = NULL;
276
  int status = MMDB_get_entry_data_list(&result.entry, &entry_data_list);
277
 
278
  if (MMDB_SUCCESS != status) {
279
- zend_throw_exception_ex(maxminddb_exception_ce,
280
- 0 TSRMLS_CC,
281
- "Error while looking up data for %s. %s",
282
- ip_address,
283
- MMDB_strerror(status));
284
  MMDB_free_entry_data_list(entry_data_list);
285
- return FAILURE;
286
  } else if (NULL == entry_data_list) {
287
- zend_throw_exception_ex(
288
- maxminddb_exception_ce,
289
- 0 TSRMLS_CC,
290
- "Error while looking up data for %s. Your database may "
291
- "be corrupt or you have found a bug in libmaxminddb.",
292
- ip_address);
293
- return FAILURE;
294
  }
295
 
296
- const MMDB_entry_data_list_s *rv =
297
- handle_entry_data_list(entry_data_list, record TSRMLS_CC);
298
- if (rv == NULL) {
299
- /* We should have already thrown the exception in handle_entry_data_list
300
- */
301
- return FAILURE;
302
- }
303
  MMDB_free_entry_data_list(entry_data_list);
304
- return SUCCESS;
305
  }
306
 
307
- ZEND_BEGIN_ARG_INFO_EX(arginfo_maxminddbreader_void, 0, 0, 0)
308
  ZEND_END_ARG_INFO()
309
 
310
  PHP_METHOD(MaxMind_Db_Reader, metadata) {
311
- zval *this_zval = NULL;
312
-
313
- if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
314
- getThis(),
315
- "O",
316
- &this_zval,
317
- maxminddb_ce) == FAILURE) {
318
  return;
319
  }
320
 
321
  const maxminddb_obj *const mmdb_obj =
322
- (maxminddb_obj *)Z_MAXMINDDB_P(this_zval);
323
 
324
  if (NULL == mmdb_obj->mmdb) {
325
- zend_throw_exception_ex(spl_ce_BadMethodCallException,
326
- 0 TSRMLS_CC,
327
- "Attempt to read from a closed MaxMind DB.");
328
  return;
329
  }
330
 
 
 
 
331
  object_init_ex(return_value, metadata_ce);
332
 
 
 
 
 
 
 
 
 
 
333
  MMDB_entry_data_list_s *entry_data_list;
334
  MMDB_get_metadata_as_entry_data_list(mmdb_obj->mmdb, &entry_data_list);
335
 
336
- zval metadata_array;
337
- const MMDB_entry_data_list_s *rv =
338
- handle_entry_data_list(entry_data_list, &metadata_array TSRMLS_CC);
339
- if (rv == NULL) {
340
- return;
341
- }
342
  MMDB_free_entry_data_list(entry_data_list);
343
- zend_call_method_with_1_params(PROP_OBJ(return_value),
 
344
  metadata_ce,
345
  &metadata_ce->constructor,
346
  ZEND_CONSTRUCTOR_FUNC_NAME,
347
  NULL,
348
- &metadata_array);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
349
  zval_ptr_dtor(&metadata_array);
 
350
  }
351
 
352
  PHP_METHOD(MaxMind_Db_Reader, close) {
353
- zval *this_zval = NULL;
354
-
355
- if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
356
- getThis(),
357
- "O",
358
- &this_zval,
359
- maxminddb_ce) == FAILURE) {
360
  return;
361
  }
362
 
363
- maxminddb_obj *mmdb_obj = (maxminddb_obj *)Z_MAXMINDDB_P(this_zval);
364
 
365
  if (NULL == mmdb_obj->mmdb) {
366
- zend_throw_exception_ex(spl_ce_BadMethodCallException,
367
- 0 TSRMLS_CC,
368
- "Attempt to close a closed MaxMind DB.");
369
  return;
370
  }
371
  MMDB_close(mmdb_obj->mmdb);
@@ -382,14 +411,14 @@ handle_entry_data_list(const MMDB_entry_data_list_s *entry_data_list,
382
  case MMDB_DATA_TYPE_ARRAY:
383
  return handle_array(entry_data_list, z_value TSRMLS_CC);
384
  case MMDB_DATA_TYPE_UTF8_STRING:
385
- ZVAL_STRINGL(z_value,
386
- (char *)entry_data_list->entry_data.utf8_string,
387
- entry_data_list->entry_data.data_size);
388
  break;
389
  case MMDB_DATA_TYPE_BYTES:
390
- ZVAL_STRINGL(z_value,
391
- (char *)entry_data_list->entry_data.bytes,
392
- entry_data_list->entry_data.data_size);
393
  break;
394
  case MMDB_DATA_TYPE_DOUBLE:
395
  ZVAL_DOUBLE(z_value, entry_data_list->entry_data.double_value);
@@ -416,10 +445,9 @@ handle_entry_data_list(const MMDB_entry_data_list_s *entry_data_list,
416
  ZVAL_LONG(z_value, entry_data_list->entry_data.int32);
417
  break;
418
  default:
419
- zend_throw_exception_ex(maxminddb_exception_ce,
420
- 0 TSRMLS_CC,
421
- "Invalid data type arguments: %d",
422
- entry_data_list->entry_data.type);
423
  return NULL;
424
  }
425
  return entry_data_list;
@@ -431,26 +459,30 @@ handle_map(const MMDB_entry_data_list_s *entry_data_list,
431
  array_init(z_value);
432
  const uint32_t map_size = entry_data_list->entry_data.data_size;
433
 
434
- uint32_t i;
435
  for (i = 0; i < map_size && entry_data_list; i++) {
436
  entry_data_list = entry_data_list->next;
437
 
438
  char *key = estrndup((char *)entry_data_list->entry_data.utf8_string,
439
  entry_data_list->entry_data.data_size);
440
  if (NULL == key) {
441
- zend_throw_exception_ex(maxminddb_exception_ce,
442
- 0 TSRMLS_CC,
443
- "Invalid data type arguments");
444
  return NULL;
445
  }
446
 
447
  entry_data_list = entry_data_list->next;
448
- zval new_value;
 
 
 
 
 
 
 
449
  entry_data_list =
450
- handle_entry_data_list(entry_data_list, &new_value TSRMLS_CC);
451
- if (entry_data_list != NULL) {
452
- add_assoc_zval(z_value, key, &new_value);
453
- }
454
  efree(key);
455
  }
456
  return entry_data_list;
@@ -463,15 +495,20 @@ handle_array(const MMDB_entry_data_list_s *entry_data_list,
463
 
464
  array_init(z_value);
465
 
466
- uint32_t i;
467
  for (i = 0; i < size && entry_data_list; i++) {
468
  entry_data_list = entry_data_list->next;
469
- zval new_value;
 
 
 
 
 
 
 
470
  entry_data_list =
471
- handle_entry_data_list(entry_data_list, &new_value TSRMLS_CC);
472
- if (entry_data_list != NULL) {
473
- add_next_index_zval(z_value, &new_value);
474
- }
475
  }
476
  return entry_data_list;
477
  }
@@ -498,7 +535,7 @@ static void handle_uint128(const MMDB_entry_data_list_s *entry_data_list,
498
  spprintf(&num_str, 0, "0x%016" PRIX64 "%016" PRIX64, high, low);
499
  CHECK_ALLOCATED(num_str);
500
 
501
- ZVAL_STRING(z_value, num_str);
502
  efree(num_str);
503
  }
504
 
@@ -519,7 +556,7 @@ static void handle_uint32(const MMDB_entry_data_list_s *entry_data_list,
519
  spprintf(&int_str, 0, "%" PRIu32, val);
520
  CHECK_ALLOCATED(int_str);
521
 
522
- ZVAL_STRING(z_value, int_str);
523
  efree(int_str);
524
  #endif
525
  }
@@ -541,11 +578,29 @@ static void handle_uint64(const MMDB_entry_data_list_s *entry_data_list,
541
  spprintf(&int_str, 0, "%" PRIu64, val);
542
  CHECK_ALLOCATED(int_str);
543
 
544
- ZVAL_STRING(z_value, int_str);
545
  efree(int_str);
546
  #endif
547
  }
548
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
549
  static void maxminddb_free_storage(free_obj_t *object TSRMLS_DC) {
550
  maxminddb_obj *obj =
551
  php_maxminddb_fetch_object((zend_object *)object TSRMLS_CC);
@@ -555,8 +610,12 @@ static void maxminddb_free_storage(free_obj_t *object TSRMLS_DC) {
555
  }
556
 
557
  zend_object_std_dtor(&obj->std TSRMLS_CC);
 
 
 
558
  }
559
 
 
560
  static zend_object *maxminddb_create_handler(zend_class_entry *type TSRMLS_DC) {
561
  maxminddb_obj *obj = (maxminddb_obj *)ecalloc(1, sizeof(maxminddb_obj));
562
  zend_object_std_init(&obj->std, type TSRMLS_CC);
@@ -566,210 +625,49 @@ static zend_object *maxminddb_create_handler(zend_class_entry *type TSRMLS_DC) {
566
 
567
  return &obj->std;
568
  }
 
 
 
 
569
 
570
- /* clang-format off */
571
- static zend_function_entry maxminddb_methods[] = {
572
- PHP_ME(MaxMind_Db_Reader, __construct, arginfo_maxminddbreader_construct,
573
- ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
574
- PHP_ME(MaxMind_Db_Reader, close, arginfo_maxminddbreader_void, ZEND_ACC_PUBLIC)
575
- PHP_ME(MaxMind_Db_Reader, get, arginfo_maxminddbreader_get, ZEND_ACC_PUBLIC)
576
- PHP_ME(MaxMind_Db_Reader, getWithPrefixLen, arginfo_maxminddbreader_getWithPrefixLen, ZEND_ACC_PUBLIC)
577
- PHP_ME(MaxMind_Db_Reader, metadata, arginfo_maxminddbreader_void, ZEND_ACC_PUBLIC)
578
- { NULL, NULL, NULL }
579
- };
580
- /* clang-format on */
581
-
582
- ZEND_BEGIN_ARG_INFO_EX(arginfo_metadata_construct, 0, 0, 1)
583
- ZEND_ARG_TYPE_INFO(0, metadata, IS_ARRAY, 0)
584
- ZEND_END_ARG_INFO()
585
-
586
- PHP_METHOD(MaxMind_Db_Reader_Metadata, __construct) {
587
- zval *object = NULL;
588
- zval *metadata_array = NULL;
589
- zend_long node_count = 0;
590
- zend_long record_size = 0;
591
-
592
- if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
593
- getThis(),
594
- "Oa",
595
- &object,
596
- metadata_ce,
597
- &metadata_array) == FAILURE) {
598
- return;
599
- }
600
-
601
- zval *tmp = NULL;
602
- if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
603
- "binary_format_major_version",
604
- sizeof("binary_format_major_version") - 1))) {
605
- zend_update_property(metadata_ce,
606
- PROP_OBJ(object),
607
- "binaryFormatMajorVersion",
608
- sizeof("binaryFormatMajorVersion") - 1,
609
- tmp);
610
- }
611
-
612
- if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
613
- "binary_format_minor_version",
614
- sizeof("binary_format_minor_version") - 1))) {
615
- zend_update_property(metadata_ce,
616
- PROP_OBJ(object),
617
- "binaryFormatMinorVersion",
618
- sizeof("binaryFormatMinorVersion") - 1,
619
- tmp);
620
- }
621
-
622
- if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
623
- "build_epoch",
624
- sizeof("build_epoch") - 1))) {
625
- zend_update_property(metadata_ce,
626
- PROP_OBJ(object),
627
- "buildEpoch",
628
- sizeof("buildEpoch") - 1,
629
- tmp);
630
- }
631
-
632
- if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
633
- "database_type",
634
- sizeof("database_type") - 1))) {
635
- zend_update_property(metadata_ce,
636
- PROP_OBJ(object),
637
- "databaseType",
638
- sizeof("databaseType") - 1,
639
- tmp);
640
- }
641
-
642
- if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
643
- "description",
644
- sizeof("description") - 1))) {
645
- zend_update_property(metadata_ce,
646
- PROP_OBJ(object),
647
- "description",
648
- sizeof("description") - 1,
649
- tmp);
650
- }
651
-
652
- if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
653
- "ip_version",
654
- sizeof("ip_version") - 1))) {
655
- zend_update_property(metadata_ce,
656
- PROP_OBJ(object),
657
- "ipVersion",
658
- sizeof("ipVersion") - 1,
659
- tmp);
660
- }
661
-
662
- if ((tmp = zend_hash_str_find(
663
- HASH_OF(metadata_array), "languages", sizeof("languages") - 1))) {
664
- zend_update_property(metadata_ce,
665
- PROP_OBJ(object),
666
- "languages",
667
- sizeof("languages") - 1,
668
- tmp);
669
- }
670
-
671
- if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
672
- "record_size",
673
- sizeof("record_size") - 1))) {
674
- zend_update_property(metadata_ce,
675
- PROP_OBJ(object),
676
- "recordSize",
677
- sizeof("recordSize") - 1,
678
- tmp);
679
- if (Z_TYPE_P(tmp) == IS_LONG) {
680
- record_size = Z_LVAL_P(tmp);
681
- }
682
- }
683
-
684
- if (record_size != 0) {
685
- zend_update_property_long(metadata_ce,
686
- PROP_OBJ(object),
687
- "nodeByteSize",
688
- sizeof("nodeByteSize") - 1,
689
- record_size / 4);
690
- }
691
 
692
- if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
693
- "node_count",
694
- sizeof("node_count") - 1))) {
695
- zend_update_property(metadata_ce,
696
- PROP_OBJ(object),
697
- "nodeCount",
698
- sizeof("nodeCount") - 1,
699
- tmp);
700
- if (Z_TYPE_P(tmp) == IS_LONG) {
701
- node_count = Z_LVAL_P(tmp);
702
- }
703
- }
704
 
705
- if (record_size != 0) {
706
- zend_update_property_long(metadata_ce,
707
- PROP_OBJ(object),
708
- "searchTreeSize",
709
- sizeof("searchTreeSize") - 1,
710
- record_size * node_count / 4);
711
- }
712
  }
 
713
 
714
  // clang-format off
715
- static zend_function_entry metadata_methods[] = {
716
- PHP_ME(MaxMind_Db_Reader_Metadata, __construct, arginfo_metadata_construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
717
- {NULL, NULL, NULL}
 
 
 
 
 
718
  };
719
  // clang-format on
720
 
721
  PHP_MINIT_FUNCTION(maxminddb) {
722
  zend_class_entry ce;
723
 
724
- INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_READER_EX_NS, NULL);
725
- maxminddb_exception_ce =
726
- zend_register_internal_class_ex(&ce, zend_ce_exception);
727
-
728
  INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_READER_NS, maxminddb_methods);
729
  maxminddb_ce = zend_register_internal_class(&ce TSRMLS_CC);
730
  maxminddb_ce->create_object = maxminddb_create_handler;
731
-
732
- INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_METADATA_NS, metadata_methods);
733
- metadata_ce = zend_register_internal_class(&ce TSRMLS_CC);
734
- zend_declare_property_null(metadata_ce,
735
- "binaryFormatMajorVersion",
736
- sizeof("binaryFormatMajorVersion") - 1,
737
- ZEND_ACC_PUBLIC);
738
- zend_declare_property_null(metadata_ce,
739
- "binaryFormatMinorVersion",
740
- sizeof("binaryFormatMinorVersion") - 1,
741
- ZEND_ACC_PUBLIC);
742
- zend_declare_property_null(
743
- metadata_ce, "buildEpoch", sizeof("buildEpoch") - 1, ZEND_ACC_PUBLIC);
744
- zend_declare_property_null(metadata_ce,
745
- "databaseType",
746
- sizeof("databaseType") - 1,
747
- ZEND_ACC_PUBLIC);
748
- zend_declare_property_null(
749
- metadata_ce, "description", sizeof("description") - 1, ZEND_ACC_PUBLIC);
750
- zend_declare_property_null(
751
- metadata_ce, "ipVersion", sizeof("ipVersion") - 1, ZEND_ACC_PUBLIC);
752
- zend_declare_property_null(
753
- metadata_ce, "languages", sizeof("languages") - 1, ZEND_ACC_PUBLIC);
754
- zend_declare_property_null(metadata_ce,
755
- "nodeByteSize",
756
- sizeof("nodeByteSize") - 1,
757
- ZEND_ACC_PUBLIC);
758
- zend_declare_property_null(
759
- metadata_ce, "nodeCount", sizeof("nodeCount") - 1, ZEND_ACC_PUBLIC);
760
- zend_declare_property_null(
761
- metadata_ce, "recordSize", sizeof("recordSize") - 1, ZEND_ACC_PUBLIC);
762
- zend_declare_property_null(metadata_ce,
763
- "searchTreeSize",
764
- sizeof("searchTreeSize") - 1,
765
- ZEND_ACC_PUBLIC);
766
-
767
  memcpy(&maxminddb_obj_handlers,
768
  zend_get_std_object_handlers(),
769
  sizeof(zend_object_handlers));
770
  maxminddb_obj_handlers.clone_obj = NULL;
 
771
  maxminddb_obj_handlers.offset = XtOffsetOf(maxminddb_obj, std);
772
  maxminddb_obj_handlers.free_obj = maxminddb_free_storage;
 
773
  zend_declare_class_constant_string(maxminddb_ce,
774
  "MMDB_LIB_VERSION",
775
  sizeof("MMDB_LIB_VERSION") - 1,
21
  #include <zend.h>
22
 
23
  #include "Zend/zend_exceptions.h"
 
 
24
  #include "ext/standard/info.h"
25
  #include <maxminddb.h>
26
 
33
 
34
  #define PHP_MAXMINDDB_NS ZEND_NS_NAME("MaxMind", "Db")
35
  #define PHP_MAXMINDDB_READER_NS ZEND_NS_NAME(PHP_MAXMINDDB_NS, "Reader")
 
 
36
  #define PHP_MAXMINDDB_READER_EX_NS \
37
  ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, "InvalidDatabaseException")
38
 
39
+ #ifdef ZEND_ENGINE_3
40
  #define Z_MAXMINDDB_P(zv) php_maxminddb_fetch_object(Z_OBJ_P(zv))
41
+ #define _ZVAL_STRING ZVAL_STRING
42
+ #define _ZVAL_STRINGL ZVAL_STRINGL
43
  typedef size_t strsize_t;
44
  typedef zend_object free_obj_t;
 
 
 
 
 
 
45
  #else
46
+ #define Z_MAXMINDDB_P(zv) \
47
+ (maxminddb_obj *)zend_object_store_get_object(zv TSRMLS_CC)
48
+ #define _ZVAL_STRING(a, b) ZVAL_STRING(a, b, 1)
49
+ #define _ZVAL_STRINGL(a, b, c) ZVAL_STRINGL(a, b, c, 1)
50
+ typedef int strsize_t;
51
+ typedef void free_obj_t;
52
+ #endif
53
 
54
+ /* For PHP 8 compatibility */
55
+ #ifndef TSRMLS_C
56
  #define TSRMLS_C
57
+ #endif
58
+ #ifndef TSRMLS_CC
59
  #define TSRMLS_CC
60
+ #endif
61
+ #ifndef TSRMLS_DC
62
  #define TSRMLS_DC
 
 
63
  #endif
 
64
  #ifndef ZEND_ACC_CTOR
65
  #define ZEND_ACC_CTOR 0
66
  #endif
67
 
68
+ #ifdef ZEND_ENGINE_3
 
 
 
 
69
  typedef struct _maxminddb_obj {
70
  MMDB_s *mmdb;
71
  zend_object std;
72
  } maxminddb_obj;
73
+ #else
74
+ typedef struct _maxminddb_obj {
75
+ zend_object std;
76
+ MMDB_s *mmdb;
77
+ } maxminddb_obj;
78
+ #endif
79
 
80
  PHP_FUNCTION(maxminddb);
81
 
96
  zval *z_value TSRMLS_DC);
97
  static void handle_uint32(const MMDB_entry_data_list_s *entry_data_list,
98
  zval *z_value TSRMLS_DC);
99
+ static zend_class_entry *lookup_class(const char *name TSRMLS_DC);
100
 
101
  #define CHECK_ALLOCATED(val) \
102
  if (!val) { \
104
  return; \
105
  }
106
 
107
+ #define THROW_EXCEPTION(name, ...) \
108
+ { \
109
+ zend_class_entry *exception_ce = lookup_class(name TSRMLS_CC); \
110
+ zend_throw_exception_ex(exception_ce, 0 TSRMLS_CC, __VA_ARGS__); \
111
+ }
112
+
113
+ #if PHP_VERSION_ID < 50399
114
+ #define object_properties_init(zo, class_type) \
115
+ { \
116
+ zval *tmp; \
117
+ zend_hash_copy((*zo).properties, \
118
+ &class_type->default_properties, \
119
+ (copy_ctor_func_t)zval_add_ref, \
120
+ (void *)&tmp, \
121
+ sizeof(zval *)); \
122
+ }
123
+ #endif
124
+
125
  static zend_object_handlers maxminddb_obj_handlers;
126
+ static zend_class_entry *maxminddb_ce;
127
 
128
  static inline maxminddb_obj *
129
  php_maxminddb_fetch_object(zend_object *obj TSRMLS_DC) {
130
+ #ifdef ZEND_ENGINE_3
131
  return (maxminddb_obj *)((char *)(obj)-XtOffsetOf(maxminddb_obj, std));
132
+ #else
133
+ return (maxminddb_obj *)obj;
134
+ #endif
135
  }
136
 
137
+ ZEND_BEGIN_ARG_INFO_EX(arginfo_maxmindbreader_construct, 0, 0, 1)
138
+ ZEND_ARG_INFO(0, db_file)
139
  ZEND_END_ARG_INFO()
140
 
141
  PHP_METHOD(MaxMind_Db_Reader, __construct) {
150
  maxminddb_ce,
151
  &db_file,
152
  &name_len) == FAILURE) {
153
+ THROW_EXCEPTION("InvalidArgumentException",
154
+ "The constructor takes exactly one argument.");
155
  return;
156
  }
157
 
158
  if (0 != php_check_open_basedir(db_file TSRMLS_CC) ||
159
  0 != access(db_file, R_OK)) {
160
+ THROW_EXCEPTION("InvalidArgumentException",
161
+ "The file \"%s\" does not exist or is not readable.",
162
+ db_file);
 
 
163
  return;
164
  }
165
 
167
  uint16_t status = MMDB_open(db_file, MMDB_MODE_MMAP, mmdb);
168
 
169
  if (MMDB_SUCCESS != status) {
170
+ THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
171
+ "Error opening database file (%s). Is this a valid "
172
+ "MaxMind DB file?",
173
+ db_file);
 
 
174
  efree(mmdb);
175
  return;
176
  }
179
  mmdb_obj->mmdb = mmdb;
180
  }
181
 
182
+ ZEND_BEGIN_ARG_INFO_EX(arginfo_maxmindbreader_get, 0, 0, 1)
183
+ ZEND_ARG_INFO(0, ip_address)
 
184
  ZEND_END_ARG_INFO()
185
 
186
  PHP_METHOD(MaxMind_Db_Reader, get) {
188
  get_record(INTERNAL_FUNCTION_PARAM_PASSTHRU, return_value, &prefix_len);
189
  }
190
 
 
 
 
 
 
191
  PHP_METHOD(MaxMind_Db_Reader, getWithPrefixLen) {
192
+ zval *record, *z_prefix_len;
193
+ #ifdef ZEND_ENGINE_3
194
+ zval _record, _z_prefix_len;
195
+ record = &_record;
196
+ z_prefix_len = &_z_prefix_len;
197
+ #else
198
+ ALLOC_INIT_ZVAL(record);
199
+ ALLOC_INIT_ZVAL(z_prefix_len);
200
+ #endif
201
 
202
  int prefix_len = 0;
203
+ if (get_record(INTERNAL_FUNCTION_PARAM_PASSTHRU, record, &prefix_len)) {
 
204
  return;
205
  }
206
 
207
  array_init(return_value);
208
+ add_next_index_zval(return_value, record);
209
 
210
+ ZVAL_LONG(z_prefix_len, prefix_len);
211
+ add_next_index_zval(return_value, z_prefix_len);
212
  }
213
 
214
  static int
215
  get_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len) {
216
  char *ip_address = NULL;
217
  strsize_t name_len;
218
+ zval *_this_zval = NULL;
219
 
220
  if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
221
  getThis(),
222
  "Os",
223
+ &_this_zval,
224
  maxminddb_ce,
225
  &ip_address,
226
  &name_len) == FAILURE) {
227
+ THROW_EXCEPTION("InvalidArgumentException",
228
+ "Method takes exactly one argument.");
229
+ return 1;
230
  }
231
 
232
  const maxminddb_obj *mmdb_obj = (maxminddb_obj *)Z_MAXMINDDB_P(getThis());
234
  MMDB_s *mmdb = mmdb_obj->mmdb;
235
 
236
  if (NULL == mmdb) {
237
+ THROW_EXCEPTION("BadMethodCallException",
238
+ "Attempt to read from a closed MaxMind DB.");
239
+ return 1;
 
240
  }
241
 
242
  struct addrinfo hints = {
243
  .ai_family = AF_UNSPEC,
244
  .ai_flags = AI_NUMERICHOST,
245
+ // We set ai_socktype so that we only get one result back
246
  .ai_socktype = SOCK_STREAM};
247
 
248
  struct addrinfo *addresses = NULL;
249
  int gai_status = getaddrinfo(ip_address, NULL, &hints, &addresses);
250
  if (gai_status) {
251
+ THROW_EXCEPTION("InvalidArgumentException",
252
+ "The value \"%s\" is not a valid IP address.",
253
+ ip_address);
254
+ return 1;
 
255
  }
256
  if (!addresses || !addresses->ai_addr) {
257
+ THROW_EXCEPTION(
258
+ "InvalidArgumentException",
 
259
  "getaddrinfo was successful but failed to set the addrinfo");
260
+ return 1;
261
  }
262
 
263
  int sa_family = addresses->ai_addr->sa_family;
269
  freeaddrinfo(addresses);
270
 
271
  if (MMDB_SUCCESS != mmdb_error) {
272
+ char *exception_name;
273
  if (MMDB_IPV6_LOOKUP_IN_IPV4_DATABASE_ERROR == mmdb_error) {
274
+ exception_name = "InvalidArgumentException";
275
  } else {
276
+ exception_name = PHP_MAXMINDDB_READER_EX_NS;
277
  }
278
+ THROW_EXCEPTION(exception_name,
279
+ "Error looking up %s. %s",
280
+ ip_address,
281
+ MMDB_strerror(mmdb_error));
282
+ return 1;
 
283
  }
284
 
285
  *prefix_len = result.netmask;
286
 
287
  if (sa_family == AF_INET && mmdb->metadata.ip_version == 6) {
288
+ // We return the prefix length given the IPv4 address. If there is
289
+ // no IPv4 subtree, we return a prefix length of 0.
290
  *prefix_len = *prefix_len >= 96 ? *prefix_len - 96 : 0;
291
  }
292
 
293
  if (!result.found_entry) {
294
  ZVAL_NULL(record);
295
+ return 0;
296
  }
297
 
298
  MMDB_entry_data_list_s *entry_data_list = NULL;
299
  int status = MMDB_get_entry_data_list(&result.entry, &entry_data_list);
300
 
301
  if (MMDB_SUCCESS != status) {
302
+ THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
303
+ "Error while looking up data for %s. %s",
304
+ ip_address,
305
+ MMDB_strerror(status));
 
306
  MMDB_free_entry_data_list(entry_data_list);
307
+ return 1;
308
  } else if (NULL == entry_data_list) {
309
+ THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
310
+ "Error while looking up data for %s. Your database may "
311
+ "be corrupt or you have found a bug in libmaxminddb.",
312
+ ip_address);
313
+ return 1;
 
 
314
  }
315
 
316
+ handle_entry_data_list(entry_data_list, record TSRMLS_CC);
 
 
 
 
 
 
317
  MMDB_free_entry_data_list(entry_data_list);
318
+ return 0;
319
  }
320
 
321
+ ZEND_BEGIN_ARG_INFO_EX(arginfo_maxmindbreader_void, 0, 0, 0)
322
  ZEND_END_ARG_INFO()
323
 
324
  PHP_METHOD(MaxMind_Db_Reader, metadata) {
325
+ if (ZEND_NUM_ARGS() != 0) {
326
+ THROW_EXCEPTION("InvalidArgumentException",
327
+ "Method takes no arguments.");
 
 
 
 
328
  return;
329
  }
330
 
331
  const maxminddb_obj *const mmdb_obj =
332
+ (maxminddb_obj *)Z_MAXMINDDB_P(getThis());
333
 
334
  if (NULL == mmdb_obj->mmdb) {
335
+ THROW_EXCEPTION("BadMethodCallException",
336
+ "Attempt to read from a closed MaxMind DB.");
 
337
  return;
338
  }
339
 
340
+ const char *const name = ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, "Metadata");
341
+ zend_class_entry *metadata_ce = lookup_class(name TSRMLS_CC);
342
+
343
  object_init_ex(return_value, metadata_ce);
344
 
345
+ #ifdef ZEND_ENGINE_3
346
+ zval _metadata_array;
347
+ zval *metadata_array = &_metadata_array;
348
+ ZVAL_NULL(metadata_array);
349
+ #else
350
+ zval *metadata_array;
351
+ ALLOC_INIT_ZVAL(metadata_array);
352
+ #endif
353
+
354
  MMDB_entry_data_list_s *entry_data_list;
355
  MMDB_get_metadata_as_entry_data_list(mmdb_obj->mmdb, &entry_data_list);
356
 
357
+ handle_entry_data_list(entry_data_list, metadata_array TSRMLS_CC);
 
 
 
 
 
358
  MMDB_free_entry_data_list(entry_data_list);
359
+ #if PHP_VERSION_ID >= 80000
360
+ zend_call_method_with_1_params(Z_OBJ_P(return_value),
361
  metadata_ce,
362
  &metadata_ce->constructor,
363
  ZEND_CONSTRUCTOR_FUNC_NAME,
364
  NULL,
365
+ metadata_array);
366
+ zval_ptr_dtor(metadata_array);
367
+ #elif defined(ZEND_ENGINE_3)
368
+ zend_call_method_with_1_params(return_value,
369
+ metadata_ce,
370
+ &metadata_ce->constructor,
371
+ ZEND_CONSTRUCTOR_FUNC_NAME,
372
+ NULL,
373
+ metadata_array);
374
+ zval_ptr_dtor(metadata_array);
375
+ #else
376
+ zend_call_method_with_1_params(&return_value,
377
+ metadata_ce,
378
+ &metadata_ce->constructor,
379
+ ZEND_CONSTRUCTOR_FUNC_NAME,
380
+ NULL,
381
+ metadata_array);
382
  zval_ptr_dtor(&metadata_array);
383
+ #endif
384
  }
385
 
386
  PHP_METHOD(MaxMind_Db_Reader, close) {
387
+ if (ZEND_NUM_ARGS() != 0) {
388
+ THROW_EXCEPTION("InvalidArgumentException",
389
+ "Method takes no arguments.");
 
 
 
 
390
  return;
391
  }
392
 
393
+ maxminddb_obj *mmdb_obj = (maxminddb_obj *)Z_MAXMINDDB_P(getThis());
394
 
395
  if (NULL == mmdb_obj->mmdb) {
396
+ THROW_EXCEPTION("BadMethodCallException",
397
+ "Attempt to close a closed MaxMind DB.");
 
398
  return;
399
  }
400
  MMDB_close(mmdb_obj->mmdb);
411
  case MMDB_DATA_TYPE_ARRAY:
412
  return handle_array(entry_data_list, z_value TSRMLS_CC);
413
  case MMDB_DATA_TYPE_UTF8_STRING:
414
+ _ZVAL_STRINGL(z_value,
415
+ (char *)entry_data_list->entry_data.utf8_string,
416
+ entry_data_list->entry_data.data_size);
417
  break;
418
  case MMDB_DATA_TYPE_BYTES:
419
+ _ZVAL_STRINGL(z_value,
420
+ (char *)entry_data_list->entry_data.bytes,
421
+ entry_data_list->entry_data.data_size);
422
  break;
423
  case MMDB_DATA_TYPE_DOUBLE:
424
  ZVAL_DOUBLE(z_value, entry_data_list->entry_data.double_value);
445
  ZVAL_LONG(z_value, entry_data_list->entry_data.int32);
446
  break;
447
  default:
448
+ THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
449
+ "Invalid data type arguments: %d",
450
+ entry_data_list->entry_data.type);
 
451
  return NULL;
452
  }
453
  return entry_data_list;
459
  array_init(z_value);
460
  const uint32_t map_size = entry_data_list->entry_data.data_size;
461
 
462
+ uint i;
463
  for (i = 0; i < map_size && entry_data_list; i++) {
464
  entry_data_list = entry_data_list->next;
465
 
466
  char *key = estrndup((char *)entry_data_list->entry_data.utf8_string,
467
  entry_data_list->entry_data.data_size);
468
  if (NULL == key) {
469
+ THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
470
+ "Invalid data type arguments");
 
471
  return NULL;
472
  }
473
 
474
  entry_data_list = entry_data_list->next;
475
+ #ifdef ZEND_ENGINE_3
476
+ zval _new_value;
477
+ zval *new_value = &_new_value;
478
+ ZVAL_NULL(new_value);
479
+ #else
480
+ zval *new_value;
481
+ ALLOC_INIT_ZVAL(new_value);
482
+ #endif
483
  entry_data_list =
484
+ handle_entry_data_list(entry_data_list, new_value TSRMLS_CC);
485
+ add_assoc_zval(z_value, key, new_value);
 
 
486
  efree(key);
487
  }
488
  return entry_data_list;
495
 
496
  array_init(z_value);
497
 
498
+ uint i;
499
  for (i = 0; i < size && entry_data_list; i++) {
500
  entry_data_list = entry_data_list->next;
501
+ #ifdef ZEND_ENGINE_3
502
+ zval _new_value;
503
+ zval *new_value = &_new_value;
504
+ ZVAL_NULL(new_value);
505
+ #else
506
+ zval *new_value;
507
+ ALLOC_INIT_ZVAL(new_value);
508
+ #endif
509
  entry_data_list =
510
+ handle_entry_data_list(entry_data_list, new_value TSRMLS_CC);
511
+ add_next_index_zval(z_value, new_value);
 
 
512
  }
513
  return entry_data_list;
514
  }
535
  spprintf(&num_str, 0, "0x%016" PRIX64 "%016" PRIX64, high, low);
536
  CHECK_ALLOCATED(num_str);
537
 
538
+ _ZVAL_STRING(z_value, num_str);
539
  efree(num_str);
540
  }
541
 
556
  spprintf(&int_str, 0, "%" PRIu32, val);
557
  CHECK_ALLOCATED(int_str);
558
 
559
+ _ZVAL_STRING(z_value, int_str);
560
  efree(int_str);
561
  #endif
562
  }
578
  spprintf(&int_str, 0, "%" PRIu64, val);
579
  CHECK_ALLOCATED(int_str);
580
 
581
+ _ZVAL_STRING(z_value, int_str);
582
  efree(int_str);
583
  #endif
584
  }
585
 
586
+ static zend_class_entry *lookup_class(const char *name TSRMLS_DC) {
587
+ #ifdef ZEND_ENGINE_3
588
+ zend_string *n = zend_string_init(name, strlen(name), 0);
589
+ zend_class_entry *ce = zend_lookup_class(n);
590
+ zend_string_release(n);
591
+ if (NULL == ce) {
592
+ zend_error(E_ERROR, "Class %s not found", name);
593
+ }
594
+ return ce;
595
+ #else
596
+ zend_class_entry **ce;
597
+ if (FAILURE == zend_lookup_class(name, strlen(name), &ce TSRMLS_CC)) {
598
+ zend_error(E_ERROR, "Class %s not found", name);
599
+ }
600
+ return *ce;
601
+ #endif
602
+ }
603
+
604
  static void maxminddb_free_storage(free_obj_t *object TSRMLS_DC) {
605
  maxminddb_obj *obj =
606
  php_maxminddb_fetch_object((zend_object *)object TSRMLS_CC);
610
  }
611
 
612
  zend_object_std_dtor(&obj->std TSRMLS_CC);
613
+ #ifndef ZEND_ENGINE_3
614
+ efree(object);
615
+ #endif
616
  }
617
 
618
+ #ifdef ZEND_ENGINE_3
619
  static zend_object *maxminddb_create_handler(zend_class_entry *type TSRMLS_DC) {
620
  maxminddb_obj *obj = (maxminddb_obj *)ecalloc(1, sizeof(maxminddb_obj));
621
  zend_object_std_init(&obj->std, type TSRMLS_CC);
625
 
626
  return &obj->std;
627
  }
628
+ #else
629
+ static zend_object_value
630
+ maxminddb_create_handler(zend_class_entry *type TSRMLS_DC) {
631
+ zend_object_value retval;
632
 
633
+ maxminddb_obj *obj = (maxminddb_obj *)ecalloc(1, sizeof(maxminddb_obj));
634
+ zend_object_std_init(&obj->std, type TSRMLS_CC);
635
+ object_properties_init(&(obj->std), type);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
636
 
637
+ retval.handle = zend_objects_store_put(
638
+ obj, NULL, maxminddb_free_storage, NULL TSRMLS_CC);
639
+ retval.handlers = &maxminddb_obj_handlers;
 
 
 
 
 
 
 
 
 
640
 
641
+ return retval;
 
 
 
 
 
 
642
  }
643
+ #endif
644
 
645
  // clang-format off
646
+ static zend_function_entry maxminddb_methods[] = {
647
+ PHP_ME(MaxMind_Db_Reader, __construct, arginfo_maxmindbreader_construct,
648
+ ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
649
+ PHP_ME(MaxMind_Db_Reader, close, arginfo_maxmindbreader_void, ZEND_ACC_PUBLIC)
650
+ PHP_ME(MaxMind_Db_Reader, get, arginfo_maxmindbreader_get, ZEND_ACC_PUBLIC)
651
+ PHP_ME(MaxMind_Db_Reader, getWithPrefixLen, arginfo_maxmindbreader_get, ZEND_ACC_PUBLIC)
652
+ PHP_ME(MaxMind_Db_Reader, metadata, arginfo_maxmindbreader_void, ZEND_ACC_PUBLIC)
653
+ { NULL, NULL, NULL }
654
  };
655
  // clang-format on
656
 
657
  PHP_MINIT_FUNCTION(maxminddb) {
658
  zend_class_entry ce;
659
 
 
 
 
 
660
  INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_READER_NS, maxminddb_methods);
661
  maxminddb_ce = zend_register_internal_class(&ce TSRMLS_CC);
662
  maxminddb_ce->create_object = maxminddb_create_handler;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
663
  memcpy(&maxminddb_obj_handlers,
664
  zend_get_std_object_handlers(),
665
  sizeof(zend_object_handlers));
666
  maxminddb_obj_handlers.clone_obj = NULL;
667
+ #ifdef ZEND_ENGINE_3
668
  maxminddb_obj_handlers.offset = XtOffsetOf(maxminddb_obj, std);
669
  maxminddb_obj_handlers.free_obj = maxminddb_free_storage;
670
+ #endif
671
  zend_declare_class_constant_string(maxminddb_ce,
672
  "MMDB_LIB_VERSION",
673
  sizeof("MMDB_LIB_VERSION") - 1,
vendor/maxmind-db/reader/ext/php_maxminddb.h CHANGED
@@ -15,7 +15,7 @@
15
 
16
  #ifndef PHP_MAXMINDDB_H
17
  #define PHP_MAXMINDDB_H 1
18
- #define PHP_MAXMINDDB_VERSION "1.10.0"
19
  #define PHP_MAXMINDDB_EXTNAME "maxminddb"
20
 
21
  extern zend_module_entry maxminddb_module_entry;
15
 
16
  #ifndef PHP_MAXMINDDB_H
17
  #define PHP_MAXMINDDB_H 1
18
+ #define PHP_MAXMINDDB_VERSION "1.6.0"
19
  #define PHP_MAXMINDDB_EXTNAME "maxminddb"
20
 
21
  extern zend_module_entry maxminddb_module_entry;
vendor/maxmind-db/reader/src/MaxMind/Db/Reader.php CHANGED
@@ -1,10 +1,7 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  namespace MaxMind\Db;
6
 
7
- use ArgumentCountError;
8
  use BadMethodCallException;
9
  use Exception;
10
  use InvalidArgumentException;
@@ -20,42 +17,15 @@ use UnexpectedValueException;
20
  */
21
  class Reader
22
  {
23
- /**
24
- * @var int
25
- */
26
  private static $DATA_SECTION_SEPARATOR_SIZE = 16;
27
- /**
28
- * @var string
29
- */
30
  private static $METADATA_START_MARKER = "\xAB\xCD\xEFMaxMind.com";
31
- /**
32
- * @var int
33
- */
34
  private static $METADATA_START_MARKER_LENGTH = 14;
35
- /**
36
- * @var int
37
- */
38
- private static $METADATA_MAX_SIZE = 131072; // 128 * 1024 = 128KiB
39
 
40
- /**
41
- * @var Decoder
42
- */
43
  private $decoder;
44
- /**
45
- * @var resource
46
- */
47
  private $fileHandle;
48
- /**
49
- * @var int
50
- */
51
  private $fileSize;
52
- /**
53
- * @var int
54
- */
55
  private $ipV4Start;
56
- /**
57
- * @var Metadata
58
- */
59
  private $metadata;
60
 
61
  /**
@@ -65,38 +35,40 @@ class Reader
65
  * @param string $database
66
  * the MaxMind DB file to use
67
  *
68
- * @throws InvalidArgumentException for invalid database path or unknown arguments
69
- * @throws InvalidDatabaseException
70
- * if the database is invalid or there is an error reading
71
- * from it
72
  */
73
- public function __construct(string $database)
74
  {
75
  if (\func_num_args() !== 1) {
76
- throw new ArgumentCountError(
77
- sprintf('%s() expects exactly 1 parameter, %d given', __METHOD__, \func_num_args())
78
  );
79
  }
80
 
81
- $fileHandle = @fopen($database, 'rb');
82
- if ($fileHandle === false) {
83
  throw new InvalidArgumentException(
84
  "The file \"$database\" does not exist or is not readable."
85
  );
86
  }
87
- $this->fileHandle = $fileHandle;
88
-
89
- $fileSize = @filesize($database);
90
- if ($fileSize === false) {
 
 
 
 
91
  throw new UnexpectedValueException(
92
  "Error determining the size of \"$database\"."
93
  );
94
  }
95
- $this->fileSize = $fileSize;
96
 
97
  $start = $this->findMetadataStart($database);
98
  $metadataDecoder = new Decoder($this->fileHandle, $start);
99
- [$metadataArray] = $metadataDecoder->decode($start);
100
  $this->metadata = new Metadata($metadataArray);
101
  $this->decoder = new Decoder(
102
  $this->fileHandle,
@@ -119,14 +91,14 @@ class Reader
119
  *
120
  * @return mixed the record for the IP address
121
  */
122
- public function get(string $ipAddress)
123
  {
124
  if (\func_num_args() !== 1) {
125
- throw new ArgumentCountError(
126
- sprintf('%s() expects exactly 1 parameter, %d given', __METHOD__, \func_num_args())
127
  );
128
  }
129
- [$record] = $this->getWithPrefixLen($ipAddress);
130
 
131
  return $record;
132
  }
@@ -146,11 +118,11 @@ class Reader
146
  * @return array an array where the first element is the record and the
147
  * second the network prefix length for the record
148
  */
149
- public function getWithPrefixLen(string $ipAddress): array
150
  {
151
  if (\func_num_args() !== 1) {
152
- throw new ArgumentCountError(
153
- sprintf('%s() expects exactly 1 parameter, %d given', __METHOD__, \func_num_args())
154
  );
155
  }
156
 
@@ -160,7 +132,13 @@ class Reader
160
  );
161
  }
162
 
163
- [$pointer, $prefixLen] = $this->findAddressInTree($ipAddress);
 
 
 
 
 
 
164
  if ($pointer === 0) {
165
  return [null, $prefixLen];
166
  }
@@ -168,16 +146,9 @@ class Reader
168
  return [$this->resolveDataPointer($pointer), $prefixLen];
169
  }
170
 
171
- private function findAddressInTree(string $ipAddress): array
172
  {
173
- $packedAddr = @inet_pton($ipAddress);
174
- if ($packedAddr === false) {
175
- throw new InvalidArgumentException(
176
- "The value \"$ipAddress\" is not a valid IP address."
177
- );
178
- }
179
-
180
- $rawAddress = unpack('C*', $packedAddr);
181
 
182
  $bitCount = \count($rawAddress) * 8;
183
 
@@ -211,18 +182,14 @@ class Reader
211
  if ($node === $nodeCount) {
212
  // Record is empty
213
  return [0, $i];
214
- }
215
- if ($node > $nodeCount) {
216
  // Record is a data pointer
217
  return [$node, $i];
218
  }
219
-
220
- throw new InvalidDatabaseException(
221
- 'Invalid or corrupt database. Maximum search depth reached without finding a leaf node'
222
- );
223
  }
224
 
225
- private function ipV4StartNode(): int
226
  {
227
  // If we have an IPv4 database, the start node is the first node
228
  if ($this->metadata->ipVersion === 4) {
@@ -238,17 +205,16 @@ class Reader
238
  return $node;
239
  }
240
 
241
- private function readNode(int $nodeNumber, int $index): int
242
  {
243
  $baseOffset = $nodeNumber * $this->metadata->nodeByteSize;
244
 
245
  switch ($this->metadata->recordSize) {
246
  case 24:
247
  $bytes = Util::read($this->fileHandle, $baseOffset + $index * 3, 3);
248
- [, $node] = unpack('N', "\x00" . $bytes);
249
 
250
  return $node;
251
-
252
  case 28:
253
  $bytes = Util::read($this->fileHandle, $baseOffset + 3 * $index, 4);
254
  if ($index === 0) {
@@ -256,16 +222,14 @@ class Reader
256
  } else {
257
  $middle = 0x0F & \ord($bytes[0]);
258
  }
259
- [, $node] = unpack('N', \chr($middle) . substr($bytes, $index, 3));
260
 
261
  return $node;
262
-
263
  case 32:
264
  $bytes = Util::read($this->fileHandle, $baseOffset + $index * 4, 4);
265
- [, $node] = unpack('N', $bytes);
266
 
267
  return $node;
268
-
269
  default:
270
  throw new InvalidDatabaseException(
271
  'Unknown record size: '
@@ -274,10 +238,7 @@ class Reader
274
  }
275
  }
276
 
277
- /**
278
- * @return mixed
279
- */
280
- private function resolveDataPointer(int $pointer)
281
  {
282
  $resolved = $pointer - $this->metadata->nodeCount
283
  + $this->metadata->searchTreeSize;
@@ -287,7 +248,7 @@ class Reader
287
  );
288
  }
289
 
290
- [$data] = $this->decoder->decode($resolved);
291
 
292
  return $data;
293
  }
@@ -297,7 +258,7 @@ class Reader
297
  * are much faster algorithms (e.g., Boyer-Moore) for this if speed is ever
298
  * an issue, but I suspect it won't be.
299
  */
300
- private function findMetadataStart(string $filename): int
301
  {
302
  $handle = $this->fileHandle;
303
  $fstat = fstat($handle);
@@ -317,7 +278,6 @@ class Reader
317
  return $offset + $markerLength;
318
  }
319
  }
320
-
321
  throw new InvalidDatabaseException(
322
  "Error opening database file ($filename). " .
323
  'Is this a valid MaxMind DB file?'
@@ -330,11 +290,11 @@ class Reader
330
  *
331
  * @return Metadata object for the database
332
  */
333
- public function metadata(): Metadata
334
  {
335
  if (\func_num_args()) {
336
- throw new ArgumentCountError(
337
- sprintf('%s() expects exactly 0 parameters, %d given', __METHOD__, \func_num_args())
338
  );
339
  }
340
 
@@ -346,7 +306,7 @@ class Reader
346
  );
347
  }
348
 
349
- return clone $this->metadata;
350
  }
351
 
352
  /**
@@ -355,14 +315,8 @@ class Reader
355
  * @throws Exception
356
  * if an I/O error occurs
357
  */
358
- public function close(): void
359
  {
360
- if (\func_num_args()) {
361
- throw new ArgumentCountError(
362
- sprintf('%s() expects exactly 0 parameters, %d given', __METHOD__, \func_num_args())
363
- );
364
- }
365
-
366
  if (!\is_resource($this->fileHandle)) {
367
  throw new BadMethodCallException(
368
  'Attempt to close a closed MaxMind DB.'
1
  <?php
2
 
 
 
3
  namespace MaxMind\Db;
4
 
 
5
  use BadMethodCallException;
6
  use Exception;
7
  use InvalidArgumentException;
17
  */
18
  class Reader
19
  {
 
 
 
20
  private static $DATA_SECTION_SEPARATOR_SIZE = 16;
 
 
 
21
  private static $METADATA_START_MARKER = "\xAB\xCD\xEFMaxMind.com";
 
 
 
22
  private static $METADATA_START_MARKER_LENGTH = 14;
23
+ private static $METADATA_MAX_SIZE = 131072; // 128 * 1024 = 128KB
 
 
 
24
 
 
 
 
25
  private $decoder;
 
 
 
26
  private $fileHandle;
 
 
 
27
  private $fileSize;
 
 
 
28
  private $ipV4Start;
 
 
 
29
  private $metadata;
30
 
31
  /**
35
  * @param string $database
36
  * the MaxMind DB file to use
37
  *
38
+ * @throws InvalidArgumentException for invalid database path or unknown arguments
39
+ * @throws \MaxMind\Db\Reader\InvalidDatabaseException
40
+ * if the database is invalid or there is an error reading
41
+ * from it
42
  */
43
+ public function __construct($database)
44
  {
45
  if (\func_num_args() !== 1) {
46
+ throw new InvalidArgumentException(
47
+ 'The constructor takes exactly one argument.'
48
  );
49
  }
50
 
51
+ if (!is_readable($database)) {
 
52
  throw new InvalidArgumentException(
53
  "The file \"$database\" does not exist or is not readable."
54
  );
55
  }
56
+ $this->fileHandle = @fopen($database, 'rb');
57
+ if ($this->fileHandle === false) {
58
+ throw new InvalidArgumentException(
59
+ "Error opening \"$database\"."
60
+ );
61
+ }
62
+ $this->fileSize = @filesize($database);
63
+ if ($this->fileSize === false) {
64
  throw new UnexpectedValueException(
65
  "Error determining the size of \"$database\"."
66
  );
67
  }
 
68
 
69
  $start = $this->findMetadataStart($database);
70
  $metadataDecoder = new Decoder($this->fileHandle, $start);
71
+ list($metadataArray) = $metadataDecoder->decode($start);
72
  $this->metadata = new Metadata($metadataArray);
73
  $this->decoder = new Decoder(
74
  $this->fileHandle,
91
  *
92
  * @return mixed the record for the IP address
93
  */
94
+ public function get($ipAddress)
95
  {
96
  if (\func_num_args() !== 1) {
97
+ throw new InvalidArgumentException(
98
+ 'Method takes exactly one argument.'
99
  );
100
  }
101
+ list($record) = $this->getWithPrefixLen($ipAddress);
102
 
103
  return $record;
104
  }
118
  * @return array an array where the first element is the record and the
119
  * second the network prefix length for the record
120
  */
121
+ public function getWithPrefixLen($ipAddress)
122
  {
123
  if (\func_num_args() !== 1) {
124
+ throw new InvalidArgumentException(
125
+ 'Method takes exactly one argument.'
126
  );
127
  }
128
 
132
  );
133
  }
134
 
135
+ if (!filter_var($ipAddress, FILTER_VALIDATE_IP)) {
136
+ throw new InvalidArgumentException(
137
+ "The value \"$ipAddress\" is not a valid IP address."
138
+ );
139
+ }
140
+
141
+ list($pointer, $prefixLen) = $this->findAddressInTree($ipAddress);
142
  if ($pointer === 0) {
143
  return [null, $prefixLen];
144
  }
146
  return [$this->resolveDataPointer($pointer), $prefixLen];
147
  }
148
 
149
+ private function findAddressInTree($ipAddress)
150
  {
151
+ $rawAddress = unpack('C*', inet_pton($ipAddress));
 
 
 
 
 
 
 
152
 
153
  $bitCount = \count($rawAddress) * 8;
154
 
182
  if ($node === $nodeCount) {
183
  // Record is empty
184
  return [0, $i];
185
+ } elseif ($node > $nodeCount) {
 
186
  // Record is a data pointer
187
  return [$node, $i];
188
  }
189
+ throw new InvalidDatabaseException('Something bad happened');
 
 
 
190
  }
191
 
192
+ private function ipV4StartNode()
193
  {
194
  // If we have an IPv4 database, the start node is the first node
195
  if ($this->metadata->ipVersion === 4) {
205
  return $node;
206
  }
207
 
208
+ private function readNode($nodeNumber, $index)
209
  {
210
  $baseOffset = $nodeNumber * $this->metadata->nodeByteSize;
211
 
212
  switch ($this->metadata->recordSize) {
213
  case 24:
214
  $bytes = Util::read($this->fileHandle, $baseOffset + $index * 3, 3);
215
+ list(, $node) = unpack('N', "\x00" . $bytes);
216
 
217
  return $node;
 
218
  case 28:
219
  $bytes = Util::read($this->fileHandle, $baseOffset + 3 * $index, 4);
220
  if ($index === 0) {
222
  } else {
223
  $middle = 0x0F & \ord($bytes[0]);
224
  }
225
+ list(, $node) = unpack('N', \chr($middle) . substr($bytes, $index, 3));
226
 
227
  return $node;
 
228
  case 32:
229
  $bytes = Util::read($this->fileHandle, $baseOffset + $index * 4, 4);
230
+ list(, $node) = unpack('N', $bytes);
231
 
232
  return $node;
 
233
  default:
234
  throw new InvalidDatabaseException(
235
  'Unknown record size: '
238
  }
239
  }
240
 
241
+ private function resolveDataPointer($pointer)
 
 
 
242
  {
243
  $resolved = $pointer - $this->metadata->nodeCount
244
  + $this->metadata->searchTreeSize;
248
  );
249
  }
250
 
251
+ list($data) = $this->decoder->decode($resolved);
252
 
253
  return $data;
254
  }
258
  * are much faster algorithms (e.g., Boyer-Moore) for this if speed is ever
259
  * an issue, but I suspect it won't be.
260
  */
261
+ private function findMetadataStart($filename)
262
  {
263
  $handle = $this->fileHandle;
264
  $fstat = fstat($handle);
278
  return $offset + $markerLength;
279
  }
280
  }
 
281
  throw new InvalidDatabaseException(
282
  "Error opening database file ($filename). " .
283
  'Is this a valid MaxMind DB file?'
290
  *
291
  * @return Metadata object for the database
292
  */
293
+ public function metadata()
294
  {
295
  if (\func_num_args()) {
296
+ throw new InvalidArgumentException(
297
+ 'Method takes no arguments.'
298
  );
299
  }
300
 
306
  );
307
  }
308
 
309
+ return $this->metadata;
310
  }
311
 
312
  /**
315
  * @throws Exception
316
  * if an I/O error occurs
317
  */
318
+ public function close()
319
  {
 
 
 
 
 
 
320
  if (!\is_resource($this->fileHandle)) {
321
  throw new BadMethodCallException(
322
  'Attempt to close a closed MaxMind DB.'
vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php CHANGED
@@ -1,68 +1,63 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  namespace MaxMind\Db\Reader;
6
 
7
  // @codingStandardsIgnoreLine
8
  use RuntimeException;
9
 
10
- /*
11
  * @ignore
12
  *
13
  * We subtract 1 from the log to protect against precision loss.
14
  */
15
- \define(__NAMESPACE__ . '\_MM_MAX_INT_BYTES', (int) ((log(\PHP_INT_MAX, 2) - 1) / 8));
16
 
17
  class Decoder
18
  {
19
- /**
20
- * @var resource
21
- */
22
  private $fileStream;
23
- /**
24
- * @var int
25
- */
26
  private $pointerBase;
27
- /**
28
- * @var float
29
- */
30
  private $pointerBaseByteSize;
31
- /**
32
- * This is only used for unit testing.
33
- *
34
- * @var bool
35
- */
36
  private $pointerTestHack;
37
- /**
38
- * @var bool
39
- */
40
  private $switchByteOrder;
41
 
42
- private const _EXTENDED = 0;
43
- private const _POINTER = 1;
44
- private const _UTF8_STRING = 2;
45
- private const _DOUBLE = 3;
46
- private const _BYTES = 4;
47
- private const _UINT16 = 5;
48
- private const _UINT32 = 6;
49
- private const _MAP = 7;
50
- private const _INT32 = 8;
51
- private const _UINT64 = 9;
52
- private const _UINT128 = 10;
53
- private const _ARRAY = 11;
54
- private const _CONTAINER = 12;
55
- private const _END_MARKER = 13;
56
- private const _BOOLEAN = 14;
57
- private const _FLOAT = 15;
58
-
59
- /**
60
- * @param resource $fileStream
61
- */
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  public function __construct(
63
  $fileStream,
64
- int $pointerBase = 0,
65
- bool $pointerTestHack = false
66
  ) {
67
  $this->fileStream = $fileStream;
68
  $this->pointerBase = $pointerBase;
@@ -73,7 +68,7 @@ class Decoder
73
  $this->switchByteOrder = $this->isPlatformLittleEndian();
74
  }
75
 
76
- public function decode(int $offset): array
77
  {
78
  $ctrlByte = \ord(Util::read($this->fileStream, $offset, 1));
79
  ++$offset;
@@ -84,14 +79,14 @@ class Decoder
84
  // use the size to determine the length of the pointer and then follow
85
  // it.
86
  if ($type === self::_POINTER) {
87
- [$pointer, $offset] = $this->decodePointer($ctrlByte, $offset);
88
 
89
  // for unit testing
90
  if ($this->pointerTestHack) {
91
  return [$pointer];
92
  }
93
 
94
- [$result] = $this->decode($pointer);
95
 
96
  return [$result, $offset];
97
  }
@@ -113,51 +108,43 @@ class Decoder
113
  ++$offset;
114
  }
115
 
116
- [$size, $offset] = $this->sizeFromCtrlByte($ctrlByte, $offset);
117
 
118
  return $this->decodeByType($type, $offset, $size);
119
  }
120
 
121
- private function decodeByType(int $type, int $offset, int $size): array
122
  {
123
  switch ($type) {
124
  case self::_MAP:
125
  return $this->decodeMap($size, $offset);
126
-
127
  case self::_ARRAY:
128
  return $this->decodeArray($size, $offset);
129
-
130
  case self::_BOOLEAN:
131
  return [$this->decodeBoolean($size), $offset];
132
  }
133
 
134
  $newOffset = $offset + $size;
135
  $bytes = Util::read($this->fileStream, $offset, $size);
136
-
137
  switch ($type) {
138
  case self::_BYTES:
139
  case self::_UTF8_STRING:
140
  return [$bytes, $newOffset];
141
-
142
  case self::_DOUBLE:
143
  $this->verifySize(8, $size);
144
 
145
  return [$this->decodeDouble($bytes), $newOffset];
146
-
147
  case self::_FLOAT:
148
  $this->verifySize(4, $size);
149
 
150
  return [$this->decodeFloat($bytes), $newOffset];
151
-
152
  case self::_INT32:
153
  return [$this->decodeInt32($bytes, $size), $newOffset];
154
-
155
  case self::_UINT16:
156
  case self::_UINT32:
157
  case self::_UINT64:
158
  case self::_UINT128:
159
  return [$this->decodeUint($bytes, $size), $newOffset];
160
-
161
  default:
162
  throw new InvalidDatabaseException(
163
  'Unknown or unexpected type: ' . $type
@@ -165,7 +152,7 @@ class Decoder
165
  }
166
  }
167
 
168
- private function verifySize(int $expected, int $actual): void
169
  {
170
  if ($expected !== $actual) {
171
  throw new InvalidDatabaseException(
@@ -174,82 +161,86 @@ class Decoder
174
  }
175
  }
176
 
177
- private function decodeArray(int $size, int $offset): array
178
  {
179
  $array = [];
180
 
181
  for ($i = 0; $i < $size; ++$i) {
182
- [$value, $offset] = $this->decode($offset);
183
- $array[] = $value;
184
  }
185
 
186
  return [$array, $offset];
187
  }
188
 
189
- private function decodeBoolean(int $size): bool
190
  {
191
- return $size !== 0;
192
  }
193
 
194
- private function decodeDouble(string $bytes): float
195
  {
196
  // This assumes IEEE 754 doubles, but most (all?) modern platforms
197
  // use them.
198
- [, $double] = unpack('E', $bytes);
 
 
 
 
199
 
200
  return $double;
201
  }
202
 
203
- private function decodeFloat(string $bytes): float
204
  {
205
  // This assumes IEEE 754 floats, but most (all?) modern platforms
206
  // use them.
207
- [, $float] = unpack('G', $bytes);
 
 
 
 
208
 
209
  return $float;
210
  }
211
 
212
- private function decodeInt32(string $bytes, int $size): int
213
  {
214
  switch ($size) {
215
  case 0:
216
  return 0;
217
-
218
  case 1:
219
  case 2:
220
  case 3:
221
- $bytes = str_pad($bytes, 4, "\x00", \STR_PAD_LEFT);
222
-
223
  break;
224
-
225
  case 4:
226
  break;
227
-
228
  default:
229
  throw new InvalidDatabaseException(
230
  "The MaxMind DB file's data section contains bad data (unknown data type or corrupt data)"
231
  );
232
  }
233
 
234
- [, $int] = unpack('l', $this->maybeSwitchByteOrder($bytes));
235
 
236
  return $int;
237
  }
238
 
239
- private function decodeMap(int $size, int $offset): array
240
  {
241
  $map = [];
242
 
243
  for ($i = 0; $i < $size; ++$i) {
244
- [$key, $offset] = $this->decode($offset);
245
- [$value, $offset] = $this->decode($offset);
246
  $map[$key] = $value;
247
  }
248
 
249
  return [$map, $offset];
250
  }
251
 
252
- private function decodePointer(int $ctrlByte, int $offset): array
253
  {
254
  $pointerSize = (($ctrlByte >> 3) & 0x3) + 1;
255
 
@@ -259,28 +250,22 @@ class Decoder
259
  switch ($pointerSize) {
260
  case 1:
261
  $packed = \chr($ctrlByte & 0x7) . $buffer;
262
- [, $pointer] = unpack('n', $packed);
263
  $pointer += $this->pointerBase;
264
-
265
  break;
266
-
267
  case 2:
268
  $packed = "\x00" . \chr($ctrlByte & 0x7) . $buffer;
269
- [, $pointer] = unpack('N', $packed);
270
  $pointer += $this->pointerBase + 2048;
271
-
272
  break;
273
-
274
  case 3:
275
  $packed = \chr($ctrlByte & 0x7) . $buffer;
276
 
277
  // It is safe to use 'N' here, even on 32 bit machines as the
278
  // first bit is 0.
279
- [, $pointer] = unpack('N', $packed);
280
  $pointer += $this->pointerBase + 526336;
281
-
282
  break;
283
-
284
  case 4:
285
  // We cannot use unpack here as we might overflow on 32 bit
286
  // machines
@@ -293,26 +278,18 @@ class Decoder
293
  } elseif (\extension_loaded('gmp')) {
294
  $pointer = gmp_strval(gmp_add($pointerOffset, $this->pointerBase));
295
  } elseif (\extension_loaded('bcmath')) {
296
- $pointer = bcadd($pointerOffset, (string) $this->pointerBase);
297
  } else {
298
  throw new RuntimeException(
299
  'The gmp or bcmath extension must be installed to read this database.'
300
  );
301
  }
302
-
303
- break;
304
-
305
- default:
306
- throw new InvalidDatabaseException(
307
- 'Unexpected pointer size ' . $pointerSize
308
- );
309
  }
310
 
311
  return [$pointer, $offset];
312
  }
313
 
314
- // @phpstan-ignore-next-line
315
- private function decodeUint(string $bytes, int $byteLength)
316
  {
317
  if ($byteLength === 0) {
318
  return 0;
@@ -320,22 +297,16 @@ class Decoder
320
 
321
  $integer = 0;
322
 
323
- // PHP integers are signed. _MM_MAX_INT_BYTES is the number of
324
- // complete bytes that can be converted to an integer. However,
325
- // we can convert another byte if the leading bit is zero.
326
- $useRealInts = $byteLength <= _MM_MAX_INT_BYTES
327
- || ($byteLength === _MM_MAX_INT_BYTES + 1 && (\ord($bytes[0]) & 0x80) === 0);
328
-
329
  for ($i = 0; $i < $byteLength; ++$i) {
330
  $part = \ord($bytes[$i]);
331
 
332
  // We only use gmp or bcmath if the final value is too big
333
- if ($useRealInts) {
334
  $integer = ($integer << 8) + $part;
335
  } elseif (\extension_loaded('gmp')) {
336
- $integer = gmp_strval(gmp_add(gmp_mul((string) $integer, '256'), $part));
337
  } elseif (\extension_loaded('bcmath')) {
338
- $integer = bcadd(bcmul((string) $integer, '256'), (string) $part);
339
  } else {
340
  throw new RuntimeException(
341
  'The gmp or bcmath extension must be installed to read this database.'
@@ -346,7 +317,7 @@ class Decoder
346
  return $integer;
347
  }
348
 
349
- private function sizeFromCtrlByte(int $ctrlByte, int $offset): array
350
  {
351
  $size = $ctrlByte & 0x1f;
352
 
@@ -360,22 +331,22 @@ class Decoder
360
  if ($size === 29) {
361
  $size = 29 + \ord($bytes);
362
  } elseif ($size === 30) {
363
- [, $adjust] = unpack('n', $bytes);
364
  $size = 285 + $adjust;
365
- } else {
366
- [, $adjust] = unpack('N', "\x00" . $bytes);
367
  $size = $adjust + 65821;
368
  }
369
 
370
  return [$size, $offset + $bytesToRead];
371
  }
372
 
373
- private function maybeSwitchByteOrder(string $bytes): string
374
  {
375
  return $this->switchByteOrder ? strrev($bytes) : $bytes;
376
  }
377
 
378
- private function isPlatformLittleEndian(): bool
379
  {
380
  $testint = 0x00FF;
381
  $packed = pack('S', $testint);
1
  <?php
2
 
 
 
3
  namespace MaxMind\Db\Reader;
4
 
5
  // @codingStandardsIgnoreLine
6
  use RuntimeException;
7
 
8
+ /**
9
  * @ignore
10
  *
11
  * We subtract 1 from the log to protect against precision loss.
12
  */
13
+ \define(__NAMESPACE__ . '\_MM_MAX_INT_BYTES', (log(PHP_INT_MAX, 2) - 1) / 8);
14
 
15
  class Decoder
16
  {
 
 
 
17
  private $fileStream;
 
 
 
18
  private $pointerBase;
 
 
 
19
  private $pointerBaseByteSize;
20
+ // This is only used for unit testing
 
 
 
 
21
  private $pointerTestHack;
 
 
 
22
  private $switchByteOrder;
23
 
24
+ /** @ignore */
25
+ const _EXTENDED = 0;
26
+ /** @ignore */
27
+ const _POINTER = 1;
28
+ /** @ignore */
29
+ const _UTF8_STRING = 2;
30
+ /** @ignore */
31
+ const _DOUBLE = 3;
32
+ /** @ignore */
33
+ const _BYTES = 4;
34
+ /** @ignore */
35
+ const _UINT16 = 5;
36
+ /** @ignore */
37
+ const _UINT32 = 6;
38
+ /** @ignore */
39
+ const _MAP = 7;
40
+ /** @ignore */
41
+ const _INT32 = 8;
42
+ /** @ignore */
43
+ const _UINT64 = 9;
44
+ /** @ignore */
45
+ const _UINT128 = 10;
46
+ /** @ignore */
47
+ const _ARRAY = 11;
48
+ /** @ignore */
49
+ const _CONTAINER = 12;
50
+ /** @ignore */
51
+ const _END_MARKER = 13;
52
+ /** @ignore */
53
+ const _BOOLEAN = 14;
54
+ /** @ignore */
55
+ const _FLOAT = 15;
56
+
57
  public function __construct(
58
  $fileStream,
59
+ $pointerBase = 0,
60
+ $pointerTestHack = false
61
  ) {
62
  $this->fileStream = $fileStream;
63
  $this->pointerBase = $pointerBase;
68
  $this->switchByteOrder = $this->isPlatformLittleEndian();
69
  }
70
 
71
+ public function decode($offset)
72
  {
73
  $ctrlByte = \ord(Util::read($this->fileStream, $offset, 1));
74
  ++$offset;
79
  // use the size to determine the length of the pointer and then follow
80
  // it.
81
  if ($type === self::_POINTER) {
82
+ list($pointer, $offset) = $this->decodePointer($ctrlByte, $offset);
83
 
84
  // for unit testing
85
  if ($this->pointerTestHack) {
86
  return [$pointer];
87
  }
88
 
89
+ list($result) = $this->decode($pointer);
90
 
91
  return [$result, $offset];
92
  }
108
  ++$offset;
109
  }
110
 
111
+ list($size, $offset) = $this->sizeFromCtrlByte($ctrlByte, $offset);
112
 
113
  return $this->decodeByType($type, $offset, $size);
114
  }
115
 
116
+ private function decodeByType($type, $offset, $size)
117
  {
118
  switch ($type) {
119
  case self::_MAP:
120
  return $this->decodeMap($size, $offset);
 
121
  case self::_ARRAY:
122
  return $this->decodeArray($size, $offset);
 
123
  case self::_BOOLEAN:
124
  return [$this->decodeBoolean($size), $offset];
125
  }
126
 
127
  $newOffset = $offset + $size;
128
  $bytes = Util::read($this->fileStream, $offset, $size);
 
129
  switch ($type) {
130
  case self::_BYTES:
131
  case self::_UTF8_STRING:
132
  return [$bytes, $newOffset];
 
133
  case self::_DOUBLE:
134
  $this->verifySize(8, $size);
135
 
136
  return [$this->decodeDouble($bytes), $newOffset];
 
137
  case self::_FLOAT:
138
  $this->verifySize(4, $size);
139
 
140
  return [$this->decodeFloat($bytes), $newOffset];
 
141
  case self::_INT32:
142
  return [$this->decodeInt32($bytes, $size), $newOffset];
 
143
  case self::_UINT16:
144
  case self::_UINT32:
145
  case self::_UINT64:
146
  case self::_UINT128:
147
  return [$this->decodeUint($bytes, $size), $newOffset];
 
148
  default:
149
  throw new InvalidDatabaseException(
150
  'Unknown or unexpected type: ' . $type
152
  }
153
  }
154
 
155
+ private function verifySize($expected, $actual)
156
  {
157
  if ($expected !== $actual) {
158
  throw new InvalidDatabaseException(
161
  }
162
  }
163
 
164
+ private function decodeArray($size, $offset)
165
  {
166
  $array = [];
167
 
168
  for ($i = 0; $i < $size; ++$i) {
169
+ list($value, $offset) = $this->decode($offset);
170
+ array_push($array, $value);
171
  }
172
 
173
  return [$array, $offset];
174
  }
175
 
176
+ private function decodeBoolean($size)
177
  {
178
+ return $size === 0 ? false : true;
179
  }
180
 
181
+ private function decodeDouble($bits)
182
  {
183
  // This assumes IEEE 754 doubles, but most (all?) modern platforms
184
  // use them.
185
+ //
186
+ // We are not using the "E" format as that was only added in
187
+ // 7.0.15 and 7.1.1. As such, we must switch byte order on
188
+ // little endian machines.
189
+ list(, $double) = unpack('d', $this->maybeSwitchByteOrder($bits));
190
 
191
  return $double;
192
  }
193
 
194
+ private function decodeFloat($bits)
195
  {
196
  // This assumes IEEE 754 floats, but most (all?) modern platforms
197
  // use them.
198
+ //
199
+ // We are not using the "G" format as that was only added in
200
+ // 7.0.15 and 7.1.1. As such, we must switch byte order on
201
+ // little endian machines.
202
+ list(, $float) = unpack('f', $this->maybeSwitchByteOrder($bits));
203
 
204
  return $float;
205
  }
206
 
207
+ private function decodeInt32($bytes, $size)
208
  {
209
  switch ($size) {
210
  case 0:
211
  return 0;
 
212
  case 1:
213
  case 2:
214
  case 3:
215
+ $bytes = str_pad($bytes, 4, "\x00", STR_PAD_LEFT);
 
216
  break;
 
217
  case 4:
218
  break;
 
219
  default:
220
  throw new InvalidDatabaseException(
221
  "The MaxMind DB file's data section contains bad data (unknown data type or corrupt data)"
222
  );
223
  }
224
 
225
+ list(, $int) = unpack('l', $this->maybeSwitchByteOrder($bytes));
226
 
227
  return $int;
228
  }
229
 
230
+ private function decodeMap($size, $offset)
231
  {
232
  $map = [];
233
 
234
  for ($i = 0; $i < $size; ++$i) {
235
+ list($key, $offset) = $this->decode($offset);
236
+ list($value, $offset) = $this->decode($offset);
237
  $map[$key] = $value;
238
  }
239
 
240
  return [$map, $offset];
241
  }
242
 
243
+ private function decodePointer($ctrlByte, $offset)
244
  {
245
  $pointerSize = (($ctrlByte >> 3) & 0x3) + 1;
246
 
250
  switch ($pointerSize) {
251
  case 1:
252
  $packed = \chr($ctrlByte & 0x7) . $buffer;
253
+ list(, $pointer) = unpack('n', $packed);
254
  $pointer += $this->pointerBase;
 
255
  break;
 
256
  case 2:
257
  $packed = "\x00" . \chr($ctrlByte & 0x7) . $buffer;
258
+ list(, $pointer) = unpack('N', $packed);
259
  $pointer += $this->pointerBase + 2048;
 
260
  break;
 
261
  case 3:
262
  $packed = \chr($ctrlByte & 0x7) . $buffer;
263
 
264
  // It is safe to use 'N' here, even on 32 bit machines as the
265
  // first bit is 0.
266
+ list(, $pointer) = unpack('N', $packed);
267
  $pointer += $this->pointerBase + 526336;
 
268
  break;
 
269
  case 4:
270
  // We cannot use unpack here as we might overflow on 32 bit
271
  // machines
278
  } elseif (\extension_loaded('gmp')) {
279
  $pointer = gmp_strval(gmp_add($pointerOffset, $this->pointerBase));
280
  } elseif (\extension_loaded('bcmath')) {
281
+ $pointer = bcadd($pointerOffset, $this->pointerBase);
282
  } else {
283
  throw new RuntimeException(
284
  'The gmp or bcmath extension must be installed to read this database.'
285
  );
286
  }
 
 
 
 
 
 
 
287
  }
288
 
289
  return [$pointer, $offset];
290
  }
291
 
292
+ private function decodeUint($bytes, $byteLength)
 
293
  {
294
  if ($byteLength === 0) {
295
  return 0;
297
 
298
  $integer = 0;
299
 
 
 
 
 
 
 
300
  for ($i = 0; $i < $byteLength; ++$i) {
301
  $part = \ord($bytes[$i]);
302
 
303
  // We only use gmp or bcmath if the final value is too big
304
+ if ($byteLength <= _MM_MAX_INT_BYTES) {
305
  $integer = ($integer << 8) + $part;
306
  } elseif (\extension_loaded('gmp')) {
307
+ $integer = gmp_strval(gmp_add(gmp_mul($integer, 256), $part));
308
  } elseif (\extension_loaded('bcmath')) {
309
+ $integer = bcadd(bcmul($integer, 256), $part);
310
  } else {
311
  throw new RuntimeException(
312
  'The gmp or bcmath extension must be installed to read this database.'
317
  return $integer;
318
  }
319
 
320
+ private function sizeFromCtrlByte($ctrlByte, $offset)
321
  {
322
  $size = $ctrlByte & 0x1f;
323
 
331
  if ($size === 29) {
332
  $size = 29 + \ord($bytes);
333
  } elseif ($size === 30) {
334
+ list(, $adjust) = unpack('n', $bytes);
335
  $size = 285 + $adjust;
336
+ } elseif ($size > 30) {
337
+ list(, $adjust) = unpack('N', "\x00" . $bytes);
338
  $size = $adjust + 65821;
339
  }
340
 
341
  return [$size, $offset + $bytesToRead];
342
  }
343
 
344
+ private function maybeSwitchByteOrder($bytes)
345
  {
346
  return $this->switchByteOrder ? strrev($bytes) : $bytes;
347
  }
348
 
349
+ private function isPlatformLittleEndian()
350
  {
351
  $testint = 0x00FF;
352
  $packed = pack('S', $testint);
vendor/maxmind-db/reader/src/MaxMind/Db/Reader/InvalidDatabaseException.php CHANGED
@@ -1,7 +1,5 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  namespace MaxMind\Db\Reader;
6
 
7
  use Exception;
1
  <?php
2
 
 
 
3
  namespace MaxMind\Db\Reader;
4
 
5
  use Exception;
vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Metadata.php CHANGED
@@ -1,100 +1,71 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  namespace MaxMind\Db\Reader;
6
 
7
- use ArgumentCountError;
8
-
9
  /**
10
  * This class provides the metadata for the MaxMind DB file.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  */
12
  class Metadata
13
  {
14
- /**
15
- * This is an unsigned 16-bit integer indicating the major version number
16
- * for the database's binary format.
17
- *
18
- * @var int
19
- */
20
- public $binaryFormatMajorVersion;
21
- /**
22
- * This is an unsigned 16-bit integer indicating the minor version number
23
- * for the database's binary format.
24
- *
25
- * @var int
26
- */
27
- public $binaryFormatMinorVersion;
28
- /**
29
- * This is an unsigned 64-bit integer that contains the database build
30
- * timestamp as a Unix epoch value.
31
- *
32
- * @var int
33
- */
34
- public $buildEpoch;
35
- /**
36
- * This is a string that indicates the structure of each data record
37
- * associated with an IP address. The actual definition of these
38
- * structures is left up to the database creator.
39
- *
40
- * @var string
41
- */
42
- public $databaseType;
43
- /**
44
- * This key will always point to a map (associative array). The keys of
45
- * that map will be language codes, and the values will be a description
46
- * in that language as a UTF-8 string. May be undefined for some
47
- * databases.
48
- *
49
- * @var array
50
- */
51
- public $description;
52
- /**
53
- * This is an unsigned 16-bit integer which is always 4 or 6. It indicates
54
- * whether the database contains IPv4 or IPv6 address data.
55
- *
56
- * @var int
57
- */
58
- public $ipVersion;
59
- /**
60
- * An array of strings, each of which is a language code. A given record
61
- * may contain data items that have been localized to some or all of
62
- * these languages. This may be undefined.
63
- *
64
- * @var array
65
- */
66
- public $languages;
67
- /**
68
- * @var int
69
- */
70
- public $nodeByteSize;
71
- /**
72
- * This is an unsigned 32-bit integer indicating the number of nodes in
73
- * the search tree.
74
- *
75
- * @var int
76
- */
77
- public $nodeCount;
78
- /**
79
- * This is an unsigned 16-bit integer. It indicates the number of bits in a
80
- * record in the search tree. Note that each node consists of two records.
81
- *
82
- * @var int
83
- */
84
- public $recordSize;
85
- /**
86
- * @var int
87
- */
88
- public $searchTreeSize;
89
 
90
- public function __construct(array $metadata)
91
  {
92
- if (\func_num_args() !== 1) {
93
- throw new ArgumentCountError(
94
- sprintf('%s() expects exactly 1 parameter, %d given', __METHOD__, \func_num_args())
95
- );
96
- }
97
-
98
  $this->binaryFormatMajorVersion =
99
  $metadata['binary_format_major_version'];
100
  $this->binaryFormatMinorVersion =
@@ -109,4 +80,9 @@ class Metadata
109
  $this->nodeByteSize = $this->recordSize / 4;
110
  $this->searchTreeSize = $this->nodeCount * $this->nodeByteSize;
111
  }
 
 
 
 
 
112
  }
1
  <?php
2
 
 
 
3
  namespace MaxMind\Db\Reader;
4
 
 
 
5
  /**
6
  * This class provides the metadata for the MaxMind DB file.
7
+ *
8
+ * @property int $nodeCount This is an unsigned 32-bit
9
+ * integer indicating the number of
10
+ * nodes in the search tree.
11
+ * @property int $recordSize This is an unsigned 16-bit
12
+ * integer. It indicates the number
13
+ * of bits in a record in the search
14
+ * tree. Note that each node
15
+ * consists of two records.
16
+ * @property int $ipVersion This is an unsigned 16-bit
17
+ * integer which is always 4 or 6.
18
+ * It indicates whether the database
19
+ * contains IPv4 or IPv6 address
20
+ * data.
21
+ * @property string $databaseType This is a string that indicates
22
+ * the structure of each data record
23
+ * associated with an IP address.
24
+ * The actual definition of these
25
+ * structures is left up to the
26
+ * database creator.
27
+ * @property array $languages An array of strings, each of
28
+ * which is a language code. A given
29
+ * record may contain data items
30
+ * that have been localized to some
31
+ * or all of these languages. This
32
+ * may be undefined.
33
+ * @property int $binaryFormatMajorVersion This is an unsigned 16-bit
34
+ * integer indicating the major
35
+ * version number for the database's
36
+ * binary format.
37
+ * @property int $binaryFormatMinorVersion This is an unsigned 16-bit
38
+ * integer indicating the minor
39
+ * version number for the database's
40
+ * binary format.
41
+ * @property int $buildEpoch This is an unsigned 64-bit
42
+ * integer that contains the
43
+ * database build timestamp as a
44
+ * Unix epoch value.
45
+ * @property array $description This key will always point to a
46
+ * map (associative array). The keys
47
+ * of that map will be language
48
+ * codes, and the values will be a
49
+ * description in that language as a
50
+ * UTF-8 string. May be undefined
51
+ * for some databases.
52
  */
53
  class Metadata
54
  {
55
+ private $binaryFormatMajorVersion;
56
+ private $binaryFormatMinorVersion;
57
+ private $buildEpoch;
58
+ private $databaseType;
59
+ private $description;
60
+ private $ipVersion;
61
+ private $languages;
62
+ private $nodeByteSize;
63
+ private $nodeCount;
64
+ private $recordSize;
65
+ private $searchTreeSize;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
 
67
+ public function __construct($metadata)
68
  {
 
 
 
 
 
 
69
  $this->binaryFormatMajorVersion =
70
  $metadata['binary_format_major_version'];
71
  $this->binaryFormatMinorVersion =
80
  $this->nodeByteSize = $this->recordSize / 4;
81
  $this->searchTreeSize = $this->nodeCount * $this->nodeByteSize;
82
  }
83
+
84
+ public function __get($var)
85
+ {
86
+ return $this->$var;
87
+ }
88
  }
vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Util.php CHANGED
@@ -1,15 +1,10 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  namespace MaxMind\Db\Reader;
6
 
7
  class Util
8
  {
9
- /**
10
- * @param resource $stream
11
- */
12
- public static function read($stream, int $offset, int $numberOfBytes): string
13
  {
14
  if ($numberOfBytes === 0) {
15
  return '';
@@ -20,11 +15,10 @@ class Util
20
  // We check that the number of bytes read is equal to the number
21
  // asked for. We use ftell as getting the length of $value is
22
  // much slower.
23
- if ($value !== false && ftell($stream) - $offset === $numberOfBytes) {
24
  return $value;
25
  }
26
  }
27
-
28
  throw new InvalidDatabaseException(
29
  'The MaxMind DB file contains bad data'
30
  );
1
  <?php
2
 
 
 
3
  namespace MaxMind\Db\Reader;
4
 
5
  class Util
6
  {
7
+ public static function read($stream, $offset, $numberOfBytes)
 
 
 
8
  {
9
  if ($numberOfBytes === 0) {
10
  return '';
15
  // We check that the number of bytes read is equal to the number
16
  // asked for. We use ftell as getting the length of $value is
17
  // much slower.
18
+ if (ftell($stream) - $offset === $numberOfBytes) {
19
  return $value;
20
  }
21
  }
 
22
  throw new InvalidDatabaseException(
23
  'The MaxMind DB file contains bad data'
24
  );
vendor/maxmind/web-service-common/CHANGELOG.md CHANGED
@@ -1,21 +1,6 @@
1
  CHANGELOG
2
  =========
3
 
4
- 0.8.1 (2020-11-02)
5
- ------------------
6
-
7
- * We now correctly handle responses without a `Content-Type` header. In 0.8.0,
8
- such responses could lead to a type error. In particular, this affected the
9
- minFraud Report Transaction endpoint, which returns a response with no
10
- content. Reported by Dmitry Malashko. GitHub #99 on
11
- `maxmind/minfraud-api-php`.
12
-
13
- 0.8.0 (2020-10-01)
14
- ------------------
15
-
16
- * PHP 7.2 or greater is now required.
17
- * Added additional type hints.
18
-
19
  0.7.0 (2020-05-06)
20
  ------------------
21
 
1
  CHANGELOG
2
  =========
3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  0.7.0 (2020-05-06)
5
  ------------------
6
 
vendor/maxmind/web-service-common/README.md CHANGED
@@ -5,7 +5,7 @@ shared code between MaxMind's various web service client APIs.
5
 
6
  ## Requirements ##
7
 
8
- The library requires PHP 7.2 or greater.
9
 
10
  There are several other dependencies as defined in the `composer.json` file.
11
 
5
 
6
  ## Requirements ##
7
 
8
+ The library requires PHP 5.6 or greater.
9
 
10
  There are several other dependencies as defined in the `composer.json` file.
11
 
vendor/maxmind/web-service-common/composer.json CHANGED
@@ -12,14 +12,14 @@
12
  }
13
  ],
14
  "require": {
15
- "php": ">=7.2",
16
  "composer/ca-bundle": "^1.0.3",
17
  "ext-curl": "*",
18
  "ext-json": "*"
19
  },
20
  "require-dev": {
21
  "friendsofphp/php-cs-fixer": "2.*",
22
- "phpunit/phpunit": "^8.0 || ^9.0",
23
  "squizlabs/php_codesniffer": "3.*"
24
  },
25
  "autoload": {
12
  }
13
  ],
14
  "require": {
15
+ "php": ">=5.6",
16
  "composer/ca-bundle": "^1.0.3",
17
  "ext-curl": "*",
18
  "ext-json": "*"
19
  },
20
  "require-dev": {
21
  "friendsofphp/php-cs-fixer": "2.*",
22
+ "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0",
23
  "squizlabs/php_codesniffer": "3.*"
24
  },
25
  "autoload": {
vendor/maxmind/web-service-common/src/Exception/AuthenticationException.php CHANGED
@@ -1,7 +1,5 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  namespace MaxMind\Exception;
6
 
7
  /**
1
  <?php
2
 
 
 
3
  namespace MaxMind\Exception;
4
 
5
  /**
vendor/maxmind/web-service-common/src/Exception/HttpException.php CHANGED
@@ -1,7 +1,5 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  namespace MaxMind\Exception;
6
 
7
  /**
@@ -21,21 +19,21 @@ class HttpException extends WebServiceException
21
  * @param \Exception $previous the previous exception, if any
22
  */
23
  public function __construct(
24
- string $message,
25
- int $httpStatus,
26
- string $uri,
27
  \Exception $previous = null
28
  ) {
29
  $this->uri = $uri;
30
  parent::__construct($message, $httpStatus, $previous);
31
  }
32
 
33
- public function getUri(): string
34
  {
35
  return $this->uri;
36
  }
37
 
38
- public function getStatusCode(): int
39
  {
40
  return $this->getCode();
41
  }
1
  <?php
2
 
 
 
3
  namespace MaxMind\Exception;
4
 
5
  /**
19
  * @param \Exception $previous the previous exception, if any
20
  */
21
  public function __construct(
22
+ $message,
23
+ $httpStatus,
24
+ $uri,
25
  \Exception $previous = null
26
  ) {
27
  $this->uri = $uri;
28
  parent::__construct($message, $httpStatus, $previous);
29
  }
30
 
31
+ public function getUri()
32
  {
33
  return $this->uri;
34
  }
35
 
36
+ public function getStatusCode()
37
  {
38
  return $this->getCode();
39
  }
vendor/maxmind/web-service-common/src/Exception/InsufficientFundsException.php CHANGED
@@ -1,7 +1,5 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  namespace MaxMind\Exception;
6
 
7
  /**
1
  <?php
2
 
 
 
3
  namespace MaxMind\Exception;
4
 
5
  /**
vendor/maxmind/web-service-common/src/Exception/InvalidInputException.php CHANGED
@@ -1,7 +1,5 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  namespace MaxMind\Exception;
6
 
7
  /**
1
  <?php
2
 
 
 
3
  namespace MaxMind\Exception;
4
 
5
  /**
vendor/maxmind/web-service-common/src/Exception/InvalidRequestException.php CHANGED
@@ -1,7 +1,5 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  namespace MaxMind\Exception;
6
 
7
  /**
@@ -16,23 +14,23 @@ class InvalidRequestException extends HttpException
16
 
17
  /**
18
  * @param string $message the exception message
19
- * @param string $error the error code returned by the MaxMind web service
20
  * @param int $httpStatus the HTTP status code of the response
21
  * @param string $uri the URI queries
22
  * @param \Exception $previous the previous exception, if any
23
  */
24
  public function __construct(
25
- string $message,
26
- string $error,
27
- int $httpStatus,
28
- string $uri,
29
  \Exception $previous = null
30
  ) {
31
  $this->error = $error;
32
  parent::__construct($message, $httpStatus, $uri, $previous);
33
  }
34
 
35
- public function getErrorCode(): string
36
  {
37
  return $this->error;
38
  }
1
  <?php
2
 
 
 
3
  namespace MaxMind\Exception;
4
 
5
  /**
14
 
15
  /**
16
  * @param string $message the exception message
17
+ * @param int $error the error code returned by the MaxMind web service
18
  * @param int $httpStatus the HTTP status code of the response
19
  * @param string $uri the URI queries
20
  * @param \Exception $previous the previous exception, if any
21
  */
22
  public function __construct(
23
+ $message,
24
+ $error,
25
+ $httpStatus,
26
+ $uri,
27
  \Exception $previous = null
28
  ) {
29
  $this->error = $error;
30
  parent::__construct($message, $httpStatus, $uri, $previous);
31
  }
32
 
33
+ public function getErrorCode()
34
  {
35
  return $this->error;
36
  }
vendor/maxmind/web-service-common/src/Exception/IpAddressNotFoundException.php CHANGED
@@ -1,7 +1,5 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  namespace MaxMind\Exception;
6
 
7
  class IpAddressNotFoundException extends InvalidRequestException
1
  <?php
2
 
 
 
3
  namespace MaxMind\Exception;
4
 
5
  class IpAddressNotFoundException extends InvalidRequestException
vendor/maxmind/web-service-common/src/Exception/PermissionRequiredException.php CHANGED
@@ -1,7 +1,5 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  namespace MaxMind\Exception;
6
 
7
  /**
1
  <?php
2
 
 
 
3
  namespace MaxMind\Exception;
4
 
5
  /**
vendor/maxmind/web-service-common/src/Exception/WebServiceException.php CHANGED
@@ -1,7 +1,5 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  namespace MaxMind\Exception;
6
 
7
  /**
1
  <?php
2
 
 
 
3
  namespace MaxMind\Exception;
4
 
5
  /**
vendor/maxmind/web-service-common/src/WebService/Client.php CHANGED
@@ -1,7 +1,5 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  namespace MaxMind\WebService;
6
 
7
  use Composer\CaBundle\CaBundle;
@@ -49,9 +47,9 @@ class Client
49
  * username, and password, e.g., `http://username:password@127.0.0.1:10`.
50
  */
51
  public function __construct(
52
- int $accountId,
53
- string $licenseKey,
54
- array $options = []
55
  ) {
56
  $this->accountId = $accountId;
57
  $this->licenseKey = $licenseKey;
@@ -98,9 +96,9 @@ class Client
98
  * @throws WebServiceException when some other error occurs. This also
99
  * serves as the base class for the above exceptions.
100
  *
101
- * @return array|null The decoded content of a successful response
102
  */
103
- public function post(string $service, string $path, array $input): ?array
104
  {
105
  $requestBody = json_encode($input);
106
  if ($requestBody === false) {
@@ -126,7 +124,7 @@ class Client
126
  );
127
  }
128
 
129
- public function get(string $service, string $path): ?array
130
  {
131
  $request = $this->createRequest($path);
132
 
@@ -141,7 +139,7 @@ class Client
141
  );
142
  }
143
 
144
- private function userAgent(): string
145
  {
146
  $curlVersion = curl_version();
147
 
@@ -149,7 +147,7 @@ class Client
149
  ' curl/' . $curlVersion['version'];
150
  }
151
 
152
- private function createRequest(string $path, array $headers = []): \MaxMind\WebService\Http\Request
153
  {
154
  array_push(
155
  $headers,
@@ -172,11 +170,11 @@ class Client
172
  }
173
 
174
  /**
175
- * @param int $statusCode the HTTP status code of the response
176
- * @param string|null $contentType the Content-Type of the response
177
- * @param string|null $responseBody the response body
178
- * @param string $service the name of the service
179
- * @param string $path the path used in the request
180
  *
181
  * @throws AuthenticationException when there is an issue authenticating the
182
  * request
@@ -187,15 +185,15 @@ class Client
187
  * @throws WebServiceException when some other error occurs. This also
188
  * serves as the base class for the above exceptions
189
  *
190
- * @return array|null The decoded content of a successful response
191
  */
192
  private function handleResponse(
193
- int $statusCode,
194
- ?string $contentType,
195
- ?string $responseBody,
196
- string $service,
197
- string $path
198
- ): ?array {
199
  if ($statusCode >= 400 && $statusCode <= 499) {
200
  $this->handle4xx($statusCode, $contentType, $responseBody, $service, $path);
201
  } elseif ($statusCode >= 500) {
@@ -210,7 +208,7 @@ class Client
210
  /**
211
  * @return string describing the JSON error
212
  */
213
- private function jsonErrorDescription(): string
214
  {
215
  $errno = json_last_error();
216
  switch ($errno) {
@@ -234,17 +232,17 @@ class Client
234
  *
235
  * @return string the constructed URL
236
  */
237
- private function urlFor(string $path): string
238
  {
239
  return 'https://' . $this->host . $path;
240
  }
241
 
242
  /**
243
- * @param int $statusCode the HTTP status code
244
- * @param string|null $contentType the response content-type
245
- * @param string|null $body the response body
246
- * @param string $service the service name
247
- * @param string $path the path used in the request
248
  *
249
  * @throws AuthenticationException
250
  * @throws HttpException
@@ -252,20 +250,20 @@ class Client
252
  * @throws InvalidRequestException
253
  */
254
  private function handle4xx(
255
- int $statusCode,
256
- ?string $contentType,
257
- ?string $body,
258
- string $service,
259
- string $path
260
- ): void {
261
- if ($body === null || $body === '') {
262
  throw new HttpException(
263
  "Received a $statusCode error for $service with no body",
264
  $statusCode,
265
  $this->urlFor($path)
266
  );
267
  }
268
- if ($contentType === null || !strstr($contentType, 'json')) {
269
  throw new HttpException(
270
  "Received a $statusCode error for $service with " .
271
  'the following body: ' . $body,
@@ -313,11 +311,11 @@ class Client
313
  * @throws InsufficientFundsException
314
  */
315
  private function handleWebServiceError(
316
- string $message,
317
- string $code,
318
- int $statusCode,
319
- string $path
320
- ): void {
321
  switch ($code) {
322
  case 'IP_ADDRESS_NOT_FOUND':
323
  case 'IP_ADDRESS_RESERVED':
@@ -371,7 +369,7 @@ class Client
371
  *
372
  * @throws HttpException
373
  */
374
- private function handle5xx(int $statusCode, string $service, string $path): void
375
  {
376
  throw new HttpException(
377
  "Received a server error ($statusCode) for $service",
@@ -387,7 +385,7 @@ class Client
387
  *
388
  * @throws HttpException
389
  */
390
- private function handleUnexpectedStatus(int $statusCode, string $service, string $path): void
391
  {
392
  throw new HttpException(
393
  'Received an unexpected HTTP status ' .
@@ -398,22 +396,22 @@ class Client
398
  }
399
 
400
  /**
401
- * @param int $statusCode the HTTP status code
402
- * @param string|null $body the successful request body
403
- * @param string $service the service name
404
  *
405
  * @throws WebServiceException if a response body is included but not
406
  * expected, or is not expected but not
407
  * included, or is expected and included
408
  * but cannot be decoded as JSON
409
  *
410
- * @return array|null the decoded request body
411
  */
412
- private function handleSuccess(int $statusCode, ?string $body, string $service): ?array
413
  {
414
  // A 204 should have no response body
415
  if ($statusCode === 204) {
416
- if ($body !== null && $body !== '') {
417
  throw new WebServiceException(
418
  "Received a 204 response for $service along with an " .
419
  "unexpected HTTP body: $body"
@@ -424,7 +422,7 @@ class Client
424
  }
425
 
426
  // A 200 should have a valid JSON body
427
- if ($body === null || $body === '') {
428
  throw new WebServiceException(
429
  "Received a 200 response for $service but did not " .
430
  'receive a HTTP body.'
1
  <?php
2
 
 
 
3
  namespace MaxMind\WebService;
4
 
5
  use Composer\CaBundle\CaBundle;
47
  * username, and password, e.g., `http://username:password@127.0.0.1:10`.
48
  */
49
  public function __construct(
50
+ $accountId,
51
+ $licenseKey,
52
+ $options = []
53
  ) {
54
  $this->accountId = $accountId;
55
  $this->licenseKey = $licenseKey;
96
  * @throws WebServiceException when some other error occurs. This also
97
  * serves as the base class for the above exceptions.
98
  *
99
+ * @return array The decoded content of a successful response
100
  */
101
+ public function post($service, $path, $input)
102
  {
103
  $requestBody = json_encode($input);
104
  if ($requestBody === false) {
124
  );
125
  }
126
 
127
+ public function get($service, $path)
128
  {
129
  $request = $this->createRequest($path);
130
 
139
  );
140
  }
141
 
142
+ private function userAgent()
143
  {
144
  $curlVersion = curl_version();
145
 
147
  ' curl/' . $curlVersion['version'];
148
  }
149
 
150
+ private function createRequest($path, $headers = [])
151
  {
152
  array_push(
153
  $headers,
170
  }
171
 
172
  /**
173
+ * @param int $statusCode the HTTP status code of the response
174
+ * @param string $contentType the Content-Type of the response
175
+ * @param string $responseBody the response body
176
+ * @param string $service the name of the service
177
+ * @param string $path the path used in the request
178
  *
179
  * @throws AuthenticationException when there is an issue authenticating the
180
  * request
185
  * @throws WebServiceException when some other error occurs. This also
186
  * serves as the base class for the above exceptions
187
  *
188
+ * @return array The decoded content of a successful response
189
  */
190
  private function handleResponse(
191
+ $statusCode,
192
+ $contentType,
193
+ $responseBody,
194
+ $service,
195
+ $path
196
+ ) {
197
  if ($statusCode >= 400 && $statusCode <= 499) {
198
  $this->handle4xx($statusCode, $contentType, $responseBody, $service, $path);
199
  } elseif ($statusCode >= 500) {
208
  /**
209
  * @return string describing the JSON error
210
  */
211
+ private function jsonErrorDescription()
212
  {
213
  $errno = json_last_error();
214
  switch ($errno) {
232
  *
233
  * @return string the constructed URL
234
  */
235
+ private function urlFor($path)
236
  {
237
  return 'https://' . $this->host . $path;
238
  }
239
 
240
  /**
241
+ * @param int $statusCode the HTTP status code
242
+ * @param string $contentType the response content-type
243
+ * @param string $body the response body
244
+ * @param string $service the service name
245
+ * @param string $path the path used in the request
246
  *
247
  * @throws AuthenticationException
248
  * @throws HttpException
250
  * @throws InvalidRequestException
251
  */
252
  private function handle4xx(
253
+ $statusCode,
254
+ $contentType,
255
+ $body,
256
+ $service,
257
+ $path
258
+ ) {
259
+ if (\strlen($body) === 0) {
260
  throw new HttpException(
261
  "Received a $statusCode error for $service with no body",
262
  $statusCode,
263
  $this->urlFor($path)
264
  );
265
  }
266
+ if (!strstr($contentType, 'json')) {
267
  throw new HttpException(
268
  "Received a $statusCode error for $service with " .
269
  'the following body: ' . $body,
311
  * @throws InsufficientFundsException
312
  */
313
  private function handleWebServiceError(
314
+ $message,
315
+ $code,
316
+ $statusCode,
317
+ $path
318
+ ) {
319
  switch ($code) {
320
  case 'IP_ADDRESS_NOT_FOUND':
321
  case 'IP_ADDRESS_RESERVED':
369
  *
370
  * @throws HttpException
371
  */
372
+ private function handle5xx($statusCode, $service, $path)
373
  {
374
  throw new HttpException(
375
  "Received a server error ($statusCode) for $service",
385
  *
386
  * @throws HttpException
387
  */
388
+ private function handleUnexpectedStatus($statusCode, $service, $path)
389
  {
390
  throw new HttpException(
391
  'Received an unexpected HTTP status ' .
396
  }
397
 
398
  /**
399
+ * @param int $statusCode the HTTP status code
400
+ * @param string $body the successful request body
401
+ * @param string $service the service name
402
  *
403
  * @throws WebServiceException if a response body is included but not
404
  * expected, or is not expected but not
405
  * included, or is expected and included
406
  * but cannot be decoded as JSON
407
  *
408
+ * @return array the decoded request body
409
  */
410
+ private function handleSuccess($statusCode, $body, $service)
411
  {
412
  // A 204 should have no response body
413
  if ($statusCode === 204) {
414
+ if (\strlen($body) !== 0) {
415
  throw new WebServiceException(
416
  "Received a 204 response for $service along with an " .
417
  "unexpected HTTP body: $body"
422
  }
423
 
424
  // A 200 should have a valid JSON body
425
+ if (\strlen($body) === 0) {
426
  throw new WebServiceException(
427
  "Received a 200 response for $service but did not " .
428
  'receive a HTTP body.'
vendor/maxmind/web-service-common/src/WebService/Http/CurlRequest.php CHANGED
@@ -1,7 +1,5 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  namespace MaxMind\WebService\Http;
6
 
7
  use MaxMind\Exception\HttpException;
@@ -28,7 +26,11 @@ class CurlRequest implements Request
28
  */
29
  private $options;
30
 
31
- public function __construct(string $url, array $options)
 
 
 
 
32
  {
33
  $this->url = $url;
34
  $this->options = $options;
@@ -36,9 +38,13 @@ class CurlRequest implements Request
36
  }
37
 
38
  /**
 
 
39
  * @throws HttpException
 
 
40
  */
41
- public function post(string $body): array
42
  {
43
  $curl = $this->createCurl();
44
 
@@ -48,7 +54,7 @@ class CurlRequest implements Request
48
  return $this->execute($curl);
49
  }
50
 
51
- public function get(): array
52
  {
53
  $curl = $this->createCurl();
54
 
@@ -106,8 +112,10 @@ class CurlRequest implements Request
106
  * @param resource $curl
107
  *
108
  * @throws HttpException
 
 
109
  */
110
- private function execute($curl): array
111
  {
112
  $body = curl_exec($curl);
113
  if ($errno = curl_errno($curl)) {
@@ -123,14 +131,6 @@ class CurlRequest implements Request
123
  $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
124
  $contentType = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
125
 
126
- return [
127
- $statusCode,
128
- // The PHP docs say "Content-Type: of the requested document. NULL
129
- // indicates server did not send valid Content-Type: header" for
130
- // CURLINFO_CONTENT_TYPE. However, it will return FALSE if no header
131
- // is set. To keep our types simple, we return null in this case.
132
- ($contentType === false ? null : $contentType),
133
- $body,
134
- ];
135
  }
136
  }
1
  <?php
2
 
 
 
3
  namespace MaxMind\WebService\Http;
4
 
5
  use MaxMind\Exception\HttpException;
26
  */
27
  private $options;
28
 
29
+ /**
30
+ * @param string $url
31
+ * @param array $options
32
+ */
33
+ public function __construct($url, $options)
34
  {
35
  $this->url = $url;
36
  $this->options = $options;
38
  }
39
 
40
  /**
41
+ * @param string $body
42
+ *
43
  * @throws HttpException
44
+ *
45
+ * @return array
46
  */
47
+ public function post($body)
48
  {
49
  $curl = $this->createCurl();
50
 
54
  return $this->execute($curl);
55
  }
56
 
57
+ public function get()
58
  {
59
  $curl = $this->createCurl();
60
 
112
  * @param resource $curl
113
  *
114
  * @throws HttpException
115
+ *
116
+ * @return array
117
  */
118
+ private function execute($curl)
119
  {
120
  $body = curl_exec($curl);
121
  if ($errno = curl_errno($curl)) {
131
  $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
132
  $contentType = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
133
 
134
+ return [$statusCode, $contentType, $body];
 
 
 
 
 
 
 
 
135
  }
136
  }
vendor/maxmind/web-service-common/src/WebService/Http/Request.php CHANGED
@@ -1,7 +1,5 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  namespace MaxMind\WebService\Http;
6
 
7
  /**
@@ -11,9 +9,21 @@ namespace MaxMind\WebService\Http;
11
  */
12
  interface Request
13
  {
14
- public function __construct(string $url, array $options);
 
 
 
 
15
 
16
- public function post(string $body): array;
 
 
 
 
 
17
 
18
- public function get(): array;
 
 
 
19
  }
1
  <?php
2
 
 
 
3
  namespace MaxMind\WebService\Http;
4
 
5
  /**
9
  */
10
  interface Request
11
  {
12
+ /**
13
+ * @param string $url
14
+ * @param array $options
15
+ */
16
+ public function __construct($url, $options);
17
 
18
+ /**
19
+ * @param string $body
20
+ *
21
+ * @return mixed
22
+ */
23
+ public function post($body);
24
 
25
+ /**
26
+ * @return mixed
27
+ */
28
+ public function get();
29
  }
vendor/maxmind/web-service-common/src/WebService/Http/RequestFactory.php CHANGED
@@ -1,7 +1,5 @@
1
  <?php
2
 
3
- declare(strict_types=1);
4
-
5
  namespace MaxMind\WebService\Http;
6
 
7
  /**
@@ -37,9 +35,12 @@ class RequestFactory
37
  }
38
 
39
  /**
 
 
 
40
  * @return Request
41
  */
42
- public function request(string $url, array $options)
43
  {
44
  $options['curlHandle'] = $this->getCurlHandle();
45
 
1
  <?php
2
 
 
 
3
  namespace MaxMind\WebService\Http;
4
 
5
  /**
35
  }
36
 
37
  /**
38
+ * @param string $url
39
+ * @param array $options
40
+ *
41
  * @return Request
42
  */
43
+ public function request($url, $options)
44
  {
45
  $options['curlHandle'] = $this->getCurlHandle();
46
 
vendor/symfony/property-info/Extractor/PhpDocExtractor.php CHANGED
@@ -142,11 +142,31 @@ class PhpDocExtractor implements PropertyDescriptionExtractorInterface, Property
142
  break;
143
  }
144
 
 
145
  $types = [];
146
  /** @var DocBlock\Tags\Var_|DocBlock\Tags\Return_|DocBlock\Tags\Param $tag */
147
  foreach ($docBlock->getTagsByName($tag) as $tag) {
148
  if ($tag && !$tag instanceof InvalidTag && null !== $tag->getType()) {
149
- $types = array_merge($types, $this->phpDocTypeHelper->getTypes($tag->getType()));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
150
  }
151
  }
152
 
@@ -258,7 +278,17 @@ class PhpDocExtractor implements PropertyDescriptionExtractorInterface, Property
258
  }
259
 
260
  try {
261
- return $this->docBlockFactory->create($reflectionProperty, $this->createFromReflector($reflectionProperty->getDeclaringClass()));
 
 
 
 
 
 
 
 
 
 
262
  } catch (\InvalidArgumentException $e) {
263
  return null;
264
  } catch (\RuntimeException $e) {
142
  break;
143
  }
144
 
145
+ $parentClass = null;
146
  $types = [];
147
  /** @var DocBlock\Tags\Var_|DocBlock\Tags\Return_|DocBlock\Tags\Param $tag */
148
  foreach ($docBlock->getTagsByName($tag) as $tag) {
149
  if ($tag && !$tag instanceof InvalidTag && null !== $tag->getType()) {
150
+ foreach ($this->phpDocTypeHelper->getTypes($tag->getType()) as $type) {
151
+ switch ($type->getClassName()) {
152
+ case 'self':
153
+ case 'static':
154
+ $resolvedClass = $class;
155
+ break;
156
+
157
+ case 'parent':
158
+ if (false !== $resolvedClass = $parentClass ?? $parentClass = get_parent_class($class)) {
159
+ break;
160
+ }
161
+ // no break
162
+
163
+ default:
164
+ $types[] = $type;
165
+ continue 2;
166
+ }
167
+
168
+ $types[] = new Type(Type::BUILTIN_TYPE_OBJECT, $type->isNullable(), $resolvedClass, $type->isCollection(), $type->getCollectionKeyType(), $type->getCollectionValueType());
169
+ }
170
  }
171
  }
172
 
278
  }
279
 
280
  try {
281
+ $reflector = $reflectionProperty->getDeclaringClass();
282
+
283
+ foreach ($reflector->getTraits() as $trait) {
284
+ if ($trait->hasProperty($property)) {
285
+ $reflector = $trait;
286
+
287
+ break;
288
+ }
289
+ }
290
+
291
+ return $this->docBlockFactory->create($reflectionProperty, $this->createFromReflector($reflector));
292
  } catch (\InvalidArgumentException $e) {
293
  return null;
294
  } catch (\RuntimeException $e) {
vendor/symfony/property-info/Extractor/ReflectionExtractor.php CHANGED
@@ -164,8 +164,8 @@ class ReflectionExtractor implements PropertyListExtractorInterface, PropertyTyp
164
  try {
165
  $reflectionProperty = new \ReflectionProperty($class, $property);
166
  $type = $reflectionProperty->getType();
167
- if (null !== $type) {
168
- return $this->extractFromReflectionType($type, $reflectionProperty->getDeclaringClass());
169
  }
170
  } catch (\ReflectionException $e) {
171
  // noop
164
  try {
165
  $reflectionProperty = new \ReflectionProperty($class, $property);
166
  $type = $reflectionProperty->getType();
167
+ if (null !== $type && $types = $this->extractFromReflectionType($type, $reflectionProperty->getDeclaringClass())) {
168
+ return $types;
169
  }
170
  } catch (\ReflectionException $e) {
171
  // noop
vendor/symfony/property-info/Util/PhpDocTypeHelper.php CHANGED
@@ -172,6 +172,10 @@ final class PhpDocTypeHelper
172
  return [$docType, null];
173
  }
174
 
 
 
 
 
175
  return ['object', substr($docType, 1)]; // substr to strip the namespace's `\`-prefix
176
  }
177
  }
172
  return [$docType, null];
173
  }
174
 
175
+ if (\in_array($docType, ['parent', 'self', 'static'], true)) {
176
+ return ['object', $docType];
177
+ }
178
+
179
  return ['object', substr($docType, 1)]; // substr to strip the namespace's `\`-prefix
180
  }
181
  }
vendor/symfony/string/Resources/functions.php CHANGED
@@ -11,22 +11,28 @@
11
 
12
  namespace Symfony\Component\String;
13
 
14
- function u(?string $string = ''): UnicodeString
15
- {
16
- return new UnicodeString($string ?? '');
 
 
17
  }
18
 
19
- function b(?string $string = ''): ByteString
20
- {
21
- return new ByteString($string ?? '');
 
 
22
  }
23
 
24
- /**
25
- * @return UnicodeString|ByteString
26
- */
27
- function s(?string $string = ''): AbstractString
28
- {
29
- $string = $string ?? '';
 
30
 
31
- return preg_match('//u', $string) ? new UnicodeString($string) : new ByteString($string);
 
32
  }
11
 
12
  namespace Symfony\Component\String;
13
 
14
+ if (!\function_exists(u::class)) {
15
+ function u(?string $string = ''): UnicodeString
16
+ {
17
+ return new UnicodeString($string ?? '');
18
+ }
19
  }
20
 
21
+ if (!\function_exists(b::class)) {
22
+ function b(?string $string = ''): ByteString
23
+ {
24
+ return new ByteString($string ?? '');
25
+ }
26
  }
27
 
28
+ if (!\function_exists(s::class)) {
29
+ /**
30
+ * @return UnicodeString|ByteString
31
+ */
32
+ function s(?string $string = ''): AbstractString
33
+ {
34
+ $string = $string ?? '';
35
 
36
+ return preg_match('//u', $string) ? new UnicodeString($string) : new ByteString($string);
37
+ }
38
  }
yarn.lock CHANGED
@@ -21,7 +21,34 @@
21
  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.13.tgz#27e19e0ed3726ccf54067ced4109501765e7e2e8"
22
  integrity sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg==
23
 
24
- "@babel/core@^7.1.0", "@babel/core@^7.12.13", "@babel/core@^7.4.4", "@babel/core@^7.7.5":
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  version "7.12.17"
26
  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.17.tgz#993c5e893333107a2815d8e0d73a2c3755e280b2"
27
  integrity sha512-V3CuX1aBywbJvV2yzJScRxeiiw0v2KZZYYE3giywxzFJL13RiyPjaaDwhDnxmgFTTS7FgvM2ijr4QmKNIu0AtQ==
@@ -51,6 +78,15 @@
51
  jsesc "^2.5.1"
52
  source-map "^0.5.0"
53
 
 
 
 
 
 
 
 
 
 
54
  "@babel/helper-annotate-as-pure@^7.12.13":
55
  version "7.12.13"
56
  resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab"
@@ -76,6 +112,16 @@
76
  browserslist "^4.14.5"
77
  semver "^5.5.0"
78
 
 
 
 
 
 
 
 
 
 
 
79
  "@babel/helper-create-class-features-plugin@^7.12.13":
80
  version "7.12.17"
81
  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.17.tgz#704b69c8a78d03fb1c5fcc2e7b593f8a65628944"
@@ -87,6 +133,17 @@
87
  "@babel/helper-replace-supers" "^7.12.13"
88
  "@babel/helper-split-export-declaration" "^7.12.13"
89
 
 
 
 
 
 
 
 
 
 
 
 
90
  "@babel/helper-create-regexp-features-plugin@^7.12.13":
91
  version "7.12.17"
92
  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7"
@@ -95,6 +152,20 @@
95
  "@babel/helper-annotate-as-pure" "^7.12.13"
96
  regexpu-core "^4.7.1"
97
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
  "@babel/helper-explode-assignable-expression@^7.12.13":
99
  version "7.12.13"
100
  resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz#0e46990da9e271502f77507efa4c9918d3d8634a"
@@ -125,6 +196,14 @@
125
  dependencies:
126
  "@babel/types" "^7.12.13"
127
 
 
 
 
 
 
 
 
 
128
  "@babel/helper-member-expression-to-functions@^7.12.13", "@babel/helper-member-expression-to-functions@^7.12.17":
129
  version "7.12.17"
130
  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.17.tgz#f82838eb06e1235307b6d71457b6670ff71ee5ac"
@@ -132,6 +211,13 @@
132
  dependencies:
133
  "@babel/types" "^7.12.17"
134
 
 
 
 
 
 
 
 
135
  "@babel/helper-module-imports@^7.12.13":
136
  version "7.12.13"
137
  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0"
@@ -154,6 +240,21 @@
154
  "@babel/types" "^7.12.17"
155
  lodash "^4.17.19"
156
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
  "@babel/helper-optimise-call-expression@^7.12.13":
158
  version "7.12.13"
159
  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea"
@@ -166,6 +267,11 @@
166
  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz#174254d0f2424d8aefb4dd48057511247b0a9eeb"
167
  integrity sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==
168
 
 
 
 
 
 
169
  "@babel/helper-remap-async-to-generator@^7.12.13":
170
  version "7.12.13"
171
  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz#170365f4140e2d20e5c88f8ba23c24468c296878"
@@ -175,6 +281,15 @@
175
  "@babel/helper-wrap-function" "^7.12.13"
176
  "@babel/types" "^7.12.13"
177
 
 
 
 
 
 
 
 
 
 
178
  "@babel/helper-replace-supers@^7.12.13":
179
  version "7.12.13"
180
  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz#00ec4fb6862546bd3d0aff9aac56074277173121"
@@ -185,6 +300,16 @@
185
  "@babel/traverse" "^7.12.13"
186
  "@babel/types" "^7.12.13"
187
 
 
 
 
 
 
 
 
 
 
 
188
  "@babel/helper-simple-access@^7.12.13":
189
  version "7.12.13"
190
  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4"
@@ -226,6 +351,16 @@
226
  "@babel/traverse" "^7.12.13"
227
  "@babel/types" "^7.12.13"
228
 
 
 
 
 
 
 
 
 
 
 
229
  "@babel/helpers@^7.12.17":
230
  version "7.12.17"
231
  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.17.tgz#71e03d2981a6b5ee16899964f4101dc8471d60bc"
@@ -235,6 +370,15 @@
235
  "@babel/traverse" "^7.12.17"
236
  "@babel/types" "^7.12.17"
237
 
 
 
 
 
 
 
 
 
 
238
  "@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13":
239
  version "7.12.13"
240
  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c"
@@ -249,6 +393,11 @@
249
  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.17.tgz#bc85d2d47db38094e5bb268fc761716e7d693848"
250
  integrity sha512-r1yKkiUTYMQ8LiEI0UcQx5ETw5dpTLn9wijn9hk6KkTtOK95FndDN10M+8/s6k/Ymlbivw0Av9q4SlgF80PtHg==
251
 
 
 
 
 
 
252
  "@babel/plugin-proposal-async-generator-functions@^7.12.13":
253
  version "7.12.13"
254
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz#d1c6d841802ffb88c64a2413e311f7345b9e66b5"
@@ -258,6 +407,15 @@
258
  "@babel/helper-remap-async-to-generator" "^7.12.13"
259
  "@babel/plugin-syntax-async-generators" "^7.8.0"
260
 
 
 
 
 
 
 
 
 
 
261
  "@babel/plugin-proposal-class-properties@^7.12.13":
262
  version "7.12.13"
263
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz#3d2ce350367058033c93c098e348161d6dc0d8c8"
@@ -266,6 +424,14 @@
266
  "@babel/helper-create-class-features-plugin" "^7.12.13"
267
  "@babel/helper-plugin-utils" "^7.12.13"
268
 
 
 
 
 
 
 
 
 
269
  "@babel/plugin-proposal-dynamic-import@^7.12.17":
270
  version "7.12.17"
271
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.17.tgz#e0ebd8db65acc37eac518fa17bead2174e224512"
@@ -274,6 +440,14 @@
274
  "@babel/helper-plugin-utils" "^7.12.13"
275
  "@babel/plugin-syntax-dynamic-import" "^7.8.0"
276
 
 
 
 
 
 
 
 
 
277
  "@babel/plugin-proposal-export-namespace-from@^7.12.13":
278
  version "7.12.13"
279
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d"
@@ -290,6 +464,14 @@
290
  "@babel/helper-plugin-utils" "^7.12.13"
291
  "@babel/plugin-syntax-json-strings" "^7.8.0"
292
 
 
 
 
 
 
 
 
 
293
  "@babel/plugin-proposal-logical-assignment-operators@^7.12.13":
294
  version "7.12.13"
295
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz#575b5d9a08d8299eeb4db6430da6e16e5cf14350"
@@ -298,6 +480,14 @@
298
  "@babel/helper-plugin-utils" "^7.12.13"
299
  "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
300
 
 
 
 
 
 
 
 
 
301
  "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.13":
302
  version "7.12.13"
303
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz#24867307285cee4e1031170efd8a7ac807deefde"
@@ -306,6 +496,14 @@
306
  "@babel/helper-plugin-utils" "^7.12.13"
307
  "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
308
 
 
 
 
 
 
 
 
 
309
  "@babel/plugin-proposal-numeric-separator@^7.12.13":
310
  version "7.12.13"
311
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db"
@@ -323,6 +521,17 @@
323
  "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
324
  "@babel/plugin-transform-parameters" "^7.12.13"
325
 
 
 
 
 
 
 
 
 
 
 
 
326
  "@babel/plugin-proposal-optional-catch-binding@^7.12.13":
327
  version "7.12.13"
328
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz#4640520afe57728af14b4d1574ba844f263bcae5"
@@ -331,6 +540,14 @@
331
  "@babel/helper-plugin-utils" "^7.12.13"
332
  "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
333
 
 
 
 
 
 
 
 
 
334
  "@babel/plugin-proposal-optional-chaining@^7.12.17":
335
  version "7.12.17"
336
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.17.tgz#e382becadc2cb16b7913b6c672d92e4b33385b5c"
@@ -340,6 +557,15 @@
340
  "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
341
  "@babel/plugin-syntax-optional-chaining" "^7.8.0"
342
 
 
 
 
 
 
 
 
 
 
343
  "@babel/plugin-proposal-private-methods@^7.12.13":
344
  version "7.12.13"
345
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz#ea78a12554d784ecf7fc55950b752d469d9c4a71"
@@ -348,6 +574,14 @@
348
  "@babel/helper-create-class-features-plugin" "^7.12.13"
349
  "@babel/helper-plugin-utils" "^7.12.13"
350
 
 
 
 
 
 
 
 
 
351
  "@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
352
  version "7.12.13"
353
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba"
@@ -377,7 +611,7 @@
377
  dependencies:
378
  "@babel/helper-plugin-utils" "^7.12.13"
379
 
380
- "@babel/plugin-syntax-dynamic-import@^7.8.0":
381
  version "7.8.3"
382
  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
383
  integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
@@ -475,6 +709,13 @@
475
  dependencies:
476
  "@babel/helper-plugin-utils" "^7.12.13"
477
 
 
 
 
 
 
 
 
478
  "@babel/plugin-transform-async-to-generator@^7.12.13":
479
  version "7.12.13"
480
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz#fed8c69eebf187a535bfa4ee97a614009b24f7ae"
@@ -484,6 +725,15 @@
484
  "@babel/helper-plugin-utils" "^7.12.13"
485
  "@babel/helper-remap-async-to-generator" "^7.12.13"
486
 
 
 
 
 
 
 
 
 
 
487
  "@babel/plugin-transform-block-scoped-functions@^7.12.13":
488
  version "7.12.13"
489
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4"
@@ -511,6 +761,19 @@
511
  "@babel/helper-split-export-declaration" "^7.12.13"
512
  globals "^11.1.0"
513
 
 
 
 
 
 
 
 
 
 
 
 
 
 
514
  "@babel/plugin-transform-computed-properties@^7.12.13":
515
  version "7.12.13"
516
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz#6a210647a3d67f21f699cfd2a01333803b27339d"
@@ -518,6 +781,13 @@
518
  dependencies:
519
  "@babel/helper-plugin-utils" "^7.12.13"
520
 
 
 
 
 
 
 
 
521
  "@babel/plugin-transform-destructuring@^7.12.13":
522
  version "7.12.13"
523
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz#fc56c5176940c5b41735c677124d1d20cecc9aeb"
@@ -525,6 +795,13 @@
525
  dependencies:
526
  "@babel/helper-plugin-utils" "^7.12.13"
527
 
 
 
 
 
 
 
 
528
  "@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4":
529
  version "7.12.13"
530
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad"
@@ -563,6 +840,13 @@
563
  dependencies:
564
  "@babel/helper-plugin-utils" "^7.12.13"
565
 
 
 
 
 
 
 
 
566
  "@babel/plugin-transform-function-name@^7.12.13":
567
  version "7.12.13"
568
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051"
@@ -594,6 +878,15 @@
594
  "@babel/helper-plugin-utils" "^7.12.13"
595
  babel-plugin-dynamic-import-node "^2.3.3"
596
 
 
 
 
 
 
 
 
 
 
597
  "@babel/plugin-transform-modules-commonjs@^7.12.13", "@babel/plugin-transform-modules-commonjs@^7.4.4":
598
  version "7.12.13"
599
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz#5043b870a784a8421fa1fd9136a24f294da13e50"
@@ -604,6 +897,16 @@
604
  "@babel/helper-simple-access" "^7.12.13"
605
  babel-plugin-dynamic-import-node "^2.3.3"
606
 
 
 
 
 
 
 
 
 
 
 
607
  "@babel/plugin-transform-modules-systemjs@^7.12.13":
608
  version "7.12.13"
609
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz#351937f392c7f07493fc79b2118201d50404a3c5"
@@ -615,6 +918,17 @@
615
  "@babel/helper-validator-identifier" "^7.12.11"
616
  babel-plugin-dynamic-import-node "^2.3.3"
617
 
 
 
 
 
 
 
 
 
 
 
 
618
  "@babel/plugin-transform-modules-umd@^7.12.13":
619
  version "7.12.13"
620
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz#26c66f161d3456674e344b4b1255de4d530cfb37"
@@ -623,6 +937,14 @@
623
  "@babel/helper-module-transforms" "^7.12.13"
624
  "@babel/helper-plugin-utils" "^7.12.13"
625
 
 
 
 
 
 
 
 
 
626
  "@babel/plugin-transform-named-capturing-groups-regex@^7.12.13":
627
  version "7.12.13"
628
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9"
@@ -652,6 +974,13 @@
652
  dependencies:
653
  "@babel/helper-plugin-utils" "^7.12.13"
654
 
 
 
 
 
 
 
 
655
  "@babel/plugin-transform-property-literals@^7.12.13":
656
  version "7.12.13"
657
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81"
@@ -684,14 +1013,17 @@
684
  dependencies:
685
  "@babel/helper-plugin-utils" "^7.12.13"
686
 
687
- "@babel/plugin-transform-runtime@>=7.6.2":
688
- version "7.12.17"
689
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.17.tgz#329cb61d293b7e60a7685b91dda7c300668cee18"
690
- integrity sha512-s+kIJxnaTj+E9Q3XxQZ5jOo+xcogSe3V78/iFQ5RmoT0jROdpcdxhfGdq/VLqW1hFSzw6VjqN8aQqTaAMixWsw==
691
  dependencies:
692
  "@babel/helper-module-imports" "^7.12.13"
693
- "@babel/helper-plugin-utils" "^7.12.13"
694
- semver "^5.5.1"
 
 
 
695
 
696
  "@babel/plugin-transform-shorthand-properties@^7.12.13":
697
  version "7.12.13"
@@ -708,6 +1040,14 @@
708
  "@babel/helper-plugin-utils" "^7.12.13"
709
  "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
710
 
 
 
 
 
 
 
 
 
711
  "@babel/plugin-transform-sticky-regex@^7.12.13":
712
  version "7.12.13"
713
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f"
@@ -722,6 +1062,13 @@
722
  dependencies:
723
  "@babel/helper-plugin-utils" "^7.12.13"
724
 
 
 
 
 
 
 
 
725
  "@babel/plugin-transform-typeof-symbol@^7.12.13":
726
  version "7.12.13"
727
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f"
@@ -744,7 +1091,81 @@
744
  "@babel/helper-create-regexp-features-plugin" "^7.12.13"
745
  "@babel/helper-plugin-utils" "^7.12.13"
746
 
747
- "@babel/preset-env@^7.12.13", "@babel/preset-env@^7.4.4":
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
748
  version "7.12.17"
749
  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.17.tgz#94a3793ff089c32ee74d76a3c03a7597693ebaaa"
750
  integrity sha512-9PMijx8zFbCwTHrd2P4PJR5nWGH3zWebx2OcpTjqQrHhCiL2ssSR2Sc9ko2BsI2VmVBfoaQmPrlMTCui4LmXQg==
@@ -816,7 +1237,7 @@
816
  core-js-compat "^3.8.0"
817
  semver "^5.5.0"
818
 
819
- "@babel/preset-modules@^0.1.3":
820
  version "0.1.4"
821
  resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e"
822
  integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==
@@ -858,6 +1279,21 @@
858
  globals "^11.1.0"
859
  lodash "^4.17.19"
860
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
861
  "@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
862
  version "7.12.17"
863
  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.17.tgz#9d711eb807e0934c90b8b1ca0eb1f7230d150963"
@@ -867,6 +1303,15 @@
867
  lodash "^4.17.19"
868
  to-fast-properties "^2.0.0"
869
 
 
 
 
 
 
 
 
 
 
870
  "@bcoe/v8-coverage@^0.2.3":
871
  version "0.2.3"
872
  resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
@@ -880,10 +1325,10 @@
880
  exec-sh "^0.3.2"
881
  minimist "^1.2.0"
882
 
883
- "@eslint/eslintrc@^0.3.0":
884
- version "0.3.0"
885
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318"
886
- integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==
887
  dependencies:
888
  ajv "^6.12.4"
889
  debug "^4.1.1"
@@ -892,7 +1337,6 @@
892
  ignore "^4.0.6"
893
  import-fresh "^3.2.1"
894
  js-yaml "^3.13.1"
895
- lodash "^4.17.20"
896
  minimatch "^3.0.4"
897
  strip-json-comments "^3.1.1"
898
 
@@ -1541,7 +1985,7 @@ babel-helper-get-function-arity@^6.24.1:
1541
  babel-runtime "^6.22.0"
1542
  babel-types "^6.24.1"
1543
 
1544
- babel-jest@^26.6.3:
1545
  version "26.6.3"
1546
  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056"
1547
  integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==
@@ -1590,12 +2034,36 @@ babel-plugin-jest-hoist@^26.6.2:
1590
  "@types/babel__core" "^7.0.0"
1591
  "@types/babel__traverse" "^7.0.6"
1592
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1593
  babel-plugin-syntax-class-properties@^6.8.0:
1594
  version "6.13.0"
1595
  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
1596
  integrity sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=
1597
 
1598
- babel-plugin-transform-class-properties@^6.24.1:
1599
  version "6.24.1"
1600
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
1601
  integrity sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=
@@ -2286,6 +2754,14 @@ core-js-compat@^3.8.0:
2286
  browserslist "^4.16.3"
2287
  semver "7.0.0"
2288
 
 
 
 
 
 
 
 
 
2289
  core-js@^2.4.0, core-js@^2.6.5:
2290
  version "2.6.12"
2291
  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
@@ -2985,13 +3461,13 @@ eslint-visitor-keys@^2.0.0:
2985
  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
2986
  integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
2987
 
2988
- eslint@^7.19.0:
2989
- version "7.20.0"
2990
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.20.0.tgz#db07c4ca4eda2e2316e7aa57ac7fc91ec550bdc7"
2991
- integrity sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw==
2992
  dependencies:
2993
  "@babel/code-frame" "7.12.11"
2994
- "@eslint/eslintrc" "^0.3.0"
2995
  ajv "^6.10.0"
2996
  chalk "^4.0.0"
2997
  cross-spawn "^7.0.2"
@@ -3004,7 +3480,7 @@ eslint@^7.19.0:
3004
  espree "^7.3.1"
3005
  esquery "^1.4.0"
3006
  esutils "^2.0.2"
3007
- file-entry-cache "^6.0.0"
3008
  functional-red-black-tree "^1.0.1"
3009
  glob-parent "^5.0.0"
3010
  globals "^12.1.0"
@@ -3250,7 +3726,7 @@ fb-watchman@^2.0.0:
3250
  dependencies:
3251
  bser "2.1.1"
3252
 
3253
- file-entry-cache@^6.0.0:
3254
  version "6.0.1"
3255
  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
3256
  integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
@@ -3369,7 +3845,7 @@ functional-red-black-tree@^1.0.1:
3369
  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
3370
  integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
3371
 
3372
- gensync@^1.0.0-beta.1:
3373
  version "1.0.0-beta.2"
3374
  resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
3375
  integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
@@ -4517,7 +4993,7 @@ jest-worker@^26.6.2:
4517
  merge-stream "^2.0.0"
4518
  supports-color "^7.0.0"
4519
 
4520
- jest@^26.6.3:
4521
  version "26.6.3"
4522
  resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef"
4523
  integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==
@@ -4749,7 +5225,7 @@ locate-path@^5.0.0:
4749
  dependencies:
4750
  p-locate "^4.1.0"
4751
 
4752
- lodash-cli@>=4.17.5:
4753
  version "4.17.5"
4754
  resolved "https://registry.yarnpkg.com/lodash-cli/-/lodash-cli-4.17.5.tgz#1bab72c8c9980febf4fe7a1900b0971ce040dd0b"
4755
  integrity sha512-eeQi+oVS76ofP791g4wEGs4B4nyc4fiHboUCc0BzM8qCkLAzqbroewOt98A8ISoY1HH2di00pENNErXf0MWxiw==
@@ -4811,6 +5287,11 @@ lodash.clone@^4.5.0:
4811
  resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
4812
  integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=
4813
 
 
 
 
 
 
4814
  lodash.find@3.2.1:
4815
  version "3.2.1"
4816
  resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-3.2.1.tgz#046e319f3ace912ac6c9246c7f683c5ec07b36ad"
@@ -5431,7 +5912,7 @@ pako@~1.0.5:
5431
  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
5432
  integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
5433
 
5434
- parcel-bundler@>=1.12.4:
5435
  version "1.12.4"
5436
  resolved "https://registry.yarnpkg.com/parcel-bundler/-/parcel-bundler-1.12.4.tgz#31223f4ab4d00323a109fce28d5e46775409a9ee"
5437
  integrity sha512-G+iZGGiPEXcRzw0fiRxWYCKxdt/F7l9a0xkiU4XbcVRJCSlBnioWEwJMutOCCpoQmaQtjB4RBHDGIHN85AIhLQ==
@@ -5496,7 +5977,7 @@ parcel-bundler@>=1.12.4:
5496
  v8-compile-cache "^2.0.0"
5497
  ws "^5.1.1"
5498
 
5499
- parcel-plugin-assets-list@>=1.7.1:
5500
  version "1.7.1"
5501
  resolved "https://registry.yarnpkg.com/parcel-plugin-assets-list/-/parcel-plugin-assets-list-1.7.1.tgz#0495f0cee1413763a2e5bc62610ad3744ff77867"
5502
  integrity sha512-PCWPBEoiAAHvw5I472aOfTV3anhpQ8Y981NUewuNHN4ZmaJTGC15z37hM/UynasjFMm3gG/o2TRtXJBNosJEYg==
@@ -6396,7 +6877,7 @@ resolve-url@^0.2.1:
6396
  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
6397
  integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
6398
 
6399
- resolve@^1.1.5, resolve@^1.10.0, resolve@^1.18.1, resolve@^1.4.0:
6400
  version "1.20.0"
6401
  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
6402
  integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
@@ -6517,7 +6998,7 @@ saxes@^5.0.0:
6517
  dependencies:
6518
  xmlchars "^2.2.0"
6519
 
6520
- "semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1:
6521
  version "5.7.1"
6522
  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
6523
  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@@ -6532,7 +7013,7 @@ semver@7.0.0:
6532
  resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
6533
  integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
6534
 
6535
- semver@^6.0.0, semver@^6.3.0:
6536
  version "6.3.0"
6537
  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
6538
  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
21
  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.13.tgz#27e19e0ed3726ccf54067ced4109501765e7e2e8"
22
  integrity sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg==
23
 
24
+ "@babel/compat-data@^7.13.0", "@babel/compat-data@^7.13.8":
25
+ version "7.13.8"
26
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.8.tgz#5b783b9808f15cef71547f1b691f34f8ff6003a6"
27
+ integrity sha512-EaI33z19T4qN3xLXsGf48M2cDqa6ei9tPZlfLdb2HC+e/cFtREiRd8hdSqDbwdLB0/+gLwqJmCYASH0z2bUdog==
28
+
29
+ "@babel/core@7.13.8":
30
+ version "7.13.8"
31
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.8.tgz#c191d9c5871788a591d69ea1dc03e5843a3680fb"
32
+ integrity sha512-oYapIySGw1zGhEFRd6lzWNLWFX2s5dA/jm+Pw/+59ZdXtjyIuwlXbrId22Md0rgZVop+aVoqow2riXhBLNyuQg==
33
+ dependencies:
34
+ "@babel/code-frame" "^7.12.13"
35
+ "@babel/generator" "^7.13.0"
36
+ "@babel/helper-compilation-targets" "^7.13.8"
37
+ "@babel/helper-module-transforms" "^7.13.0"
38
+ "@babel/helpers" "^7.13.0"
39
+ "@babel/parser" "^7.13.4"
40
+ "@babel/template" "^7.12.13"
41
+ "@babel/traverse" "^7.13.0"
42
+ "@babel/types" "^7.13.0"
43
+ convert-source-map "^1.7.0"
44
+ debug "^4.1.0"
45
+ gensync "^1.0.0-beta.2"
46
+ json5 "^2.1.2"
47
+ lodash "^4.17.19"
48
+ semver "^6.3.0"
49
+ source-map "^0.5.0"
50
+
51
+ "@babel/core@^7.1.0", "@babel/core@^7.4.4", "@babel/core@^7.7.5":
52
  version "7.12.17"
53
  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.17.tgz#993c5e893333107a2815d8e0d73a2c3755e280b2"
54
  integrity sha512-V3CuX1aBywbJvV2yzJScRxeiiw0v2KZZYYE3giywxzFJL13RiyPjaaDwhDnxmgFTTS7FgvM2ijr4QmKNIu0AtQ==
78
  jsesc "^2.5.1"
79
  source-map "^0.5.0"
80
 
81
+ "@babel/generator@^7.13.0":
82
+ version "7.13.9"
83
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39"
84
+ integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==
85
+ dependencies:
86
+ "@babel/types" "^7.13.0"
87
+ jsesc "^2.5.1"
88
+ source-map "^0.5.0"
89
+
90
  "@babel/helper-annotate-as-pure@^7.12.13":
91
  version "7.12.13"
92
  resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab"
112
  browserslist "^4.14.5"
113
  semver "^5.5.0"
114
 
115
+ "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.8":
116
+ version "7.13.8"
117
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.8.tgz#02bdb22783439afb11b2f009814bdd88384bd468"
118
+ integrity sha512-pBljUGC1y3xKLn1nrx2eAhurLMA8OqBtBP/JwG4U8skN7kf8/aqwwxpV1N6T0e7r6+7uNitIa/fUxPFagSXp3A==
119
+ dependencies:
120
+ "@babel/compat-data" "^7.13.8"
121
+ "@babel/helper-validator-option" "^7.12.17"
122
+ browserslist "^4.14.5"
123
+ semver "^6.3.0"
124
+
125
  "@babel/helper-create-class-features-plugin@^7.12.13":
126
  version "7.12.17"
127
  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.17.tgz#704b69c8a78d03fb1c5fcc2e7b593f8a65628944"
133
  "@babel/helper-replace-supers" "^7.12.13"
134
  "@babel/helper-split-export-declaration" "^7.12.13"
135
 
136
+ "@babel/helper-create-class-features-plugin@^7.13.0":
137
+ version "7.13.8"
138
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.8.tgz#0367bd0a7505156ce018ca464f7ac91ba58c1a04"
139
+ integrity sha512-qioaRrKHQbn4hkRKDHbnuQ6kAxmmOF+kzKGnIfxPK4j2rckSJCpKzr/SSTlohSCiE3uAQpNDJ9FIh4baeE8W+w==
140
+ dependencies:
141
+ "@babel/helper-function-name" "^7.12.13"
142
+ "@babel/helper-member-expression-to-functions" "^7.13.0"
143
+ "@babel/helper-optimise-call-expression" "^7.12.13"
144
+ "@babel/helper-replace-supers" "^7.13.0"
145
+ "@babel/helper-split-export-declaration" "^7.12.13"
146
+
147
  "@babel/helper-create-regexp-features-plugin@^7.12.13":
148
  version "7.12.17"
149
  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7"
152
  "@babel/helper-annotate-as-pure" "^7.12.13"
153
  regexpu-core "^4.7.1"
154
 
155
+ "@babel/helper-define-polyfill-provider@^0.1.5":
156
+ version "0.1.5"
157
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz#3c2f91b7971b9fc11fe779c945c014065dea340e"
158
+ integrity sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==
159
+ dependencies:
160
+ "@babel/helper-compilation-targets" "^7.13.0"
161
+ "@babel/helper-module-imports" "^7.12.13"
162
+ "@babel/helper-plugin-utils" "^7.13.0"
163
+ "@babel/traverse" "^7.13.0"
164
+ debug "^4.1.1"
165
+ lodash.debounce "^4.0.8"
166
+ resolve "^1.14.2"
167
+ semver "^6.1.2"
168
+
169
  "@babel/helper-explode-assignable-expression@^7.12.13":
170
  version "7.12.13"
171
  resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz#0e46990da9e271502f77507efa4c9918d3d8634a"
196
  dependencies:
197
  "@babel/types" "^7.12.13"
198
 
199
+ "@babel/helper-hoist-variables@^7.13.0":
200
+ version "7.13.0"
201
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz#5d5882e855b5c5eda91e0cadc26c6e7a2c8593d8"
202
+ integrity sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==
203
+ dependencies:
204
+ "@babel/traverse" "^7.13.0"
205
+ "@babel/types" "^7.13.0"
206
+
207
  "@babel/helper-member-expression-to-functions@^7.12.13", "@babel/helper-member-expression-to-functions@^7.12.17":
208
  version "7.12.17"
209
  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.17.tgz#f82838eb06e1235307b6d71457b6670ff71ee5ac"
211
  dependencies:
212
  "@babel/types" "^7.12.17"
213
 
214
+ "@babel/helper-member-expression-to-functions@^7.13.0":
215
+ version "7.13.0"
216
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz#6aa4bb678e0f8c22f58cdb79451d30494461b091"
217
+ integrity sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ==
218
+ dependencies:
219
+ "@babel/types" "^7.13.0"
220
+
221
  "@babel/helper-module-imports@^7.12.13":
222
  version "7.12.13"
223
  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0"
240
  "@babel/types" "^7.12.17"
241
  lodash "^4.17.19"
242
 
243
+ "@babel/helper-module-transforms@^7.13.0":
244
+ version "7.13.0"
245
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz#42eb4bd8eea68bab46751212c357bfed8b40f6f1"
246
+ integrity sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw==
247
+ dependencies:
248
+ "@babel/helper-module-imports" "^7.12.13"
249
+ "@babel/helper-replace-supers" "^7.13.0"
250
+ "@babel/helper-simple-access" "^7.12.13"
251
+ "@babel/helper-split-export-declaration" "^7.12.13"
252
+ "@babel/helper-validator-identifier" "^7.12.11"
253
+ "@babel/template" "^7.12.13"
254
+ "@babel/traverse" "^7.13.0"
255
+ "@babel/types" "^7.13.0"
256
+ lodash "^4.17.19"
257
+
258
  "@babel/helper-optimise-call-expression@^7.12.13":
259
  version "7.12.13"
260
  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea"
267
  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz#174254d0f2424d8aefb4dd48057511247b0a9eeb"
268
  integrity sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==
269
 
270
+ "@babel/helper-plugin-utils@^7.13.0":
271
+ version "7.13.0"
272
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af"
273
+ integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==
274
+
275
  "@babel/helper-remap-async-to-generator@^7.12.13":
276
  version "7.12.13"
277
  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz#170365f4140e2d20e5c88f8ba23c24468c296878"
281
  "@babel/helper-wrap-function" "^7.12.13"
282
  "@babel/types" "^7.12.13"
283
 
284
+ "@babel/helper-remap-async-to-generator@^7.13.0":
285
+ version "7.13.0"
286
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209"
287
+ integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==
288
+ dependencies:
289
+ "@babel/helper-annotate-as-pure" "^7.12.13"
290
+ "@babel/helper-wrap-function" "^7.13.0"
291
+ "@babel/types" "^7.13.0"
292
+
293
  "@babel/helper-replace-supers@^7.12.13":
294
  version "7.12.13"
295
  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz#00ec4fb6862546bd3d0aff9aac56074277173121"
300
  "@babel/traverse" "^7.12.13"
301
  "@babel/types" "^7.12.13"
302
 
303
+ "@babel/helper-replace-supers@^7.13.0":
304
+ version "7.13.0"
305
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz#6034b7b51943094cb41627848cb219cb02be1d24"
306
+ integrity sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw==
307
+ dependencies:
308
+ "@babel/helper-member-expression-to-functions" "^7.13.0"
309
+ "@babel/helper-optimise-call-expression" "^7.12.13"
310
+ "@babel/traverse" "^7.13.0"
311
+ "@babel/types" "^7.13.0"
312
+
313
  "@babel/helper-simple-access@^7.12.13":
314
  version "7.12.13"
315
  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4"
351
  "@babel/traverse" "^7.12.13"
352
  "@babel/types" "^7.12.13"
353
 
354
+ "@babel/helper-wrap-function@^7.13.0":
355
+ version "7.13.0"
356
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4"
357
+ integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==
358
+ dependencies:
359
+ "@babel/helper-function-name" "^7.12.13"
360
+ "@babel/template" "^7.12.13"
361
+ "@babel/traverse" "^7.13.0"
362
+ "@babel/types" "^7.13.0"
363
+
364
  "@babel/helpers@^7.12.17":
365
  version "7.12.17"
366
  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.17.tgz#71e03d2981a6b5ee16899964f4101dc8471d60bc"
370
  "@babel/traverse" "^7.12.17"
371
  "@babel/types" "^7.12.17"
372
 
373
+ "@babel/helpers@^7.13.0":
374
+ version "7.13.0"
375
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.0.tgz#7647ae57377b4f0408bf4f8a7af01c42e41badc0"
376
+ integrity sha512-aan1MeFPxFacZeSz6Ld7YZo5aPuqnKlD7+HZY75xQsueczFccP9A7V05+oe0XpLwHK3oLorPe9eaAUljL7WEaQ==
377
+ dependencies:
378
+ "@babel/template" "^7.12.13"
379
+ "@babel/traverse" "^7.13.0"
380
+ "@babel/types" "^7.13.0"
381
+
382
  "@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13":
383
  version "7.12.13"
384
  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c"
393
  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.17.tgz#bc85d2d47db38094e5bb268fc761716e7d693848"
394
  integrity sha512-r1yKkiUTYMQ8LiEI0UcQx5ETw5dpTLn9wijn9hk6KkTtOK95FndDN10M+8/s6k/Ymlbivw0Av9q4SlgF80PtHg==
395
 
396
+ "@babel/parser@^7.13.0", "@babel/parser@^7.13.4":
397
+ version "7.13.9"
398
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.9.tgz#ca34cb95e1c2dd126863a84465ae8ef66114be99"
399
+ integrity sha512-nEUfRiARCcaVo3ny3ZQjURjHQZUo/JkEw7rLlSZy/psWGnvwXFtPcr6jb7Yb41DVW5LTe6KRq9LGleRNsg1Frw==
400
+
401
  "@babel/plugin-proposal-async-generator-functions@^7.12.13":
402
  version "7.12.13"
403
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz#d1c6d841802ffb88c64a2413e311f7345b9e66b5"
407
  "@babel/helper-remap-async-to-generator" "^7.12.13"
408
  "@babel/plugin-syntax-async-generators" "^7.8.0"
409
 
410
+ "@babel/plugin-proposal-async-generator-functions@^7.13.8":
411
+ version "7.13.8"
412
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz#87aacb574b3bc4b5603f6fe41458d72a5a2ec4b1"
413
+ integrity sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==
414
+ dependencies:
415
+ "@babel/helper-plugin-utils" "^7.13.0"
416
+ "@babel/helper-remap-async-to-generator" "^7.13.0"
417
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
418
+
419
  "@babel/plugin-proposal-class-properties@^7.12.13":
420
  version "7.12.13"
421
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz#3d2ce350367058033c93c098e348161d6dc0d8c8"
424
  "@babel/helper-create-class-features-plugin" "^7.12.13"
425
  "@babel/helper-plugin-utils" "^7.12.13"
426
 
427
+ "@babel/plugin-proposal-class-properties@^7.13.0":
428
+ version "7.13.0"
429
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37"
430
+ integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==
431
+ dependencies:
432
+ "@babel/helper-create-class-features-plugin" "^7.13.0"
433
+ "@babel/helper-plugin-utils" "^7.13.0"
434
+
435
  "@babel/plugin-proposal-dynamic-import@^7.12.17":
436
  version "7.12.17"
437
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.17.tgz#e0ebd8db65acc37eac518fa17bead2174e224512"
440
  "@babel/helper-plugin-utils" "^7.12.13"
441
  "@babel/plugin-syntax-dynamic-import" "^7.8.0"
442
 
443
+ "@babel/plugin-proposal-dynamic-import@^7.13.8":
444
+ version "7.13.8"
445
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d"
446
+ integrity sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==
447
+ dependencies:
448
+ "@babel/helper-plugin-utils" "^7.13.0"
449
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
450
+
451
  "@babel/plugin-proposal-export-namespace-from@^7.12.13":
452
  version "7.12.13"
453
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d"
464
  "@babel/helper-plugin-utils" "^7.12.13"
465
  "@babel/plugin-syntax-json-strings" "^7.8.0"
466
 
467
+ "@babel/plugin-proposal-json-strings@^7.13.8":
468
+ version "7.13.8"
469
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b"
470
+ integrity sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==
471
+ dependencies:
472
+ "@babel/helper-plugin-utils" "^7.13.0"
473
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
474
+
475
  "@babel/plugin-proposal-logical-assignment-operators@^7.12.13":
476
  version "7.12.13"
477
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz#575b5d9a08d8299eeb4db6430da6e16e5cf14350"
480
  "@babel/helper-plugin-utils" "^7.12.13"
481
  "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
482
 
483
+ "@babel/plugin-proposal-logical-assignment-operators@^7.13.8":
484
+ version "7.13.8"
485
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a"
486
+ integrity sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==
487
+ dependencies:
488
+ "@babel/helper-plugin-utils" "^7.13.0"
489
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
490
+
491
  "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.13":
492
  version "7.12.13"
493
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz#24867307285cee4e1031170efd8a7ac807deefde"
496
  "@babel/helper-plugin-utils" "^7.12.13"
497
  "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
498
 
499
+ "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8":
500
+ version "7.13.8"
501
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3"
502
+ integrity sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==
503
+ dependencies:
504
+ "@babel/helper-plugin-utils" "^7.13.0"
505
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
506
+
507
  "@babel/plugin-proposal-numeric-separator@^7.12.13":
508
  version "7.12.13"
509
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db"
521
  "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
522
  "@babel/plugin-transform-parameters" "^7.12.13"
523
 
524
+ "@babel/plugin-proposal-object-rest-spread@^7.13.8":
525
+ version "7.13.8"
526
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a"
527
+ integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==
528
+ dependencies:
529
+ "@babel/compat-data" "^7.13.8"
530
+ "@babel/helper-compilation-targets" "^7.13.8"
531
+ "@babel/helper-plugin-utils" "^7.13.0"
532
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
533
+ "@babel/plugin-transform-parameters" "^7.13.0"
534
+
535
  "@babel/plugin-proposal-optional-catch-binding@^7.12.13":
536
  version "7.12.13"
537
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz#4640520afe57728af14b4d1574ba844f263bcae5"
540
  "@babel/helper-plugin-utils" "^7.12.13"
541
  "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
542
 
543
+ "@babel/plugin-proposal-optional-catch-binding@^7.13.8":
544
+ version "7.13.8"
545
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107"
546
+ integrity sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==
547
+ dependencies:
548
+ "@babel/helper-plugin-utils" "^7.13.0"
549
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
550
+
551
  "@babel/plugin-proposal-optional-chaining@^7.12.17":
552
  version "7.12.17"
553
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.17.tgz#e382becadc2cb16b7913b6c672d92e4b33385b5c"
557
  "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
558
  "@babel/plugin-syntax-optional-chaining" "^7.8.0"
559
 
560
+ "@babel/plugin-proposal-optional-chaining@^7.13.8":
561
+ version "7.13.8"
562
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.8.tgz#e39df93efe7e7e621841babc197982e140e90756"
563
+ integrity sha512-hpbBwbTgd7Cz1QryvwJZRo1U0k1q8uyBmeXOSQUjdg/A2TASkhR/rz7AyqZ/kS8kbpsNA80rOYbxySBJAqmhhQ==
564
+ dependencies:
565
+ "@babel/helper-plugin-utils" "^7.13.0"
566
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
567
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
568
+
569
  "@babel/plugin-proposal-private-methods@^7.12.13":
570
  version "7.12.13"
571
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz#ea78a12554d784ecf7fc55950b752d469d9c4a71"
574
  "@babel/helper-create-class-features-plugin" "^7.12.13"
575
  "@babel/helper-plugin-utils" "^7.12.13"
576
 
577
+ "@babel/plugin-proposal-private-methods@^7.13.0":
578
+ version "7.13.0"
579
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787"
580
+ integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==
581
+ dependencies:
582
+ "@babel/helper-create-class-features-plugin" "^7.13.0"
583
+ "@babel/helper-plugin-utils" "^7.13.0"
584
+
585
  "@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
586
  version "7.12.13"
587
  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba"
611
  dependencies:
612
  "@babel/helper-plugin-utils" "^7.12.13"
613
 
614
+ "@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3":
615
  version "7.8.3"
616
  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
617
  integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
709
  dependencies:
710
  "@babel/helper-plugin-utils" "^7.12.13"
711
 
712
+ "@babel/plugin-transform-arrow-functions@^7.13.0":
713
+ version "7.13.0"
714
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae"
715
+ integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==
716
+ dependencies:
717
+ "@babel/helper-plugin-utils" "^7.13.0"
718
+
719
  "@babel/plugin-transform-async-to-generator@^7.12.13":
720
  version "7.12.13"
721
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz#fed8c69eebf187a535bfa4ee97a614009b24f7ae"
725
  "@babel/helper-plugin-utils" "^7.12.13"
726
  "@babel/helper-remap-async-to-generator" "^7.12.13"
727
 
728
+ "@babel/plugin-transform-async-to-generator@^7.13.0":
729
+ version "7.13.0"
730
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f"
731
+ integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==
732
+ dependencies:
733
+ "@babel/helper-module-imports" "^7.12.13"
734
+ "@babel/helper-plugin-utils" "^7.13.0"
735
+ "@babel/helper-remap-async-to-generator" "^7.13.0"
736
+
737
  "@babel/plugin-transform-block-scoped-functions@^7.12.13":
738
  version "7.12.13"
739
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4"
761
  "@babel/helper-split-export-declaration" "^7.12.13"
762
  globals "^11.1.0"
763
 
764
+ "@babel/plugin-transform-classes@^7.13.0":
765
+ version "7.13.0"
766
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b"
767
+ integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==
768
+ dependencies:
769
+ "@babel/helper-annotate-as-pure" "^7.12.13"
770
+ "@babel/helper-function-name" "^7.12.13"
771
+ "@babel/helper-optimise-call-expression" "^7.12.13"
772
+ "@babel/helper-plugin-utils" "^7.13.0"
773
+ "@babel/helper-replace-supers" "^7.13.0"
774
+ "@babel/helper-split-export-declaration" "^7.12.13"
775
+ globals "^11.1.0"
776
+
777
  "@babel/plugin-transform-computed-properties@^7.12.13":
778
  version "7.12.13"
779
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz#6a210647a3d67f21f699cfd2a01333803b27339d"
781
  dependencies:
782
  "@babel/helper-plugin-utils" "^7.12.13"
783
 
784
+ "@babel/plugin-transform-computed-properties@^7.13.0":
785
+ version "7.13.0"
786
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed"
787
+ integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==
788
+ dependencies:
789
+ "@babel/helper-plugin-utils" "^7.13.0"
790
+
791
  "@babel/plugin-transform-destructuring@^7.12.13":
792
  version "7.12.13"
793
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz#fc56c5176940c5b41735c677124d1d20cecc9aeb"
795
  dependencies:
796
  "@babel/helper-plugin-utils" "^7.12.13"
797
 
798
+ "@babel/plugin-transform-destructuring@^7.13.0":
799
+ version "7.13.0"
800
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz#c5dce270014d4e1ebb1d806116694c12b7028963"
801
+ integrity sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==
802
+ dependencies:
803
+ "@babel/helper-plugin-utils" "^7.13.0"
804
+
805
  "@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4":
806
  version "7.12.13"
807
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad"
840
  dependencies:
841
  "@babel/helper-plugin-utils" "^7.12.13"
842
 
843
+ "@babel/plugin-transform-for-of@^7.13.0":
844
+ version "7.13.0"
845
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062"
846
+ integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==
847
+ dependencies:
848
+ "@babel/helper-plugin-utils" "^7.13.0"
849
+
850
  "@babel/plugin-transform-function-name@^7.12.13":
851
  version "7.12.13"
852
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051"
878
  "@babel/helper-plugin-utils" "^7.12.13"
879
  babel-plugin-dynamic-import-node "^2.3.3"
880
 
881
+ "@babel/plugin-transform-modules-amd@^7.13.0":
882
+ version "7.13.0"
883
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3"
884
+ integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==
885
+ dependencies:
886
+ "@babel/helper-module-transforms" "^7.13.0"
887
+ "@babel/helper-plugin-utils" "^7.13.0"
888
+ babel-plugin-dynamic-import-node "^2.3.3"
889
+
890
  "@babel/plugin-transform-modules-commonjs@^7.12.13", "@babel/plugin-transform-modules-commonjs@^7.4.4":
891
  version "7.12.13"
892
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz#5043b870a784a8421fa1fd9136a24f294da13e50"
897
  "@babel/helper-simple-access" "^7.12.13"
898
  babel-plugin-dynamic-import-node "^2.3.3"
899
 
900
+ "@babel/plugin-transform-modules-commonjs@^7.13.8":
901
+ version "7.13.8"
902
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz#7b01ad7c2dcf2275b06fa1781e00d13d420b3e1b"
903
+ integrity sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==
904
+ dependencies:
905
+ "@babel/helper-module-transforms" "^7.13.0"
906
+ "@babel/helper-plugin-utils" "^7.13.0"
907
+ "@babel/helper-simple-access" "^7.12.13"
908
+ babel-plugin-dynamic-import-node "^2.3.3"
909
+
910
  "@babel/plugin-transform-modules-systemjs@^7.12.13":
911
  version "7.12.13"
912
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz#351937f392c7f07493fc79b2118201d50404a3c5"
918
  "@babel/helper-validator-identifier" "^7.12.11"
919
  babel-plugin-dynamic-import-node "^2.3.3"
920
 
921
+ "@babel/plugin-transform-modules-systemjs@^7.13.8":
922
+ version "7.13.8"
923
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3"
924
+ integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==
925
+ dependencies:
926
+ "@babel/helper-hoist-variables" "^7.13.0"
927
+ "@babel/helper-module-transforms" "^7.13.0"
928
+ "@babel/helper-plugin-utils" "^7.13.0"
929
+ "@babel/helper-validator-identifier" "^7.12.11"
930
+ babel-plugin-dynamic-import-node "^2.3.3"
931
+
932
  "@babel/plugin-transform-modules-umd@^7.12.13":
933
  version "7.12.13"
934
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz#26c66f161d3456674e344b4b1255de4d530cfb37"
937
  "@babel/helper-module-transforms" "^7.12.13"
938
  "@babel/helper-plugin-utils" "^7.12.13"
939
 
940
+ "@babel/plugin-transform-modules-umd@^7.13.0":
941
+ version "7.13.0"
942
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b"
943
+ integrity sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==
944
+ dependencies:
945
+ "@babel/helper-module-transforms" "^7.13.0"
946
+ "@babel/helper-plugin-utils" "^7.13.0"
947
+
948
  "@babel/plugin-transform-named-capturing-groups-regex@^7.12.13":
949
  version "7.12.13"
950
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9"
974
  dependencies:
975
  "@babel/helper-plugin-utils" "^7.12.13"
976
 
977
+ "@babel/plugin-transform-parameters@^7.13.0":
978
+ version "7.13.0"
979
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007"
980
+ integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==
981
+ dependencies:
982
+ "@babel/helper-plugin-utils" "^7.13.0"
983
+
984
  "@babel/plugin-transform-property-literals@^7.12.13":
985
  version "7.12.13"
986
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81"
1013
  dependencies:
1014
  "@babel/helper-plugin-utils" "^7.12.13"
1015
 
1016
+ "@babel/plugin-transform-runtime@7.13.9":
1017
+ version "7.13.9"
1018
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.9.tgz#744d3103338a0d6c90dee0497558150b490cee07"
1019
+ integrity sha512-XCxkY/wBI6M6Jj2mlWxkmqbKPweRanszWbF3Tyut+hKh+PHcuIH/rSr/7lmmE7C3WW+HSIm2GT+d5jwmheuB0g==
1020
  dependencies:
1021
  "@babel/helper-module-imports" "^7.12.13"
1022
+ "@babel/helper-plugin-utils" "^7.13.0"
1023
+ babel-plugin-polyfill-corejs2 "^0.1.4"
1024
+ babel-plugin-polyfill-corejs3 "^0.1.3"
1025
+ babel-plugin-polyfill-regenerator "^0.1.2"
1026
+ semver "^6.3.0"
1027
 
1028
  "@babel/plugin-transform-shorthand-properties@^7.12.13":
1029
  version "7.12.13"
1040
  "@babel/helper-plugin-utils" "^7.12.13"
1041
  "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
1042
 
1043
+ "@babel/plugin-transform-spread@^7.13.0":
1044
+ version "7.13.0"
1045
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd"
1046
+ integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==
1047
+ dependencies:
1048
+ "@babel/helper-plugin-utils" "^7.13.0"
1049
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
1050
+
1051
  "@babel/plugin-transform-sticky-regex@^7.12.13":
1052
  version "7.12.13"
1053
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f"
1062
  dependencies:
1063
  "@babel/helper-plugin-utils" "^7.12.13"
1064
 
1065
+ "@babel/plugin-transform-template-literals@^7.13.0":
1066
+ version "7.13.0"
1067
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d"
1068
+ integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==
1069
+ dependencies:
1070
+ "@babel/helper-plugin-utils" "^7.13.0"
1071
+
1072
  "@babel/plugin-transform-typeof-symbol@^7.12.13":
1073
  version "7.12.13"
1074
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f"
1091
  "@babel/helper-create-regexp-features-plugin" "^7.12.13"
1092
  "@babel/helper-plugin-utils" "^7.12.13"
1093
 
1094
+ "@babel/preset-env@7.13.9":
1095
+ version "7.13.9"
1096
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.13.9.tgz#3ee5f233316b10d066d7f379c6d1e13a96853654"
1097
+ integrity sha512-mcsHUlh2rIhViqMG823JpscLMesRt3QbMsv1+jhopXEb3W2wXvQ9QoiOlZI9ZbR3XqPtaFpZwEZKYqGJnGMZTQ==
1098
+ dependencies:
1099
+ "@babel/compat-data" "^7.13.8"
1100
+ "@babel/helper-compilation-targets" "^7.13.8"
1101
+ "@babel/helper-plugin-utils" "^7.13.0"
1102
+ "@babel/helper-validator-option" "^7.12.17"
1103
+ "@babel/plugin-proposal-async-generator-functions" "^7.13.8"
1104
+ "@babel/plugin-proposal-class-properties" "^7.13.0"
1105
+ "@babel/plugin-proposal-dynamic-import" "^7.13.8"
1106
+ "@babel/plugin-proposal-export-namespace-from" "^7.12.13"
1107
+ "@babel/plugin-proposal-json-strings" "^7.13.8"
1108
+ "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8"
1109
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8"
1110
+ "@babel/plugin-proposal-numeric-separator" "^7.12.13"
1111
+ "@babel/plugin-proposal-object-rest-spread" "^7.13.8"
1112
+ "@babel/plugin-proposal-optional-catch-binding" "^7.13.8"
1113
+ "@babel/plugin-proposal-optional-chaining" "^7.13.8"
1114
+ "@babel/plugin-proposal-private-methods" "^7.13.0"
1115
+ "@babel/plugin-proposal-unicode-property-regex" "^7.12.13"
1116
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
1117
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
1118
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
1119
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
1120
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
1121
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
1122
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
1123
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
1124
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
1125
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
1126
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
1127
+ "@babel/plugin-syntax-top-level-await" "^7.12.13"
1128
+ "@babel/plugin-transform-arrow-functions" "^7.13.0"
1129
+ "@babel/plugin-transform-async-to-generator" "^7.13.0"
1130
+ "@babel/plugin-transform-block-scoped-functions" "^7.12.13"
1131
+ "@babel/plugin-transform-block-scoping" "^7.12.13"
1132
+ "@babel/plugin-transform-classes" "^7.13.0"
1133
+ "@babel/plugin-transform-computed-properties" "^7.13.0"
1134
+ "@babel/plugin-transform-destructuring" "^7.13.0"
1135
+ "@babel/plugin-transform-dotall-regex" "^7.12.13"
1136
+ "@babel/plugin-transform-duplicate-keys" "^7.12.13"
1137
+ "@babel/plugin-transform-exponentiation-operator" "^7.12.13"
1138
+ "@babel/plugin-transform-for-of" "^7.13.0"
1139
+ "@babel/plugin-transform-function-name" "^7.12.13"
1140
+ "@babel/plugin-transform-literals" "^7.12.13"
1141
+ "@babel/plugin-transform-member-expression-literals" "^7.12.13"
1142
+ "@babel/plugin-transform-modules-amd" "^7.13.0"
1143
+ "@babel/plugin-transform-modules-commonjs" "^7.13.8"
1144
+ "@babel/plugin-transform-modules-systemjs" "^7.13.8"
1145
+ "@babel/plugin-transform-modules-umd" "^7.13.0"
1146
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13"
1147
+ "@babel/plugin-transform-new-target" "^7.12.13"
1148
+ "@babel/plugin-transform-object-super" "^7.12.13"
1149
+ "@babel/plugin-transform-parameters" "^7.13.0"
1150
+ "@babel/plugin-transform-property-literals" "^7.12.13"
1151
+ "@babel/plugin-transform-regenerator" "^7.12.13"
1152
+ "@babel/plugin-transform-reserved-words" "^7.12.13"
1153
+ "@babel/plugin-transform-shorthand-properties" "^7.12.13"
1154
+ "@babel/plugin-transform-spread" "^7.13.0"
1155
+ "@babel/plugin-transform-sticky-regex" "^7.12.13"
1156
+ "@babel/plugin-transform-template-literals" "^7.13.0"
1157
+ "@babel/plugin-transform-typeof-symbol" "^7.12.13"
1158
+ "@babel/plugin-transform-unicode-escapes" "^7.12.13"
1159
+ "@babel/plugin-transform-unicode-regex" "^7.12.13"
1160
+ "@babel/preset-modules" "^0.1.4"
1161
+ "@babel/types" "^7.13.0"
1162
+ babel-plugin-polyfill-corejs2 "^0.1.4"
1163
+ babel-plugin-polyfill-corejs3 "^0.1.3"
1164
+ babel-plugin-polyfill-regenerator "^0.1.2"
1165
+ core-js-compat "^3.9.0"
1166
+ semver "^6.3.0"
1167
+
1168
+ "@babel/preset-env@^7.4.4":
1169
  version "7.12.17"
1170
  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.17.tgz#94a3793ff089c32ee74d76a3c03a7597693ebaaa"
1171
  integrity sha512-9PMijx8zFbCwTHrd2P4PJR5nWGH3zWebx2OcpTjqQrHhCiL2ssSR2Sc9ko2BsI2VmVBfoaQmPrlMTCui4LmXQg==
1237
  core-js-compat "^3.8.0"
1238
  semver "^5.5.0"
1239
 
1240
+ "@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.4":
1241
  version "0.1.4"
1242
  resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e"
1243
  integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==
1279
  globals "^11.1.0"
1280
  lodash "^4.17.19"
1281
 
1282
+ "@babel/traverse@^7.13.0":
1283
+ version "7.13.0"
1284
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.0.tgz#6d95752475f86ee7ded06536de309a65fc8966cc"
1285
+ integrity sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==
1286
+ dependencies:
1287
+ "@babel/code-frame" "^7.12.13"
1288
+ "@babel/generator" "^7.13.0"
1289
+ "@babel/helper-function-name" "^7.12.13"
1290
+ "@babel/helper-split-export-declaration" "^7.12.13"
1291
+ "@babel/parser" "^7.13.0"
1292
+ "@babel/types" "^7.13.0"
1293
+ debug "^4.1.0"
1294
+ globals "^11.1.0"
1295
+ lodash "^4.17.19"
1296
+
1297
  "@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
1298
  version "7.12.17"
1299
  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.17.tgz#9d711eb807e0934c90b8b1ca0eb1f7230d150963"
1303
  lodash "^4.17.19"
1304
  to-fast-properties "^2.0.0"
1305
 
1306
+ "@babel/types@^7.13.0":
1307
+ version "7.13.0"
1308
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz#74424d2816f0171b4100f0ab34e9a374efdf7f80"
1309
+ integrity sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==
1310
+ dependencies:
1311
+ "@babel/helper-validator-identifier" "^7.12.11"
1312
+ lodash "^4.17.19"
1313
+ to-fast-properties "^2.0.0"
1314
+
1315
  "@bcoe/v8-coverage@^0.2.3":
1316
  version "0.2.3"
1317
  resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
1325
  exec-sh "^0.3.2"
1326
  minimist "^1.2.0"
1327
 
1328
+ "@eslint/eslintrc@^0.4.0":
1329
+ version "0.4.0"
1330
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547"
1331
+ integrity sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==
1332
  dependencies:
1333
  ajv "^6.12.4"
1334
  debug "^4.1.1"
1337
  ignore "^4.0.6"
1338
  import-fresh "^3.2.1"
1339
  js-yaml "^3.13.1"
 
1340
  minimatch "^3.0.4"
1341
  strip-json-comments "^3.1.1"
1342
 
1985
  babel-runtime "^6.22.0"
1986
  babel-types "^6.24.1"
1987
 
1988
+ babel-jest@26.6.3, babel-jest@^26.6.3:
1989
  version "26.6.3"
1990
  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056"
1991
  integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==
2034
  "@types/babel__core" "^7.0.0"
2035
  "@types/babel__traverse" "^7.0.6"
2036
 
2037
+ babel-plugin-polyfill-corejs2@^0.1.4:
2038
+ version "0.1.10"
2039
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz#a2c5c245f56c0cac3dbddbf0726a46b24f0f81d1"
2040
+ integrity sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==
2041
+ dependencies:
2042
+ "@babel/compat-data" "^7.13.0"
2043
+ "@babel/helper-define-polyfill-provider" "^0.1.5"
2044
+ semver "^6.1.1"
2045
+
2046
+ babel-plugin-polyfill-corejs3@^0.1.3:
2047
+ version "0.1.7"
2048
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0"
2049
+ integrity sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==
2050
+ dependencies:
2051
+ "@babel/helper-define-polyfill-provider" "^0.1.5"
2052
+ core-js-compat "^3.8.1"
2053
+
2054
+ babel-plugin-polyfill-regenerator@^0.1.2:
2055
+ version "0.1.6"
2056
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz#0fe06a026fe0faa628ccc8ba3302da0a6ce02f3f"
2057
+ integrity sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==
2058
+ dependencies:
2059
+ "@babel/helper-define-polyfill-provider" "^0.1.5"
2060
+
2061
  babel-plugin-syntax-class-properties@^6.8.0:
2062
  version "6.13.0"
2063
  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
2064
  integrity sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=
2065
 
2066
+ babel-plugin-transform-class-properties@6.24.1:
2067
  version "6.24.1"
2068
  resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
2069
  integrity sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=
2754
  browserslist "^4.16.3"
2755
  semver "7.0.0"
2756
 
2757
+ core-js-compat@^3.8.1, core-js-compat@^3.9.0:
2758
+ version "3.9.1"
2759
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.1.tgz#4e572acfe90aff69d76d8c37759d21a5c59bb455"
2760
+ integrity sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==
2761
+ dependencies:
2762
+ browserslist "^4.16.3"
2763
+ semver "7.0.0"
2764
+
2765
  core-js@^2.4.0, core-js@^2.6.5:
2766
  version "2.6.12"
2767
  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
3461
  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
3462
  integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
3463
 
3464
+ eslint@7.21.0:
3465
+ version "7.21.0"
3466
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.21.0.tgz#4ecd5b8c5b44f5dedc9b8a110b01bbfeb15d1c83"
3467
+ integrity sha512-W2aJbXpMNofUp0ztQaF40fveSsJBjlSCSWpy//gzfTvwC+USs/nceBrKmlJOiM8r1bLwP2EuYkCqArn/6QTIgg==
3468
  dependencies:
3469
  "@babel/code-frame" "7.12.11"
3470
+ "@eslint/eslintrc" "^0.4.0"
3471
  ajv "^6.10.0"
3472
  chalk "^4.0.0"
3473
  cross-spawn "^7.0.2"
3480
  espree "^7.3.1"
3481
  esquery "^1.4.0"
3482
  esutils "^2.0.2"
3483
+ file-entry-cache "^6.0.1"
3484
  functional-red-black-tree "^1.0.1"
3485
  glob-parent "^5.0.0"
3486
  globals "^12.1.0"
3726
  dependencies:
3727
  bser "2.1.1"
3728
 
3729
+ file-entry-cache@^6.0.1:
3730
  version "6.0.1"
3731
  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
3732
  integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
3845
  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
3846
  integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
3847
 
3848
+ gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2:
3849
  version "1.0.0-beta.2"
3850
  resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
3851
  integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
4993
  merge-stream "^2.0.0"
4994
  supports-color "^7.0.0"
4995
 
4996
+ jest@26.6.3:
4997
  version "26.6.3"
4998
  resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef"
4999
  integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==
5225
  dependencies:
5226
  p-locate "^4.1.0"
5227
 
5228
+ lodash-cli@4.17.5:
5229
  version "4.17.5"
5230
  resolved "https://registry.yarnpkg.com/lodash-cli/-/lodash-cli-4.17.5.tgz#1bab72c8c9980febf4fe7a1900b0971ce040dd0b"
5231
  integrity sha512-eeQi+oVS76ofP791g4wEGs4B4nyc4fiHboUCc0BzM8qCkLAzqbroewOt98A8ISoY1HH2di00pENNErXf0MWxiw==
5287
  resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
5288
  integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=
5289
 
5290
+ lodash.debounce@^4.0.8:
5291
+ version "4.0.8"
5292
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
5293
+ integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
5294
+
5295
  lodash.find@3.2.1:
5296
  version "3.2.1"
5297
  resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-3.2.1.tgz#046e319f3ace912ac6c9246c7f683c5ec07b36ad"
5912
  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
5913
  integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
5914
 
5915
+ parcel-bundler@1.12.4:
5916
  version "1.12.4"
5917
  resolved "https://registry.yarnpkg.com/parcel-bundler/-/parcel-bundler-1.12.4.tgz#31223f4ab4d00323a109fce28d5e46775409a9ee"
5918
  integrity sha512-G+iZGGiPEXcRzw0fiRxWYCKxdt/F7l9a0xkiU4XbcVRJCSlBnioWEwJMutOCCpoQmaQtjB4RBHDGIHN85AIhLQ==
5977
  v8-compile-cache "^2.0.0"
5978
  ws "^5.1.1"
5979
 
5980
+ parcel-plugin-assets-list@1.7.1:
5981
  version "1.7.1"
5982
  resolved "https://registry.yarnpkg.com/parcel-plugin-assets-list/-/parcel-plugin-assets-list-1.7.1.tgz#0495f0cee1413763a2e5bc62610ad3744ff77867"
5983
  integrity sha512-PCWPBEoiAAHvw5I472aOfTV3anhpQ8Y981NUewuNHN4ZmaJTGC15z37hM/UynasjFMm3gG/o2TRtXJBNosJEYg==
6877
  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
6878
  integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
6879
 
6880
+ resolve@^1.1.5, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.18.1, resolve@^1.4.0:
6881
  version "1.20.0"
6882
  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
6883
  integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
6998
  dependencies:
6999
  xmlchars "^2.2.0"
7000
 
7001
+ "semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0:
7002
  version "5.7.1"
7003
  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
7004
  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
7013
  resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
7014
  integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
7015
 
7016
+ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
7017
  version "6.3.0"
7018
  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
7019
  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==