GeoIP Detection - Version 3.1.0

Version Description

The property access for shortcodes has been rewritten so that property names such as "extra.original.zip" (Datasource: ipstack) are possible now.

Download this release

Release Info

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

Code changes from version 3.0.4 to 3.1.0

Files changed (81) hide show
  1. ajax.php +10 -3
  2. composer.json +2 -1
  3. composer.lock +298 -2
  4. geoip-detect-lib.php +14 -1
  5. geoip-detect.php +2 -2
  6. js/dist/backend.f84e1103.js +1 -1
  7. js/dist/frontend.e6504b2e.js +26 -0
  8. js/dist/frontend.e6504b2e.js.map +1 -0
  9. js/dist/parcel.js +2 -2
  10. js/dist/parcel.json +2 -2
  11. js/dist/parcel.urls +2 -2
  12. js/frontend.js +16 -23
  13. js/localStorageAccess.js +21 -0
  14. js/xhr.js +56 -0
  15. package.json +4 -5
  16. readme.txt +12 -0
  17. shortcode.php +63 -1
  18. vendor/composer/autoload_classmap.php +29 -0
  19. vendor/composer/autoload_files.php +11 -0
  20. vendor/composer/autoload_psr4.php +4 -0
  21. vendor/composer/autoload_real.php +18 -0
  22. vendor/composer/autoload_static.php +57 -0
  23. vendor/composer/installed.json +306 -0
  24. vendor/paragonie/random_compat/LICENSE +22 -0
  25. vendor/paragonie/random_compat/build-phar.sh +5 -0
  26. vendor/paragonie/random_compat/composer.json +34 -0
  27. vendor/paragonie/random_compat/dist/random_compat.phar.pubkey +5 -0
  28. vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc +11 -0
  29. vendor/paragonie/random_compat/lib/random.php +32 -0
  30. vendor/paragonie/random_compat/other/build_phar.php +57 -0
  31. vendor/paragonie/random_compat/psalm-autoload.php +9 -0
  32. vendor/paragonie/random_compat/psalm.xml +19 -0
  33. vendor/symfony/inflector/Inflector.php +503 -0
  34. vendor/symfony/inflector/LICENSE +19 -0
  35. vendor/symfony/inflector/README.md +12 -0
  36. vendor/symfony/inflector/composer.json +41 -0
  37. vendor/symfony/polyfill-ctype/Ctype.php +227 -0
  38. vendor/symfony/polyfill-ctype/LICENSE +19 -0
  39. vendor/symfony/polyfill-ctype/README.md +12 -0
  40. vendor/symfony/polyfill-ctype/bootstrap.php +46 -0
  41. vendor/symfony/polyfill-ctype/composer.json +38 -0
  42. vendor/symfony/polyfill-php70/LICENSE +19 -0
  43. vendor/symfony/polyfill-php70/Php70.php +74 -0
  44. vendor/symfony/polyfill-php70/README.md +28 -0
  45. vendor/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php +7 -0
  46. vendor/symfony/polyfill-php70/Resources/stubs/AssertionError.php +7 -0
  47. vendor/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php +7 -0
  48. vendor/symfony/polyfill-php70/Resources/stubs/Error.php +7 -0
  49. vendor/symfony/polyfill-php70/Resources/stubs/ParseError.php +7 -0
  50. vendor/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php +24 -0
  51. vendor/symfony/polyfill-php70/Resources/stubs/TypeError.php +7 -0
  52. vendor/symfony/polyfill-php70/bootstrap.php +30 -0
  53. vendor/symfony/polyfill-php70/composer.json +37 -0
  54. vendor/symfony/property-access/.gitignore +3 -0
  55. vendor/symfony/property-access/CHANGELOG.md +35 -0
  56. vendor/symfony/property-access/Exception/AccessException.php +21 -0
  57. vendor/symfony/property-access/Exception/ExceptionInterface.php +21 -0
  58. vendor/symfony/property-access/Exception/InvalidArgumentException.php +21 -0
  59. vendor/symfony/property-access/Exception/InvalidPropertyPathException.php +21 -0
  60. vendor/symfony/property-access/Exception/NoSuchIndexException.php +21 -0
  61. vendor/symfony/property-access/Exception/NoSuchPropertyException.php +21 -0
  62. vendor/symfony/property-access/Exception/OutOfBoundsException.php +21 -0
  63. vendor/symfony/property-access/Exception/RuntimeException.php +21 -0
  64. vendor/symfony/property-access/Exception/UnexpectedTypeException.php +40 -0
  65. vendor/symfony/property-access/LICENSE +19 -0
  66. vendor/symfony/property-access/PropertyAccess.php +47 -0
  67. vendor/symfony/property-access/PropertyAccessor.php +971 -0
  68. vendor/symfony/property-access/PropertyAccessorBuilder.php +131 -0
  69. vendor/symfony/property-access/PropertyAccessorInterface.php +114 -0
  70. vendor/symfony/property-access/PropertyPath.php +205 -0
  71. vendor/symfony/property-access/PropertyPathBuilder.php +298 -0
  72. vendor/symfony/property-access/PropertyPathInterface.php +86 -0
  73. vendor/symfony/property-access/PropertyPathIterator.php +49 -0
  74. vendor/symfony/property-access/PropertyPathIteratorInterface.php +34 -0
  75. vendor/symfony/property-access/README.md +14 -0
  76. vendor/symfony/property-access/StringUtil.php +51 -0
  77. vendor/symfony/property-access/composer.json +41 -0
  78. vendor/symfony/property-access/phpunit.xml.dist +31 -0
  79. views/lookup.php +39 -8
  80. views/options.php +1 -1
  81. yarn.lock +353 -306
ajax.php CHANGED
@@ -109,9 +109,16 @@ function _geoip_detect_ajax_get_data($options = array()) {
109
 
110
  /**
111
  * Call this function if you want to register the JS script only for specific pages
 
112
  */
113
  function geoip_detect2_enqueue_javascript() {
114
- wp_enqueue_script('geoip-detect-js');
 
 
 
 
 
 
115
  }
116
 
117
  function _geoip_detect_parcel_get_dist_js($handle) {
@@ -122,7 +129,7 @@ function _geoip_detect_parcel_get_dist_js($handle) {
122
  $urls = json_decode($json, true);
123
 
124
  if (isset($urls[$handle]))
125
- return '/js/dist' .$urls[$handle];
126
  return false;
127
  }
128
 
@@ -145,7 +152,7 @@ function _geoip_detect_register_javascript() {
145
  return;
146
  }
147
 
148
- wp_register_script('geoip-detect-js', GEOIP_DETECT_PLUGIN_URI . $file_uri, array('jquery'), GEOIP_DETECT_VERSION, true);
149
  $data = [
150
  'ajaxurl' => admin_url('/admin-ajax.php'),
151
  'default_locales' => apply_filters('geoip_detect2_locales', null),
109
 
110
  /**
111
  * Call this function if you want to register the JS script only for specific pages
112
+ * @api
113
  */
114
  function geoip_detect2_enqueue_javascript() {
115
+ if (did_action('wp_enqueue_scripts')) {
116
+ wp_enqueue_script('geoip-detect-js');
117
+ } else {
118
+ add_action('wp_enqueue_scripts', function() {
119
+ wp_enqueue_script('geoip-detect-js');
120
+ });
121
+ }
122
  }
123
 
124
  function _geoip_detect_parcel_get_dist_js($handle) {
129
  $urls = json_decode($json, true);
130
 
131
  if (isset($urls[$handle]))
132
+ return '/js/dist/' .$urls[$handle];
133
  return false;
134
  }
135
 
152
  return;
153
  }
154
 
155
+ wp_register_script('geoip-detect-js', GEOIP_DETECT_PLUGIN_URI . $file_uri, array(), GEOIP_DETECT_VERSION, true);
156
  $data = [
157
  'ajaxurl' => admin_url('/admin-ajax.php'),
158
  'default_locales' => apply_filters('geoip_detect2_locales', null),
composer.json CHANGED
@@ -14,6 +14,7 @@
14
  ],
15
  "require": {
16
  "geoip2/geoip2": "~2.0",
17
- "php": ">=5.6"
 
18
  }
19
  }
14
  ],
15
  "require": {
16
  "geoip2/geoip2": "~2.0",
17
+ "php": ">=5.6",
18
+ "symfony/property-access": "^3.4"
19
  }
20
  }
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": "1469024a23af7d9facb99a4208b34160",
8
  "packages": [
9
  {
10
  "name": "composer/ca-bundle",
@@ -216,6 +216,302 @@
216
  "description": "Internal MaxMind Web Service API",
217
  "homepage": "https://github.com/maxmind/web-service-common-php",
218
  "time": "2018-02-12T22:31:54+00:00"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
219
  }
220
  ],
221
  "packages-dev": [],
@@ -225,7 +521,7 @@
225
  "prefer-stable": false,
226
  "prefer-lowest": false,
227
  "platform": {
228
- "php": ">=5.4"
229
  },
230
  "platform-dev": []
231
  }
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": "5c667020928ed82b17b5c3bbbf6a3c8f",
8
  "packages": [
9
  {
10
  "name": "composer/ca-bundle",
216
  "description": "Internal MaxMind Web Service API",
217
  "homepage": "https://github.com/maxmind/web-service-common-php",
218
  "time": "2018-02-12T22:31:54+00:00"
219
+ },
220
+ {
221
+ "name": "paragonie/random_compat",
222
+ "version": "v9.99.99",
223
+ "source": {
224
+ "type": "git",
225
+ "url": "https://github.com/paragonie/random_compat.git",
226
+ "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95"
227
+ },
228
+ "dist": {
229
+ "type": "zip",
230
+ "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
231
+ "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
232
+ "shasum": ""
233
+ },
234
+ "require": {
235
+ "php": "^7"
236
+ },
237
+ "require-dev": {
238
+ "phpunit/phpunit": "4.*|5.*",
239
+ "vimeo/psalm": "^1"
240
+ },
241
+ "suggest": {
242
+ "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
243
+ },
244
+ "type": "library",
245
+ "notification-url": "https://packagist.org/downloads/",
246
+ "license": [
247
+ "MIT"
248
+ ],
249
+ "authors": [
250
+ {
251
+ "name": "Paragon Initiative Enterprises",
252
+ "email": "security@paragonie.com",
253
+ "homepage": "https://paragonie.com"
254
+ }
255
+ ],
256
+ "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
257
+ "keywords": [
258
+ "csprng",
259
+ "polyfill",
260
+ "pseudorandom",
261
+ "random"
262
+ ],
263
+ "time": "2018-07-02T15:55:56+00:00"
264
+ },
265
+ {
266
+ "name": "symfony/inflector",
267
+ "version": "v4.4.10",
268
+ "source": {
269
+ "type": "git",
270
+ "url": "https://github.com/symfony/inflector.git",
271
+ "reference": "3330be44724db42f0aa493002ae63f5d29f8d5f7"
272
+ },
273
+ "dist": {
274
+ "type": "zip",
275
+ "url": "https://api.github.com/repos/symfony/inflector/zipball/3330be44724db42f0aa493002ae63f5d29f8d5f7",
276
+ "reference": "3330be44724db42f0aa493002ae63f5d29f8d5f7",
277
+ "shasum": ""
278
+ },
279
+ "require": {
280
+ "php": ">=7.1.3",
281
+ "symfony/polyfill-ctype": "~1.8"
282
+ },
283
+ "type": "library",
284
+ "extra": {
285
+ "branch-alias": {
286
+ "dev-master": "4.4-dev"
287
+ }
288
+ },
289
+ "autoload": {
290
+ "psr-4": {
291
+ "Symfony\\Component\\Inflector\\": ""
292
+ },
293
+ "exclude-from-classmap": [
294
+ "/Tests/"
295
+ ]
296
+ },
297
+ "notification-url": "https://packagist.org/downloads/",
298
+ "license": [
299
+ "MIT"
300
+ ],
301
+ "authors": [
302
+ {
303
+ "name": "Bernhard Schussek",
304
+ "email": "bschussek@gmail.com"
305
+ },
306
+ {
307
+ "name": "Symfony Community",
308
+ "homepage": "https://symfony.com/contributors"
309
+ }
310
+ ],
311
+ "description": "Symfony Inflector Component",
312
+ "homepage": "https://symfony.com",
313
+ "keywords": [
314
+ "inflection",
315
+ "pluralize",
316
+ "singularize",
317
+ "string",
318
+ "symfony",
319
+ "words"
320
+ ],
321
+ "time": "2020-05-20T08:37:50+00:00"
322
+ },
323
+ {
324
+ "name": "symfony/polyfill-ctype",
325
+ "version": "v1.17.1",
326
+ "source": {
327
+ "type": "git",
328
+ "url": "https://github.com/symfony/polyfill-ctype.git",
329
+ "reference": "2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d"
330
+ },
331
+ "dist": {
332
+ "type": "zip",
333
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d",
334
+ "reference": "2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d",
335
+ "shasum": ""
336
+ },
337
+ "require": {
338
+ "php": ">=5.3.3"
339
+ },
340
+ "suggest": {
341
+ "ext-ctype": "For best performance"
342
+ },
343
+ "type": "library",
344
+ "extra": {
345
+ "branch-alias": {
346
+ "dev-master": "1.17-dev"
347
+ },
348
+ "thanks": {
349
+ "name": "symfony/polyfill",
350
+ "url": "https://github.com/symfony/polyfill"
351
+ }
352
+ },
353
+ "autoload": {
354
+ "psr-4": {
355
+ "Symfony\\Polyfill\\Ctype\\": ""
356
+ },
357
+ "files": [
358
+ "bootstrap.php"
359
+ ]
360
+ },
361
+ "notification-url": "https://packagist.org/downloads/",
362
+ "license": [
363
+ "MIT"
364
+ ],
365
+ "authors": [
366
+ {
367
+ "name": "Gert de Pagter",
368
+ "email": "BackEndTea@gmail.com"
369
+ },
370
+ {
371
+ "name": "Symfony Community",
372
+ "homepage": "https://symfony.com/contributors"
373
+ }
374
+ ],
375
+ "description": "Symfony polyfill for ctype functions",
376
+ "homepage": "https://symfony.com",
377
+ "keywords": [
378
+ "compatibility",
379
+ "ctype",
380
+ "polyfill",
381
+ "portable"
382
+ ],
383
+ "time": "2020-06-06T08:46:27+00:00"
384
+ },
385
+ {
386
+ "name": "symfony/polyfill-php70",
387
+ "version": "v1.17.1",
388
+ "source": {
389
+ "type": "git",
390
+ "url": "https://github.com/symfony/polyfill-php70.git",
391
+ "reference": "471b096aede7025bace8eb356b9ac801aaba7e2d"
392
+ },
393
+ "dist": {
394
+ "type": "zip",
395
+ "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/471b096aede7025bace8eb356b9ac801aaba7e2d",
396
+ "reference": "471b096aede7025bace8eb356b9ac801aaba7e2d",
397
+ "shasum": ""
398
+ },
399
+ "require": {
400
+ "paragonie/random_compat": "~1.0|~2.0|~9.99",
401
+ "php": ">=5.3.3"
402
+ },
403
+ "type": "library",
404
+ "extra": {
405
+ "branch-alias": {
406
+ "dev-master": "1.17-dev"
407
+ },
408
+ "thanks": {
409
+ "name": "symfony/polyfill",
410
+ "url": "https://github.com/symfony/polyfill"
411
+ }
412
+ },
413
+ "autoload": {
414
+ "psr-4": {
415
+ "Symfony\\Polyfill\\Php70\\": ""
416
+ },
417
+ "files": [
418
+ "bootstrap.php"
419
+ ],
420
+ "classmap": [
421
+ "Resources/stubs"
422
+ ]
423
+ },
424
+ "notification-url": "https://packagist.org/downloads/",
425
+ "license": [
426
+ "MIT"
427
+ ],
428
+ "authors": [
429
+ {
430
+ "name": "Nicolas Grekas",
431
+ "email": "p@tchwork.com"
432
+ },
433
+ {
434
+ "name": "Symfony Community",
435
+ "homepage": "https://symfony.com/contributors"
436
+ }
437
+ ],
438
+ "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
439
+ "homepage": "https://symfony.com",
440
+ "keywords": [
441
+ "compatibility",
442
+ "polyfill",
443
+ "portable",
444
+ "shim"
445
+ ],
446
+ "time": "2020-06-06T08:46:27+00:00"
447
+ },
448
+ {
449
+ "name": "symfony/property-access",
450
+ "version": "v3.4.42",
451
+ "source": {
452
+ "type": "git",
453
+ "url": "https://github.com/symfony/property-access.git",
454
+ "reference": "e1a6c91c0007e45bc1beba929c76548ca9fe8a85"
455
+ },
456
+ "dist": {
457
+ "type": "zip",
458
+ "url": "https://api.github.com/repos/symfony/property-access/zipball/e1a6c91c0007e45bc1beba929c76548ca9fe8a85",
459
+ "reference": "e1a6c91c0007e45bc1beba929c76548ca9fe8a85",
460
+ "shasum": ""
461
+ },
462
+ "require": {
463
+ "php": "^5.5.9|>=7.0.8",
464
+ "symfony/inflector": "~3.1|~4.0",
465
+ "symfony/polyfill-php70": "~1.0"
466
+ },
467
+ "require-dev": {
468
+ "symfony/cache": "~3.1|~4.0"
469
+ },
470
+ "suggest": {
471
+ "psr/cache-implementation": "To cache access methods."
472
+ },
473
+ "type": "library",
474
+ "extra": {
475
+ "branch-alias": {
476
+ "dev-master": "3.4-dev"
477
+ }
478
+ },
479
+ "autoload": {
480
+ "psr-4": {
481
+ "Symfony\\Component\\PropertyAccess\\": ""
482
+ },
483
+ "exclude-from-classmap": [
484
+ "/Tests/"
485
+ ]
486
+ },
487
+ "notification-url": "https://packagist.org/downloads/",
488
+ "license": [
489
+ "MIT"
490
+ ],
491
+ "authors": [
492
+ {
493
+ "name": "Fabien Potencier",
494
+ "email": "fabien@symfony.com"
495
+ },
496
+ {
497
+ "name": "Symfony Community",
498
+ "homepage": "https://symfony.com/contributors"
499
+ }
500
+ ],
501
+ "description": "Symfony PropertyAccess Component",
502
+ "homepage": "https://symfony.com",
503
+ "keywords": [
504
+ "access",
505
+ "array",
506
+ "extraction",
507
+ "index",
508
+ "injection",
509
+ "object",
510
+ "property",
511
+ "property path",
512
+ "reflection"
513
+ ],
514
+ "time": "2020-05-29T00:04:36+00:00"
515
  }
516
  ],
517
  "packages-dev": [],
521
  "prefer-stable": false,
522
  "prefer-lowest": false,
523
  "platform": {
524
+ "php": ">=5.6"
525
  },
526
  "platform-dev": []
527
  }
geoip-detect-lib.php CHANGED
@@ -492,4 +492,17 @@ function geoip_detect_format_localtime($timestamp = 0) {
492
  $format = get_option('date_format') . ' '. get_option('time_format');
493
 
494
  return get_date_from_gmt ( date( 'Y-m-d H:i:s', $timestamp ), $format);
495
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
492
  $format = get_option('date_format') . ' '. get_option('time_format');
493
 
494
  return get_date_from_gmt ( date( 'Y-m-d H:i:s', $timestamp ), $format);
495
+ }
496
+
497
+ function _geoip_str_begins_with($string, $startString)
498
+ {
499
+ $len = mb_strlen($startString);
500
+ return (mb_substr($string, 0, $len) === $startString);
501
+ }
502
+
503
+ function _geoip_str_ends_with($string, $startString)
504
+ {
505
+ $len = mb_strlen($startString);
506
+ //if ($len === 0) return true; // Not sure what is "expected behavior"
507
+ return (mb_substr($string, -$len) === $startString);
508
+ }
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: 3.0.4
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: 4.0
16
  Requires PHP: 5.6
17
  */
18
 
19
- define('GEOIP_DETECT_VERSION', '3.0.4');
20
 
21
  /*
22
  Copyright 2013-2020 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: 3.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: 5.6
17
  */
18
 
19
+ define('GEOIP_DETECT_VERSION', '3.1.0');
20
 
21
  /*
22
  Copyright 2013-2020 Yellow Tree, Siegen, Germany
js/dist/backend.f84e1103.js CHANGED
@@ -1,4 +1,4 @@
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}({"gP7L":[function(require,module,exports) {
2
 
3
  },{}]},{},["gP7L"], null)
4
- //# sourceMappingURL=/backend.f84e1103.js.map
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}({"gP7L":[function(require,module,exports) {
2
 
3
  },{}]},{},["gP7L"], null)
4
+ //# sourceMappingURL=backend.f84e1103.js.map
js/dist/frontend.e6504b2e.js ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ },{}],"KA2S":[function(require,module,exports) {
4
+ var t=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,n){var o=r&&r.prototype instanceof v?r:v,i=Object.create(o.prototype),a=new k(n||[]);return i._invoke=function(t,r,e){var n=f;return function(o,i){if(n===l)throw new Error("Generator is already running");if(n===p){if("throw"===o)throw i;return N()}for(e.method=o,e.arg=i;;){var a=e.delegate;if(a){var c=_(a,e);if(c){if(c===y)continue;return c}}if("next"===e.method)e.sent=e._sent=e.arg;else if("throw"===e.method){if(n===f)throw n=p,e.arg;e.dispatchException(e.arg)}else"return"===e.method&&e.abrupt("return",e.arg);n=l;var u=h(t,r,e);if("normal"===u.type){if(n=e.done?p:s,u.arg===y)continue;return{value:u.arg,done:e.done}}"throw"===u.type&&(n=p,e.method="throw",e.arg=u.arg)}}}(t,e,a),i}function h(t,r,e){try{return{type:"normal",arg:t.call(r,e)}}catch(n){return{type:"throw",arg:n}}}t.wrap=u;var f="suspendedStart",s="suspendedYield",l="executing",p="completed",y={};function v(){}function d(){}function g(){}var m={};m[i]=function(){return this};var w=Object.getPrototypeOf,L=w&&w(w(G([])));L&&L!==e&&n.call(L,i)&&(m=L);var x=g.prototype=v.prototype=Object.create(m);function E(t){["next","throw","return"].forEach(function(r){t[r]=function(t){return this._invoke(r,t)}})}function b(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=h(t[o],t,i);if("throw"!==u.type){var f=u.arg,s=f.value;return s&&"object"==typeof s&&n.call(s,"__await")?r.resolve(s.__await).then(function(t){e("next",t,a,c)},function(t){e("throw",t,a,c)}):r.resolve(s).then(function(t){f.value=t,a(f)},function(t){return e("throw",t,a,c)})}c(u.arg)}(o,i,e,a)})}return e=e?e.then(a,a):a()}}function _(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,_(t,e),"throw"===e.method))return y;e.method="throw",e.arg=new TypeError("The iterator does not provide a 'throw' method")}return y}var o=h(n,t.iterator,e.arg);if("throw"===o.type)return e.method="throw",e.arg=o.arg,e.delegate=null,y;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,y):i:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,y)}function j(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 O(t){var r=t.completion||{};r.type="normal",delete r.arg,t.completion=r}function k(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(j,this),this.reset(!0)}function G(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:N}}function N(){return{value:r,done:!0}}return d.prototype=x.constructor=g,g.constructor=d,g[c]=d.displayName="GeneratorFunction",t.isGeneratorFunction=function(t){var r="function"==typeof t&&t.constructor;return!!r&&(r===d||"GeneratorFunction"===(r.displayName||r.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,g):(t.__proto__=g,c in t||(t[c]="GeneratorFunction")),t.prototype=Object.create(x),t},t.awrap=function(t){return{__await:t}},E(b.prototype),b.prototype[a]=function(){return this},t.AsyncIterator=b,t.async=function(r,e,n,o,i){void 0===i&&(i=Promise);var a=new b(u(r,e,n,o),i);return t.isGeneratorFunction(e)?a:a.next().then(function(t){return t.done?t.value:a.next()})},E(x),x[c]="Generator",x[i]=function(){return this},x.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=G,k.prototype={constructor:k,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(O),!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,y):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),y},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),O(e),y}},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;O(e)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:G(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=r),y}},t}("object"==typeof module?module.exports:{});try{regeneratorRuntime=t}catch(r){Function("r","regeneratorRuntime = r")(t)}
5
+ },{}],"m4eR":[function(require,module,exports) {
6
+ module.exports=require("regenerator-runtime");
7
+ },{"regenerator-runtime":"KA2S"}],"fwsn":[function(require,module,exports) {
8
+ 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;
9
+ },{}],"ZBnv":[function(require,module,exports) {
10
+ function n(n,o){if(!(n instanceof o))throw new TypeError("Cannot call a class as a function")}module.exports=n;
11
+ },{}],"NoOd":[function(require,module,exports) {
12
+ 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;
13
+ },{}],"AuD4":[function(require,module,exports) {
14
+ var global = arguments[3];
15
+ var define;
16
+ var t,e=arguments[3],n=r(require("@babel/runtime/helpers/typeof"));function r(t){return t&&t.__esModule?t:{default:t}}(function(){var r,o="Expected a function",u="__lodash_hash_undefined__",i=500,a=1/0,c="[object AsyncFunction]",l="[object Function]",s="[object GeneratorFunction]",f="[object Null]",p="[object Proxy]",h="[object Symbol]",_="[object Undefined]",d=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,y=/^\w*$/,v=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,b=/\\(\\)?/g,g=/^\[object .+?Constructor\]$/,j="object"==(void 0===e?"undefined":(0,n.default)(e))&&e&&e.Object===Object&&e,m="object"==("undefined"==typeof self?"undefined":(0,n.default)(self))&&self&&self.Object===Object&&self,O=j||m||Function("return this")(),z="object"==("undefined"==typeof exports?"undefined":(0,n.default)(exports))&&exports&&!exports.nodeType&&exports,x=z&&"object"==("undefined"==typeof module?"undefined":(0,n.default)(module))&&module&&!module.nodeType&&module;var S,w=Array.prototype,$=Function.prototype,A=Object.prototype,F=O["__core-js_shared__"],E=$.toString,T=A.hasOwnProperty,C=(S=/[^.]+$/.exec(F&&F.keys&&F.keys.IE_PROTO||""))?"Symbol(src)_1."+S:"",P=A.toString,k=RegExp("^"+E.call(T).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),R=O.Symbol,q=w.splice,I=R?R.toStringTag:r,M=Y(O,"Map"),N=Y(Object,"create"),G=R?R.prototype:r,L=G?G.toString:r;function U(){}function V(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function B(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function D(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function H(t,e){for(var n=t.length;n--;)if(ut(t[n][0],e))return n;return-1}function J(t,e){for(var o=0,u=(e=function(t,e){if(it(t))return t;return function(t,e){if(it(t))return!1;var r=(0,n.default)(t);if("number"==r||"symbol"==r||"boolean"==r||null==t||st(t))return!0;return y.test(t)||!d.test(t)||null!=e&&t in Object(e)}(t,e)?[t]:nt(ft(t))}(e,t)).length;null!=t&&o<u;)t=t[rt(e[o++])];return o&&o==u?t:r}function K(t){return null==t?t===r?_:f:I&&I in Object(t)?function(t){var e=T.call(t,I),n=t[I];try{t[I]=r;var o=!0}catch(i){}var u=P.call(t);o&&(e?t[I]=n:delete t[I]);return u}(t):function(t){return P.call(t)}(t)}function Q(t){return!(!ct(t)||(e=t,C&&C in e))&&(at(t)?k:g).test(function(t){if(null!=t){try{return E.call(t)}catch(e){}try{return t+""}catch(e){}}return""}(t));var e}function W(t){if("string"==typeof t)return t;if(it(t))return function(t,e){for(var n=-1,r=null==t?0:t.length,o=Array(r);++n<r;)o[n]=e(t[n],n,t);return o}(t,W)+"";if(st(t))return L?L.call(t):"";var e=t+"";return"0"==e&&1/t==-a?"-0":e}function X(t,e){var r,o,u=t.__data__;return r=e,("string"==(o=(0,n.default)(r))||"number"==o||"symbol"==o||"boolean"==o?"__proto__"!==r:null===r)?u["string"==typeof e?"string":"hash"]:u.map}function Y(t,e){var n=function(t,e){return null==t?r:t[e]}(t,e);return Q(n)?n:r}V.prototype.clear=function(){this.__data__=N?N(null):{},this.size=0},V.prototype.delete=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e},V.prototype.get=function(t){var e=this.__data__;if(N){var n=e[t];return n===u?r:n}return T.call(e,t)?e[t]:r},V.prototype.has=function(t){var e=this.__data__;return N?e[t]!==r:T.call(e,t)},V.prototype.set=function(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=N&&e===r?u:e,this},B.prototype.clear=function(){this.__data__=[],this.size=0},B.prototype.delete=function(t){var e=this.__data__,n=H(e,t);return!(n<0||(n==e.length-1?e.pop():q.call(e,n,1),--this.size,0))},B.prototype.get=function(t){var e=this.__data__,n=H(e,t);return n<0?r:e[n][1]},B.prototype.has=function(t){return H(this.__data__,t)>-1},B.prototype.set=function(t,e){var n=this.__data__,r=H(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this},D.prototype.clear=function(){this.size=0,this.__data__={hash:new V,map:new(M||B),string:new V}},D.prototype.delete=function(t){var e=X(this,t).delete(t);return this.size-=e?1:0,e},D.prototype.get=function(t){return X(this,t).get(t)},D.prototype.has=function(t){return X(this,t).has(t)},D.prototype.set=function(t,e){var n=X(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this};var Z,tt,et,nt=(Z=function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(v,function(t,n,r,o){e.push(r?o.replace(b,"$1"):n||t)}),e},tt=ot(Z,function(t){return et.size===i&&et.clear(),t}),et=tt.cache,tt);function rt(t){if("string"==typeof t||st(t))return t;var e=t+"";return"0"==e&&1/t==-a?"-0":e}function ot(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError(o);var n=function n(){var r=arguments,o=e?e.apply(this,r):r[0],u=n.cache;if(u.has(o))return u.get(o);var i=t.apply(this,r);return n.cache=u.set(o,i)||u,i};return n.cache=new(ot.Cache||D),n}function ut(t,e){return t===e||t!=t&&e!=e}ot.Cache=D;var it=Array.isArray;function at(t){if(!ct(t))return!1;var e=K(t);return e==l||e==s||e==c||e==p}function ct(t){var e=(0,n.default)(t);return null!=t&&("object"==e||"function"==e)}function lt(t){return null!=t&&"object"==(0,n.default)(t)}function st(t){return"symbol"==(0,n.default)(t)||lt(t)&&K(t)==h}function ft(t){return null==t?"":W(t)}U.memoize=ot,U.eq=ut,U.get=function(t,e,n){var o=null==t?r:J(t,e);return o===r?n:o},U.isArray=it,U.isFunction=at,U.isObject=ct,U.isObjectLike=lt,U.isSymbol=st,U.toString=ft,U.VERSION="4.17.5","function"==typeof t&&"object"==(0,n.default)(t.amd)&&t.amd?(O._=U,t(function(){return U})):x?((x.exports=U)._=U,z._=U):O._=U}).call(void 0);
17
+ },{"@babel/runtime/helpers/typeof":"LNzP"}],"yK6K":[function(require,module,exports) {
18
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=a(require("@babel/runtime/helpers/classCallCheck")),t=a(require("@babel/runtime/helpers/createClass")),r=a(require("@babel/runtime/helpers/typeof")),n=a(require("../lodash.custom"));function a(e){return e&&e.__esModule?e:{default:e}}function u(e){if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(e=o(e))){var t=0,r=function(){};return{s:r,n:function(){return t>=e.length?{done:!0}:{done:!1,value:e[t++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var n,a,u=!0,l=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return u=e.done,e},e:function(e){l=!0,a=e},f:function(){try{u||null==n.return||n.return()}finally{if(l)throw a}}}}function o(e,t){if(e){if("string"==typeof e)return l(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?l(e,t):void 0}}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var i=function(e,t){if("object"==(0,r.default)(e)&&"object"==(0,r.default)(e.names)){"string"==typeof t&&(t=[t]);var n,a=u(t);try{for(a.s();!(n=a.n()).done;){var o=n.value;if(e.names[o])return e.names[o]}}catch(l){a.e(l)}finally{a.f()}return""}return e},s=function(){function r(t,n){(0,e.default)(this,r),this.data={},this.default_locales=[],this.data=t||{},this.default_locales=n||["en"]}return(0,t.default)(r,[{key:"get",value:function(e,t){return this.get_with_locales(e,this.default_locales,t)}},{key:"get_with_locales",value:function(e,t,r){".name"===e.substr(-5)&&(e=e.substr(0,e.length-5));var a=n.default.get(this.data,e,r);return a=i(a,t)}},{key:"error",value:function(){return n.default.get(this.data,"extra.error","")}}]),r}(),f=s;exports.default=f;
19
+ },{"@babel/runtime/helpers/classCallCheck":"ZBnv","@babel/runtime/helpers/createClass":"NoOd","@babel/runtime/helpers/typeof":"LNzP","../lodash.custom":"AuD4"}],"d429":[function(require,module,exports) {
20
+ "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;
21
+ },{}],"BTyy":[function(require,module,exports) {
22
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.makeJSONRequest=exports.makeRequest=void 0;var e=r(require("@babel/runtime/regenerator")),t=r(require("@babel/runtime/helpers/asyncToGenerator"));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,t.default)(e.default.mark(function t(r){var s,a,o=arguments;return e.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()}},t,null,[[1,8]])}));return function(e){return r.apply(this,arguments)}}();exports.makeJSONRequest=s;
23
+ },{"@babel/runtime/regenerator":"m4eR","@babel/runtime/helpers/asyncToGenerator":"fwsn"}],"ZVsn":[function(require,module,exports) {
24
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.get_info=f;var e=c(require("@babel/runtime/helpers/typeof")),t=c(require("@babel/runtime/regenerator")),r=c(require("@babel/runtime/helpers/asyncToGenerator")),n=c(require("./models/record")),o=require("./localStorageAccess"),a=c(require("./lodash.custom")),i=require("./xhr");function c(e){return e&&e.__esModule?e:{default:e}}window.geoip_detect||console.error("Geoip-detect: the JS variable window.geoip_detect is missing - this is needed for the options");var s=window.geoip_detect.options||{},u=null;function d(){if(!u){var e=s.ajaxurl+"?action=geoip_detect2_get_info_from_current_ip";u=(0,i.makeJSONRequest)(e)}return u}function l(){return p.apply(this,arguments)}function p(){return(p=(0,r.default)(t.default.mark(function e(){var r;return t.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(r=!1,!s.cookie_name){e.next=5;break}if(!(r=(0,o.getLocalStorage)(s.cookie_name))||!r.extra){e.next=5;break}return e.abrupt("return",r);case 5:return e.prev=5,e.next=8,d();case 8:r=e.sent,e.next=14;break;case 11:e.prev=11,e.t0=e.catch(5),r=e.t0.responseJSON||e.t0;case 14:return s.cookie_name&&(0,o.setLocalStorage)(s.cookie_name,r,24*s.cookie_duration_in_days*60*60),e.abrupt("return",r);case 16:case"end":return e.stop()}},e,null,[[5,11]])}))).apply(this,arguments)}function f(){return _.apply(this,arguments)}function _(){return(_=(0,r.default)(t.default.mark(function r(){var o,a;return t.default.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,l();case 2:return o=t.sent,"object"!==(0,e.default)(o)&&(console.error("Geoip-detect: Record should be an object, not a "+(0,e.default)(o),o),o={extra:{error:o||"Network error, look at the original server response ..."}}),a=new n.default(o,s.default_locales),t.abrupt("return",a);case 6:case"end":return t.stop()}},r)}))).apply(this,arguments)}function g(){return b.apply(this,arguments)}function b(){return(b=(0,r.default)(t.default.mark(function e(){var r,n,o,a,i,c,s;return t.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,f();case 2:for((r=e.sent).error()&&console.error("Geodata Error (could not add CSS-classes to body): "+r.error()),n={country:r.get("country.iso_code"),"country-is-in-european-union":r.get("country.is_in_european_union"),continent:r.get("continent.code"),province:r.get("most_specific_subdivision.iso_code")},o=document.getElementsByTagName("body")[0],a=0,i=Object.keys(n);a<i.length;a++)c=i[a],(s=n[c])&&("string"==typeof s?o.classList.add("geoip-".concat(c,"-").concat(s)):o.classList.add("geoip-".concat(c)));case 7:case"end":return e.stop()}},e)}))).apply(this,arguments)}s.do_body_classes&&g(),window.geoip_detect.get_info=f;
25
+ },{"@babel/runtime/helpers/typeof":"LNzP","@babel/runtime/regenerator":"m4eR","@babel/runtime/helpers/asyncToGenerator":"fwsn","./models/record":"yK6K","./localStorageAccess":"d429","./lodash.custom":"AuD4","./xhr":"BTyy"}]},{},["ZVsn"], null)
26
+ //# sourceMappingURL=frontend.e6504b2e.js.map
js/dist/frontend.e6504b2e.js.map ADDED
@@ -0,0 +1 @@
 
1
+ {"version":3,"sources":["node_modules/@babel/runtime/helpers/typeof.js","node_modules/regenerator-runtime/runtime.js","node_modules/@babel/runtime/regenerator/index.js","node_modules/@babel/runtime/helpers/asyncToGenerator.js","node_modules/@babel/runtime/helpers/classCallCheck.js","node_modules/@babel/runtime/helpers/createClass.js","js/lodash.custom.js","js/models/record.js","js/localStorageAccess.js","js/xhr.js","js/frontend.js"],"names":["undefined","FUNC_ERROR_TEXT","HASH_UNDEFINED","MAX_MEMOIZE_SIZE","INFINITY","asyncTag","funcTag","genTag","nullTag","proxyTag","symbolTag","undefinedTag","reIsDeepProp","reIsPlainProp","rePropName","reEscapeChar","reIsHostCtor","freeGlobal","global","Object","freeSelf","self","root","Function","freeExports","exports","nodeType","freeModule","module","arrayProto","uid","Array","prototype","funcProto","objectProto","coreJsData","funcToString","toString","hasOwnProperty","maskSrcKey","exec","keys","IE_PROTO","nativeObjectToString","reIsNative","RegExp","call","replace","Symbol","splice","symToStringTag","toStringTag","Map","getNative","nativeCreate","symbolProto","symbolToString","lodash","Hash","entries","index","length","clear","entry","set","ListCache","MapCache","assocIndexOf","array","key","eq","baseGet","object","path","castPath","value","isArray","isKey","type","isSymbol","test","stringToPath","toKey","baseGetTag","getRawTag","isOwn","tag","unmasked","e","result","objectToString","baseIsNative","isObject","func","isFunction","toSource","isMasked","baseToString","arrayMap","iteratee","getMapData","map","data","__data__","isKeyable","getValue","hashClear","size","hashDelete","has","get","hashGet","hashHas","hashSet","listCacheClear","listCacheDelete","pop","listCacheGet","listCacheHas","listCacheSet","push","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","cache","string","charCodeAt","match","number","quote","subString","memoize","resolver","TypeError","memoized","args","arguments","apply","Cache","other","isObjectLike","defaultValue","VERSION","define","amd","_","Record","_get_localized","ret","locales","names","locale","default_locales","prop","default_value","get_with_locales","substr","setLocalStorage","variable","ttl_sec","expires_at","Date","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","window","geoip_detect","console","error","options","ajaxPromise","get_info_raw","ajaxurl","get_info_cached","response","cookie_name","extra","responseJSON","cookie_duration_in_days","get_info","record","add_body_classes","css_classes","country","continent","province","body","document","getElementsByTagName","classList","add","do_body_classes"],"mappings":"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","file":"frontend.e6504b2e.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;","/**\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 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 GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\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 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 if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\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 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 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;","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\" -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 as references for various `Number` constants. */\n var INFINITY = 1 / 0;\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 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 * 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\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 /* 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 * 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 `_.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 `_.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 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 * 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 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 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 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 // Add methods that return wrapped values in chain sequences.\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.isArray = isArray;\n lodash.isFunction = isFunction;\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' && typeof(ret.names) == 'object') {\n if (typeof(locales) == 'string') {\n locales = [ locales ];\n }\n\n for (let locale of locales) {\n if (ret.names[locale]) {\n return ret.names[locale];\n }\n }\n \n return '';\n }\n return ret;\n}\n\n\n\nclass Record {\n data = {};\n default_locales = [];\n\n constructor(data, default_locales) {\n this.data = data || {};\n this.default_locales = default_locales || ['en']; \n }\n\n get(prop, default_value) {\n return this.get_with_locales(prop, this.default_locales, default_value);\n }\n \n \n get_with_locales(prop, locales, default_value) {\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 // TODO handle most_specific_subdivision (here or in PHP)?\n\n let ret = _.get(this.data, prop, default_value);\n\n // Localize property, if possible\n ret = _get_localized(ret, locales);\n\n return ret;\n }\n \n /**\n * Get error message, if any\n * @return string Error Message\n */\n error() {\n return _.get(this.data, 'extra.error', '');\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 './localStorageAccess';\nimport _ from './lodash.custom';\nimport { makeJSONRequest } from './xhr';\n\nif (!window.geoip_detect) {\n console.error('Geoip-detect: the JS variable window.geoip_detect is missing - this is needed for the options')\n}\nconst options = window.geoip_detect.options || {};\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\n // 1) Load Info from cookie cache, if possible\n if (options.cookie_name) {\n response = getLocalStorage(options.cookie_name)\n if (response && response.extra) {\n // This might be an error object - cache it anyway\n return response;\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 cookie cache\n if (options.cookie_name) {\n setLocalStorage(options.cookie_name, response, options.cookie_duration_in_days * 24 * 60 * 60)\n }\n\n return response;\n}\n\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}\n\nasync 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 }\n\n const css_classes = {\n country: record.get('country.iso_code'),\n 'country-is-in-european-union': record.get('country.is_in_european_union'),\n continent: record.get('continent.code'),\n province: record.get('most_specific_subdivision.iso_code'),\n };\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}\nif (options.do_body_classes) {\n add_body_classes();\n}\n\n// Extend window object \nwindow.geoip_detect.get_info = get_info;"]}
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.66c57954.js",backendJS:"/backend.f84e1103.js"};
3
- },{"./js/frontend.js":[["frontend.66c57954.js","ZVsn"],"frontend.66c57954.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.e6504b2e.js",backendJS:"backend.f84e1103.js"};
3
+ },{"./js/frontend.js":[["frontend.e6504b2e.js","ZVsn"],"frontend.e6504b2e.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.66c57954.js",
3
- "backendJS": "/backend.f84e1103.js"
4
  }
1
  {
2
+ "frontendJS": "frontend.e6504b2e.js",
3
+ "backendJS": "backend.f84e1103.js"
4
  }
js/dist/parcel.urls CHANGED
@@ -1,2 +1,2 @@
1
- frontendJS: /frontend.66c57954.js
2
- backendJS: /backend.f84e1103.js
1
+ frontendJS: frontend.e6504b2e.js
2
+ backendJS: backend.f84e1103.js
js/frontend.js CHANGED
@@ -1,14 +1,10 @@
1
  import Record from './models/record';
2
- import Cookies from 'js-cookie';
3
-
4
- if (!window.jQuery) {
5
- console.error('Geoip-detect: window.jQuery is missing!');
6
- }
7
- const $ = window.jQuery;
8
-
9
 
10
  if (!window.geoip_detect) {
11
- console.error('Geoip-detect: window.geoip_detect')
12
  }
13
  const options = window.geoip_detect.options || {};
14
 
@@ -17,13 +13,9 @@ let ajaxPromise = null;
17
  function get_info_raw() {
18
  if (!ajaxPromise) {
19
  // Do Ajax Request only once per page load
20
- ajaxPromise = $.ajax(options.ajaxurl, {
21
- dataType: 'json',
22
- type: 'GET',
23
- data: {
24
- action: 'geoip_detect2_get_info_from_current_ip'
25
- }
26
- });
27
  }
28
 
29
  return ajaxPromise;
@@ -34,7 +26,11 @@ async function get_info_cached() {
34
 
35
  // 1) Load Info from cookie cache, if possible
36
  if (options.cookie_name) {
37
- response = Cookies.getJSON(options.cookie_name)
 
 
 
 
38
  }
39
 
40
  // 2) Get response
@@ -46,11 +42,7 @@ async function get_info_cached() {
46
 
47
  // 3) Save info to cookie cache
48
  if (options.cookie_name) {
49
- let cookie_options = { path: '/' };
50
- if (options.cookie_duration_in_days) {
51
- cookie_options.expires = options.cookie_duration_in_days;
52
- }
53
- Cookies.set(options.cookie_name, JSON.stringify(response), cookie_options);
54
  }
55
 
56
  return response;
@@ -83,13 +75,14 @@ async function add_body_classes() {
83
  province: record.get('most_specific_subdivision.iso_code'),
84
  };
85
 
 
86
  for(let key of Object.keys(css_classes)) {
87
  const value = css_classes[key];
88
  if (value) {
89
  if (typeof(value) == 'string') {
90
- $('body').addClass(`geoip-${key}-${value}`);
91
  } else {
92
- $('body').addClass(`geoip-${key}`);
93
  }
94
  }
95
  }
1
  import Record from './models/record';
2
+ import { getLocalStorage, setLocalStorage } from './localStorageAccess';
3
+ import _ from './lodash.custom';
4
+ import { makeJSONRequest } from './xhr';
 
 
 
 
5
 
6
  if (!window.geoip_detect) {
7
+ console.error('Geoip-detect: the JS variable window.geoip_detect is missing - this is needed for the options')
8
  }
9
  const options = window.geoip_detect.options || {};
10
 
13
  function get_info_raw() {
14
  if (!ajaxPromise) {
15
  // Do Ajax Request only once per page load
16
+ const url = options.ajaxurl + '?action=geoip_detect2_get_info_from_current_ip'
17
+
18
+ ajaxPromise = makeJSONRequest(url);
 
 
 
 
19
  }
20
 
21
  return ajaxPromise;
26
 
27
  // 1) Load Info from cookie cache, if possible
28
  if (options.cookie_name) {
29
+ response = getLocalStorage(options.cookie_name)
30
+ if (response && response.extra) {
31
+ // This might be an error object - cache it anyway
32
+ return response;
33
+ }
34
  }
35
 
36
  // 2) Get response
42
 
43
  // 3) Save info to cookie cache
44
  if (options.cookie_name) {
45
+ setLocalStorage(options.cookie_name, response, options.cookie_duration_in_days * 24 * 60 * 60)
 
 
 
 
46
  }
47
 
48
  return response;
75
  province: record.get('most_specific_subdivision.iso_code'),
76
  };
77
 
78
+ const body = document.getElementsByTagName('body')[0];
79
  for(let key of Object.keys(css_classes)) {
80
  const value = css_classes[key];
81
  if (value) {
82
  if (typeof(value) == 'string') {
83
+ body.classList.add(`geoip-${key}-${value}`);
84
  } else {
85
+ body.classList.add(`geoip-${key}`);
86
  }
87
  }
88
  }
js/localStorageAccess.js ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export const setLocalStorage = function (variable, value, ttl_sec) {
2
+ var data = { value: value, expires_at: new Date().getTime() + (ttl_sec * 1000) / 1 };
3
+ localStorage.setItem(variable.toString(), JSON.stringify(data));
4
+ };
5
+
6
+ export const getLocalStorage = function (variable) {
7
+ let data = null;
8
+ try {
9
+ data = JSON.parse(localStorage.getItem(variable.toString()));
10
+ } catch(e) {
11
+ return null;
12
+ }
13
+ if (data !== null) {
14
+ if (data.expires_at !== null && data.expires_at < new Date().getTime()) {
15
+ localStorage.removeItem(variable.toString());
16
+ } else {
17
+ return data.value;
18
+ }
19
+ }
20
+ return null;
21
+ }
js/xhr.js ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // @see https://gomakethings.com/promise-based-xhr/
2
+
3
+ export const makeRequest = function (url, method = 'GET') {
4
+
5
+ // Create the XHR request
6
+ var request = new XMLHttpRequest();
7
+
8
+ // Return it as a Promise
9
+ return new Promise(function (resolve, reject) {
10
+
11
+ // Setup our listener to process compeleted requests
12
+ request.onreadystatechange = function () {
13
+
14
+ // Only run if the request is complete
15
+ if (request.readyState !== 4) return;
16
+
17
+ // Process the response
18
+ if (request.status >= 200 && request.status < 300) {
19
+ // If successful
20
+ resolve(request);
21
+ } else {
22
+ // If failed
23
+ reject({
24
+ status: request.status,
25
+ statusText: request.statusText,
26
+ request: request
27
+ });
28
+ }
29
+
30
+ };
31
+
32
+ // Setup our HTTP request
33
+ request.open(method || 'GET', url, true);
34
+
35
+ // Send the request
36
+ request.send();
37
+
38
+ });
39
+ };
40
+
41
+ const jsonDecodeIfPossible = function(str) {
42
+ try {
43
+ return JSON.parse(str);
44
+ } catch(e) {
45
+ return str;
46
+ }
47
+ }
48
+
49
+ export const makeJSONRequest = async function(url, method = 'GET') {
50
+ try {
51
+ const request = await makeRequest(url, method);
52
+ return jsonDecodeIfPossible(request.responseText);
53
+ } catch(e) {
54
+ return jsonDecodeIfPossible(e.request.responseText);
55
+ }
56
+ }
package.json CHANGED
@@ -9,22 +9,21 @@
9
  "scripts": {
10
  "clean": "rm -rf .cache",
11
  "build-lodash": "lodash include=get -o js/lodash.custom.js",
12
- "start": "rm -rf js/dist && parcel parcel.urls --out-dir js/dist",
13
- "build": "rm -rf js/dist && parcel build parcel.urls --out-dir js/dist"
14
  },
15
  "private": false,
16
  "dependencies": {
17
  "@babel/runtime": ">=7.7.2",
18
  "babel-plugin-transform-class-properties": "^6.24.1",
19
- "emoji-flags": "matiassingers/emoji-flags#master",
20
- "js-cookie": "^2.2.1"
21
  },
22
  "devDependencies": {
23
  "@babel/core": ">=7.7.2",
24
  "@babel/plugin-transform-runtime": ">=7.6.2",
25
  "babel-plugin-transform-runtime": ">=6.23.0",
26
  "eslint": "^6.6.0",
27
- "lodash-cli": "^4.17.5",
28
  "parcel-bundler": ">=1.12.4",
29
  "parcel-plugin-assets-list": ">=1.7.1"
30
  }
9
  "scripts": {
10
  "clean": "rm -rf .cache",
11
  "build-lodash": "lodash include=get -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
  },
15
  "private": false,
16
  "dependencies": {
17
  "@babel/runtime": ">=7.7.2",
18
  "babel-plugin-transform-class-properties": "^6.24.1",
19
+ "emoji-flags": "matiassingers/emoji-flags#master"
 
20
  },
21
  "devDependencies": {
22
  "@babel/core": ">=7.7.2",
23
  "@babel/plugin-transform-runtime": ">=7.6.2",
24
  "babel-plugin-transform-runtime": ">=6.23.0",
25
  "eslint": "^6.6.0",
26
+ "lodash-cli": ">=4.17.5",
27
  "parcel-bundler": ">=1.12.4",
28
  "parcel-plugin-assets-list": ">=1.7.1"
29
  }
readme.txt CHANGED
@@ -108,6 +108,9 @@ Does `geoip_detect2_get_info_from_current_ip()` return the same country, regardl
108
 
109
  == Upgrade Notice ==
110
 
 
 
 
111
  = 3.0.3.1 =
112
  Hotfix for the Manual download Maxmind datasource.
113
  The Plugin was renamed to Geolocation IP Detection in order to prevent trademark issues.
@@ -150,6 +153,14 @@ New: Shortcode for showing/hiding content!
150
 
151
  == Changelog ==
152
 
 
 
 
 
 
 
 
 
153
  = 3.0.4 =
154
  * When an error occurs during the Cron update of the Maxmind database, it is now shown in the backend.
155
  * FIX: All times shown in the Admin backend now use the timezone set by Wordpress
@@ -195,6 +206,7 @@ https://blog.maxmind.com/2019/12/18/significant-changes-to-accessing-and-using-g
195
  = 2.12.0 =
196
  * NEW: It is now possible to use ipstack.com as a data source.
197
  * The Backend Lookup UI now can show all properties and you can choose if you want to see the PHP, Shortcode or JS syntax.
 
198
 
199
  = 2.11.2 =
200
  * The auto-updater of the Maxmind City Lite source now updates more often (every 1-2weeks) in order to get more accurate data.
108
 
109
  == Upgrade Notice ==
110
 
111
+ = 3.1.0 =
112
+ The property access for shortcodes has been rewritten so that property names such as "extra.original.zip" (Datasource: ipstack) are possible now.
113
+
114
  = 3.0.3.1 =
115
  Hotfix for the Manual download Maxmind datasource.
116
  The Plugin was renamed to Geolocation IP Detection in order to prevent trademark issues.
153
 
154
  == Changelog ==
155
 
156
+ = 3.1.0 =
157
+ * FIX: The property access for shortcodes has been rewritten so that property names such as "extra.original.zip" (Datasource: ipstack) are possible now.
158
+ * FIX: The lookup page now also shows subdivisions (e.g. for IPs from Uk that have 2 levels of subdivisions)
159
+ * NEW: The (CF7) shortcode `[geoip_detect2_countries mycountry include_blank flag tel]` now adds the flag emoji (or ISO code in Windows) and the telephone international code to the country name
160
+ * FIX: AJAX mode: Using localStorage instead of Cookies for caching (as we hit the Cookie size limitation sometimes)
161
+ * FIX: AJAX mode: Remove jQuery dependency
162
+ * FIX: AJAX mode: `geoip_detect2_enqueue_javascript()` can be used now in function.php or templates (see [PHP Example](https://github.com/yellowtree/geoip-detect/wiki/API-Usage-Examples#ajax-enqueue-the-js-file-manually))
163
+
164
  = 3.0.4 =
165
  * When an error occurs during the Cron update of the Maxmind database, it is now shown in the backend.
166
  * FIX: All times shown in the Admin backend now use the timezone set by Wordpress
206
  = 2.12.0 =
207
  * NEW: It is now possible to use ipstack.com as a data source.
208
  * The Backend Lookup UI now can show all properties and you can choose if you want to see the PHP, Shortcode or JS syntax.
209
+ * The property "extra->original" now contains the original Web Answer array from the datasources ipstack & hostinfo
210
 
211
  = 2.11.2 =
212
  * The auto-updater of the Maxmind City Lite source now updates more often (every 1-2weeks) in order to get more accurate data.
shortcode.php CHANGED
@@ -120,6 +120,41 @@ add_shortcode('geoip_detect2', 'geoip_detect2_shortcode');
120
  * @throws \RuntimeException (if Property name invalid)
121
  */
122
  function geoip_detect2_shortcode_get_property($userInfo, $propertyName) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
  $return = '';
124
  $properties = explode('.', $propertyName);
125
  if (count($properties) == 1) {
@@ -147,6 +182,8 @@ function geoip_detect2_shortcode_get_property($userInfo, $propertyName) {
147
  }
148
  return $return;
149
  }
 
 
150
 
151
  function geoip_detect2_shortcode_client_ip() {
152
  $client_ip = geoip_detect2_get_client_ip();
@@ -199,6 +236,9 @@ add_shortcode('geoip_detect2_get_current_source_description', 'geoip_detect2_sho
199
  * @param string $selected Which country to select by default (2-letter ISO code.) (optional. If not set, the country will be detected by client ip.)
200
  * @param string $default Default Value that will be used if country cannot be detected (optional)
201
  * @param string $include_blank If this value contains 'true', a empty value will be prepended ('---', i.e. no country) (optional)
 
 
 
202
  *
203
  * @return string The generated HTML
204
  */
@@ -229,6 +269,22 @@ function geoip_detect2_shortcode_country_select($attr) {
229
  $countryInfo = new YellowTree\GeoipDetect\Geonames\CountryInformation();
230
  $countries = $countryInfo->getAllCountries($locales);
231
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
232
  /**
233
  * Filter: geoip_detect2_shortcode_country_select_countries
234
  * Change the list of countries that should show up in the select box.
@@ -282,6 +338,9 @@ function _geoip_detect_flatten_html_attr($attr) {
282
  * `[geoip_detect2_countries mycountry include_blank]`
283
  * Country names are in the current site language. User can also choose '---' for no country at all.
284
  *
 
 
 
285
  * `[geoip_detect2_countries mycountry "US"]`
286
  * "United States" is preselected, there is no visitor IP detection going on here
287
  *
@@ -311,7 +370,10 @@ function geoip_detect2_shortcode_country_select_wpcf7($tag) {
311
  'lang' => $tag->get_option('lang', '', true),
312
  'selected' => $default,
313
  'default' => $tag->get_option('default', '', true),
 
 
314
  );
 
315
  $html = geoip_detect2_shortcode_country_select($attr);
316
 
317
  $html = sprintf(
@@ -547,7 +609,7 @@ add_shortcode('geoip_detect2_user_info', 'geoip_detect_shortcode_user_info');
547
  * `[geoip_detect2_show_if property="location.timeZone" property_value="Europe/Berlin"]TEXT[/geoip_detect2_show_if]`
548
  *
549
  * Show TEXT if the visitor is in the european union
550
- * `[geoip_detect2_show_if property="country.isInEuropeanUnion" property_value="true"]Products list for EU[/geoip_detect2_show_if]`
551
  *
552
  * LIMITATIONS:
553
  * - You cannot nest several of these shortcodes within one another. Instead, seperate them into several blocks of shortcodes.
120
  * @throws \RuntimeException (if Property name invalid)
121
  */
122
  function geoip_detect2_shortcode_get_property($userInfo, $propertyName) {
123
+ /*
124
+ if (version_compare ( PHP_VERSION, '7.2.5', '<' )) {
125
+ return _deprecated_geoip_detect2_shortcode_get_property($userInfo, $propertyName);
126
+ }
127
+ */
128
+ $propertyAccessor = \Symfony\Component\PropertyAccess\PropertyAccess::createPropertyAccessorBuilder()
129
+ ->enableExceptionOnInvalidIndex()
130
+ ->getPropertyAccessor();
131
+
132
+ if (_geoip_str_begins_with($propertyName, 'extra.original.')) {
133
+ $properties = explode('.', $propertyName);
134
+ $properties = array_slice($properties, 2);
135
+ $propertyName = 'extra.original[' . implode($properties, '][') . ']';
136
+ }
137
+
138
+ // subdivisions.0.isoCode -> subdivisions[0].isoCode
139
+ $propertyName = preg_replace('/\.([0-9])/', '[$1]', $propertyName);
140
+
141
+ try {
142
+ return $propertyAccessor->getValue($userInfo, $propertyName);
143
+ } catch(\Exception $e) {
144
+ throw new \RuntimeException('Invalid property name.');
145
+ }
146
+ }
147
+
148
+ /**
149
+ * Get property from object by string (old version, deprecated)
150
+ * Remove when PHP <= 7.1 not supported anymore (EOL has passed end 2019, but Maxmind lib is still compatible 5.6)
151
+ *
152
+ * @param YellowTree\GeoipDetect\DataSources\City $userInfo GeoIP information object
153
+ * @param string $propertyName property name, e.g. "city.isoCode"
154
+ * @return string|\GeoIp2\Record\AbstractRecord Property Value
155
+ * @throws \RuntimeException (if Property name invalid)
156
+ *
157
+ function _deprecated_geoip_detect2_shortcode_get_property($userInfo, $propertyName) {
158
  $return = '';
159
  $properties = explode('.', $propertyName);
160
  if (count($properties) == 1) {
182
  }
183
  return $return;
184
  }
185
+ */
186
+
187
 
188
  function geoip_detect2_shortcode_client_ip() {
189
  $client_ip = geoip_detect2_get_client_ip();
236
  * @param string $selected Which country to select by default (2-letter ISO code.) (optional. If not set, the country will be detected by client ip.)
237
  * @param string $default Default Value that will be used if country cannot be detected (optional)
238
  * @param string $include_blank If this value contains 'true', a empty value will be prepended ('---', i.e. no country) (optional)
239
+ * @param bool $flag If a flag should be added before the country name (In Windows, there are no flags, ISO-Country codes instead. This is a design choice by Windows.)
240
+ * @param bool $tel If the international code should be added after the country name
241
+
242
  *
243
  * @return string The generated HTML
244
  */
269
  $countryInfo = new YellowTree\GeoipDetect\Geonames\CountryInformation();
270
  $countries = $countryInfo->getAllCountries($locales);
271
 
272
+ if (!empty($attr['flag'])) {
273
+ array_walk($countries, function(&$value, $key) use($countryInfo) {
274
+ $flag = $countryInfo->getFlagEmoji($key);
275
+ $value = $flag . ' ' . $value;
276
+ });
277
+ }
278
+
279
+ if (!empty($attr['tel'])) {
280
+ array_walk($countries, function(&$value, $key) use($countryInfo) {
281
+ $tel = $countryInfo->getTelephonePrefix($key);
282
+ if ($tel) {
283
+ $value = $value . ' (' . $tel . ')';
284
+ }
285
+ });
286
+ }
287
+
288
  /**
289
  * Filter: geoip_detect2_shortcode_country_select_countries
290
  * Change the list of countries that should show up in the select box.
338
  * `[geoip_detect2_countries mycountry include_blank]`
339
  * Country names are in the current site language. User can also choose '---' for no country at all.
340
  *
341
+ * `[geoip_detect2_countries mycountry flag tel]`
342
+ * Country names have a UTF-8 flag in front of the country name, and the (+1) internation phone code after it
343
+ *
344
  * `[geoip_detect2_countries mycountry "US"]`
345
  * "United States" is preselected, there is no visitor IP detection going on here
346
  *
370
  'lang' => $tag->get_option('lang', '', true),
371
  'selected' => $default,
372
  'default' => $tag->get_option('default', '', true),
373
+ 'flag' => $tag->has_option('flag'),
374
+ 'tel' => $tag->has_option('tel'),
375
  );
376
+
377
  $html = geoip_detect2_shortcode_country_select($attr);
378
 
379
  $html = sprintf(
609
  * `[geoip_detect2_show_if property="location.timeZone" property_value="Europe/Berlin"]TEXT[/geoip_detect2_show_if]`
610
  *
611
  * Show TEXT if the visitor is in the european union
612
+ * `[geoip_detect2_show_if property="country.isInEuropeanUnion" property_value="true"]TEXT[/geoip_detect2_show_if]`
613
  *
614
  * LIMITATIONS:
615
  * - You cannot nest several of these shortcodes within one another. Instead, seperate them into several blocks of shortcodes.
vendor/composer/autoload_classmap.php CHANGED
@@ -6,7 +6,11 @@ $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
 
 
9
  'Composer\\CaBundle\\CaBundle' => $vendorDir . '/composer/ca-bundle/src/CaBundle.php',
 
 
10
  'GeoIp2\\Database\\Reader' => $vendorDir . '/geoip2/geoip2/src/Database/Reader.php',
11
  'GeoIp2\\Exception\\AddressNotFoundException' => $vendorDir . '/geoip2/geoip2/src/Exception/AddressNotFoundException.php',
12
  'GeoIp2\\Exception\\AuthenticationException' => $vendorDir . '/geoip2/geoip2/src/Exception/AuthenticationException.php',
@@ -54,4 +58,29 @@ return array(
54
  'MaxMind\\WebService\\Http\\CurlRequest' => $vendorDir . '/maxmind/web-service-common/src/WebService/Http/CurlRequest.php',
55
  'MaxMind\\WebService\\Http\\Request' => $vendorDir . '/maxmind/web-service-common/src/WebService/Http/Request.php',
56
  'MaxMind\\WebService\\Http\\RequestFactory' => $vendorDir . '/maxmind/web-service-common/src/WebService/Http/RequestFactory.php',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
  );
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
+ 'ArithmeticError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
10
+ 'AssertionError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',
11
  'Composer\\CaBundle\\CaBundle' => $vendorDir . '/composer/ca-bundle/src/CaBundle.php',
12
+ 'DivisionByZeroError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php',
13
+ 'Error' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/Error.php',
14
  'GeoIp2\\Database\\Reader' => $vendorDir . '/geoip2/geoip2/src/Database/Reader.php',
15
  'GeoIp2\\Exception\\AddressNotFoundException' => $vendorDir . '/geoip2/geoip2/src/Exception/AddressNotFoundException.php',
16
  'GeoIp2\\Exception\\AuthenticationException' => $vendorDir . '/geoip2/geoip2/src/Exception/AuthenticationException.php',
58
  'MaxMind\\WebService\\Http\\CurlRequest' => $vendorDir . '/maxmind/web-service-common/src/WebService/Http/CurlRequest.php',
59
  'MaxMind\\WebService\\Http\\Request' => $vendorDir . '/maxmind/web-service-common/src/WebService/Http/Request.php',
60
  'MaxMind\\WebService\\Http\\RequestFactory' => $vendorDir . '/maxmind/web-service-common/src/WebService/Http/RequestFactory.php',
61
+ 'ParseError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ParseError.php',
62
+ 'SessionUpdateTimestampHandlerInterface' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php',
63
+ 'Symfony\\Component\\Inflector\\Inflector' => $vendorDir . '/symfony/inflector/Inflector.php',
64
+ 'Symfony\\Component\\PropertyAccess\\Exception\\AccessException' => $vendorDir . '/symfony/property-access/Exception/AccessException.php',
65
+ 'Symfony\\Component\\PropertyAccess\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/property-access/Exception/ExceptionInterface.php',
66
+ 'Symfony\\Component\\PropertyAccess\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/property-access/Exception/InvalidArgumentException.php',
67
+ 'Symfony\\Component\\PropertyAccess\\Exception\\InvalidPropertyPathException' => $vendorDir . '/symfony/property-access/Exception/InvalidPropertyPathException.php',
68
+ 'Symfony\\Component\\PropertyAccess\\Exception\\NoSuchIndexException' => $vendorDir . '/symfony/property-access/Exception/NoSuchIndexException.php',
69
+ 'Symfony\\Component\\PropertyAccess\\Exception\\NoSuchPropertyException' => $vendorDir . '/symfony/property-access/Exception/NoSuchPropertyException.php',
70
+ 'Symfony\\Component\\PropertyAccess\\Exception\\OutOfBoundsException' => $vendorDir . '/symfony/property-access/Exception/OutOfBoundsException.php',
71
+ 'Symfony\\Component\\PropertyAccess\\Exception\\RuntimeException' => $vendorDir . '/symfony/property-access/Exception/RuntimeException.php',
72
+ 'Symfony\\Component\\PropertyAccess\\Exception\\UnexpectedTypeException' => $vendorDir . '/symfony/property-access/Exception/UnexpectedTypeException.php',
73
+ 'Symfony\\Component\\PropertyAccess\\PropertyAccess' => $vendorDir . '/symfony/property-access/PropertyAccess.php',
74
+ 'Symfony\\Component\\PropertyAccess\\PropertyAccessor' => $vendorDir . '/symfony/property-access/PropertyAccessor.php',
75
+ 'Symfony\\Component\\PropertyAccess\\PropertyAccessorBuilder' => $vendorDir . '/symfony/property-access/PropertyAccessorBuilder.php',
76
+ 'Symfony\\Component\\PropertyAccess\\PropertyAccessorInterface' => $vendorDir . '/symfony/property-access/PropertyAccessorInterface.php',
77
+ 'Symfony\\Component\\PropertyAccess\\PropertyPath' => $vendorDir . '/symfony/property-access/PropertyPath.php',
78
+ 'Symfony\\Component\\PropertyAccess\\PropertyPathBuilder' => $vendorDir . '/symfony/property-access/PropertyPathBuilder.php',
79
+ 'Symfony\\Component\\PropertyAccess\\PropertyPathInterface' => $vendorDir . '/symfony/property-access/PropertyPathInterface.php',
80
+ 'Symfony\\Component\\PropertyAccess\\PropertyPathIterator' => $vendorDir . '/symfony/property-access/PropertyPathIterator.php',
81
+ 'Symfony\\Component\\PropertyAccess\\PropertyPathIteratorInterface' => $vendorDir . '/symfony/property-access/PropertyPathIteratorInterface.php',
82
+ 'Symfony\\Component\\PropertyAccess\\StringUtil' => $vendorDir . '/symfony/property-access/StringUtil.php',
83
+ 'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php',
84
+ 'Symfony\\Polyfill\\Php70\\Php70' => $vendorDir . '/symfony/polyfill-php70/Php70.php',
85
+ 'TypeError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/TypeError.php',
86
  );
vendor/composer/autoload_files.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_files.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
10
+ '023d27dca8066ef29e6739335ea73bad' => $vendorDir . '/symfony/polyfill-php70/bootstrap.php',
11
+ );
vendor/composer/autoload_psr4.php CHANGED
@@ -6,6 +6,10 @@ $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
 
 
 
 
9
  'MaxMind\\WebService\\' => array($vendorDir . '/maxmind/web-service-common/src/WebService'),
10
  'MaxMind\\Exception\\' => array($vendorDir . '/maxmind/web-service-common/src/Exception'),
11
  'MaxMind\\Db\\' => array($vendorDir . '/maxmind-db/reader/src/MaxMind/Db'),
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
+ 'Symfony\\Polyfill\\Php70\\' => array($vendorDir . '/symfony/polyfill-php70'),
10
+ 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
11
+ 'Symfony\\Component\\PropertyAccess\\' => array($vendorDir . '/symfony/property-access'),
12
+ 'Symfony\\Component\\Inflector\\' => array($vendorDir . '/symfony/inflector'),
13
  'MaxMind\\WebService\\' => array($vendorDir . '/maxmind/web-service-common/src/WebService'),
14
  'MaxMind\\Exception\\' => array($vendorDir . '/maxmind/web-service-common/src/Exception'),
15
  'MaxMind\\Db\\' => array($vendorDir . '/maxmind-db/reader/src/MaxMind/Db'),
vendor/composer/autoload_real.php CHANGED
@@ -47,6 +47,24 @@ class ComposerAutoloaderInite354937679ffa734a3f63544e59103dd
47
 
48
  $loader->register(true);
49
 
 
 
 
 
 
 
 
 
 
50
  return $loader;
51
  }
52
  }
 
 
 
 
 
 
 
 
 
47
 
48
  $loader->register(true);
49
 
50
+ if ($useStaticLoader) {
51
+ $includeFiles = Composer\Autoload\ComposerStaticInite354937679ffa734a3f63544e59103dd::$files;
52
+ } else {
53
+ $includeFiles = require __DIR__ . '/autoload_files.php';
54
+ }
55
+ foreach ($includeFiles as $fileIdentifier => $file) {
56
+ composerRequiree354937679ffa734a3f63544e59103dd($fileIdentifier, $file);
57
+ }
58
+
59
  return $loader;
60
  }
61
  }
62
+
63
+ function composerRequiree354937679ffa734a3f63544e59103dd($fileIdentifier, $file)
64
+ {
65
+ if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
+ require $file;
67
+
68
+ $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
69
+ }
70
+ }
vendor/composer/autoload_static.php CHANGED
@@ -6,7 +6,19 @@ namespace Composer\Autoload;
6
 
7
  class ComposerStaticInite354937679ffa734a3f63544e59103dd
8
  {
 
 
 
 
 
9
  public static $prefixLengthsPsr4 = array (
 
 
 
 
 
 
 
10
  'M' =>
11
  array (
12
  'MaxMind\\WebService\\' => 19,
@@ -24,6 +36,22 @@ class ComposerStaticInite354937679ffa734a3f63544e59103dd
24
  );
25
 
26
  public static $prefixDirsPsr4 = array (
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  'MaxMind\\WebService\\' =>
28
  array (
29
  0 => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService',
@@ -47,7 +75,11 @@ class ComposerStaticInite354937679ffa734a3f63544e59103dd
47
  );
48
 
49
  public static $classMap = array (
 
 
50
  'Composer\\CaBundle\\CaBundle' => __DIR__ . '/..' . '/composer/ca-bundle/src/CaBundle.php',
 
 
51
  'GeoIp2\\Database\\Reader' => __DIR__ . '/..' . '/geoip2/geoip2/src/Database/Reader.php',
52
  'GeoIp2\\Exception\\AddressNotFoundException' => __DIR__ . '/..' . '/geoip2/geoip2/src/Exception/AddressNotFoundException.php',
53
  'GeoIp2\\Exception\\AuthenticationException' => __DIR__ . '/..' . '/geoip2/geoip2/src/Exception/AuthenticationException.php',
@@ -95,6 +127,31 @@ class ComposerStaticInite354937679ffa734a3f63544e59103dd
95
  'MaxMind\\WebService\\Http\\CurlRequest' => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService/Http/CurlRequest.php',
96
  'MaxMind\\WebService\\Http\\Request' => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService/Http/Request.php',
97
  'MaxMind\\WebService\\Http\\RequestFactory' => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService/Http/RequestFactory.php',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
  );
99
 
100
  public static function getInitializer(ClassLoader $loader)
6
 
7
  class ComposerStaticInite354937679ffa734a3f63544e59103dd
8
  {
9
+ public static $files = array (
10
+ '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
11
+ '023d27dca8066ef29e6739335ea73bad' => __DIR__ . '/..' . '/symfony/polyfill-php70/bootstrap.php',
12
+ );
13
+
14
  public static $prefixLengthsPsr4 = array (
15
+ 'S' =>
16
+ array (
17
+ 'Symfony\\Polyfill\\Php70\\' => 23,
18
+ 'Symfony\\Polyfill\\Ctype\\' => 23,
19
+ 'Symfony\\Component\\PropertyAccess\\' => 33,
20
+ 'Symfony\\Component\\Inflector\\' => 28,
21
+ ),
22
  'M' =>
23
  array (
24
  'MaxMind\\WebService\\' => 19,
36
  );
37
 
38
  public static $prefixDirsPsr4 = array (
39
+ 'Symfony\\Polyfill\\Php70\\' =>
40
+ array (
41
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-php70',
42
+ ),
43
+ 'Symfony\\Polyfill\\Ctype\\' =>
44
+ array (
45
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
46
+ ),
47
+ 'Symfony\\Component\\PropertyAccess\\' =>
48
+ array (
49
+ 0 => __DIR__ . '/..' . '/symfony/property-access',
50
+ ),
51
+ 'Symfony\\Component\\Inflector\\' =>
52
+ array (
53
+ 0 => __DIR__ . '/..' . '/symfony/inflector',
54
+ ),
55
  'MaxMind\\WebService\\' =>
56
  array (
57
  0 => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService',
75
  );
76
 
77
  public static $classMap = array (
78
+ 'ArithmeticError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
79
+ 'AssertionError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',
80
  'Composer\\CaBundle\\CaBundle' => __DIR__ . '/..' . '/composer/ca-bundle/src/CaBundle.php',
81
+ 'DivisionByZeroError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php',
82
+ 'Error' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/Error.php',
83
  'GeoIp2\\Database\\Reader' => __DIR__ . '/..' . '/geoip2/geoip2/src/Database/Reader.php',
84
  'GeoIp2\\Exception\\AddressNotFoundException' => __DIR__ . '/..' . '/geoip2/geoip2/src/Exception/AddressNotFoundException.php',
85
  'GeoIp2\\Exception\\AuthenticationException' => __DIR__ . '/..' . '/geoip2/geoip2/src/Exception/AuthenticationException.php',
127
  'MaxMind\\WebService\\Http\\CurlRequest' => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService/Http/CurlRequest.php',
128
  'MaxMind\\WebService\\Http\\Request' => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService/Http/Request.php',
129
  'MaxMind\\WebService\\Http\\RequestFactory' => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService/Http/RequestFactory.php',
130
+ 'ParseError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ParseError.php',
131
+ 'SessionUpdateTimestampHandlerInterface' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php',
132
+ 'Symfony\\Component\\Inflector\\Inflector' => __DIR__ . '/..' . '/symfony/inflector/Inflector.php',
133
+ 'Symfony\\Component\\PropertyAccess\\Exception\\AccessException' => __DIR__ . '/..' . '/symfony/property-access/Exception/AccessException.php',
134
+ 'Symfony\\Component\\PropertyAccess\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/property-access/Exception/ExceptionInterface.php',
135
+ 'Symfony\\Component\\PropertyAccess\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/property-access/Exception/InvalidArgumentException.php',
136
+ 'Symfony\\Component\\PropertyAccess\\Exception\\InvalidPropertyPathException' => __DIR__ . '/..' . '/symfony/property-access/Exception/InvalidPropertyPathException.php',
137
+ 'Symfony\\Component\\PropertyAccess\\Exception\\NoSuchIndexException' => __DIR__ . '/..' . '/symfony/property-access/Exception/NoSuchIndexException.php',
138
+ 'Symfony\\Component\\PropertyAccess\\Exception\\NoSuchPropertyException' => __DIR__ . '/..' . '/symfony/property-access/Exception/NoSuchPropertyException.php',
139
+ 'Symfony\\Component\\PropertyAccess\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/symfony/property-access/Exception/OutOfBoundsException.php',
140
+ 'Symfony\\Component\\PropertyAccess\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/property-access/Exception/RuntimeException.php',
141
+ 'Symfony\\Component\\PropertyAccess\\Exception\\UnexpectedTypeException' => __DIR__ . '/..' . '/symfony/property-access/Exception/UnexpectedTypeException.php',
142
+ 'Symfony\\Component\\PropertyAccess\\PropertyAccess' => __DIR__ . '/..' . '/symfony/property-access/PropertyAccess.php',
143
+ 'Symfony\\Component\\PropertyAccess\\PropertyAccessor' => __DIR__ . '/..' . '/symfony/property-access/PropertyAccessor.php',
144
+ 'Symfony\\Component\\PropertyAccess\\PropertyAccessorBuilder' => __DIR__ . '/..' . '/symfony/property-access/PropertyAccessorBuilder.php',
145
+ 'Symfony\\Component\\PropertyAccess\\PropertyAccessorInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyAccessorInterface.php',
146
+ 'Symfony\\Component\\PropertyAccess\\PropertyPath' => __DIR__ . '/..' . '/symfony/property-access/PropertyPath.php',
147
+ 'Symfony\\Component\\PropertyAccess\\PropertyPathBuilder' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathBuilder.php',
148
+ 'Symfony\\Component\\PropertyAccess\\PropertyPathInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathInterface.php',
149
+ 'Symfony\\Component\\PropertyAccess\\PropertyPathIterator' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathIterator.php',
150
+ 'Symfony\\Component\\PropertyAccess\\PropertyPathIteratorInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathIteratorInterface.php',
151
+ 'Symfony\\Component\\PropertyAccess\\StringUtil' => __DIR__ . '/..' . '/symfony/property-access/StringUtil.php',
152
+ 'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php',
153
+ 'Symfony\\Polyfill\\Php70\\Php70' => __DIR__ . '/..' . '/symfony/polyfill-php70/Php70.php',
154
+ 'TypeError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/TypeError.php',
155
  );
156
 
157
  public static function getInitializer(ClassLoader $loader)
vendor/composer/installed.json CHANGED
@@ -217,5 +217,311 @@
217
  ],
218
  "description": "Internal MaxMind Web Service API",
219
  "homepage": "https://github.com/maxmind/web-service-common-php"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
220
  }
221
  ]
217
  ],
218
  "description": "Internal MaxMind Web Service API",
219
  "homepage": "https://github.com/maxmind/web-service-common-php"
220
+ },
221
+ {
222
+ "name": "paragonie/random_compat",
223
+ "version": "v9.99.99",
224
+ "version_normalized": "9.99.99.0",
225
+ "source": {
226
+ "type": "git",
227
+ "url": "https://github.com/paragonie/random_compat.git",
228
+ "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95"
229
+ },
230
+ "dist": {
231
+ "type": "zip",
232
+ "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
233
+ "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
234
+ "shasum": ""
235
+ },
236
+ "require": {
237
+ "php": "^7"
238
+ },
239
+ "require-dev": {
240
+ "phpunit/phpunit": "4.*|5.*",
241
+ "vimeo/psalm": "^1"
242
+ },
243
+ "suggest": {
244
+ "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
245
+ },
246
+ "time": "2018-07-02T15:55:56+00:00",
247
+ "type": "library",
248
+ "installation-source": "dist",
249
+ "notification-url": "https://packagist.org/downloads/",
250
+ "license": [
251
+ "MIT"
252
+ ],
253
+ "authors": [
254
+ {
255
+ "name": "Paragon Initiative Enterprises",
256
+ "email": "security@paragonie.com",
257
+ "homepage": "https://paragonie.com"
258
+ }
259
+ ],
260
+ "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
261
+ "keywords": [
262
+ "csprng",
263
+ "polyfill",
264
+ "pseudorandom",
265
+ "random"
266
+ ]
267
+ },
268
+ {
269
+ "name": "symfony/inflector",
270
+ "version": "v4.4.10",
271
+ "version_normalized": "4.4.10.0",
272
+ "source": {
273
+ "type": "git",
274
+ "url": "https://github.com/symfony/inflector.git",
275
+ "reference": "3330be44724db42f0aa493002ae63f5d29f8d5f7"
276
+ },
277
+ "dist": {
278
+ "type": "zip",
279
+ "url": "https://api.github.com/repos/symfony/inflector/zipball/3330be44724db42f0aa493002ae63f5d29f8d5f7",
280
+ "reference": "3330be44724db42f0aa493002ae63f5d29f8d5f7",
281
+ "shasum": ""
282
+ },
283
+ "require": {
284
+ "php": ">=7.1.3",
285
+ "symfony/polyfill-ctype": "~1.8"
286
+ },
287
+ "time": "2020-05-20T08:37:50+00:00",
288
+ "type": "library",
289
+ "extra": {
290
+ "branch-alias": {
291
+ "dev-master": "4.4-dev"
292
+ }
293
+ },
294
+ "installation-source": "dist",
295
+ "autoload": {
296
+ "psr-4": {
297
+ "Symfony\\Component\\Inflector\\": ""
298
+ },
299
+ "exclude-from-classmap": [
300
+ "/Tests/"
301
+ ]
302
+ },
303
+ "notification-url": "https://packagist.org/downloads/",
304
+ "license": [
305
+ "MIT"
306
+ ],
307
+ "authors": [
308
+ {
309
+ "name": "Bernhard Schussek",
310
+ "email": "bschussek@gmail.com"
311
+ },
312
+ {
313
+ "name": "Symfony Community",
314
+ "homepage": "https://symfony.com/contributors"
315
+ }
316
+ ],
317
+ "description": "Symfony Inflector Component",
318
+ "homepage": "https://symfony.com",
319
+ "keywords": [
320
+ "inflection",
321
+ "pluralize",
322
+ "singularize",
323
+ "string",
324
+ "symfony",
325
+ "words"
326
+ ]
327
+ },
328
+ {
329
+ "name": "symfony/polyfill-ctype",
330
+ "version": "v1.17.1",
331
+ "version_normalized": "1.17.1.0",
332
+ "source": {
333
+ "type": "git",
334
+ "url": "https://github.com/symfony/polyfill-ctype.git",
335
+ "reference": "2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d"
336
+ },
337
+ "dist": {
338
+ "type": "zip",
339
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d",
340
+ "reference": "2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d",
341
+ "shasum": ""
342
+ },
343
+ "require": {
344
+ "php": ">=5.3.3"
345
+ },
346
+ "suggest": {
347
+ "ext-ctype": "For best performance"
348
+ },
349
+ "time": "2020-06-06T08:46:27+00:00",
350
+ "type": "library",
351
+ "extra": {
352
+ "branch-alias": {
353
+ "dev-master": "1.17-dev"
354
+ },
355
+ "thanks": {
356
+ "name": "symfony/polyfill",
357
+ "url": "https://github.com/symfony/polyfill"
358
+ }
359
+ },
360
+ "installation-source": "dist",
361
+ "autoload": {
362
+ "psr-4": {
363
+ "Symfony\\Polyfill\\Ctype\\": ""
364
+ },
365
+ "files": [
366
+ "bootstrap.php"
367
+ ]
368
+ },
369
+ "notification-url": "https://packagist.org/downloads/",
370
+ "license": [
371
+ "MIT"
372
+ ],
373
+ "authors": [
374
+ {
375
+ "name": "Gert de Pagter",
376
+ "email": "BackEndTea@gmail.com"
377
+ },
378
+ {
379
+ "name": "Symfony Community",
380
+ "homepage": "https://symfony.com/contributors"
381
+ }
382
+ ],
383
+ "description": "Symfony polyfill for ctype functions",
384
+ "homepage": "https://symfony.com",
385
+ "keywords": [
386
+ "compatibility",
387
+ "ctype",
388
+ "polyfill",
389
+ "portable"
390
+ ]
391
+ },
392
+ {
393
+ "name": "symfony/polyfill-php70",
394
+ "version": "v1.17.1",
395
+ "version_normalized": "1.17.1.0",
396
+ "source": {
397
+ "type": "git",
398
+ "url": "https://github.com/symfony/polyfill-php70.git",
399
+ "reference": "471b096aede7025bace8eb356b9ac801aaba7e2d"
400
+ },
401
+ "dist": {
402
+ "type": "zip",
403
+ "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/471b096aede7025bace8eb356b9ac801aaba7e2d",
404
+ "reference": "471b096aede7025bace8eb356b9ac801aaba7e2d",
405
+ "shasum": ""
406
+ },
407
+ "require": {
408
+ "paragonie/random_compat": "~1.0|~2.0|~9.99",
409
+ "php": ">=5.3.3"
410
+ },
411
+ "time": "2020-06-06T08:46:27+00:00",
412
+ "type": "library",
413
+ "extra": {
414
+ "branch-alias": {
415
+ "dev-master": "1.17-dev"
416
+ },
417
+ "thanks": {
418
+ "name": "symfony/polyfill",
419
+ "url": "https://github.com/symfony/polyfill"
420
+ }
421
+ },
422
+ "installation-source": "dist",
423
+ "autoload": {
424
+ "psr-4": {
425
+ "Symfony\\Polyfill\\Php70\\": ""
426
+ },
427
+ "files": [
428
+ "bootstrap.php"
429
+ ],
430
+ "classmap": [
431
+ "Resources/stubs"
432
+ ]
433
+ },
434
+ "notification-url": "https://packagist.org/downloads/",
435
+ "license": [
436
+ "MIT"
437
+ ],
438
+ "authors": [
439
+ {
440
+ "name": "Nicolas Grekas",
441
+ "email": "p@tchwork.com"
442
+ },
443
+ {
444
+ "name": "Symfony Community",
445
+ "homepage": "https://symfony.com/contributors"
446
+ }
447
+ ],
448
+ "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
449
+ "homepage": "https://symfony.com",
450
+ "keywords": [
451
+ "compatibility",
452
+ "polyfill",
453
+ "portable",
454
+ "shim"
455
+ ]
456
+ },
457
+ {
458
+ "name": "symfony/property-access",
459
+ "version": "v3.4.42",
460
+ "version_normalized": "3.4.42.0",
461
+ "source": {
462
+ "type": "git",
463
+ "url": "https://github.com/symfony/property-access.git",
464
+ "reference": "e1a6c91c0007e45bc1beba929c76548ca9fe8a85"
465
+ },
466
+ "dist": {
467
+ "type": "zip",
468
+ "url": "https://api.github.com/repos/symfony/property-access/zipball/e1a6c91c0007e45bc1beba929c76548ca9fe8a85",
469
+ "reference": "e1a6c91c0007e45bc1beba929c76548ca9fe8a85",
470
+ "shasum": ""
471
+ },
472
+ "require": {
473
+ "php": "^5.5.9|>=7.0.8",
474
+ "symfony/inflector": "~3.1|~4.0",
475
+ "symfony/polyfill-php70": "~1.0"
476
+ },
477
+ "require-dev": {
478
+ "symfony/cache": "~3.1|~4.0"
479
+ },
480
+ "suggest": {
481
+ "psr/cache-implementation": "To cache access methods."
482
+ },
483
+ "time": "2020-05-29T00:04:36+00:00",
484
+ "type": "library",
485
+ "extra": {
486
+ "branch-alias": {
487
+ "dev-master": "3.4-dev"
488
+ }
489
+ },
490
+ "installation-source": "dist",
491
+ "autoload": {
492
+ "psr-4": {
493
+ "Symfony\\Component\\PropertyAccess\\": ""
494
+ },
495
+ "exclude-from-classmap": [
496
+ "/Tests/"
497
+ ]
498
+ },
499
+ "notification-url": "https://packagist.org/downloads/",
500
+ "license": [
501
+ "MIT"
502
+ ],
503
+ "authors": [
504
+ {
505
+ "name": "Fabien Potencier",
506
+ "email": "fabien@symfony.com"
507
+ },
508
+ {
509
+ "name": "Symfony Community",
510
+ "homepage": "https://symfony.com/contributors"
511
+ }
512
+ ],
513
+ "description": "Symfony PropertyAccess Component",
514
+ "homepage": "https://symfony.com",
515
+ "keywords": [
516
+ "access",
517
+ "array",
518
+ "extraction",
519
+ "index",
520
+ "injection",
521
+ "object",
522
+ "property",
523
+ "property path",
524
+ "reflection"
525
+ ]
526
  }
527
  ]
vendor/paragonie/random_compat/LICENSE ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Paragon Initiative Enterprises
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
vendor/paragonie/random_compat/build-phar.sh ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+
3
+ basedir=$( dirname $( readlink -f ${BASH_SOURCE[0]} ) )
4
+
5
+ php -dphar.readonly=0 "$basedir/other/build_phar.php" $*
vendor/paragonie/random_compat/composer.json ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "paragonie/random_compat",
3
+ "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
4
+ "keywords": [
5
+ "csprng",
6
+ "random",
7
+ "polyfill",
8
+ "pseudorandom"
9
+ ],
10
+ "license": "MIT",
11
+ "type": "library",
12
+ "authors": [
13
+ {
14
+ "name": "Paragon Initiative Enterprises",
15
+ "email": "security@paragonie.com",
16
+ "homepage": "https://paragonie.com"
17
+ }
18
+ ],
19
+ "support": {
20
+ "issues": "https://github.com/paragonie/random_compat/issues",
21
+ "email": "info@paragonie.com",
22
+ "source": "https://github.com/paragonie/random_compat"
23
+ },
24
+ "require": {
25
+ "php": "^7"
26
+ },
27
+ "require-dev": {
28
+ "vimeo/psalm": "^1",
29
+ "phpunit/phpunit": "4.*|5.*"
30
+ },
31
+ "suggest": {
32
+ "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
33
+ }
34
+ }
vendor/paragonie/random_compat/dist/random_compat.phar.pubkey ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ -----BEGIN PUBLIC KEY-----
2
+ MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEd+wCqJDrx5B4OldM0dQE0ZMX+lx1ZWm
3
+ pui0SUqD4G29L3NGsz9UhJ/0HjBdbnkhIK5xviT0X5vtjacF6ajgcCArbTB+ds+p
4
+ +h7Q084NuSuIpNb6YPfoUFgC/CL9kAoc
5
+ -----END PUBLIC KEY-----
vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ -----BEGIN PGP SIGNATURE-----
2
+ Version: GnuPG v2.0.22 (MingW32)
3
+
4
+ iQEcBAABAgAGBQJWtW1hAAoJEGuXocKCZATaJf0H+wbZGgskK1dcRTsuVJl9IWip
5
+ QwGw/qIKI280SD6/ckoUMxKDCJiFuPR14zmqnS36k7N5UNPnpdTJTS8T11jttSpg
6
+ 1LCmgpbEIpgaTah+cELDqFCav99fS+bEiAL5lWDAHBTE/XPjGVCqeehyPYref4IW
7
+ NDBIEsvnHPHPLsn6X5jq4+Yj5oUixgxaMPiR+bcO4Sh+RzOVB6i2D0upWfRXBFXA
8
+ NNnsg9/zjvoC7ZW73y9uSH+dPJTt/Vgfeiv52/v41XliyzbUyLalf02GNPY+9goV
9
+ JHG1ulEEBJOCiUD9cE1PUIJwHA/HqyhHIvV350YoEFiHl8iSwm7SiZu5kPjaq74=
10
+ =B6+8
11
+ -----END PGP SIGNATURE-----
vendor/paragonie/random_compat/lib/random.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Random_* Compatibility Library
4
+ * for using the new PHP 7 random_* API in PHP 5 projects
5
+ *
6
+ * @version 2.99.99
7
+ * @released 2018-06-06
8
+ *
9
+ * The MIT License (MIT)
10
+ *
11
+ * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
12
+ *
13
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
14
+ * of this software and associated documentation files (the "Software"), to deal
15
+ * in the Software without restriction, including without limitation the rights
16
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17
+ * copies of the Software, and to permit persons to whom the Software is
18
+ * furnished to do so, subject to the following conditions:
19
+ *
20
+ * The above copyright notice and this permission notice shall be included in
21
+ * all copies or substantial portions of the Software.
22
+ *
23
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
+ * SOFTWARE.
30
+ */
31
+
32
+ // NOP
vendor/paragonie/random_compat/other/build_phar.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $dist = dirname(__DIR__).'/dist';
3
+ if (!is_dir($dist)) {
4
+ mkdir($dist, 0755);
5
+ }
6
+ if (file_exists($dist.'/random_compat.phar')) {
7
+ unlink($dist.'/random_compat.phar');
8
+ }
9
+ $phar = new Phar(
10
+ $dist.'/random_compat.phar',
11
+ FilesystemIterator::CURRENT_AS_FILEINFO | \FilesystemIterator::KEY_AS_FILENAME,
12
+ 'random_compat.phar'
13
+ );
14
+ rename(
15
+ dirname(__DIR__).'/lib/random.php',
16
+ dirname(__DIR__).'/lib/index.php'
17
+ );
18
+ $phar->buildFromDirectory(dirname(__DIR__).'/lib');
19
+ rename(
20
+ dirname(__DIR__).'/lib/index.php',
21
+ dirname(__DIR__).'/lib/random.php'
22
+ );
23
+
24
+ /**
25
+ * If we pass an (optional) path to a private key as a second argument, we will
26
+ * sign the Phar with OpenSSL.
27
+ *
28
+ * If you leave this out, it will produce an unsigned .phar!
29
+ */
30
+ if ($argc > 1) {
31
+ if (!@is_readable($argv[1])) {
32
+ echo 'Could not read the private key file:', $argv[1], "\n";
33
+ exit(255);
34
+ }
35
+ $pkeyFile = file_get_contents($argv[1]);
36
+
37
+ $private = openssl_get_privatekey($pkeyFile);
38
+ if ($private !== false) {
39
+ $pkey = '';
40
+ openssl_pkey_export($private, $pkey);
41
+ $phar->setSignatureAlgorithm(Phar::OPENSSL, $pkey);
42
+
43
+ /**
44
+ * Save the corresponding public key to the file
45
+ */
46
+ if (!@is_readable($dist.'/random_compat.phar.pubkey')) {
47
+ $details = openssl_pkey_get_details($private);
48
+ file_put_contents(
49
+ $dist.'/random_compat.phar.pubkey',
50
+ $details['key']
51
+ );
52
+ }
53
+ } else {
54
+ echo 'An error occurred reading the private key from OpenSSL.', "\n";
55
+ exit(255);
56
+ }
57
+ }
vendor/paragonie/random_compat/psalm-autoload.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ require_once 'lib/byte_safe_strings.php';
4
+ require_once 'lib/cast_to_int.php';
5
+ require_once 'lib/error_polyfill.php';
6
+ require_once 'other/ide_stubs/libsodium.php';
7
+ require_once 'lib/random.php';
8
+
9
+ $int = random_int(0, 65536);
vendor/paragonie/random_compat/psalm.xml ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <psalm
3
+ autoloader="psalm-autoload.php"
4
+ stopOnFirstError="false"
5
+ useDocblockTypes="true"
6
+ >
7
+ <projectFiles>
8
+ <directory name="lib" />
9
+ </projectFiles>
10
+ <issueHandlers>
11
+ <RedundantConditionGivenDocblockType errorLevel="info" />
12
+ <UnresolvableInclude errorLevel="info" />
13
+ <DuplicateClass errorLevel="info" />
14
+ <InvalidOperand errorLevel="info" />
15
+ <UndefinedConstant errorLevel="info" />
16
+ <MissingReturnType errorLevel="info" />
17
+ <InvalidReturnType errorLevel="info" />
18
+ </issueHandlers>
19
+ </psalm>
vendor/symfony/inflector/Inflector.php ADDED
@@ -0,0 +1,503 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Inflector;
13
+
14
+ /**
15
+ * Converts words between singular and plural forms.
16
+ *
17
+ * @author Bernhard Schussek <bschussek@gmail.com>
18
+ */
19
+ final class Inflector
20
+ {
21
+ /**
22
+ * Map English plural to singular suffixes.
23
+ *
24
+ * @see http://english-zone.com/spelling/plurals.html
25
+ */
26
+ private static $pluralMap = [
27
+ // First entry: plural suffix, reversed
28
+ // Second entry: length of plural suffix
29
+ // Third entry: Whether the suffix may succeed a vocal
30
+ // Fourth entry: Whether the suffix may succeed a consonant
31
+ // Fifth entry: singular suffix, normal
32
+
33
+ // bacteria (bacterium), criteria (criterion), phenomena (phenomenon)
34
+ ['a', 1, true, true, ['on', 'um']],
35
+
36
+ // nebulae (nebula)
37
+ ['ea', 2, true, true, 'a'],
38
+
39
+ // services (service)
40
+ ['secivres', 8, true, true, 'service'],
41
+
42
+ // mice (mouse), lice (louse)
43
+ ['eci', 3, false, true, 'ouse'],
44
+
45
+ // geese (goose)
46
+ ['esee', 4, false, true, 'oose'],
47
+
48
+ // fungi (fungus), alumni (alumnus), syllabi (syllabus), radii (radius)
49
+ ['i', 1, true, true, 'us'],
50
+
51
+ // men (man), women (woman)
52
+ ['nem', 3, true, true, 'man'],
53
+
54
+ // children (child)
55
+ ['nerdlihc', 8, true, true, 'child'],
56
+
57
+ // oxen (ox)
58
+ ['nexo', 4, false, false, 'ox'],
59
+
60
+ // indices (index), appendices (appendix), prices (price)
61
+ ['seci', 4, false, true, ['ex', 'ix', 'ice']],
62
+
63
+ // selfies (selfie)
64
+ ['seifles', 7, true, true, 'selfie'],
65
+
66
+ // movies (movie)
67
+ ['seivom', 6, true, true, 'movie'],
68
+
69
+ // feet (foot)
70
+ ['teef', 4, true, true, 'foot'],
71
+
72
+ // geese (goose)
73
+ ['eseeg', 5, true, true, 'goose'],
74
+
75
+ // teeth (tooth)
76
+ ['hteet', 5, true, true, 'tooth'],
77
+
78
+ // news (news)
79
+ ['swen', 4, true, true, 'news'],
80
+
81
+ // series (series)
82
+ ['seires', 6, true, true, 'series'],
83
+
84
+ // babies (baby)
85
+ ['sei', 3, false, true, 'y'],
86
+
87
+ // accesses (access), addresses (address), kisses (kiss)
88
+ ['sess', 4, true, false, 'ss'],
89
+
90
+ // analyses (analysis), ellipses (ellipsis), fungi (fungus),
91
+ // neuroses (neurosis), theses (thesis), emphases (emphasis),
92
+ // oases (oasis), crises (crisis), houses (house), bases (base),
93
+ // atlases (atlas)
94
+ ['ses', 3, true, true, ['s', 'se', 'sis']],
95
+
96
+ // objectives (objective), alternative (alternatives)
97
+ ['sevit', 5, true, true, 'tive'],
98
+
99
+ // drives (drive)
100
+ ['sevird', 6, false, true, 'drive'],
101
+
102
+ // lives (life), wives (wife)
103
+ ['sevi', 4, false, true, 'ife'],
104
+
105
+ // moves (move)
106
+ ['sevom', 5, true, true, 'move'],
107
+
108
+ // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf), caves (cave), staves (staff)
109
+ ['sev', 3, true, true, ['f', 've', 'ff']],
110
+
111
+ // axes (axis), axes (ax), axes (axe)
112
+ ['sexa', 4, false, false, ['ax', 'axe', 'axis']],
113
+
114
+ // indexes (index), matrixes (matrix)
115
+ ['sex', 3, true, false, 'x'],
116
+
117
+ // quizzes (quiz)
118
+ ['sezz', 4, true, false, 'z'],
119
+
120
+ // bureaus (bureau)
121
+ ['suae', 4, false, true, 'eau'],
122
+
123
+ // fees (fee), trees (tree), employees (employee)
124
+ ['see', 3, true, true, 'ee'],
125
+
126
+ // roses (rose), garages (garage), cassettes (cassette),
127
+ // waltzes (waltz), heroes (hero), bushes (bush), arches (arch),
128
+ // shoes (shoe)
129
+ ['se', 2, true, true, ['', 'e']],
130
+
131
+ // tags (tag)
132
+ ['s', 1, true, true, ''],
133
+
134
+ // chateaux (chateau)
135
+ ['xuae', 4, false, true, 'eau'],
136
+
137
+ // people (person)
138
+ ['elpoep', 6, true, true, 'person'],
139
+ ];
140
+
141
+ /**
142
+ * Map English singular to plural suffixes.
143
+ *
144
+ * @see http://english-zone.com/spelling/plurals.html
145
+ */
146
+ private static $singularMap = [
147
+ // First entry: singular suffix, reversed
148
+ // Second entry: length of singular suffix
149
+ // Third entry: Whether the suffix may succeed a vocal
150
+ // Fourth entry: Whether the suffix may succeed a consonant
151
+ // Fifth entry: plural suffix, normal
152
+
153
+ // criterion (criteria)
154
+ ['airetirc', 8, false, false, 'criterion'],
155
+
156
+ // nebulae (nebula)
157
+ ['aluben', 6, false, false, 'nebulae'],
158
+
159
+ // children (child)
160
+ ['dlihc', 5, true, true, 'children'],
161
+
162
+ // prices (price)
163
+ ['eci', 3, false, true, 'ices'],
164
+
165
+ // services (service)
166
+ ['ecivres', 7, true, true, 'services'],
167
+
168
+ // lives (life), wives (wife)
169
+ ['efi', 3, false, true, 'ives'],
170
+
171
+ // selfies (selfie)
172
+ ['eifles', 6, true, true, 'selfies'],
173
+
174
+ // movies (movie)
175
+ ['eivom', 5, true, true, 'movies'],
176
+
177
+ // lice (louse)
178
+ ['esuol', 5, false, true, 'lice'],
179
+
180
+ // mice (mouse)
181
+ ['esuom', 5, false, true, 'mice'],
182
+
183
+ // geese (goose)
184
+ ['esoo', 4, false, true, 'eese'],
185
+
186
+ // houses (house), bases (base)
187
+ ['es', 2, true, true, 'ses'],
188
+
189
+ // geese (goose)
190
+ ['esoog', 5, true, true, 'geese'],
191
+
192
+ // caves (cave)
193
+ ['ev', 2, true, true, 'ves'],
194
+
195
+ // drives (drive)
196
+ ['evird', 5, false, true, 'drives'],
197
+
198
+ // objectives (objective), alternative (alternatives)
199
+ ['evit', 4, true, true, 'tives'],
200
+
201
+ // moves (move)
202
+ ['evom', 4, true, true, 'moves'],
203
+
204
+ // staves (staff)
205
+ ['ffats', 5, true, true, 'staves'],
206
+
207
+ // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf)
208
+ ['ff', 2, true, true, 'ffs'],
209
+
210
+ // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf)
211
+ ['f', 1, true, true, ['fs', 'ves']],
212
+
213
+ // arches (arch)
214
+ ['hc', 2, true, true, 'ches'],
215
+
216
+ // bushes (bush)
217
+ ['hs', 2, true, true, 'shes'],
218
+
219
+ // teeth (tooth)
220
+ ['htoot', 5, true, true, 'teeth'],
221
+
222
+ // bacteria (bacterium), criteria (criterion), phenomena (phenomenon)
223
+ ['mu', 2, true, true, 'a'],
224
+
225
+ // men (man), women (woman)
226
+ ['nam', 3, true, true, 'men'],
227
+
228
+ // people (person)
229
+ ['nosrep', 6, true, true, ['persons', 'people']],
230
+
231
+ // bacteria (bacterium), criteria (criterion), phenomena (phenomenon)
232
+ ['noi', 3, true, true, 'ions'],
233
+
234
+ // seasons (season), treasons (treason), poisons (poison), lessons (lesson)
235
+ ['nos', 3, true, true, 'sons'],
236
+
237
+ // bacteria (bacterium), criteria (criterion), phenomena (phenomenon)
238
+ ['no', 2, true, true, 'a'],
239
+
240
+ // echoes (echo)
241
+ ['ohce', 4, true, true, 'echoes'],
242
+
243
+ // heroes (hero)
244
+ ['oreh', 4, true, true, 'heroes'],
245
+
246
+ // atlases (atlas)
247
+ ['salta', 5, true, true, 'atlases'],
248
+
249
+ // irises (iris)
250
+ ['siri', 4, true, true, 'irises'],
251
+
252
+ // analyses (analysis), ellipses (ellipsis), neuroses (neurosis)
253
+ // theses (thesis), emphases (emphasis), oases (oasis),
254
+ // crises (crisis)
255
+ ['sis', 3, true, true, 'ses'],
256
+
257
+ // accesses (access), addresses (address), kisses (kiss)
258
+ ['ss', 2, true, false, 'sses'],
259
+
260
+ // syllabi (syllabus)
261
+ ['suballys', 8, true, true, 'syllabi'],
262
+
263
+ // buses (bus)
264
+ ['sub', 3, true, true, 'buses'],
265
+
266
+ // circuses (circus)
267
+ ['suc', 3, true, true, 'cuses'],
268
+
269
+ // fungi (fungus), alumni (alumnus), syllabi (syllabus), radii (radius)
270
+ ['su', 2, true, true, 'i'],
271
+
272
+ // news (news)
273
+ ['swen', 4, true, true, 'news'],
274
+
275
+ // feet (foot)
276
+ ['toof', 4, true, true, 'feet'],
277
+
278
+ // chateaux (chateau), bureaus (bureau)
279
+ ['uae', 3, false, true, ['eaus', 'eaux']],
280
+
281
+ // oxen (ox)
282
+ ['xo', 2, false, false, 'oxen'],
283
+
284
+ // hoaxes (hoax)
285
+ ['xaoh', 4, true, false, 'hoaxes'],
286
+
287
+ // indices (index)
288
+ ['xedni', 5, false, true, ['indicies', 'indexes']],
289
+
290
+ // boxes (box)
291
+ ['xo', 2, false, true, 'oxes'],
292
+
293
+ // indexes (index), matrixes (matrix)
294
+ ['x', 1, true, false, ['cies', 'xes']],
295
+
296
+ // appendices (appendix)
297
+ ['xi', 2, false, true, 'ices'],
298
+
299
+ // babies (baby)
300
+ ['y', 1, false, true, 'ies'],
301
+
302
+ // quizzes (quiz)
303
+ ['ziuq', 4, true, false, 'quizzes'],
304
+
305
+ // waltzes (waltz)
306
+ ['z', 1, true, true, 'zes'],
307
+ ];
308
+
309
+ /**
310
+ * A list of words which should not be inflected, reversed.
311
+ */
312
+ private static $uninflected = [
313
+ 'atad',
314
+ 'reed',
315
+ 'kcabdeef',
316
+ 'hsif',
317
+ 'ofni',
318
+ 'esoom',
319
+ 'seires',
320
+ 'peehs',
321
+ 'seiceps',
322
+ ];
323
+
324
+ /**
325
+ * This class should not be instantiated.
326
+ */
327
+ private function __construct()
328
+ {
329
+ }
330
+
331
+ /**
332
+ * Returns the singular form of a word.
333
+ *
334
+ * If the method can't determine the form with certainty, an array of the
335
+ * possible singulars is returned.
336
+ *
337
+ * @param string $plural A word in plural form
338
+ *
339
+ * @return string|array The singular form or an array of possible singular forms
340
+ */
341
+ public static function singularize(string $plural)
342
+ {
343
+ $pluralRev = strrev($plural);
344
+ $lowerPluralRev = strtolower($pluralRev);
345
+ $pluralLength = \strlen($lowerPluralRev);
346
+
347
+ // Check if the word is one which is not inflected, return early if so
348
+ if (\in_array($lowerPluralRev, self::$uninflected, true)) {
349
+ return $plural;
350
+ }
351
+
352
+ // The outer loop iterates over the entries of the plural table
353
+ // The inner loop $j iterates over the characters of the plural suffix
354
+ // in the plural table to compare them with the characters of the actual
355
+ // given plural suffix
356
+ foreach (self::$pluralMap as $map) {
357
+ $suffix = $map[0];
358
+ $suffixLength = $map[1];
359
+ $j = 0;
360
+
361
+ // Compare characters in the plural table and of the suffix of the
362
+ // given plural one by one
363
+ while ($suffix[$j] === $lowerPluralRev[$j]) {
364
+ // Let $j point to the next character
365
+ ++$j;
366
+
367
+ // Successfully compared the last character
368
+ // Add an entry with the singular suffix to the singular array
369
+ if ($j === $suffixLength) {
370
+ // Is there any character preceding the suffix in the plural string?
371
+ if ($j < $pluralLength) {
372
+ $nextIsVocal = false !== strpos('aeiou', $lowerPluralRev[$j]);
373
+
374
+ if (!$map[2] && $nextIsVocal) {
375
+ // suffix may not succeed a vocal but next char is one
376
+ break;
377
+ }
378
+
379
+ if (!$map[3] && !$nextIsVocal) {
380
+ // suffix may not succeed a consonant but next char is one
381
+ break;
382
+ }
383
+ }
384
+
385
+ $newBase = substr($plural, 0, $pluralLength - $suffixLength);
386
+ $newSuffix = $map[4];
387
+
388
+ // Check whether the first character in the plural suffix
389
+ // is uppercased. If yes, uppercase the first character in
390
+ // the singular suffix too
391
+ $firstUpper = ctype_upper($pluralRev[$j - 1]);
392
+
393
+ if (\is_array($newSuffix)) {
394
+ $singulars = [];
395
+
396
+ foreach ($newSuffix as $newSuffixEntry) {
397
+ $singulars[] = $newBase.($firstUpper ? ucfirst($newSuffixEntry) : $newSuffixEntry);
398
+ }
399
+
400
+ return $singulars;
401
+ }
402
+
403
+ return $newBase.($firstUpper ? ucfirst($newSuffix) : $newSuffix);
404
+ }
405
+
406
+ // Suffix is longer than word
407
+ if ($j === $pluralLength) {
408
+ break;
409
+ }
410
+ }
411
+ }
412
+
413
+ // Assume that plural and singular is identical
414
+ return $plural;
415
+ }
416
+
417
+ /**
418
+ * Returns the plural form of a word.
419
+ *
420
+ * If the method can't determine the form with certainty, an array of the
421
+ * possible plurals is returned.
422
+ *
423
+ * @param string $singular A word in singular form
424
+ *
425
+ * @return string|array The plural form or an array of possible plural forms
426
+ */
427
+ public static function pluralize(string $singular)
428
+ {
429
+ $singularRev = strrev($singular);
430
+ $lowerSingularRev = strtolower($singularRev);
431
+ $singularLength = \strlen($lowerSingularRev);
432
+
433
+ // Check if the word is one which is not inflected, return early if so
434
+ if (\in_array($lowerSingularRev, self::$uninflected, true)) {
435
+ return $singular;
436
+ }
437
+
438
+ // The outer loop iterates over the entries of the singular table
439
+ // The inner loop $j iterates over the characters of the singular suffix
440
+ // in the singular table to compare them with the characters of the actual
441
+ // given singular suffix
442
+ foreach (self::$singularMap as $map) {
443
+ $suffix = $map[0];
444
+ $suffixLength = $map[1];
445
+ $j = 0;
446
+
447
+ // Compare characters in the singular table and of the suffix of the
448
+ // given plural one by one
449
+
450
+ while ($suffix[$j] === $lowerSingularRev[$j]) {
451
+ // Let $j point to the next character
452
+ ++$j;
453
+
454
+ // Successfully compared the last character
455
+ // Add an entry with the plural suffix to the plural array
456
+ if ($j === $suffixLength) {
457
+ // Is there any character preceding the suffix in the plural string?
458
+ if ($j < $singularLength) {
459
+ $nextIsVocal = false !== strpos('aeiou', $lowerSingularRev[$j]);
460
+
461
+ if (!$map[2] && $nextIsVocal) {
462
+ // suffix may not succeed a vocal but next char is one
463
+ break;
464
+ }
465
+
466
+ if (!$map[3] && !$nextIsVocal) {
467
+ // suffix may not succeed a consonant but next char is one
468
+ break;
469
+ }
470
+ }
471
+
472
+ $newBase = substr($singular, 0, $singularLength - $suffixLength);
473
+ $newSuffix = $map[4];
474
+
475
+ // Check whether the first character in the singular suffix
476
+ // is uppercased. If yes, uppercase the first character in
477
+ // the singular suffix too
478
+ $firstUpper = ctype_upper($singularRev[$j - 1]);
479
+
480
+ if (\is_array($newSuffix)) {
481
+ $plurals = [];
482
+
483
+ foreach ($newSuffix as $newSuffixEntry) {
484
+ $plurals[] = $newBase.($firstUpper ? ucfirst($newSuffixEntry) : $newSuffixEntry);
485
+ }
486
+
487
+ return $plurals;
488
+ }
489
+
490
+ return $newBase.($firstUpper ? ucfirst($newSuffix) : $newSuffix);
491
+ }
492
+
493
+ // Suffix is longer than word
494
+ if ($j === $singularLength) {
495
+ break;
496
+ }
497
+ }
498
+ }
499
+
500
+ // Assume that plural is singular with a trailing `s`
501
+ return $singular.'s';
502
+ }
503
+ }
vendor/symfony/inflector/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2012-2020 Fabien Potencier
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is furnished
8
+ to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
vendor/symfony/inflector/README.md ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Inflector Component
2
+ ===================
3
+
4
+ Inflector converts words between their singular and plural forms (English only).
5
+
6
+ Resources
7
+ ---------
8
+
9
+ * [Contributing](https://symfony.com/doc/current/contributing/index.html)
10
+ * [Report issues](https://github.com/symfony/symfony/issues) and
11
+ [send Pull Requests](https://github.com/symfony/symfony/pulls)
12
+ in the [main Symfony repository](https://github.com/symfony/symfony)
vendor/symfony/inflector/composer.json ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "symfony/inflector",
3
+ "type": "library",
4
+ "description": "Symfony Inflector Component",
5
+ "keywords": [
6
+ "string",
7
+ "inflection",
8
+ "singularize",
9
+ "pluralize",
10
+ "words",
11
+ "symfony"
12
+ ],
13
+ "homepage": "https://symfony.com",
14
+ "license": "MIT",
15
+ "authors": [
16
+ {
17
+ "name": "Bernhard Schussek",
18
+ "email": "bschussek@gmail.com"
19
+ },
20
+ {
21
+ "name": "Symfony Community",
22
+ "homepage": "https://symfony.com/contributors"
23
+ }
24
+ ],
25
+ "require": {
26
+ "php": ">=7.1.3",
27
+ "symfony/polyfill-ctype": "~1.8"
28
+ },
29
+ "autoload": {
30
+ "psr-4": { "Symfony\\Component\\Inflector\\": "" },
31
+ "exclude-from-classmap": [
32
+ "/Tests/"
33
+ ]
34
+ },
35
+ "minimum-stability": "dev",
36
+ "extra": {
37
+ "branch-alias": {
38
+ "dev-master": "4.4-dev"
39
+ }
40
+ }
41
+ }
vendor/symfony/polyfill-ctype/Ctype.php ADDED
@@ -0,0 +1,227 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Polyfill\Ctype;
13
+
14
+ /**
15
+ * Ctype implementation through regex.
16
+ *
17
+ * @internal
18
+ *
19
+ * @author Gert de Pagter <BackEndTea@gmail.com>
20
+ */
21
+ final class Ctype
22
+ {
23
+ /**
24
+ * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise.
25
+ *
26
+ * @see https://php.net/ctype-alnum
27
+ *
28
+ * @param string|int $text
29
+ *
30
+ * @return bool
31
+ */
32
+ public static function ctype_alnum($text)
33
+ {
34
+ $text = self::convert_int_to_char_for_ctype($text);
35
+
36
+ return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text);
37
+ }
38
+
39
+ /**
40
+ * Returns TRUE if every character in text is a letter, FALSE otherwise.
41
+ *
42
+ * @see https://php.net/ctype-alpha
43
+ *
44
+ * @param string|int $text
45
+ *
46
+ * @return bool
47
+ */
48
+ public static function ctype_alpha($text)
49
+ {
50
+ $text = self::convert_int_to_char_for_ctype($text);
51
+
52
+ return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text);
53
+ }
54
+
55
+ /**
56
+ * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise.
57
+ *
58
+ * @see https://php.net/ctype-cntrl
59
+ *
60
+ * @param string|int $text
61
+ *
62
+ * @return bool
63
+ */
64
+ public static function ctype_cntrl($text)
65
+ {
66
+ $text = self::convert_int_to_char_for_ctype($text);
67
+
68
+ return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text);
69
+ }
70
+
71
+ /**
72
+ * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise.
73
+ *
74
+ * @see https://php.net/ctype-digit
75
+ *
76
+ * @param string|int $text
77
+ *
78
+ * @return bool
79
+ */
80
+ public static function ctype_digit($text)
81
+ {
82
+ $text = self::convert_int_to_char_for_ctype($text);
83
+
84
+ return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text);
85
+ }
86
+
87
+ /**
88
+ * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise.
89
+ *
90
+ * @see https://php.net/ctype-graph
91
+ *
92
+ * @param string|int $text
93
+ *
94
+ * @return bool
95
+ */
96
+ public static function ctype_graph($text)
97
+ {
98
+ $text = self::convert_int_to_char_for_ctype($text);
99
+
100
+ return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text);
101
+ }
102
+
103
+ /**
104
+ * Returns TRUE if every character in text is a lowercase letter.
105
+ *
106
+ * @see https://php.net/ctype-lower
107
+ *
108
+ * @param string|int $text
109
+ *
110
+ * @return bool
111
+ */
112
+ public static function ctype_lower($text)
113
+ {
114
+ $text = self::convert_int_to_char_for_ctype($text);
115
+
116
+ return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text);
117
+ }
118
+
119
+ /**
120
+ * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all.
121
+ *
122
+ * @see https://php.net/ctype-print
123
+ *
124
+ * @param string|int $text
125
+ *
126
+ * @return bool
127
+ */
128
+ public static function ctype_print($text)
129
+ {
130
+ $text = self::convert_int_to_char_for_ctype($text);
131
+
132
+ return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text);
133
+ }
134
+
135
+ /**
136
+ * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise.
137
+ *
138
+ * @see https://php.net/ctype-punct
139
+ *
140
+ * @param string|int $text
141
+ *
142
+ * @return bool
143
+ */
144
+ public static function ctype_punct($text)
145
+ {
146
+ $text = self::convert_int_to_char_for_ctype($text);
147
+
148
+ return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text);
149
+ }
150
+
151
+ /**
152
+ * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters.
153
+ *
154
+ * @see https://php.net/ctype-space
155
+ *
156
+ * @param string|int $text
157
+ *
158
+ * @return bool
159
+ */
160
+ public static function ctype_space($text)
161
+ {
162
+ $text = self::convert_int_to_char_for_ctype($text);
163
+
164
+ return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text);
165
+ }
166
+
167
+ /**
168
+ * Returns TRUE if every character in text is an uppercase letter.
169
+ *
170
+ * @see https://php.net/ctype-upper
171
+ *
172
+ * @param string|int $text
173
+ *
174
+ * @return bool
175
+ */
176
+ public static function ctype_upper($text)
177
+ {
178
+ $text = self::convert_int_to_char_for_ctype($text);
179
+
180
+ return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text);
181
+ }
182
+
183
+ /**
184
+ * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise.
185
+ *
186
+ * @see https://php.net/ctype-xdigit
187
+ *
188
+ * @param string|int $text
189
+ *
190
+ * @return bool
191
+ */
192
+ public static function ctype_xdigit($text)
193
+ {
194
+ $text = self::convert_int_to_char_for_ctype($text);
195
+
196
+ return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text);
197
+ }
198
+
199
+ /**
200
+ * Converts integers to their char versions according to normal ctype behaviour, if needed.
201
+ *
202
+ * If an integer between -128 and 255 inclusive is provided,
203
+ * it is interpreted as the ASCII value of a single character
204
+ * (negative values have 256 added in order to allow characters in the Extended ASCII range).
205
+ * Any other integer is interpreted as a string containing the decimal digits of the integer.
206
+ *
207
+ * @param string|int $int
208
+ *
209
+ * @return mixed
210
+ */
211
+ private static function convert_int_to_char_for_ctype($int)
212
+ {
213
+ if (!\is_int($int)) {
214
+ return $int;
215
+ }
216
+
217
+ if ($int < -128 || $int > 255) {
218
+ return (string) $int;
219
+ }
220
+
221
+ if ($int < 0) {
222
+ $int += 256;
223
+ }
224
+
225
+ return \chr($int);
226
+ }
227
+ }
vendor/symfony/polyfill-ctype/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2018-2019 Fabien Potencier
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is furnished
8
+ to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
vendor/symfony/polyfill-ctype/README.md ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Symfony Polyfill / Ctype
2
+ ========================
3
+
4
+ This component provides `ctype_*` functions to users who run php versions without the ctype extension.
5
+
6
+ More information can be found in the
7
+ [main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
8
+
9
+ License
10
+ =======
11
+
12
+ This library is released under the [MIT license](LICENSE).
vendor/symfony/polyfill-ctype/bootstrap.php ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ use Symfony\Polyfill\Ctype as p;
13
+
14
+ if (!function_exists('ctype_alnum')) {
15
+ function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); }
16
+ }
17
+ if (!function_exists('ctype_alpha')) {
18
+ function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); }
19
+ }
20
+ if (!function_exists('ctype_cntrl')) {
21
+ function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); }
22
+ }
23
+ if (!function_exists('ctype_digit')) {
24
+ function ctype_digit($text) { return p\Ctype::ctype_digit($text); }
25
+ }
26
+ if (!function_exists('ctype_graph')) {
27
+ function ctype_graph($text) { return p\Ctype::ctype_graph($text); }
28
+ }
29
+ if (!function_exists('ctype_lower')) {
30
+ function ctype_lower($text) { return p\Ctype::ctype_lower($text); }
31
+ }
32
+ if (!function_exists('ctype_print')) {
33
+ function ctype_print($text) { return p\Ctype::ctype_print($text); }
34
+ }
35
+ if (!function_exists('ctype_punct')) {
36
+ function ctype_punct($text) { return p\Ctype::ctype_punct($text); }
37
+ }
38
+ if (!function_exists('ctype_space')) {
39
+ function ctype_space($text) { return p\Ctype::ctype_space($text); }
40
+ }
41
+ if (!function_exists('ctype_upper')) {
42
+ function ctype_upper($text) { return p\Ctype::ctype_upper($text); }
43
+ }
44
+ if (!function_exists('ctype_xdigit')) {
45
+ function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); }
46
+ }
vendor/symfony/polyfill-ctype/composer.json ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "symfony/polyfill-ctype",
3
+ "type": "library",
4
+ "description": "Symfony polyfill for ctype functions",
5
+ "keywords": ["polyfill", "compatibility", "portable", "ctype"],
6
+ "homepage": "https://symfony.com",
7
+ "license": "MIT",
8
+ "authors": [
9
+ {
10
+ "name": "Gert de Pagter",
11
+ "email": "BackEndTea@gmail.com"
12
+ },
13
+ {
14
+ "name": "Symfony Community",
15
+ "homepage": "https://symfony.com/contributors"
16
+ }
17
+ ],
18
+ "require": {
19
+ "php": ">=5.3.3"
20
+ },
21
+ "autoload": {
22
+ "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" },
23
+ "files": [ "bootstrap.php" ]
24
+ },
25
+ "suggest": {
26
+ "ext-ctype": "For best performance"
27
+ },
28
+ "minimum-stability": "dev",
29
+ "extra": {
30
+ "branch-alias": {
31
+ "dev-master": "1.17-dev"
32
+ },
33
+ "thanks": {
34
+ "name": "symfony/polyfill",
35
+ "url": "https://github.com/symfony/polyfill"
36
+ }
37
+ }
38
+ }
vendor/symfony/polyfill-php70/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2015-2019 Fabien Potencier
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is furnished
8
+ to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
vendor/symfony/polyfill-php70/Php70.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Polyfill\Php70;
13
+
14
+ /**
15
+ * @author Nicolas Grekas <p@tchwork.com>
16
+ *
17
+ * @internal
18
+ */
19
+ final class Php70
20
+ {
21
+ public static function intdiv($dividend, $divisor)
22
+ {
23
+ $dividend = self::intArg($dividend, __FUNCTION__, 1);
24
+ $divisor = self::intArg($divisor, __FUNCTION__, 2);
25
+
26
+ if (0 === $divisor) {
27
+ throw new \DivisionByZeroError('Division by zero');
28
+ }
29
+ if (-1 === $divisor && ~PHP_INT_MAX === $dividend) {
30
+ throw new \ArithmeticError('Division of PHP_INT_MIN by -1 is not an integer');
31
+ }
32
+
33
+ return ($dividend - ($dividend % $divisor)) / $divisor;
34
+ }
35
+
36
+ public static function preg_replace_callback_array(array $patterns, $subject, $limit = -1, &$count = 0)
37
+ {
38
+ $count = 0;
39
+ $result = (string) $subject;
40
+ if (0 === $limit = self::intArg($limit, __FUNCTION__, 3)) {
41
+ return $result;
42
+ }
43
+
44
+ foreach ($patterns as $pattern => $callback) {
45
+ $result = preg_replace_callback($pattern, $callback, $result, $limit, $c);
46
+ $count += $c;
47
+ }
48
+
49
+ return $result;
50
+ }
51
+
52
+ public static function error_clear_last()
53
+ {
54
+ static $handler;
55
+ if (!$handler) {
56
+ $handler = function () { return false; };
57
+ }
58
+ set_error_handler($handler);
59
+ @trigger_error('');
60
+ restore_error_handler();
61
+ }
62
+
63
+ private static function intArg($value, $caller, $pos)
64
+ {
65
+ if (\is_int($value)) {
66
+ return $value;
67
+ }
68
+ if (!\is_numeric($value) || PHP_INT_MAX <= ($value += 0) || ~PHP_INT_MAX >= $value) {
69
+ throw new \TypeError(sprintf('%s() expects parameter %d to be integer, %s given', $caller, $pos, \gettype($value)));
70
+ }
71
+
72
+ return (int) $value;
73
+ }
74
+ }
vendor/symfony/polyfill-php70/README.md ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Symfony Polyfill / Php70
2
+ ========================
3
+
4
+ This component provides features unavailable in releases prior to PHP 7.0:
5
+
6
+ - [`intdiv`](https://php.net/intdiv)
7
+ - [`preg_replace_callback_array`](https://php.net/preg_replace_callback_array)
8
+ - [`error_clear_last`](https://php.net/error_clear_last)
9
+ - `random_bytes` and `random_int` (from [paragonie/random_compat](https://github.com/paragonie/random_compat))
10
+ - [`*Error` throwable classes](https://php.net/Error)
11
+ - [`PHP_INT_MIN`](https://php.net/reserved.constants#constant.php-int-min)
12
+ - `SessionUpdateTimestampHandlerInterface`
13
+
14
+ More information can be found in the
15
+ [main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
16
+
17
+ Compatibility notes
18
+ ===================
19
+
20
+ To write portable code between PHP5 and PHP7, some care must be taken:
21
+ - `\*Error` exceptions must be caught before `\Exception`;
22
+ - after calling `error_clear_last()`, the result of `$e = error_get_last()` must be
23
+ verified using `isset($e['message'][0])` instead of `null !== $e`.
24
+
25
+ License
26
+ =======
27
+
28
+ This library is released under the [MIT license](LICENSE).
vendor/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (!class_exists('ArithmeticError')) {
4
+ class ArithmeticError extends Error
5
+ {
6
+ }
7
+ }
vendor/symfony/polyfill-php70/Resources/stubs/AssertionError.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (!class_exists('AssertionError')) {
4
+ class AssertionError extends Error
5
+ {
6
+ }
7
+ }
vendor/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (!class_exists('DivisionByZeroError')) {
4
+ class DivisionByZeroError extends Error
5
+ {
6
+ }
7
+ }
vendor/symfony/polyfill-php70/Resources/stubs/Error.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (!class_exists('Error')) {
4
+ class Error extends Exception
5
+ {
6
+ }
7
+ }
vendor/symfony/polyfill-php70/Resources/stubs/ParseError.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (!class_exists('ParseError')) {
4
+ class ParseError extends Error
5
+ {
6
+ }
7
+ }
vendor/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if (!interface_exists('SessionUpdateTimestampHandlerInterface')) {
3
+ interface SessionUpdateTimestampHandlerInterface
4
+ {
5
+ /**
6
+ * Checks if a session identifier already exists or not.
7
+ *
8
+ * @param string $key
9
+ *
10
+ * @return bool
11
+ */
12
+ public function validateId($key);
13
+
14
+ /**
15
+ * Updates the timestamp of a session when its data didn't change.
16
+ *
17
+ * @param string $key
18
+ * @param string $val
19
+ *
20
+ * @return bool
21
+ */
22
+ public function updateTimestamp($key, $val);
23
+ }
24
+ }
vendor/symfony/polyfill-php70/Resources/stubs/TypeError.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (!class_exists('TypeError')) {
4
+ class TypeError extends Error
5
+ {
6
+ }
7
+ }
vendor/symfony/polyfill-php70/bootstrap.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ use Symfony\Polyfill\Php70 as p;
13
+
14
+ if (PHP_VERSION_ID >= 70000) {
15
+ return;
16
+ }
17
+
18
+ if (!defined('PHP_INT_MIN')) {
19
+ define('PHP_INT_MIN', ~PHP_INT_MAX);
20
+ }
21
+
22
+ if (!function_exists('intdiv')) {
23
+ function intdiv($dividend, $divisor) { return p\Php70::intdiv($dividend, $divisor); }
24
+ }
25
+ if (!function_exists('preg_replace_callback_array')) {
26
+ function preg_replace_callback_array(array $patterns, $subject, $limit = -1, &$count = 0) { return p\Php70::preg_replace_callback_array($patterns, $subject, $limit, $count); }
27
+ }
28
+ if (!function_exists('error_clear_last')) {
29
+ function error_clear_last() { return p\Php70::error_clear_last(); }
30
+ }
vendor/symfony/polyfill-php70/composer.json ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "symfony/polyfill-php70",
3
+ "type": "library",
4
+ "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
5
+ "keywords": ["polyfill", "shim", "compatibility", "portable"],
6
+ "homepage": "https://symfony.com",
7
+ "license": "MIT",
8
+ "authors": [
9
+ {
10
+ "name": "Nicolas Grekas",
11
+ "email": "p@tchwork.com"
12
+ },
13
+ {
14
+ "name": "Symfony Community",
15
+ "homepage": "https://symfony.com/contributors"
16
+ }
17
+ ],
18
+ "require": {
19
+ "php": ">=5.3.3",
20
+ "paragonie/random_compat": "~1.0|~2.0|~9.99"
21
+ },
22
+ "autoload": {
23
+ "psr-4": { "Symfony\\Polyfill\\Php70\\": "" },
24
+ "files": [ "bootstrap.php" ],
25
+ "classmap": [ "Resources/stubs" ]
26
+ },
27
+ "minimum-stability": "dev",
28
+ "extra": {
29
+ "branch-alias": {
30
+ "dev-master": "1.17-dev"
31
+ },
32
+ "thanks": {
33
+ "name": "symfony/polyfill",
34
+ "url": "https://github.com/symfony/polyfill"
35
+ }
36
+ }
37
+ }
vendor/symfony/property-access/.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ vendor/
2
+ composer.lock
3
+ phpunit.xml
vendor/symfony/property-access/CHANGELOG.md ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ CHANGELOG
2
+ =========
3
+
4
+ 3.1.0
5
+ -----
6
+
7
+ * deprecated the `StringUtil` class, use `Symfony\Component\Inflector\Inflector`
8
+ instead
9
+
10
+ 2.7.0
11
+ ------
12
+
13
+ * `UnexpectedTypeException` now expects three constructor arguments: The invalid property value,
14
+ the `PropertyPathInterface` object and the current index of the property path.
15
+
16
+ 2.5.0
17
+ ------
18
+
19
+ * allowed non alpha numeric characters in second level and deeper object properties names
20
+ * [BC BREAK] when accessing an index on an object that does not implement
21
+ ArrayAccess, a NoSuchIndexException is now thrown instead of the
22
+ semantically wrong NoSuchPropertyException
23
+ * [BC BREAK] added isReadable() and isWritable() to PropertyAccessorInterface
24
+
25
+ 2.3.0
26
+ ------
27
+
28
+ * added PropertyAccessorBuilder, to enable or disable the support of "__call"
29
+ * added support for "__call" in the PropertyAccessor (disabled by default)
30
+ * [BC BREAK] changed PropertyAccessor to continue its search for a property or
31
+ method even if a non-public match was found. Before, a PropertyAccessDeniedException
32
+ was thrown in this case. Class PropertyAccessDeniedException was removed
33
+ now.
34
+ * deprecated PropertyAccess::getPropertyAccessor
35
+ * added PropertyAccess::createPropertyAccessor and PropertyAccess::createPropertyAccessorBuilder
vendor/symfony/property-access/Exception/AccessException.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess\Exception;
13
+
14
+ /**
15
+ * Thrown when a property path is not available.
16
+ *
17
+ * @author Stéphane Escandell <stephane.escandell@gmail.com>
18
+ */
19
+ class AccessException extends RuntimeException
20
+ {
21
+ }
vendor/symfony/property-access/Exception/ExceptionInterface.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess\Exception;
13
+
14
+ /**
15
+ * Marker interface for the PropertyAccess component.
16
+ *
17
+ * @author Bernhard Schussek <bschussek@gmail.com>
18
+ */
19
+ interface ExceptionInterface
20
+ {
21
+ }
vendor/symfony/property-access/Exception/InvalidArgumentException.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess\Exception;
13
+
14
+ /**
15
+ * Base InvalidArgumentException for the PropertyAccess component.
16
+ *
17
+ * @author Bernhard Schussek <bschussek@gmail.com>
18
+ */
19
+ class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
20
+ {
21
+ }
vendor/symfony/property-access/Exception/InvalidPropertyPathException.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess\Exception;
13
+
14
+ /**
15
+ * Thrown when a property path is malformed.
16
+ *
17
+ * @author Bernhard Schussek <bschussek@gmail.com>
18
+ */
19
+ class InvalidPropertyPathException extends RuntimeException
20
+ {
21
+ }
vendor/symfony/property-access/Exception/NoSuchIndexException.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess\Exception;
13
+
14
+ /**
15
+ * Thrown when an index cannot be found.
16
+ *
17
+ * @author Stéphane Escandell <stephane.escandell@gmail.com>
18
+ */
19
+ class NoSuchIndexException extends AccessException
20
+ {
21
+ }
vendor/symfony/property-access/Exception/NoSuchPropertyException.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess\Exception;
13
+
14
+ /**
15
+ * Thrown when a property cannot be found.
16
+ *
17
+ * @author Bernhard Schussek <bschussek@gmail.com>
18
+ */
19
+ class NoSuchPropertyException extends AccessException
20
+ {
21
+ }
vendor/symfony/property-access/Exception/OutOfBoundsException.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess\Exception;
13
+
14
+ /**
15
+ * Base OutOfBoundsException for the PropertyAccess component.
16
+ *
17
+ * @author Bernhard Schussek <bschussek@gmail.com>
18
+ */
19
+ class OutOfBoundsException extends \OutOfBoundsException implements ExceptionInterface
20
+ {
21
+ }
vendor/symfony/property-access/Exception/RuntimeException.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess\Exception;
13
+
14
+ /**
15
+ * Base RuntimeException for the PropertyAccess component.
16
+ *
17
+ * @author Bernhard Schussek <bschussek@gmail.com>
18
+ */
19
+ class RuntimeException extends \RuntimeException implements ExceptionInterface
20
+ {
21
+ }
vendor/symfony/property-access/Exception/UnexpectedTypeException.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess\Exception;
13
+
14
+ use Symfony\Component\PropertyAccess\PropertyPathInterface;
15
+
16
+ /**
17
+ * Thrown when a value does not match an expected type.
18
+ *
19
+ * @author Bernhard Schussek <bschussek@gmail.com>
20
+ */
21
+ class UnexpectedTypeException extends RuntimeException
22
+ {
23
+ /**
24
+ * @param mixed $value The unexpected value found while traversing property path
25
+ * @param PropertyPathInterface $path The property path
26
+ * @param int $pathIndex The property path index when the unexpected value was found
27
+ */
28
+ public function __construct($value, PropertyPathInterface $path, $pathIndex)
29
+ {
30
+ $message = sprintf(
31
+ 'PropertyAccessor requires a graph of objects or arrays to operate on, '.
32
+ 'but it found type "%s" while trying to traverse path "%s" at property "%s".',
33
+ \gettype($value),
34
+ (string) $path,
35
+ $path->getElement($pathIndex)
36
+ );
37
+
38
+ parent::__construct($message);
39
+ }
40
+ }
vendor/symfony/property-access/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2004-2020 Fabien Potencier
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is furnished
8
+ to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
vendor/symfony/property-access/PropertyAccess.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess;
13
+
14
+ /**
15
+ * Entry point of the PropertyAccess component.
16
+ *
17
+ * @author Bernhard Schussek <bschussek@gmail.com>
18
+ */
19
+ final class PropertyAccess
20
+ {
21
+ /**
22
+ * Creates a property accessor with the default configuration.
23
+ *
24
+ * @return PropertyAccessor
25
+ */
26
+ public static function createPropertyAccessor()
27
+ {
28
+ return self::createPropertyAccessorBuilder()->getPropertyAccessor();
29
+ }
30
+
31
+ /**
32
+ * Creates a property accessor builder.
33
+ *
34
+ * @return PropertyAccessorBuilder
35
+ */
36
+ public static function createPropertyAccessorBuilder()
37
+ {
38
+ return new PropertyAccessorBuilder();
39
+ }
40
+
41
+ /**
42
+ * This class cannot be instantiated.
43
+ */
44
+ private function __construct()
45
+ {
46
+ }
47
+ }
vendor/symfony/property-access/PropertyAccessor.php ADDED
@@ -0,0 +1,971 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess;
13
+
14
+ use Psr\Cache\CacheItemPoolInterface;
15
+ use Psr\Log\LoggerInterface;
16
+ use Psr\Log\NullLogger;
17
+ use Symfony\Component\Cache\Adapter\AdapterInterface;
18
+ use Symfony\Component\Cache\Adapter\ApcuAdapter;
19
+ use Symfony\Component\Cache\Adapter\NullAdapter;
20
+ use Symfony\Component\Inflector\Inflector;
21
+ use Symfony\Component\PropertyAccess\Exception\AccessException;
22
+ use Symfony\Component\PropertyAccess\Exception\InvalidArgumentException;
23
+ use Symfony\Component\PropertyAccess\Exception\NoSuchIndexException;
24
+ use Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException;
25
+ use Symfony\Component\PropertyAccess\Exception\UnexpectedTypeException;
26
+
27
+ /**
28
+ * Default implementation of {@link PropertyAccessorInterface}.
29
+ *
30
+ * @author Bernhard Schussek <bschussek@gmail.com>
31
+ * @author Kévin Dunglas <dunglas@gmail.com>
32
+ * @author Nicolas Grekas <p@tchwork.com>
33
+ */
34
+ class PropertyAccessor implements PropertyAccessorInterface
35
+ {
36
+ /**
37
+ * @internal
38
+ */
39
+ const VALUE = 0;
40
+
41
+ /**
42
+ * @internal
43
+ */
44
+ const REF = 1;
45
+
46
+ /**
47
+ * @internal
48
+ */
49
+ const IS_REF_CHAINED = 2;
50
+
51
+ /**
52
+ * @internal
53
+ */
54
+ const ACCESS_HAS_PROPERTY = 0;
55
+
56
+ /**
57
+ * @internal
58
+ */
59
+ const ACCESS_TYPE = 1;
60
+
61
+ /**
62
+ * @internal
63
+ */
64
+ const ACCESS_NAME = 2;
65
+
66
+ /**
67
+ * @internal
68
+ */
69
+ const ACCESS_REF = 3;
70
+
71
+ /**
72
+ * @internal
73
+ */
74
+ const ACCESS_ADDER = 4;
75
+
76
+ /**
77
+ * @internal
78
+ */
79
+ const ACCESS_REMOVER = 5;
80
+
81
+ /**
82
+ * @internal
83
+ */
84
+ const ACCESS_TYPE_METHOD = 0;
85
+
86
+ /**
87
+ * @internal
88
+ */
89
+ const ACCESS_TYPE_PROPERTY = 1;
90
+
91
+ /**
92
+ * @internal
93
+ */
94
+ const ACCESS_TYPE_MAGIC = 2;
95
+
96
+ /**
97
+ * @internal
98
+ */
99
+ const ACCESS_TYPE_ADDER_AND_REMOVER = 3;
100
+
101
+ /**
102
+ * @internal
103
+ */
104
+ const ACCESS_TYPE_NOT_FOUND = 4;
105
+
106
+ /**
107
+ * @internal
108
+ */
109
+ const CACHE_PREFIX_READ = 'r';
110
+
111
+ /**
112
+ * @internal
113
+ */
114
+ const CACHE_PREFIX_WRITE = 'w';
115
+
116
+ /**
117
+ * @internal
118
+ */
119
+ const CACHE_PREFIX_PROPERTY_PATH = 'p';
120
+
121
+ /**
122
+ * @var bool
123
+ */
124
+ private $magicCall;
125
+ private $ignoreInvalidIndices;
126
+
127
+ /**
128
+ * @var CacheItemPoolInterface
129
+ */
130
+ private $cacheItemPool;
131
+
132
+ private $readPropertyCache = [];
133
+ private $writePropertyCache = [];
134
+ private $propertyPathCache = [];
135
+
136
+ private static $previousErrorHandler = false;
137
+ private static $errorHandler = [__CLASS__, 'handleError'];
138
+ private static $resultProto = [self::VALUE => null];
139
+
140
+ /**
141
+ * Should not be used by application code. Use
142
+ * {@link PropertyAccess::createPropertyAccessor()} instead.
143
+ *
144
+ * @param bool $magicCall
145
+ * @param bool $throwExceptionOnInvalidIndex
146
+ * @param CacheItemPoolInterface $cacheItemPool
147
+ */
148
+ public function __construct($magicCall = false, $throwExceptionOnInvalidIndex = false, CacheItemPoolInterface $cacheItemPool = null)
149
+ {
150
+ $this->magicCall = $magicCall;
151
+ $this->ignoreInvalidIndices = !$throwExceptionOnInvalidIndex;
152
+ $this->cacheItemPool = $cacheItemPool instanceof NullAdapter ? null : $cacheItemPool; // Replace the NullAdapter by the null value
153
+ }
154
+
155
+ /**
156
+ * {@inheritdoc}
157
+ */
158
+ public function getValue($objectOrArray, $propertyPath)
159
+ {
160
+ $propertyPath = $this->getPropertyPath($propertyPath);
161
+
162
+ $zval = [
163
+ self::VALUE => $objectOrArray,
164
+ ];
165
+ $propertyValues = $this->readPropertiesUntil($zval, $propertyPath, $propertyPath->getLength(), $this->ignoreInvalidIndices);
166
+
167
+ return $propertyValues[\count($propertyValues) - 1][self::VALUE];
168
+ }
169
+
170
+ /**
171
+ * {@inheritdoc}
172
+ */
173
+ public function setValue(&$objectOrArray, $propertyPath, $value)
174
+ {
175
+ $propertyPath = $this->getPropertyPath($propertyPath);
176
+
177
+ $zval = [
178
+ self::VALUE => $objectOrArray,
179
+ self::REF => &$objectOrArray,
180
+ ];
181
+ $propertyValues = $this->readPropertiesUntil($zval, $propertyPath, $propertyPath->getLength() - 1);
182
+ $overwrite = true;
183
+
184
+ try {
185
+ if (\PHP_VERSION_ID < 70000 && false === self::$previousErrorHandler) {
186
+ self::$previousErrorHandler = set_error_handler(self::$errorHandler);
187
+ }
188
+
189
+ for ($i = \count($propertyValues) - 1; 0 <= $i; --$i) {
190
+ $zval = $propertyValues[$i];
191
+ unset($propertyValues[$i]);
192
+
193
+ // You only need set value for current element if:
194
+ // 1. it's the parent of the last index element
195
+ // OR
196
+ // 2. its child is not passed by reference
197
+ //
198
+ // This may avoid uncessary value setting process for array elements.
199
+ // For example:
200
+ // '[a][b][c]' => 'old-value'
201
+ // If you want to change its value to 'new-value',
202
+ // you only need set value for '[a][b][c]' and it's safe to ignore '[a][b]' and '[a]'
203
+ if ($overwrite) {
204
+ $property = $propertyPath->getElement($i);
205
+
206
+ if ($propertyPath->isIndex($i)) {
207
+ if ($overwrite = !isset($zval[self::REF])) {
208
+ $ref = &$zval[self::REF];
209
+ $ref = $zval[self::VALUE];
210
+ }
211
+ $this->writeIndex($zval, $property, $value);
212
+ if ($overwrite) {
213
+ $zval[self::VALUE] = $zval[self::REF];
214
+ }
215
+ } else {
216
+ $this->writeProperty($zval, $property, $value);
217
+ }
218
+
219
+ // if current element is an object
220
+ // OR
221
+ // if current element's reference chain is not broken - current element
222
+ // as well as all its ancients in the property path are all passed by reference,
223
+ // then there is no need to continue the value setting process
224
+ if (\is_object($zval[self::VALUE]) || isset($zval[self::IS_REF_CHAINED])) {
225
+ break;
226
+ }
227
+ }
228
+
229
+ $value = $zval[self::VALUE];
230
+ }
231
+ } catch (\TypeError $e) {
232
+ self::throwInvalidArgumentException($e->getMessage(), $e->getTrace(), 0, $e);
233
+
234
+ // It wasn't thrown in this class so rethrow it
235
+ throw $e;
236
+ } finally {
237
+ if (\PHP_VERSION_ID < 70000 && false !== self::$previousErrorHandler) {
238
+ restore_error_handler();
239
+ self::$previousErrorHandler = false;
240
+ }
241
+ }
242
+ }
243
+
244
+ /**
245
+ * @internal
246
+ */
247
+ public static function handleError($type, $message, $file, $line, $context = [])
248
+ {
249
+ if (E_RECOVERABLE_ERROR === $type) {
250
+ self::throwInvalidArgumentException($message, debug_backtrace(false), 1);
251
+ }
252
+
253
+ return null !== self::$previousErrorHandler && false !== \call_user_func(self::$previousErrorHandler, $type, $message, $file, $line, $context);
254
+ }
255
+
256
+ private static function throwInvalidArgumentException($message, $trace, $i, $previous = null)
257
+ {
258
+ if (!isset($trace[$i]['file']) || __FILE__ !== $trace[$i]['file']) {
259
+ return;
260
+ }
261
+
262
+ if (\PHP_VERSION_ID < 80000) {
263
+ if (0 !== strpos($message, 'Argument ')) {
264
+ return;
265
+ }
266
+
267
+ $pos = strpos($message, $delim = 'must be of the type ') ?: (strpos($message, $delim = 'must be an instance of ') ?: strpos($message, $delim = 'must implement interface '));
268
+ $pos += \strlen($delim);
269
+ $j = strpos($message, ',', $pos);
270
+ $type = substr($message, 2 + $j, strpos($message, ' given', $j) - $j - 2);
271
+ $message = substr($message, $pos, $j - $pos);
272
+
273
+ throw new InvalidArgumentException(sprintf('Expected argument of type "%s", "%s" given.', $message, 'NULL' === $type ? 'null' : $type), 0, $previous);
274
+ }
275
+
276
+ if (preg_match('/^\S+::\S+\(\): Argument #\d+ \(\$\S+\) must be of type (\S+), (\S+) given/', $message, $matches)) {
277
+ list(, $expectedType, $actualType) = $matches;
278
+
279
+ throw new InvalidArgumentException(sprintf('Expected argument of type "%s", "%s" given.', $expectedType, 'NULL' === $actualType ? 'null' : $actualType), 0, $previous);
280
+ }
281
+ }
282
+
283
+ /**
284
+ * {@inheritdoc}
285
+ */
286
+ public function isReadable($objectOrArray, $propertyPath)
287
+ {
288
+ if (!$propertyPath instanceof PropertyPathInterface) {
289
+ $propertyPath = new PropertyPath($propertyPath);
290
+ }
291
+
292
+ try {
293
+ $zval = [
294
+ self::VALUE => $objectOrArray,
295
+ ];
296
+ $this->readPropertiesUntil($zval, $propertyPath, $propertyPath->getLength(), $this->ignoreInvalidIndices);
297
+
298
+ return true;
299
+ } catch (AccessException $e) {
300
+ return false;
301
+ } catch (UnexpectedTypeException $e) {
302
+ return false;
303
+ }
304
+ }
305
+
306
+ /**
307
+ * {@inheritdoc}
308
+ */
309
+ public function isWritable($objectOrArray, $propertyPath)
310
+ {
311
+ $propertyPath = $this->getPropertyPath($propertyPath);
312
+
313
+ try {
314
+ $zval = [
315
+ self::VALUE => $objectOrArray,
316
+ ];
317
+ $propertyValues = $this->readPropertiesUntil($zval, $propertyPath, $propertyPath->getLength() - 1);
318
+
319
+ for ($i = \count($propertyValues) - 1; 0 <= $i; --$i) {
320
+ $zval = $propertyValues[$i];
321
+ unset($propertyValues[$i]);
322
+
323
+ if ($propertyPath->isIndex($i)) {
324
+ if (!$zval[self::VALUE] instanceof \ArrayAccess && !\is_array($zval[self::VALUE])) {
325
+ return false;
326
+ }
327
+ } else {
328
+ if (!$this->isPropertyWritable($zval[self::VALUE], $propertyPath->getElement($i))) {
329
+ return false;
330
+ }
331
+ }
332
+
333
+ if (\is_object($zval[self::VALUE])) {
334
+ return true;
335
+ }
336
+ }
337
+
338
+ return true;
339
+ } catch (AccessException $e) {
340
+ return false;
341
+ } catch (UnexpectedTypeException $e) {
342
+ return false;
343
+ }
344
+ }
345
+
346
+ /**
347
+ * Reads the path from an object up to a given path index.
348
+ *
349
+ * @param array $zval The array containing the object or array to read from
350
+ * @param PropertyPathInterface $propertyPath The property path to read
351
+ * @param int $lastIndex The index up to which should be read
352
+ * @param bool $ignoreInvalidIndices Whether to ignore invalid indices or throw an exception
353
+ *
354
+ * @return array The values read in the path
355
+ *
356
+ * @throws UnexpectedTypeException if a value within the path is neither object nor array
357
+ * @throws NoSuchIndexException If a non-existing index is accessed
358
+ */
359
+ private function readPropertiesUntil($zval, PropertyPathInterface $propertyPath, $lastIndex, $ignoreInvalidIndices = true)
360
+ {
361
+ if (!\is_object($zval[self::VALUE]) && !\is_array($zval[self::VALUE])) {
362
+ throw new UnexpectedTypeException($zval[self::VALUE], $propertyPath, 0);
363
+ }
364
+
365
+ // Add the root object to the list
366
+ $propertyValues = [$zval];
367
+
368
+ for ($i = 0; $i < $lastIndex; ++$i) {
369
+ $property = $propertyPath->getElement($i);
370
+ $isIndex = $propertyPath->isIndex($i);
371
+
372
+ if ($isIndex) {
373
+ // Create missing nested arrays on demand
374
+ if (($zval[self::VALUE] instanceof \ArrayAccess && !$zval[self::VALUE]->offsetExists($property)) ||
375
+ (\is_array($zval[self::VALUE]) && !isset($zval[self::VALUE][$property]) && !\array_key_exists($property, $zval[self::VALUE]))
376
+ ) {
377
+ if (!$ignoreInvalidIndices) {
378
+ if (!\is_array($zval[self::VALUE])) {
379
+ if (!$zval[self::VALUE] instanceof \Traversable) {
380
+ throw new NoSuchIndexException(sprintf('Cannot read index "%s" while trying to traverse path "%s".', $property, (string) $propertyPath));
381
+ }
382
+
383
+ $zval[self::VALUE] = iterator_to_array($zval[self::VALUE]);
384
+ }
385
+
386
+ throw new NoSuchIndexException(sprintf('Cannot read index "%s" while trying to traverse path "%s". Available indices are "%s".', $property, (string) $propertyPath, print_r(array_keys($zval[self::VALUE]), true)));
387
+ }
388
+
389
+ if ($i + 1 < $propertyPath->getLength()) {
390
+ if (isset($zval[self::REF])) {
391
+ $zval[self::VALUE][$property] = [];
392
+ $zval[self::REF] = $zval[self::VALUE];
393
+ } else {
394
+ $zval[self::VALUE] = [$property => []];
395
+ }
396
+ }
397
+ }
398
+
399
+ $zval = $this->readIndex($zval, $property);
400
+ } else {
401
+ $zval = $this->readProperty($zval, $property);
402
+ }
403
+
404
+ // the final value of the path must not be validated
405
+ if ($i + 1 < $propertyPath->getLength() && !\is_object($zval[self::VALUE]) && !\is_array($zval[self::VALUE])) {
406
+ throw new UnexpectedTypeException($zval[self::VALUE], $propertyPath, $i + 1);
407
+ }
408
+
409
+ if (isset($zval[self::REF]) && (0 === $i || isset($propertyValues[$i - 1][self::IS_REF_CHAINED]))) {
410
+ // Set the IS_REF_CHAINED flag to true if:
411
+ // current property is passed by reference and
412
+ // it is the first element in the property path or
413
+ // the IS_REF_CHAINED flag of its parent element is true
414
+ // Basically, this flag is true only when the reference chain from the top element to current element is not broken
415
+ $zval[self::IS_REF_CHAINED] = true;
416
+ }
417
+
418
+ $propertyValues[] = $zval;
419
+ }
420
+
421
+ return $propertyValues;
422
+ }
423
+
424
+ /**
425
+ * Reads a key from an array-like structure.
426
+ *
427
+ * @param array $zval The array containing the array or \ArrayAccess object to read from
428
+ * @param string|int $index The key to read
429
+ *
430
+ * @return array The array containing the value of the key
431
+ *
432
+ * @throws NoSuchIndexException If the array does not implement \ArrayAccess or it is not an array
433
+ */
434
+ private function readIndex($zval, $index)
435
+ {
436
+ if (!$zval[self::VALUE] instanceof \ArrayAccess && !\is_array($zval[self::VALUE])) {
437
+ throw new NoSuchIndexException(sprintf('Cannot read index "%s" from object of type "%s" because it doesn\'t implement \ArrayAccess.', $index, \get_class($zval[self::VALUE])));
438
+ }
439
+
440
+ $result = self::$resultProto;
441
+
442
+ if (isset($zval[self::VALUE][$index])) {
443
+ $result[self::VALUE] = $zval[self::VALUE][$index];
444
+
445
+ if (!isset($zval[self::REF])) {
446
+ // Save creating references when doing read-only lookups
447
+ } elseif (\is_array($zval[self::VALUE])) {
448
+ $result[self::REF] = &$zval[self::REF][$index];
449
+ } elseif (\is_object($result[self::VALUE])) {
450
+ $result[self::REF] = $result[self::VALUE];
451
+ }
452
+ }
453
+
454
+ return $result;
455
+ }
456
+
457
+ /**
458
+ * Reads the a property from an object.
459
+ *
460
+ * @param array $zval The array containing the object to read from
461
+ * @param string $property The property to read
462
+ *
463
+ * @return array The array containing the value of the property
464
+ *
465
+ * @throws NoSuchPropertyException if the property does not exist or is not public
466
+ */
467
+ private function readProperty($zval, $property)
468
+ {
469
+ if (!\is_object($zval[self::VALUE])) {
470
+ throw new NoSuchPropertyException(sprintf('Cannot read property "%s" from an array. Maybe you intended to write the property path as "[%1$s]" instead.', $property));
471
+ }
472
+
473
+ $result = self::$resultProto;
474
+ $object = $zval[self::VALUE];
475
+ $access = $this->getReadAccessInfo(\get_class($object), $property);
476
+
477
+ try {
478
+ if (self::ACCESS_TYPE_METHOD === $access[self::ACCESS_TYPE]) {
479
+ try {
480
+ $result[self::VALUE] = $object->{$access[self::ACCESS_NAME]}();
481
+ } catch (\TypeError $e) {
482
+ list($trace) = $e->getTrace();
483
+
484
+ // handle uninitialized properties in PHP >= 7
485
+ if (__FILE__ === $trace['file']
486
+ && $access[self::ACCESS_NAME] === $trace['function']
487
+ && $object instanceof $trace['class']
488
+ && preg_match((sprintf('/Return value (?:of .*::\w+\(\) )?must be of (?:the )?type (\w+), null returned$/')), $e->getMessage(), $matches)
489
+ ) {
490
+ throw new AccessException(sprintf('The method "%s::%s()" returned "null", but expected type "%3$s". Did you forget to initialize a property or to make the return type nullable using "?%3$s"?', false === strpos(\get_class($object), "@anonymous\0") ? \get_class($object) : (get_parent_class($object) ?: 'class').'@anonymous', $access[self::ACCESS_NAME], $matches[1]), 0, $e);
491
+ }
492
+
493
+ throw $e;
494
+ }
495
+ } elseif (self::ACCESS_TYPE_PROPERTY === $access[self::ACCESS_TYPE]) {
496
+ $result[self::VALUE] = $object->{$access[self::ACCESS_NAME]};
497
+
498
+ if ($access[self::ACCESS_REF] && isset($zval[self::REF])) {
499
+ $result[self::REF] = &$object->{$access[self::ACCESS_NAME]};
500
+ }
501
+ } elseif (!$access[self::ACCESS_HAS_PROPERTY] && property_exists($object, $property)) {
502
+ // Needed to support \stdClass instances. We need to explicitly
503
+ // exclude $access[self::ACCESS_HAS_PROPERTY], otherwise if
504
+ // a *protected* property was found on the class, property_exists()
505
+ // returns true, consequently the following line will result in a
506
+ // fatal error.
507
+
508
+ $result[self::VALUE] = $object->$property;
509
+ if (isset($zval[self::REF])) {
510
+ $result[self::REF] = &$object->$property;
511
+ }
512
+ } elseif (self::ACCESS_TYPE_MAGIC === $access[self::ACCESS_TYPE]) {
513
+ // we call the getter and hope the __call do the job
514
+ $result[self::VALUE] = $object->{$access[self::ACCESS_NAME]}();
515
+ } else {
516
+ throw new NoSuchPropertyException($access[self::ACCESS_NAME]);
517
+ }
518
+ } catch (\Error $e) {
519
+ // handle uninitialized properties in PHP >= 7.4
520
+ if (\PHP_VERSION_ID >= 70400 && preg_match('/^Typed property ([\w\\\]+)::\$(\w+) must not be accessed before initialization$/', $e->getMessage(), $matches)) {
521
+ $r = new \ReflectionProperty($matches[1], $matches[2]);
522
+
523
+ throw new AccessException(sprintf('The property "%s::$%s" is not readable because it is typed "%s". You should initialize it or declare a default value instead.', $r->getDeclaringClass()->getName(), $r->getName(), $r->getType()->getName()), 0, $e);
524
+ }
525
+
526
+ throw $e;
527
+ }
528
+
529
+ // Objects are always passed around by reference
530
+ if (isset($zval[self::REF]) && \is_object($result[self::VALUE])) {
531
+ $result[self::REF] = $result[self::VALUE];
532
+ }
533
+
534
+ return $result;
535
+ }
536
+
537
+ /**
538
+ * Guesses how to read the property value.
539
+ *
540
+ * @param string $class
541
+ * @param string $property
542
+ *
543
+ * @return array
544
+ */
545
+ private function getReadAccessInfo($class, $property)
546
+ {
547
+ $key = str_replace('\\', '.', $class).'..'.$property;
548
+
549
+ if (isset($this->readPropertyCache[$key])) {
550
+ return $this->readPropertyCache[$key];
551
+ }
552
+
553
+ if ($this->cacheItemPool) {
554
+ $item = $this->cacheItemPool->getItem(self::CACHE_PREFIX_READ.rawurlencode($key));
555
+ if ($item->isHit()) {
556
+ return $this->readPropertyCache[$key] = $item->get();
557
+ }
558
+ }
559
+
560
+ $access = [];
561
+
562
+ $reflClass = new \ReflectionClass($class);
563
+ $access[self::ACCESS_HAS_PROPERTY] = $reflClass->hasProperty($property);
564
+ $camelProp = $this->camelize($property);
565
+ $getter = 'get'.$camelProp;
566
+ $getsetter = lcfirst($camelProp); // jQuery style, e.g. read: last(), write: last($item)
567
+ $isser = 'is'.$camelProp;
568
+ $hasser = 'has'.$camelProp;
569
+
570
+ if ($reflClass->hasMethod($getter) && $reflClass->getMethod($getter)->isPublic()) {
571
+ $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_METHOD;
572
+ $access[self::ACCESS_NAME] = $getter;
573
+ } elseif ($reflClass->hasMethod($getsetter) && $reflClass->getMethod($getsetter)->isPublic()) {
574
+ $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_METHOD;
575
+ $access[self::ACCESS_NAME] = $getsetter;
576
+ } elseif ($reflClass->hasMethod($isser) && $reflClass->getMethod($isser)->isPublic()) {
577
+ $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_METHOD;
578
+ $access[self::ACCESS_NAME] = $isser;
579
+ } elseif ($reflClass->hasMethod($hasser) && $reflClass->getMethod($hasser)->isPublic()) {
580
+ $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_METHOD;
581
+ $access[self::ACCESS_NAME] = $hasser;
582
+ } elseif ($reflClass->hasMethod('__get') && $reflClass->getMethod('__get')->isPublic()) {
583
+ $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_PROPERTY;
584
+ $access[self::ACCESS_NAME] = $property;
585
+ $access[self::ACCESS_REF] = false;
586
+ } elseif ($access[self::ACCESS_HAS_PROPERTY] && $reflClass->getProperty($property)->isPublic()) {
587
+ $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_PROPERTY;
588
+ $access[self::ACCESS_NAME] = $property;
589
+ $access[self::ACCESS_REF] = true;
590
+ } elseif ($this->magicCall && $reflClass->hasMethod('__call') && $reflClass->getMethod('__call')->isPublic()) {
591
+ // we call the getter and hope the __call do the job
592
+ $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_MAGIC;
593
+ $access[self::ACCESS_NAME] = $getter;
594
+ } else {
595
+ $methods = [$getter, $getsetter, $isser, $hasser, '__get'];
596
+ if ($this->magicCall) {
597
+ $methods[] = '__call';
598
+ }
599
+
600
+ $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_NOT_FOUND;
601
+ $access[self::ACCESS_NAME] = sprintf(
602
+ 'Neither the property "%s" nor one of the methods "%s()" '.
603
+ 'exist and have public access in class "%s".',
604
+ $property,
605
+ implode('()", "', $methods),
606
+ $reflClass->name
607
+ );
608
+ }
609
+
610
+ if (isset($item)) {
611
+ $this->cacheItemPool->save($item->set($access));
612
+ }
613
+
614
+ return $this->readPropertyCache[$key] = $access;
615
+ }
616
+
617
+ /**
618
+ * Sets the value of an index in a given array-accessible value.
619
+ *
620
+ * @param array $zval The array containing the array or \ArrayAccess object to write to
621
+ * @param string|int $index The index to write at
622
+ * @param mixed $value The value to write
623
+ *
624
+ * @throws NoSuchIndexException If the array does not implement \ArrayAccess or it is not an array
625
+ */
626
+ private function writeIndex($zval, $index, $value)
627
+ {
628
+ if (!$zval[self::VALUE] instanceof \ArrayAccess && !\is_array($zval[self::VALUE])) {
629
+ throw new NoSuchIndexException(sprintf('Cannot modify index "%s" in object of type "%s" because it doesn\'t implement \ArrayAccess.', $index, \get_class($zval[self::VALUE])));
630
+ }
631
+
632
+ $zval[self::REF][$index] = $value;
633
+ }
634
+
635
+ /**
636
+ * Sets the value of a property in the given object.
637
+ *
638
+ * @param array $zval The array containing the object to write to
639
+ * @param string $property The property to write
640
+ * @param mixed $value The value to write
641
+ *
642
+ * @throws NoSuchPropertyException if the property does not exist or is not public
643
+ */
644
+ private function writeProperty($zval, $property, $value)
645
+ {
646
+ if (!\is_object($zval[self::VALUE])) {
647
+ throw new NoSuchPropertyException(sprintf('Cannot write property "%s" to an array. Maybe you should write the property path as "[%1$s]" instead?', $property));
648
+ }
649
+
650
+ $object = $zval[self::VALUE];
651
+ $access = $this->getWriteAccessInfo(\get_class($object), $property, $value);
652
+
653
+ if (self::ACCESS_TYPE_METHOD === $access[self::ACCESS_TYPE]) {
654
+ $object->{$access[self::ACCESS_NAME]}($value);
655
+ } elseif (self::ACCESS_TYPE_PROPERTY === $access[self::ACCESS_TYPE]) {
656
+ $object->{$access[self::ACCESS_NAME]} = $value;
657
+ } elseif (self::ACCESS_TYPE_ADDER_AND_REMOVER === $access[self::ACCESS_TYPE]) {
658
+ $this->writeCollection($zval, $property, $value, $access[self::ACCESS_ADDER], $access[self::ACCESS_REMOVER]);
659
+ } elseif (!$access[self::ACCESS_HAS_PROPERTY] && property_exists($object, $property)) {
660
+ // Needed to support \stdClass instances. We need to explicitly
661
+ // exclude $access[self::ACCESS_HAS_PROPERTY], otherwise if
662
+ // a *protected* property was found on the class, property_exists()
663
+ // returns true, consequently the following line will result in a
664
+ // fatal error.
665
+
666
+ $object->$property = $value;
667
+ } elseif (self::ACCESS_TYPE_MAGIC === $access[self::ACCESS_TYPE]) {
668
+ $object->{$access[self::ACCESS_NAME]}($value);
669
+ } elseif (self::ACCESS_TYPE_NOT_FOUND === $access[self::ACCESS_TYPE]) {
670
+ throw new NoSuchPropertyException(sprintf('Could not determine access type for property "%s" in class "%s".', $property, \get_class($object)));
671
+ } else {
672
+ throw new NoSuchPropertyException($access[self::ACCESS_NAME]);
673
+ }
674
+ }
675
+
676
+ /**
677
+ * Adjusts a collection-valued property by calling add*() and remove*() methods.
678
+ *
679
+ * @param array $zval The array containing the object to write to
680
+ * @param string $property The property to write
681
+ * @param iterable $collection The collection to write
682
+ * @param string $addMethod The add*() method
683
+ * @param string $removeMethod The remove*() method
684
+ */
685
+ private function writeCollection($zval, $property, $collection, $addMethod, $removeMethod)
686
+ {
687
+ // At this point the add and remove methods have been found
688
+ $previousValue = $this->readProperty($zval, $property);
689
+ $previousValue = $previousValue[self::VALUE];
690
+
691
+ if ($previousValue instanceof \Traversable) {
692
+ $previousValue = iterator_to_array($previousValue);
693
+ }
694
+ if ($previousValue && \is_array($previousValue)) {
695
+ if (\is_object($collection)) {
696
+ $collection = iterator_to_array($collection);
697
+ }
698
+ foreach ($previousValue as $key => $item) {
699
+ if (!\in_array($item, $collection, true)) {
700
+ unset($previousValue[$key]);
701
+ $zval[self::VALUE]->{$removeMethod}($item);
702
+ }
703
+ }
704
+ } else {
705
+ $previousValue = false;
706
+ }
707
+
708
+ foreach ($collection as $item) {
709
+ if (!$previousValue || !\in_array($item, $previousValue, true)) {
710
+ $zval[self::VALUE]->{$addMethod}($item);
711
+ }
712
+ }
713
+ }
714
+
715
+ /**
716
+ * Guesses how to write the property value.
717
+ *
718
+ * @param string $class
719
+ * @param string $property
720
+ * @param mixed $value
721
+ *
722
+ * @return array
723
+ */
724
+ private function getWriteAccessInfo($class, $property, $value)
725
+ {
726
+ $useAdderAndRemover = \is_array($value) || $value instanceof \Traversable;
727
+ $key = str_replace('\\', '.', $class).'..'.$property.'..'.(int) $useAdderAndRemover;
728
+
729
+ if (isset($this->writePropertyCache[$key])) {
730
+ return $this->writePropertyCache[$key];
731
+ }
732
+
733
+ if ($this->cacheItemPool) {
734
+ $item = $this->cacheItemPool->getItem(self::CACHE_PREFIX_WRITE.rawurlencode($key));
735
+ if ($item->isHit()) {
736
+ return $this->writePropertyCache[$key] = $item->get();
737
+ }
738
+ }
739
+
740
+ $access = [];
741
+
742
+ $reflClass = new \ReflectionClass($class);
743
+ $access[self::ACCESS_HAS_PROPERTY] = $reflClass->hasProperty($property);
744
+ $camelized = $this->camelize($property);
745
+ $singulars = (array) Inflector::singularize($camelized);
746
+
747
+ if ($useAdderAndRemover) {
748
+ $methods = $this->findAdderAndRemover($reflClass, $singulars);
749
+
750
+ if (null !== $methods) {
751
+ $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_ADDER_AND_REMOVER;
752
+ $access[self::ACCESS_ADDER] = $methods[0];
753
+ $access[self::ACCESS_REMOVER] = $methods[1];
754
+ }
755
+ }
756
+
757
+ if (!isset($access[self::ACCESS_TYPE])) {
758
+ $setter = 'set'.$camelized;
759
+ $getsetter = lcfirst($camelized); // jQuery style, e.g. read: last(), write: last($item)
760
+
761
+ if ($this->isMethodAccessible($reflClass, $setter, 1)) {
762
+ $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_METHOD;
763
+ $access[self::ACCESS_NAME] = $setter;
764
+ } elseif ($this->isMethodAccessible($reflClass, $getsetter, 1)) {
765
+ $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_METHOD;
766
+ $access[self::ACCESS_NAME] = $getsetter;
767
+ } elseif ($this->isMethodAccessible($reflClass, '__set', 2)) {
768
+ $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_PROPERTY;
769
+ $access[self::ACCESS_NAME] = $property;
770
+ } elseif ($access[self::ACCESS_HAS_PROPERTY] && $reflClass->getProperty($property)->isPublic()) {
771
+ $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_PROPERTY;
772
+ $access[self::ACCESS_NAME] = $property;
773
+ } elseif ($this->magicCall && $this->isMethodAccessible($reflClass, '__call', 2)) {
774
+ // we call the getter and hope the __call do the job
775
+ $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_MAGIC;
776
+ $access[self::ACCESS_NAME] = $setter;
777
+ } elseif (null !== $methods = $this->findAdderAndRemover($reflClass, $singulars)) {
778
+ $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_NOT_FOUND;
779
+ $access[self::ACCESS_NAME] = sprintf(
780
+ 'The property "%s" in class "%s" can be defined with the methods "%s()" but '.
781
+ 'the new value must be an array or an instance of \Traversable, '.
782
+ '"%s" given.',
783
+ $property,
784
+ $reflClass->name,
785
+ implode('()", "', $methods),
786
+ \is_object($value) ? \get_class($value) : \gettype($value)
787
+ );
788
+ } else {
789
+ $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_NOT_FOUND;
790
+ $access[self::ACCESS_NAME] = sprintf(
791
+ 'Neither the property "%s" nor one of the methods %s"%s()", "%s()", '.
792
+ '"__set()" or "__call()" exist and have public access in class "%s".',
793
+ $property,
794
+ implode('', array_map(function ($singular) {
795
+ return '"add'.$singular.'()"/"remove'.$singular.'()", ';
796
+ }, $singulars)),
797
+ $setter,
798
+ $getsetter,
799
+ $reflClass->name
800
+ );
801
+ }
802
+ }
803
+
804
+ if (isset($item)) {
805
+ $this->cacheItemPool->save($item->set($access));
806
+ }
807
+
808
+ return $this->writePropertyCache[$key] = $access;
809
+ }
810
+
811
+ /**
812
+ * Returns whether a property is writable in the given object.
813
+ *
814
+ * @param object $object The object to write to
815
+ * @param string $property The property to write
816
+ *
817
+ * @return bool Whether the property is writable
818
+ */
819
+ private function isPropertyWritable($object, $property)
820
+ {
821
+ if (!\is_object($object)) {
822
+ return false;
823
+ }
824
+
825
+ $access = $this->getWriteAccessInfo(\get_class($object), $property, []);
826
+
827
+ $isWritable = self::ACCESS_TYPE_METHOD === $access[self::ACCESS_TYPE]
828
+ || self::ACCESS_TYPE_PROPERTY === $access[self::ACCESS_TYPE]
829
+ || self::ACCESS_TYPE_ADDER_AND_REMOVER === $access[self::ACCESS_TYPE]
830
+ || (!$access[self::ACCESS_HAS_PROPERTY] && property_exists($object, $property))
831
+ || self::ACCESS_TYPE_MAGIC === $access[self::ACCESS_TYPE];
832
+
833
+ if ($isWritable) {
834
+ return true;
835
+ }
836
+
837
+ $access = $this->getWriteAccessInfo(\get_class($object), $property, '');
838
+
839
+ return self::ACCESS_TYPE_METHOD === $access[self::ACCESS_TYPE]
840
+ || self::ACCESS_TYPE_PROPERTY === $access[self::ACCESS_TYPE]
841
+ || self::ACCESS_TYPE_ADDER_AND_REMOVER === $access[self::ACCESS_TYPE]
842
+ || (!$access[self::ACCESS_HAS_PROPERTY] && property_exists($object, $property))
843
+ || self::ACCESS_TYPE_MAGIC === $access[self::ACCESS_TYPE];
844
+ }
845
+
846
+ /**
847
+ * Camelizes a given string.
848
+ *
849
+ * @param string $string Some string
850
+ *
851
+ * @return string The camelized version of the string
852
+ */
853
+ private function camelize($string)
854
+ {
855
+ return str_replace(' ', '', ucwords(str_replace('_', ' ', $string)));
856
+ }
857
+
858
+ /**
859
+ * Searches for add and remove methods.
860
+ *
861
+ * @param \ReflectionClass $reflClass The reflection class for the given object
862
+ * @param array $singulars The singular form of the property name or null
863
+ *
864
+ * @return array|null An array containing the adder and remover when found, null otherwise
865
+ */
866
+ private function findAdderAndRemover(\ReflectionClass $reflClass, array $singulars)
867
+ {
868
+ foreach ($singulars as $singular) {
869
+ $addMethod = 'add'.$singular;
870
+ $removeMethod = 'remove'.$singular;
871
+
872
+ $addMethodFound = $this->isMethodAccessible($reflClass, $addMethod, 1);
873
+ $removeMethodFound = $this->isMethodAccessible($reflClass, $removeMethod, 1);
874
+
875
+ if ($addMethodFound && $removeMethodFound) {
876
+ return [$addMethod, $removeMethod];
877
+ }
878
+ }
879
+
880
+ return null;
881
+ }
882
+
883
+ /**
884
+ * Returns whether a method is public and has the number of required parameters.
885
+ *
886
+ * @param \ReflectionClass $class The class of the method
887
+ * @param string $methodName The method name
888
+ * @param int $parameters The number of parameters
889
+ *
890
+ * @return bool Whether the method is public and has $parameters required parameters
891
+ */
892
+ private function isMethodAccessible(\ReflectionClass $class, $methodName, $parameters)
893
+ {
894
+ if ($class->hasMethod($methodName)) {
895
+ $method = $class->getMethod($methodName);
896
+
897
+ if ($method->isPublic()
898
+ && $method->getNumberOfRequiredParameters() <= $parameters
899
+ && $method->getNumberOfParameters() >= $parameters) {
900
+ return true;
901
+ }
902
+ }
903
+
904
+ return false;
905
+ }
906
+
907
+ /**
908
+ * Gets a PropertyPath instance and caches it.
909
+ *
910
+ * @param string|PropertyPath $propertyPath
911
+ *
912
+ * @return PropertyPath
913
+ */
914
+ private function getPropertyPath($propertyPath)
915
+ {
916
+ if ($propertyPath instanceof PropertyPathInterface) {
917
+ // Don't call the copy constructor has it is not needed here
918
+ return $propertyPath;
919
+ }
920
+
921
+ if (isset($this->propertyPathCache[$propertyPath])) {
922
+ return $this->propertyPathCache[$propertyPath];
923
+ }
924
+
925
+ if ($this->cacheItemPool) {
926
+ $item = $this->cacheItemPool->getItem(self::CACHE_PREFIX_PROPERTY_PATH.rawurlencode($propertyPath));
927
+ if ($item->isHit()) {
928
+ return $this->propertyPathCache[$propertyPath] = $item->get();
929
+ }
930
+ }
931
+
932
+ $propertyPathInstance = new PropertyPath($propertyPath);
933
+ if (isset($item)) {
934
+ $item->set($propertyPathInstance);
935
+ $this->cacheItemPool->save($item);
936
+ }
937
+
938
+ return $this->propertyPathCache[$propertyPath] = $propertyPathInstance;
939
+ }
940
+
941
+ /**
942
+ * Creates the APCu adapter if applicable.
943
+ *
944
+ * @param string $namespace
945
+ * @param int $defaultLifetime
946
+ * @param string $version
947
+ *
948
+ * @return AdapterInterface
949
+ *
950
+ * @throws RuntimeException When the Cache Component isn't available
951
+ */
952
+ public static function createCache($namespace, $defaultLifetime, $version, LoggerInterface $logger = null)
953
+ {
954
+ if (!class_exists('Symfony\Component\Cache\Adapter\ApcuAdapter')) {
955
+ throw new \RuntimeException(sprintf('The Symfony Cache component must be installed to use "%s()".', __METHOD__));
956
+ }
957
+
958
+ if (!ApcuAdapter::isSupported()) {
959
+ return new NullAdapter();
960
+ }
961
+
962
+ $apcu = new ApcuAdapter($namespace, $defaultLifetime / 5, $version);
963
+ if ('cli' === \PHP_SAPI && !filter_var(ini_get('apc.enable_cli'), FILTER_VALIDATE_BOOLEAN)) {
964
+ $apcu->setLogger(new NullLogger());
965
+ } elseif (null !== $logger) {
966
+ $apcu->setLogger($logger);
967
+ }
968
+
969
+ return $apcu;
970
+ }
971
+ }
vendor/symfony/property-access/PropertyAccessorBuilder.php ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess;
13
+
14
+ use Psr\Cache\CacheItemPoolInterface;
15
+
16
+ /**
17
+ * A configurable builder to create a PropertyAccessor.
18
+ *
19
+ * @author Jérémie Augustin <jeremie.augustin@pixel-cookers.com>
20
+ */
21
+ class PropertyAccessorBuilder
22
+ {
23
+ private $magicCall = false;
24
+ private $throwExceptionOnInvalidIndex = false;
25
+
26
+ /**
27
+ * @var CacheItemPoolInterface|null
28
+ */
29
+ private $cacheItemPool;
30
+
31
+ /**
32
+ * Enables the use of "__call" by the PropertyAccessor.
33
+ *
34
+ * @return $this
35
+ */
36
+ public function enableMagicCall()
37
+ {
38
+ $this->magicCall = true;
39
+
40
+ return $this;
41
+ }
42
+
43
+ /**
44
+ * Disables the use of "__call" by the PropertyAccessor.
45
+ *
46
+ * @return $this
47
+ */
48
+ public function disableMagicCall()
49
+ {
50
+ $this->magicCall = false;
51
+
52
+ return $this;
53
+ }
54
+
55
+ /**
56
+ * @return bool whether the use of "__call" by the PropertyAccessor is enabled
57
+ */
58
+ public function isMagicCallEnabled()
59
+ {
60
+ return $this->magicCall;
61
+ }
62
+
63
+ /**
64
+ * Enables exceptions when reading a non-existing index.
65
+ *
66
+ * This has no influence on writing non-existing indices with PropertyAccessorInterface::setValue()
67
+ * which are always created on-the-fly.
68
+ *
69
+ * @return $this
70
+ */
71
+ public function enableExceptionOnInvalidIndex()
72
+ {
73
+ $this->throwExceptionOnInvalidIndex = true;
74
+
75
+ return $this;
76
+ }
77
+
78
+ /**
79
+ * Disables exceptions when reading a non-existing index.
80
+ *
81
+ * Instead, null is returned when calling PropertyAccessorInterface::getValue() on a non-existing index.
82
+ *
83
+ * @return $this
84
+ */
85
+ public function disableExceptionOnInvalidIndex()
86
+ {
87
+ $this->throwExceptionOnInvalidIndex = false;
88
+
89
+ return $this;
90
+ }
91
+
92
+ /**
93
+ * @return bool whether an exception is thrown or null is returned when reading a non-existing index
94
+ */
95
+ public function isExceptionOnInvalidIndexEnabled()
96
+ {
97
+ return $this->throwExceptionOnInvalidIndex;
98
+ }
99
+
100
+ /**
101
+ * Sets a cache system.
102
+ *
103
+ * @return PropertyAccessorBuilder The builder object
104
+ */
105
+ public function setCacheItemPool(CacheItemPoolInterface $cacheItemPool = null)
106
+ {
107
+ $this->cacheItemPool = $cacheItemPool;
108
+
109
+ return $this;
110
+ }
111
+
112
+ /**
113
+ * Gets the used cache system.
114
+ *
115
+ * @return CacheItemPoolInterface|null
116
+ */
117
+ public function getCacheItemPool()
118
+ {
119
+ return $this->cacheItemPool;
120
+ }
121
+
122
+ /**
123
+ * Builds and returns a new PropertyAccessor object.
124
+ *
125
+ * @return PropertyAccessorInterface The built PropertyAccessor
126
+ */
127
+ public function getPropertyAccessor()
128
+ {
129
+ return new PropertyAccessor($this->magicCall, $this->throwExceptionOnInvalidIndex, $this->cacheItemPool);
130
+ }
131
+ }
vendor/symfony/property-access/PropertyAccessorInterface.php ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess;
13
+
14
+ /**
15
+ * Writes and reads values to/from an object/array graph.
16
+ *
17
+ * @author Bernhard Schussek <bschussek@gmail.com>
18
+ */
19
+ interface PropertyAccessorInterface
20
+ {
21
+ /**
22
+ * Sets the value at the end of the property path of the object graph.
23
+ *
24
+ * Example:
25
+ *
26
+ * use Symfony\Component\PropertyAccess\PropertyAccess;
27
+ *
28
+ * $propertyAccessor = PropertyAccess::createPropertyAccessor();
29
+ *
30
+ * echo $propertyAccessor->setValue($object, 'child.name', 'Fabien');
31
+ * // equals echo $object->getChild()->setName('Fabien');
32
+ *
33
+ * This method first tries to find a public setter for each property in the
34
+ * path. The name of the setter must be the camel-cased property name
35
+ * prefixed with "set".
36
+ *
37
+ * If the setter does not exist, this method tries to find a public
38
+ * property. The value of the property is then changed.
39
+ *
40
+ * If neither is found, an exception is thrown.
41
+ *
42
+ * @param object|array $objectOrArray The object or array to modify
43
+ * @param string|PropertyPathInterface $propertyPath The property path to modify
44
+ * @param mixed $value The value to set at the end of the property path
45
+ *
46
+ * @throws Exception\InvalidArgumentException If the property path is invalid
47
+ * @throws Exception\AccessException If a property/index does not exist or is not public
48
+ * @throws Exception\UnexpectedTypeException If a value within the path is neither object nor array
49
+ */
50
+ public function setValue(&$objectOrArray, $propertyPath, $value);
51
+
52
+ /**
53
+ * Returns the value at the end of the property path of the object graph.
54
+ *
55
+ * Example:
56
+ *
57
+ * use Symfony\Component\PropertyAccess\PropertyAccess;
58
+ *
59
+ * $propertyAccessor = PropertyAccess::createPropertyAccessor();
60
+ *
61
+ * echo $propertyAccessor->getValue($object, 'child.name');
62
+ * // equals echo $object->getChild()->getName();
63
+ *
64
+ * This method first tries to find a public getter for each property in the
65
+ * path. The name of the getter must be the camel-cased property name
66
+ * prefixed with "get", "is", or "has".
67
+ *
68
+ * If the getter does not exist, this method tries to find a public
69
+ * property. The value of the property is then returned.
70
+ *
71
+ * If none of them are found, an exception is thrown.
72
+ *
73
+ * @param object|array $objectOrArray The object or array to traverse
74
+ * @param string|PropertyPathInterface $propertyPath The property path to read
75
+ *
76
+ * @return mixed The value at the end of the property path
77
+ *
78
+ * @throws Exception\InvalidArgumentException If the property path is invalid
79
+ * @throws Exception\AccessException If a property/index does not exist or is not public
80
+ * @throws Exception\UnexpectedTypeException If a value within the path is neither object
81
+ * nor array
82
+ */
83
+ public function getValue($objectOrArray, $propertyPath);
84
+
85
+ /**
86
+ * Returns whether a value can be written at a given property path.
87
+ *
88
+ * Whenever this method returns true, {@link setValue()} is guaranteed not
89
+ * to throw an exception when called with the same arguments.
90
+ *
91
+ * @param object|array $objectOrArray The object or array to check
92
+ * @param string|PropertyPathInterface $propertyPath The property path to check
93
+ *
94
+ * @return bool Whether the value can be set
95
+ *
96
+ * @throws Exception\InvalidArgumentException If the property path is invalid
97
+ */
98
+ public function isWritable($objectOrArray, $propertyPath);
99
+
100
+ /**
101
+ * Returns whether a property path can be read from an object graph.
102
+ *
103
+ * Whenever this method returns true, {@link getValue()} is guaranteed not
104
+ * to throw an exception when called with the same arguments.
105
+ *
106
+ * @param object|array $objectOrArray The object or array to check
107
+ * @param string|PropertyPathInterface $propertyPath The property path to check
108
+ *
109
+ * @return bool Whether the property path can be read
110
+ *
111
+ * @throws Exception\InvalidArgumentException If the property path is invalid
112
+ */
113
+ public function isReadable($objectOrArray, $propertyPath);
114
+ }
vendor/symfony/property-access/PropertyPath.php ADDED
@@ -0,0 +1,205 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess;
13
+
14
+ use Symfony\Component\PropertyAccess\Exception\InvalidArgumentException;
15
+ use Symfony\Component\PropertyAccess\Exception\InvalidPropertyPathException;
16
+ use Symfony\Component\PropertyAccess\Exception\OutOfBoundsException;
17
+
18
+ /**
19
+ * Default implementation of {@link PropertyPathInterface}.
20
+ *
21
+ * @author Bernhard Schussek <bschussek@gmail.com>
22
+ */
23
+ class PropertyPath implements \IteratorAggregate, PropertyPathInterface
24
+ {
25
+ /**
26
+ * Character used for separating between plural and singular of an element.
27
+ */
28
+ const SINGULAR_SEPARATOR = '|';
29
+
30
+ /**
31
+ * The elements of the property path.
32
+ *
33
+ * @var array
34
+ */
35
+ private $elements = [];
36
+
37
+ /**
38
+ * The number of elements in the property path.
39
+ *
40
+ * @var int
41
+ */
42
+ private $length;
43
+
44
+ /**
45
+ * Contains a Boolean for each property in $elements denoting whether this
46
+ * element is an index. It is a property otherwise.
47
+ *
48
+ * @var array
49
+ */
50
+ private $isIndex = [];
51
+
52
+ /**
53
+ * String representation of the path.
54
+ *
55
+ * @var string
56
+ */
57
+ private $pathAsString;
58
+
59
+ /**
60
+ * Constructs a property path from a string.
61
+ *
62
+ * @param PropertyPath|string $propertyPath The property path as string or instance
63
+ *
64
+ * @throws InvalidArgumentException If the given path is not a string
65
+ * @throws InvalidPropertyPathException If the syntax of the property path is not valid
66
+ */
67
+ public function __construct($propertyPath)
68
+ {
69
+ // Can be used as copy constructor
70
+ if ($propertyPath instanceof self) {
71
+ /* @var PropertyPath $propertyPath */
72
+ $this->elements = $propertyPath->elements;
73
+ $this->length = $propertyPath->length;
74
+ $this->isIndex = $propertyPath->isIndex;
75
+ $this->pathAsString = $propertyPath->pathAsString;
76
+
77
+ return;
78
+ }
79
+ if (!\is_string($propertyPath)) {
80
+ throw new InvalidArgumentException(sprintf('The property path constructor needs a string or an instance of "Symfony\Component\PropertyAccess\PropertyPath". Got: "%s".', \is_object($propertyPath) ? \get_class($propertyPath) : \gettype($propertyPath)));
81
+ }
82
+
83
+ if ('' === $propertyPath) {
84
+ throw new InvalidPropertyPathException('The property path should not be empty.');
85
+ }
86
+
87
+ $this->pathAsString = $propertyPath;
88
+ $position = 0;
89
+ $remaining = $propertyPath;
90
+
91
+ // first element is evaluated differently - no leading dot for properties
92
+ $pattern = '/^(([^\.\[]++)|\[([^\]]++)\])(.*)/';
93
+
94
+ while (preg_match($pattern, $remaining, $matches)) {
95
+ if ('' !== $matches[2]) {
96
+ $element = $matches[2];
97
+ $this->isIndex[] = false;
98
+ } else {
99
+ $element = $matches[3];
100
+ $this->isIndex[] = true;
101
+ }
102
+
103
+ $this->elements[] = $element;
104
+
105
+ $position += \strlen($matches[1]);
106
+ $remaining = $matches[4];
107
+ $pattern = '/^(\.([^\.|\[]++)|\[([^\]]++)\])(.*)/';
108
+ }
109
+
110
+ if ('' !== $remaining) {
111
+ throw new InvalidPropertyPathException(sprintf('Could not parse property path "%s". Unexpected token "%s" at position %d.', $propertyPath, $remaining[0], $position));
112
+ }
113
+
114
+ $this->length = \count($this->elements);
115
+ }
116
+
117
+ /**
118
+ * {@inheritdoc}
119
+ */
120
+ public function __toString()
121
+ {
122
+ return $this->pathAsString;
123
+ }
124
+
125
+ /**
126
+ * {@inheritdoc}
127
+ */
128
+ public function getLength()
129
+ {
130
+ return $this->length;
131
+ }
132
+
133
+ /**
134
+ * {@inheritdoc}
135
+ */
136
+ public function getParent()
137
+ {
138
+ if ($this->length <= 1) {
139
+ return null;
140
+ }
141
+
142
+ $parent = clone $this;
143
+
144
+ --$parent->length;
145
+ $parent->pathAsString = substr($parent->pathAsString, 0, max(strrpos($parent->pathAsString, '.'), strrpos($parent->pathAsString, '[')));
146
+ array_pop($parent->elements);
147
+ array_pop($parent->isIndex);
148
+
149
+ return $parent;
150
+ }
151
+
152
+ /**
153
+ * Returns a new iterator for this path.
154
+ *
155
+ * @return PropertyPathIteratorInterface
156
+ */
157
+ public function getIterator()
158
+ {
159
+ return new PropertyPathIterator($this);
160
+ }
161
+
162
+ /**
163
+ * {@inheritdoc}
164
+ */
165
+ public function getElements()
166
+ {
167
+ return $this->elements;
168
+ }
169
+
170
+ /**
171
+ * {@inheritdoc}
172
+ */
173
+ public function getElement($index)
174
+ {
175
+ if (!isset($this->elements[$index])) {
176
+ throw new OutOfBoundsException(sprintf('The index "%s" is not within the property path.', $index));
177
+ }
178
+
179
+ return $this->elements[$index];
180
+ }
181
+
182
+ /**
183
+ * {@inheritdoc}
184
+ */
185
+ public function isProperty($index)
186
+ {
187
+ if (!isset($this->isIndex[$index])) {
188
+ throw new OutOfBoundsException(sprintf('The index "%s" is not within the property path.', $index));
189
+ }
190
+
191
+ return !$this->isIndex[$index];
192
+ }
193
+
194
+ /**
195
+ * {@inheritdoc}
196
+ */
197
+ public function isIndex($index)
198
+ {
199
+ if (!isset($this->isIndex[$index])) {
200
+ throw new OutOfBoundsException(sprintf('The index "%s" is not within the property path.', $index));
201
+ }
202
+
203
+ return $this->isIndex[$index];
204
+ }
205
+ }
vendor/symfony/property-access/PropertyPathBuilder.php ADDED
@@ -0,0 +1,298 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess;
13
+
14
+ use Symfony\Component\PropertyAccess\Exception\OutOfBoundsException;
15
+
16
+ /**
17
+ * @author Bernhard Schussek <bschussek@gmail.com>
18
+ */
19
+ class PropertyPathBuilder
20
+ {
21
+ private $elements = [];
22
+ private $isIndex = [];
23
+
24
+ /**
25
+ * Creates a new property path builder.
26
+ *
27
+ * @param PropertyPathInterface|string|null $path The path to initially store
28
+ * in the builder. Optional.
29
+ */
30
+ public function __construct($path = null)
31
+ {
32
+ if (null !== $path) {
33
+ $this->append($path);
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Appends a (sub-) path to the current path.
39
+ *
40
+ * @param PropertyPathInterface|string $path The path to append
41
+ * @param int $offset The offset where the appended
42
+ * piece starts in $path
43
+ * @param int $length The length of the appended piece
44
+ * If 0, the full path is appended
45
+ */
46
+ public function append($path, $offset = 0, $length = 0)
47
+ {
48
+ if (\is_string($path)) {
49
+ $path = new PropertyPath($path);
50
+ }
51
+
52
+ if (0 === $length) {
53
+ $end = $path->getLength();
54
+ } else {
55
+ $end = $offset + $length;
56
+ }
57
+
58
+ for (; $offset < $end; ++$offset) {
59
+ $this->elements[] = $path->getElement($offset);
60
+ $this->isIndex[] = $path->isIndex($offset);
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Appends an index element to the current path.
66
+ *
67
+ * @param string $name The name of the appended index
68
+ */
69
+ public function appendIndex($name)
70
+ {
71
+ $this->elements[] = $name;
72
+ $this->isIndex[] = true;
73
+ }
74
+
75
+ /**
76
+ * Appends a property element to the current path.
77
+ *
78
+ * @param string $name The name of the appended property
79
+ */
80
+ public function appendProperty($name)
81
+ {
82
+ $this->elements[] = $name;
83
+ $this->isIndex[] = false;
84
+ }
85
+
86
+ /**
87
+ * Removes elements from the current path.
88
+ *
89
+ * @param int $offset The offset at which to remove
90
+ * @param int $length The length of the removed piece
91
+ *
92
+ * @throws OutOfBoundsException if offset is invalid
93
+ */
94
+ public function remove($offset, $length = 1)
95
+ {
96
+ if (!isset($this->elements[$offset])) {
97
+ throw new OutOfBoundsException(sprintf('The offset "%s" is not within the property path.', $offset));
98
+ }
99
+
100
+ $this->resize($offset, $length, 0);
101
+ }
102
+
103
+ /**
104
+ * Replaces a sub-path by a different (sub-) path.
105
+ *
106
+ * @param int $offset The offset at which to replace
107
+ * @param int $length The length of the piece to replace
108
+ * @param PropertyPathInterface|string $path The path to insert
109
+ * @param int $pathOffset The offset where the inserted piece
110
+ * starts in $path
111
+ * @param int $pathLength The length of the inserted piece
112
+ * If 0, the full path is inserted
113
+ *
114
+ * @throws OutOfBoundsException If the offset is invalid
115
+ */
116
+ public function replace($offset, $length, $path, $pathOffset = 0, $pathLength = 0)
117
+ {
118
+ if (\is_string($path)) {
119
+ $path = new PropertyPath($path);
120
+ }
121
+
122
+ if ($offset < 0 && abs($offset) <= $this->getLength()) {
123
+ $offset = $this->getLength() + $offset;
124
+ } elseif (!isset($this->elements[$offset])) {
125
+ throw new OutOfBoundsException('The offset '.$offset.' is not within the property path');
126
+ }
127
+
128
+ if (0 === $pathLength) {
129
+ $pathLength = $path->getLength() - $pathOffset;
130
+ }
131
+
132
+ $this->resize($offset, $length, $pathLength);
133
+
134
+ for ($i = 0; $i < $pathLength; ++$i) {
135
+ $this->elements[$offset + $i] = $path->getElement($pathOffset + $i);
136
+ $this->isIndex[$offset + $i] = $path->isIndex($pathOffset + $i);
137
+ }
138
+ ksort($this->elements);
139
+ }
140
+
141
+ /**
142
+ * Replaces a property element by an index element.
143
+ *
144
+ * @param int $offset The offset at which to replace
145
+ * @param string $name The new name of the element. Optional
146
+ *
147
+ * @throws OutOfBoundsException If the offset is invalid
148
+ */
149
+ public function replaceByIndex($offset, $name = null)
150
+ {
151
+ if (!isset($this->elements[$offset])) {
152
+ throw new OutOfBoundsException(sprintf('The offset "%s" is not within the property path.', $offset));
153
+ }
154
+
155
+ if (null !== $name) {
156
+ $this->elements[$offset] = $name;
157
+ }
158
+
159
+ $this->isIndex[$offset] = true;
160
+ }
161
+
162
+ /**
163
+ * Replaces an index element by a property element.
164
+ *
165
+ * @param int $offset The offset at which to replace
166
+ * @param string $name The new name of the element. Optional
167
+ *
168
+ * @throws OutOfBoundsException If the offset is invalid
169
+ */
170
+ public function replaceByProperty($offset, $name = null)
171
+ {
172
+ if (!isset($this->elements[$offset])) {
173
+ throw new OutOfBoundsException(sprintf('The offset "%s" is not within the property path.', $offset));
174
+ }
175
+
176
+ if (null !== $name) {
177
+ $this->elements[$offset] = $name;
178
+ }
179
+
180
+ $this->isIndex[$offset] = false;
181
+ }
182
+
183
+ /**
184
+ * Returns the length of the current path.
185
+ *
186
+ * @return int The path length
187
+ */
188
+ public function getLength()
189
+ {
190
+ return \count($this->elements);
191
+ }
192
+
193
+ /**
194
+ * Returns the current property path.
195
+ *
196
+ * @return PropertyPathInterface|null The constructed property path
197
+ */
198
+ public function getPropertyPath()
199
+ {
200
+ $pathAsString = $this->__toString();
201
+
202
+ return '' !== $pathAsString ? new PropertyPath($pathAsString) : null;
203
+ }
204
+
205
+ /**
206
+ * Returns the current property path as string.
207
+ *
208
+ * @return string The property path as string
209
+ */
210
+ public function __toString()
211
+ {
212
+ $string = '';
213
+
214
+ foreach ($this->elements as $offset => $element) {
215
+ if ($this->isIndex[$offset]) {
216
+ $element = '['.$element.']';
217
+ } elseif ('' !== $string) {
218
+ $string .= '.';
219
+ }
220
+
221
+ $string .= $element;
222
+ }
223
+
224
+ return $string;
225
+ }
226
+
227
+ /**
228
+ * Resizes the path so that a chunk of length $cutLength is
229
+ * removed at $offset and another chunk of length $insertionLength
230
+ * can be inserted.
231
+ *
232
+ * @param int $offset The offset where the removed chunk starts
233
+ * @param int $cutLength The length of the removed chunk
234
+ * @param int $insertionLength The length of the inserted chunk
235
+ */
236
+ private function resize($offset, $cutLength, $insertionLength)
237
+ {
238
+ // Nothing else to do in this case
239
+ if ($insertionLength === $cutLength) {
240
+ return;
241
+ }
242
+
243
+ $length = \count($this->elements);
244
+
245
+ if ($cutLength > $insertionLength) {
246
+ // More elements should be removed than inserted
247
+ $diff = $cutLength - $insertionLength;
248
+ $newLength = $length - $diff;
249
+
250
+ // Shift elements to the left (left-to-right until the new end)
251
+ // Max allowed offset to be shifted is such that
252
+ // $offset + $diff < $length (otherwise invalid index access)
253
+ // i.e. $offset < $length - $diff = $newLength
254
+ for ($i = $offset; $i < $newLength; ++$i) {
255
+ $this->elements[$i] = $this->elements[$i + $diff];
256
+ $this->isIndex[$i] = $this->isIndex[$i + $diff];
257
+ }
258
+
259
+ // All remaining elements should be removed
260
+ $this->elements = \array_slice($this->elements, 0, $i);
261
+ $this->isIndex = \array_slice($this->isIndex, 0, $i);
262
+ } else {
263
+ $diff = $insertionLength - $cutLength;
264
+
265
+ $newLength = $length + $diff;
266
+ $indexAfterInsertion = $offset + $insertionLength;
267
+
268
+ // $diff <= $insertionLength
269
+ // $indexAfterInsertion >= $insertionLength
270
+ // => $diff <= $indexAfterInsertion
271
+
272
+ // In each of the following loops, $i >= $diff must hold,
273
+ // otherwise ($i - $diff) becomes negative.
274
+
275
+ // Shift old elements to the right to make up space for the
276
+ // inserted elements. This needs to be done left-to-right in
277
+ // order to preserve an ascending array index order
278
+ // Since $i = max($length, $indexAfterInsertion) and $indexAfterInsertion >= $diff,
279
+ // $i >= $diff is guaranteed.
280
+ for ($i = max($length, $indexAfterInsertion); $i < $newLength; ++$i) {
281
+ $this->elements[$i] = $this->elements[$i - $diff];
282
+ $this->isIndex[$i] = $this->isIndex[$i - $diff];
283
+ }
284
+
285
+ // Shift remaining elements to the right. Do this right-to-left
286
+ // so we don't overwrite elements before copying them
287
+ // The last written index is the immediate index after the inserted
288
+ // string, because the indices before that will be overwritten
289
+ // anyway.
290
+ // Since $i >= $indexAfterInsertion and $indexAfterInsertion >= $diff,
291
+ // $i >= $diff is guaranteed.
292
+ for ($i = $length - 1; $i >= $indexAfterInsertion; --$i) {
293
+ $this->elements[$i] = $this->elements[$i - $diff];
294
+ $this->isIndex[$i] = $this->isIndex[$i - $diff];
295
+ }
296
+ }
297
+ }
298
+ }
vendor/symfony/property-access/PropertyPathInterface.php ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess;
13
+
14
+ /**
15
+ * A sequence of property names or array indices.
16
+ *
17
+ * @author Bernhard Schussek <bschussek@gmail.com>
18
+ */
19
+ interface PropertyPathInterface extends \Traversable
20
+ {
21
+ /**
22
+ * Returns the string representation of the property path.
23
+ *
24
+ * @return string The path as string
25
+ */
26
+ public function __toString();
27
+
28
+ /**
29
+ * Returns the length of the property path, i.e. the number of elements.
30
+ *
31
+ * @return int The path length
32
+ */
33
+ public function getLength();
34
+
35
+ /**
36
+ * Returns the parent property path.
37
+ *
38
+ * The parent property path is the one that contains the same items as
39
+ * this one except for the last one.
40
+ *
41
+ * If this property path only contains one item, null is returned.
42
+ *
43
+ * @return self|null The parent path or null
44
+ */
45
+ public function getParent();
46
+
47
+ /**
48
+ * Returns the elements of the property path as array.
49
+ *
50
+ * @return array An array of property/index names
51
+ */
52
+ public function getElements();
53
+
54
+ /**
55
+ * Returns the element at the given index in the property path.
56
+ *
57
+ * @param int $index The index key
58
+ *
59
+ * @return string A property or index name
60
+ *
61
+ * @throws Exception\OutOfBoundsException If the offset is invalid
62
+ */
63
+ public function getElement($index);
64
+
65
+ /**
66
+ * Returns whether the element at the given index is a property.
67
+ *
68
+ * @param int $index The index in the property path
69
+ *
70
+ * @return bool Whether the element at this index is a property
71
+ *
72
+ * @throws Exception\OutOfBoundsException If the offset is invalid
73
+ */
74
+ public function isProperty($index);
75
+
76
+ /**
77
+ * Returns whether the element at the given index is an array index.
78
+ *
79
+ * @param int $index The index in the property path
80
+ *
81
+ * @return bool Whether the element at this index is an array index
82
+ *
83
+ * @throws Exception\OutOfBoundsException If the offset is invalid
84
+ */
85
+ public function isIndex($index);
86
+ }
vendor/symfony/property-access/PropertyPathIterator.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess;
13
+
14
+ /**
15
+ * Traverses a property path and provides additional methods to find out
16
+ * information about the current element.
17
+ *
18
+ * @author Bernhard Schussek <bschussek@gmail.com>
19
+ */
20
+ class PropertyPathIterator extends \ArrayIterator implements PropertyPathIteratorInterface
21
+ {
22
+ protected $path;
23
+
24
+ /**
25
+ * @param PropertyPathInterface $path The property path to traverse
26
+ */
27
+ public function __construct(PropertyPathInterface $path)
28
+ {
29
+ parent::__construct($path->getElements());
30
+
31
+ $this->path = $path;
32
+ }
33
+
34
+ /**
35
+ * {@inheritdoc}
36
+ */
37
+ public function isIndex()
38
+ {
39
+ return $this->path->isIndex($this->key());
40
+ }
41
+
42
+ /**
43
+ * {@inheritdoc}
44
+ */
45
+ public function isProperty()
46
+ {
47
+ return $this->path->isProperty($this->key());
48
+ }
49
+ }
vendor/symfony/property-access/PropertyPathIteratorInterface.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess;
13
+
14
+ /**
15
+ * @author Bernhard Schussek <bschussek@gmail.com>
16
+ */
17
+ interface PropertyPathIteratorInterface extends \Iterator, \SeekableIterator
18
+ {
19
+ /**
20
+ * Returns whether the current element in the property path is an array
21
+ * index.
22
+ *
23
+ * @return bool
24
+ */
25
+ public function isIndex();
26
+
27
+ /**
28
+ * Returns whether the current element in the property path is a property
29
+ * name.
30
+ *
31
+ * @return bool
32
+ */
33
+ public function isProperty();
34
+ }
vendor/symfony/property-access/README.md ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ PropertyAccess Component
2
+ ========================
3
+
4
+ The PropertyAccess component provides function to read and write from/to an
5
+ object or array using a simple string notation.
6
+
7
+ Resources
8
+ ---------
9
+
10
+ * [Documentation](https://symfony.com/doc/current/components/property_access.html)
11
+ * [Contributing](https://symfony.com/doc/current/contributing/index.html)
12
+ * [Report issues](https://github.com/symfony/symfony/issues) and
13
+ [send Pull Requests](https://github.com/symfony/symfony/pulls)
14
+ in the [main Symfony repository](https://github.com/symfony/symfony)
vendor/symfony/property-access/StringUtil.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\PropertyAccess;
13
+
14
+ use Symfony\Component\Inflector\Inflector;
15
+
16
+ /**
17
+ * Creates singulars from plurals.
18
+ *
19
+ * @author Bernhard Schussek <bschussek@gmail.com>
20
+ *
21
+ * @deprecated since version 3.1, to be removed in 4.0. Use {@see Symfony\Component\Inflector\Inflector} instead.
22
+ */
23
+ class StringUtil
24
+ {
25
+ /**
26
+ * This class should not be instantiated.
27
+ */
28
+ private function __construct()
29
+ {
30
+ }
31
+
32
+ /**
33
+ * Returns the singular form of a word.
34
+ *
35
+ * If the method can't determine the form with certainty, an array of the
36
+ * possible singulars is returned.
37
+ *
38
+ * @param string $plural A word in plural form
39
+ *
40
+ * @return string|array The singular form or an array of possible singular
41
+ * forms
42
+ *
43
+ * @deprecated since version 3.1, to be removed in 4.0. Use {@see Symfony\Component\Inflector\Inflector::singularize} instead.
44
+ */
45
+ public static function singularify($plural)
46
+ {
47
+ @trigger_error('StringUtil::singularify() is deprecated since Symfony 3.1 and will be removed in 4.0. Use Symfony\Component\Inflector\Inflector::singularize instead.', E_USER_DEPRECATED);
48
+
49
+ return Inflector::singularize($plural);
50
+ }
51
+ }
vendor/symfony/property-access/composer.json ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "symfony/property-access",
3
+ "type": "library",
4
+ "description": "Symfony PropertyAccess Component",
5
+ "keywords": ["property", "index", "access", "object", "array", "extraction", "injection", "reflection", "property path"],
6
+ "homepage": "https://symfony.com",
7
+ "license": "MIT",
8
+ "authors": [
9
+ {
10
+ "name": "Fabien Potencier",
11
+ "email": "fabien@symfony.com"
12
+ },
13
+ {
14
+ "name": "Symfony Community",
15
+ "homepage": "https://symfony.com/contributors"
16
+ }
17
+ ],
18
+ "require": {
19
+ "php": "^5.5.9|>=7.0.8",
20
+ "symfony/polyfill-php70": "~1.0",
21
+ "symfony/inflector": "~3.1|~4.0"
22
+ },
23
+ "require-dev": {
24
+ "symfony/cache": "~3.1|~4.0"
25
+ },
26
+ "suggest": {
27
+ "psr/cache-implementation": "To cache access methods."
28
+ },
29
+ "autoload": {
30
+ "psr-4": { "Symfony\\Component\\PropertyAccess\\": "" },
31
+ "exclude-from-classmap": [
32
+ "/Tests/"
33
+ ]
34
+ },
35
+ "minimum-stability": "dev",
36
+ "extra": {
37
+ "branch-alias": {
38
+ "dev-master": "3.4-dev"
39
+ }
40
+ }
41
+ }
vendor/symfony/property-access/phpunit.xml.dist ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+
3
+ <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+ xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/5.2/phpunit.xsd"
5
+ backupGlobals="false"
6
+ colors="true"
7
+ bootstrap="vendor/autoload.php"
8
+ failOnRisky="true"
9
+ failOnWarning="true"
10
+ >
11
+ <php>
12
+ <ini name="error_reporting" value="-1" />
13
+ </php>
14
+
15
+ <testsuites>
16
+ <testsuite name="Symfony PropertyAccess Component Test Suite">
17
+ <directory>./Tests/</directory>
18
+ </testsuite>
19
+ </testsuites>
20
+
21
+ <filter>
22
+ <whitelist>
23
+ <directory>./</directory>
24
+ <exclude>
25
+ <directory>./Resources</directory>
26
+ <directory>./Tests</directory>
27
+ <directory>./vendor</directory>
28
+ </exclude>
29
+ </whitelist>
30
+ </filter>
31
+ </phpunit>
views/lookup.php CHANGED
@@ -117,26 +117,59 @@ function var_export_short($data, $return=true)
117
 
118
  <?php
119
  function show_row($record, $key_1, $key_2, $value = null, $class = '') {
 
 
 
120
  if (is_array($value)) {
121
  if ($key_2 === 'names') {
122
  show_row($record, $key_1, 'name', null, $class);
123
  return;
124
  }
125
  if ($key_1 === 'subdivisions') {
126
- foreach ($value as $key_3 => $v) {
127
- show_row($record, 'most_specific_subdivision', $key_3, $v, $class);
 
 
 
 
 
 
 
 
 
128
  }
129
  return;
130
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
131
  }
132
  $camel_key_1 = _geoip_dashes_to_camel_case($key_1);
133
  $camel_key_2 = _geoip_dashes_to_camel_case($key_2);
134
 
135
  try {
136
  if (is_object($record) ) {
137
- $value = $record->$camel_key_1;
138
- if (is_object($value)) {
139
- $value = $value->$camel_key_2;
 
 
 
 
140
  }
141
  }
142
  } catch(\RuntimeException $e) {
@@ -146,9 +179,7 @@ function var_export_short($data, $return=true)
146
  $value = var_export_short($value, true);
147
  }
148
 
149
- $locales = sanitize_text_field(@$_POST['locales']);
150
-
151
- switch(sanitize_key($_POST['syntax'])) {
152
  case 'shortcode':
153
  $extra = '';
154
  if ($locales && $key_2 === 'name') {
117
 
118
  <?php
119
  function show_row($record, $key_1, $key_2, $value = null, $class = '') {
120
+ $syntax = sanitize_key($_POST['syntax']);
121
+ $locales = sanitize_text_field(@$_POST['locales']);
122
+
123
  if (is_array($value)) {
124
  if ($key_2 === 'names') {
125
  show_row($record, $key_1, 'name', null, $class);
126
  return;
127
  }
128
  if ($key_1 === 'subdivisions') {
129
+ $index = (int) $key_2;
130
+ if ($index === 0) { /* Do it only once! Most specific subdivision is actually not index 0, but the highest index, but it works - as I don't use the index in the following `show_row` */
131
+ foreach ($value as $key_3 => $v) {
132
+ show_row($record, 'most_specific_subdivision', $key_3, $v, $class);
133
+ }
134
+ }
135
+ if ($class == 'all') {
136
+ foreach ($value as $key_3 => $v) {
137
+ $new_key_1 = 'subdivisions' . ( ($syntax === 'php') ? '[' . $index . ']' : '.' . $index);
138
+ show_row($record->subdivisions[$index], $new_key_1, $key_3, $v, $class);
139
+ }
140
  }
141
  return;
142
  }
143
+ /* This is quite complex to do right. Postponed
144
+ if ($key_2 == 'original') {
145
+ // It must be recursive, as we don't know how deep the array is nested. Level 1
146
+ $new_key_1 = $key_1 . ( ($syntax === 'php') ? '->' : '.') . 'original';
147
+ foreach($value as $key_3 => $v) {
148
+ show_row(null, $new_key_1, $key_3, $v, $class);
149
+ }
150
+ }
151
+ if (_geoip_str_ends_with($key_1, 'original')) {
152
+ // Level 2 and counting
153
+ $new_key_1 = $key_1 . ( ($syntax === 'php') ? '["' . $key_2 . '"]' : '.' . $key_2);
154
+ foreach($value as $key_3 => $v) {
155
+ show_row(null, $new_key_1, $key_3, $v, $class);
156
+ }
157
+
158
+ }
159
+ */
160
  }
161
  $camel_key_1 = _geoip_dashes_to_camel_case($key_1);
162
  $camel_key_2 = _geoip_dashes_to_camel_case($key_2);
163
 
164
  try {
165
  if (is_object($record) ) {
166
+ if (isset($record->$camel_key_1)) {
167
+ $value = $record->$camel_key_1;
168
+ if (is_object($value)) {
169
+ $value = $value->$camel_key_2;
170
+ }
171
+ } else {
172
+ $value = $record->$camel_key_2;
173
  }
174
  }
175
  } catch(\RuntimeException $e) {
179
  $value = var_export_short($value, true);
180
  }
181
 
182
+ switch($syntax) {
 
 
183
  case 'shortcode':
184
  $extra = '';
185
  if ($locales && $key_2 === 'name') {
views/options.php CHANGED
@@ -108,7 +108,7 @@ $currentSourceId = $currentSource->getId();
108
  <span class="detail-box">
109
  <?php if (empty($wp_options['has_reverse_proxy']) && !empty($wp_options['trusted_proxy_ips'])) : ?>
110
  <span style="color:red">
111
- <?php printf(__('Warning: As you didn\'t tick the option "%s" above, seting trusted IPs has no effect. This is only used for reverse proxies.', 'geoip-detect'), __('The server is behind a reverse proxy', 'geoip-detect') ); ?>
112
  </span><br>
113
  <?php endif; ?>
114
  <?php _e('If specified, only IPs in this list will be treated as proxy.', 'geoip-detect'); ?><br>
108
  <span class="detail-box">
109
  <?php if (empty($wp_options['has_reverse_proxy']) && !empty($wp_options['trusted_proxy_ips'])) : ?>
110
  <span style="color:red">
111
+ <?php printf(__('Warning: As you didn\'t tick the option "%s" above, setting trusted IPs has no effect. This is only used for reverse proxies.', 'geoip-detect'), __('The server is behind a reverse proxy', 'geoip-detect') ); ?>
112
  </span><br>
113
  <?php endif; ?>
114
  <?php _e('If specified, only IPs in this list will be treated as proxy.', 'geoip-detect'); ?><br>
yarn.lock CHANGED
@@ -9,28 +9,28 @@
9
  dependencies:
10
  "@babel/highlight" "^7.8.3"
11
 
12
- "@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0":
13
- version "7.9.0"
14
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c"
15
- integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==
16
  dependencies:
17
- browserslist "^4.9.1"
18
  invariant "^2.2.4"
19
  semver "^5.5.0"
20
 
21
  "@babel/core@>=7.7.2", "@babel/core@^7.4.4":
22
- version "7.9.0"
23
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e"
24
- integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==
25
  dependencies:
26
  "@babel/code-frame" "^7.8.3"
27
- "@babel/generator" "^7.9.0"
28
  "@babel/helper-module-transforms" "^7.9.0"
29
- "@babel/helpers" "^7.9.0"
30
- "@babel/parser" "^7.9.0"
31
  "@babel/template" "^7.8.6"
32
- "@babel/traverse" "^7.9.0"
33
- "@babel/types" "^7.9.0"
34
  convert-source-map "^1.7.0"
35
  debug "^4.1.0"
36
  gensync "^1.0.0-beta.1"
@@ -40,12 +40,12 @@
40
  semver "^5.4.1"
41
  source-map "^0.5.0"
42
 
43
- "@babel/generator@^7.4.4", "@babel/generator@^7.9.0":
44
- version "7.9.4"
45
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce"
46
- integrity sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==
47
  dependencies:
48
- "@babel/types" "^7.9.0"
49
  jsesc "^2.5.1"
50
  lodash "^4.17.13"
51
  source-map "^0.5.0"
@@ -66,13 +66,13 @@
66
  "@babel/types" "^7.8.3"
67
 
68
  "@babel/helper-builder-react-jsx-experimental@^7.9.0":
69
- version "7.9.0"
70
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz#066d80262ade488f9c1b1823ce5db88a4cedaa43"
71
- integrity sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ==
72
  dependencies:
73
  "@babel/helper-annotate-as-pure" "^7.8.3"
74
  "@babel/helper-module-imports" "^7.8.3"
75
- "@babel/types" "^7.9.0"
76
 
77
  "@babel/helper-builder-react-jsx@^7.9.0":
78
  version "7.9.0"
@@ -82,13 +82,13 @@
82
  "@babel/helper-annotate-as-pure" "^7.8.3"
83
  "@babel/types" "^7.9.0"
84
 
85
- "@babel/helper-compilation-targets@^7.8.7":
86
- version "7.8.7"
87
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde"
88
- integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==
89
  dependencies:
90
- "@babel/compat-data" "^7.8.6"
91
- browserslist "^4.9.1"
92
  invariant "^2.2.4"
93
  levenary "^1.1.1"
94
  semver "^5.5.0"
@@ -119,14 +119,14 @@
119
  "@babel/traverse" "^7.8.3"
120
  "@babel/types" "^7.8.3"
121
 
122
- "@babel/helper-function-name@^7.8.3":
123
- version "7.8.3"
124
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca"
125
- integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==
126
  dependencies:
127
  "@babel/helper-get-function-arity" "^7.8.3"
128
  "@babel/template" "^7.8.3"
129
- "@babel/types" "^7.8.3"
130
 
131
  "@babel/helper-get-function-arity@^7.8.3":
132
  version "7.8.3"
@@ -200,14 +200,14 @@
200
  "@babel/types" "^7.8.3"
201
 
202
  "@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6":
203
- version "7.8.6"
204
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8"
205
- integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==
206
  dependencies:
207
  "@babel/helper-member-expression-to-functions" "^7.8.3"
208
  "@babel/helper-optimise-call-expression" "^7.8.3"
209
- "@babel/traverse" "^7.8.6"
210
- "@babel/types" "^7.8.6"
211
 
212
  "@babel/helper-simple-access@^7.8.3":
213
  version "7.8.3"
@@ -224,10 +224,10 @@
224
  dependencies:
225
  "@babel/types" "^7.8.3"
226
 
227
- "@babel/helper-validator-identifier@^7.9.0":
228
- version "7.9.0"
229
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed"
230
- integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==
231
 
232
  "@babel/helper-wrap-function@^7.8.3":
233
  version "7.8.3"
@@ -239,14 +239,14 @@
239
  "@babel/traverse" "^7.8.3"
240
  "@babel/types" "^7.8.3"
241
 
242
- "@babel/helpers@^7.9.0":
243
- version "7.9.2"
244
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f"
245
- integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==
246
  dependencies:
247
  "@babel/template" "^7.8.3"
248
- "@babel/traverse" "^7.9.0"
249
- "@babel/types" "^7.9.0"
250
 
251
  "@babel/highlight@^7.8.3":
252
  version "7.9.0"
@@ -257,10 +257,10 @@
257
  chalk "^2.0.0"
258
  js-tokens "^4.0.0"
259
 
260
- "@babel/parser@^7.4.4", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0":
261
- version "7.9.4"
262
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8"
263
- integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==
264
 
265
  "@babel/plugin-proposal-async-generator-functions@^7.8.3":
266
  version "7.8.3"
@@ -303,13 +303,14 @@
303
  "@babel/helper-plugin-utils" "^7.8.3"
304
  "@babel/plugin-syntax-numeric-separator" "^7.8.3"
305
 
306
- "@babel/plugin-proposal-object-rest-spread@^7.9.0":
307
- version "7.9.0"
308
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f"
309
- integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow==
310
  dependencies:
311
  "@babel/helper-plugin-utils" "^7.8.3"
312
  "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
 
313
 
314
  "@babel/plugin-proposal-optional-catch-binding@^7.8.3":
315
  version "7.8.3"
@@ -443,14 +444,14 @@
443
  "@babel/helper-plugin-utils" "^7.8.3"
444
  lodash "^4.17.13"
445
 
446
- "@babel/plugin-transform-classes@^7.9.0":
447
- version "7.9.2"
448
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d"
449
- integrity sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==
450
  dependencies:
451
  "@babel/helper-annotate-as-pure" "^7.8.3"
452
  "@babel/helper-define-map" "^7.8.3"
453
- "@babel/helper-function-name" "^7.8.3"
454
  "@babel/helper-optimise-call-expression" "^7.8.3"
455
  "@babel/helper-plugin-utils" "^7.8.3"
456
  "@babel/helper-replace-supers" "^7.8.6"
@@ -464,10 +465,10 @@
464
  dependencies:
465
  "@babel/helper-plugin-utils" "^7.8.3"
466
 
467
- "@babel/plugin-transform-destructuring@^7.8.3":
468
- version "7.8.8"
469
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz#fadb2bc8e90ccaf5658de6f8d4d22ff6272a2f4b"
470
- integrity sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ==
471
  dependencies:
472
  "@babel/helper-plugin-utils" "^7.8.3"
473
 
@@ -531,34 +532,34 @@
531
  dependencies:
532
  "@babel/helper-plugin-utils" "^7.8.3"
533
 
534
- "@babel/plugin-transform-modules-amd@^7.9.0":
535
- version "7.9.0"
536
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4"
537
- integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==
538
  dependencies:
539
  "@babel/helper-module-transforms" "^7.9.0"
540
  "@babel/helper-plugin-utils" "^7.8.3"
541
- babel-plugin-dynamic-import-node "^2.3.0"
542
 
543
- "@babel/plugin-transform-modules-commonjs@^7.4.4", "@babel/plugin-transform-modules-commonjs@^7.9.0":
544
- version "7.9.0"
545
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940"
546
- integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==
547
  dependencies:
548
  "@babel/helper-module-transforms" "^7.9.0"
549
  "@babel/helper-plugin-utils" "^7.8.3"
550
  "@babel/helper-simple-access" "^7.8.3"
551
- babel-plugin-dynamic-import-node "^2.3.0"
552
 
553
- "@babel/plugin-transform-modules-systemjs@^7.9.0":
554
- version "7.9.0"
555
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90"
556
- integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==
557
  dependencies:
558
  "@babel/helper-hoist-variables" "^7.8.3"
559
  "@babel/helper-module-transforms" "^7.9.0"
560
  "@babel/helper-plugin-utils" "^7.8.3"
561
- babel-plugin-dynamic-import-node "^2.3.0"
562
 
563
  "@babel/plugin-transform-modules-umd@^7.9.0":
564
  version "7.9.0"
@@ -590,10 +591,10 @@
590
  "@babel/helper-plugin-utils" "^7.8.3"
591
  "@babel/helper-replace-supers" "^7.8.3"
592
 
593
- "@babel/plugin-transform-parameters@^7.8.7":
594
- version "7.9.3"
595
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz#3028d0cc20ddc733166c6e9c8534559cee09f54a"
596
- integrity sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==
597
  dependencies:
598
  "@babel/helper-get-function-arity" "^7.8.3"
599
  "@babel/helper-plugin-utils" "^7.8.3"
@@ -630,9 +631,9 @@
630
  "@babel/helper-plugin-utils" "^7.8.3"
631
 
632
  "@babel/plugin-transform-runtime@>=7.6.2":
633
- version "7.9.0"
634
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b"
635
- integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==
636
  dependencies:
637
  "@babel/helper-module-imports" "^7.8.3"
638
  "@babel/helper-plugin-utils" "^7.8.3"
@@ -685,12 +686,12 @@
685
  "@babel/helper-plugin-utils" "^7.8.3"
686
 
687
  "@babel/preset-env@^7.4.4":
688
- version "7.9.0"
689
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8"
690
- integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==
691
  dependencies:
692
- "@babel/compat-data" "^7.9.0"
693
- "@babel/helper-compilation-targets" "^7.8.7"
694
  "@babel/helper-module-imports" "^7.8.3"
695
  "@babel/helper-plugin-utils" "^7.8.3"
696
  "@babel/plugin-proposal-async-generator-functions" "^7.8.3"
@@ -698,7 +699,7 @@
698
  "@babel/plugin-proposal-json-strings" "^7.8.3"
699
  "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3"
700
  "@babel/plugin-proposal-numeric-separator" "^7.8.3"
701
- "@babel/plugin-proposal-object-rest-spread" "^7.9.0"
702
  "@babel/plugin-proposal-optional-catch-binding" "^7.8.3"
703
  "@babel/plugin-proposal-optional-chaining" "^7.9.0"
704
  "@babel/plugin-proposal-unicode-property-regex" "^7.8.3"
@@ -715,9 +716,9 @@
715
  "@babel/plugin-transform-async-to-generator" "^7.8.3"
716
  "@babel/plugin-transform-block-scoped-functions" "^7.8.3"
717
  "@babel/plugin-transform-block-scoping" "^7.8.3"
718
- "@babel/plugin-transform-classes" "^7.9.0"
719
  "@babel/plugin-transform-computed-properties" "^7.8.3"
720
- "@babel/plugin-transform-destructuring" "^7.8.3"
721
  "@babel/plugin-transform-dotall-regex" "^7.8.3"
722
  "@babel/plugin-transform-duplicate-keys" "^7.8.3"
723
  "@babel/plugin-transform-exponentiation-operator" "^7.8.3"
@@ -725,14 +726,14 @@
725
  "@babel/plugin-transform-function-name" "^7.8.3"
726
  "@babel/plugin-transform-literals" "^7.8.3"
727
  "@babel/plugin-transform-member-expression-literals" "^7.8.3"
728
- "@babel/plugin-transform-modules-amd" "^7.9.0"
729
- "@babel/plugin-transform-modules-commonjs" "^7.9.0"
730
- "@babel/plugin-transform-modules-systemjs" "^7.9.0"
731
  "@babel/plugin-transform-modules-umd" "^7.9.0"
732
  "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3"
733
  "@babel/plugin-transform-new-target" "^7.8.3"
734
  "@babel/plugin-transform-object-super" "^7.8.3"
735
- "@babel/plugin-transform-parameters" "^7.8.7"
736
  "@babel/plugin-transform-property-literals" "^7.8.3"
737
  "@babel/plugin-transform-regenerator" "^7.8.7"
738
  "@babel/plugin-transform-reserved-words" "^7.8.3"
@@ -743,8 +744,8 @@
743
  "@babel/plugin-transform-typeof-symbol" "^7.8.4"
744
  "@babel/plugin-transform-unicode-regex" "^7.8.3"
745
  "@babel/preset-modules" "^0.1.3"
746
- "@babel/types" "^7.9.0"
747
- browserslist "^4.9.1"
748
  core-js-compat "^3.6.2"
749
  invariant "^2.2.2"
750
  levenary "^1.1.1"
@@ -762,9 +763,9 @@
762
  esutils "^2.0.2"
763
 
764
  "@babel/runtime@>=7.7.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.8.4":
765
- version "7.9.2"
766
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06"
767
- integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==
768
  dependencies:
769
  regenerator-runtime "^0.13.4"
770
 
@@ -777,34 +778,34 @@
777
  "@babel/parser" "^7.8.6"
778
  "@babel/types" "^7.8.6"
779
 
780
- "@babel/traverse@^7.4.4", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0":
781
- version "7.9.0"
782
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892"
783
- integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==
784
  dependencies:
785
  "@babel/code-frame" "^7.8.3"
786
- "@babel/generator" "^7.9.0"
787
- "@babel/helper-function-name" "^7.8.3"
788
  "@babel/helper-split-export-declaration" "^7.8.3"
789
- "@babel/parser" "^7.9.0"
790
- "@babel/types" "^7.9.0"
791
  debug "^4.1.0"
792
  globals "^11.1.0"
793
  lodash "^4.17.13"
794
 
795
- "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0":
796
- version "7.9.0"
797
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5"
798
- integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==
799
  dependencies:
800
- "@babel/helper-validator-identifier" "^7.9.0"
801
  lodash "^4.17.13"
802
  to-fast-properties "^2.0.0"
803
 
804
  "@iarna/toml@^2.2.0":
805
- version "2.2.3"
806
- resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.3.tgz#f060bf6eaafae4d56a7dac618980838b0696e2ab"
807
- integrity sha512-FmuxfCuolpLl0AnQ2NHSzoUKWEJDFl63qXjzdoWBVyFCXzMGm1spBzk7LeHNoVCiWCF7mRVms9e6jEV9+MoPbg==
808
 
809
  "@mrmlnc/readdir-enhanced@^2.2.1":
810
  version "2.2.1"
@@ -866,9 +867,9 @@
866
  integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
867
 
868
  "@types/q@^1.5.1":
869
- version "1.5.2"
870
- resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
871
- integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==
872
 
873
  abab@^2.0.0:
874
  version "2.0.3"
@@ -899,14 +900,14 @@ acorn@^6.0.1, acorn@^6.0.4:
899
  integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==
900
 
901
  acorn@^7.1.1:
902
- version "7.1.1"
903
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf"
904
- integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==
905
 
906
  ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5:
907
- version "6.12.0"
908
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7"
909
- integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==
910
  dependencies:
911
  fast-deep-equal "^3.1.1"
912
  fast-json-stable-stringify "^2.0.0"
@@ -1135,10 +1136,10 @@ babel-messages@^6.23.0:
1135
  dependencies:
1136
  babel-runtime "^6.22.0"
1137
 
1138
- babel-plugin-dynamic-import-node@^2.3.0:
1139
- version "2.3.0"
1140
- resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f"
1141
- integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==
1142
  dependencies:
1143
  object.assign "^4.1.0"
1144
 
@@ -1264,11 +1265,16 @@ bindings@^1.5.0:
1264
  dependencies:
1265
  file-uri-to-path "1.0.0"
1266
 
1267
- bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
1268
  version "4.11.8"
1269
  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
1270
  integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
1271
 
 
 
 
 
 
1272
  boolbase@^1.0.0, boolbase@~1.0.0:
1273
  version "1.0.0"
1274
  resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
@@ -1349,7 +1355,7 @@ browserify-des@^1.0.0:
1349
  inherits "^2.0.1"
1350
  safe-buffer "^5.1.2"
1351
 
1352
- browserify-rsa@^4.0.0:
1353
  version "4.0.1"
1354
  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
1355
  integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=
@@ -1358,17 +1364,19 @@ browserify-rsa@^4.0.0:
1358
  randombytes "^2.0.1"
1359
 
1360
  browserify-sign@^4.0.0:
1361
- version "4.0.4"
1362
- resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
1363
- integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=
1364
- dependencies:
1365
- bn.js "^4.1.1"
1366
- browserify-rsa "^4.0.0"
1367
- create-hash "^1.1.0"
1368
- create-hmac "^1.1.2"
1369
- elliptic "^6.0.0"
1370
- inherits "^2.0.1"
1371
- parse-asn1 "^5.0.0"
 
 
1372
 
1373
  browserify-zlib@^0.2.0:
1374
  version "0.2.0"
@@ -1377,15 +1385,15 @@ browserify-zlib@^0.2.0:
1377
  dependencies:
1378
  pako "~1.0.5"
1379
 
1380
- browserslist@^4.0.0, browserslist@^4.1.0, browserslist@^4.8.3, browserslist@^4.9.1:
1381
- version "4.11.0"
1382
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.0.tgz#aef4357b10a8abda00f97aac7cd587b2082ba1ad"
1383
- integrity sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A==
1384
  dependencies:
1385
- caniuse-lite "^1.0.30001035"
1386
- electron-to-chromium "^1.3.380"
1387
- node-releases "^1.1.52"
1388
- pkg-up "^3.1.0"
1389
 
1390
  buffer-equal@0.0.1:
1391
  version "0.0.1"
@@ -1480,10 +1488,10 @@ caniuse-api@^3.0.0:
1480
  lodash.memoize "^4.1.2"
1481
  lodash.uniq "^4.5.0"
1482
 
1483
- caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001035:
1484
- version "1.0.30001038"
1485
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz#44da3cbca2ab6cb6aa83d1be5d324e17f141caff"
1486
- integrity sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ==
1487
 
1488
  caseless@~0.12.0:
1489
  version "0.12.0"
@@ -1588,9 +1596,9 @@ cli-spinners@^1.1.0:
1588
  integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==
1589
 
1590
  cli-width@^2.0.0:
1591
- version "2.2.0"
1592
- resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
1593
- integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=
1594
 
1595
  cliui@^2.1.0:
1596
  version "2.1.0"
@@ -1700,9 +1708,9 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
1700
  delayed-stream "~1.0.0"
1701
 
1702
  command-exists@^1.2.6:
1703
- version "1.2.8"
1704
- resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.8.tgz#715acefdd1223b9c9b37110a149c6392c2852291"
1705
- integrity sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==
1706
 
1707
  commander@^2.11.0, commander@^2.19.0, commander@^2.20.0:
1708
  version "2.20.3"
@@ -1752,11 +1760,11 @@ copy-descriptor@^0.1.0:
1752
  integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
1753
 
1754
  core-js-compat@^3.6.2:
1755
- version "3.6.4"
1756
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17"
1757
- integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==
1758
  dependencies:
1759
- browserslist "^4.8.3"
1760
  semver "7.0.0"
1761
 
1762
  core-js@^2.4.0, core-js@^2.6.5:
@@ -1787,7 +1795,7 @@ create-ecdh@^4.0.0:
1787
  bn.js "^4.1.0"
1788
  elliptic "^6.0.0"
1789
 
1790
- create-hash@^1.1.0, create-hash@^1.1.2:
1791
  version "1.2.0"
1792
  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
1793
  integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
@@ -1798,7 +1806,7 @@ create-hash@^1.1.0, create-hash@^1.1.2:
1798
  ripemd160 "^2.0.1"
1799
  sha.js "^2.4.0"
1800
 
1801
- create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
1802
  version "1.1.7"
1803
  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
1804
  integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
@@ -2017,9 +2025,9 @@ data-urls@^1.1.0:
2017
  whatwg-url "^7.0.0"
2018
 
2019
  deasync@^0.1.14:
2020
- version "0.1.19"
2021
- resolved "https://registry.yarnpkg.com/deasync/-/deasync-0.1.19.tgz#e7ea89fcc9ad483367e8a48fe78f508ca86286e8"
2022
- integrity sha512-oh3MRktfnPlLysCPpBpKZZzb4cUC/p0aA3SyRGp15lN30juJBTo/CiD0d4fR+f1kBtUQoJj1NE9RPNWQ7BQ9Mg==
2023
  dependencies:
2024
  bindings "^1.5.0"
2025
  node-addon-api "^1.7.1"
@@ -2210,12 +2218,12 @@ ee-first@1.1.1:
2210
  resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
2211
  integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
2212
 
2213
- electron-to-chromium@^1.3.380:
2214
- version "1.3.390"
2215
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.390.tgz#a49e67dea22e52ea8027c475dd5447b1c00b1d4e"
2216
- integrity sha512-4RvbM5x+002gKI8sltkqWEk5pptn0UnzekUx8RTThAMPDSb8jjpm6SwGiSnEve7f85biyZl8DMXaipaCxDjXag==
2217
 
2218
- elliptic@^6.0.0:
2219
  version "6.5.2"
2220
  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762"
2221
  integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==
@@ -2229,8 +2237,8 @@ elliptic@^6.0.0:
2229
  minimalistic-crypto-utils "^1.0.0"
2230
 
2231
  emoji-flags@matiassingers/emoji-flags#master:
2232
- version "1.2.0"
2233
- resolved "https://codeload.github.com/matiassingers/emoji-flags/tar.gz/af37287d5c28de6db7c2001fb2e82a52f5d59c46"
2234
  dependencies:
2235
  columnify "1.5.1"
2236
  lodash.find "3.2.1"
@@ -2256,14 +2264,14 @@ entities@^1.1.1, entities@^1.1.2:
2256
  integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
2257
 
2258
  entities@^2.0.0:
2259
- version "2.0.0"
2260
- resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4"
2261
- integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==
2262
 
2263
  envinfo@^7.3.1:
2264
- version "7.5.0"
2265
- resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.5.0.tgz#91410bb6db262fb4f1409bd506e9ff57e91023f4"
2266
- integrity sha512-jDgnJaF/Btomk+m3PZDTTCb5XIIIX3zYItnCRfF73zVgvinLoRomuhi75Y4su0PtQxWz4v66XnLLckyvyJTOIQ==
2267
 
2268
  error-ex@^1.3.1:
2269
  version "1.3.2"
@@ -2272,7 +2280,7 @@ error-ex@^1.3.1:
2272
  dependencies:
2273
  is-arrayish "^0.2.1"
2274
 
2275
- es-abstract@^1.17.0-next.1, es-abstract@^1.17.2:
2276
  version "1.17.5"
2277
  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9"
2278
  integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==
@@ -2415,11 +2423,11 @@ esprima@^4.0.0, esprima@^4.0.1:
2415
  integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
2416
 
2417
  esquery@^1.0.1:
2418
- version "1.2.0"
2419
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.2.0.tgz#a010a519c0288f2530b3404124bfb5f02e9797fe"
2420
- integrity sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==
2421
  dependencies:
2422
- estraverse "^5.0.0"
2423
 
2424
  esrecurse@^4.1.0:
2425
  version "4.2.1"
@@ -2433,10 +2441,10 @@ estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
2433
  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
2434
  integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
2435
 
2436
- estraverse@^5.0.0:
2437
- version "5.0.0"
2438
- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22"
2439
- integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==
2440
 
2441
  esutils@^2.0.2:
2442
  version "2.0.3"
@@ -2603,6 +2611,13 @@ fill-range@^4.0.0:
2603
  repeat-string "^1.6.1"
2604
  to-regex-range "^2.1.0"
2605
 
 
 
 
 
 
 
 
2606
  find-up@^3.0.0:
2607
  version "3.0.0"
2608
  resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
@@ -2620,9 +2635,9 @@ flat-cache@^2.0.1:
2620
  write "1.0.3"
2621
 
2622
  flatted@^2.0.0:
2623
- version "2.0.1"
2624
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08"
2625
- integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==
2626
 
2627
  for-in@^1.0.2:
2628
  version "1.0.2"
@@ -2666,9 +2681,9 @@ fs.realpath@^1.0.0:
2666
  integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
2667
 
2668
  fsevents@^1.2.7:
2669
- version "1.2.12"
2670
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c"
2671
- integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==
2672
  dependencies:
2673
  bindings "^1.5.0"
2674
  nan "^2.12.1"
@@ -2777,9 +2792,9 @@ google-closure-compiler@20150901.x:
2777
  integrity sha1-PQHGyt5leQqb+04wshWLdjWsut4=
2778
 
2779
  graceful-fs@^4.1.11:
2780
- version "4.2.3"
2781
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
2782
- integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
2783
 
2784
  grapheme-breaker@^0.3.2:
2785
  version "0.3.2"
@@ -2868,12 +2883,13 @@ has@^1.0.0, has@^1.0.1, has@^1.0.3:
2868
  function-bind "^1.1.1"
2869
 
2870
  hash-base@^3.0.0:
2871
- version "3.0.4"
2872
- resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
2873
- integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=
2874
  dependencies:
2875
- inherits "^2.0.1"
2876
- safe-buffer "^5.0.1"
 
2877
 
2878
  hash.js@^1.0.0, hash.js@^1.0.3:
2879
  version "1.1.7"
@@ -3031,7 +3047,7 @@ inflight@^1.0.4:
3031
  once "^1.3.0"
3032
  wrappy "1"
3033
 
3034
- inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
3035
  version "2.0.4"
3036
  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
3037
  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -3244,11 +3260,6 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4:
3244
  dependencies:
3245
  isobject "^3.0.1"
3246
 
3247
- is-promise@^2.1.0:
3248
- version "2.1.0"
3249
- resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
3250
- integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=
3251
-
3252
  is-regex@^1.0.5:
3253
  version "1.0.5"
3254
  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
@@ -3327,11 +3338,6 @@ isstream@~0.1.2:
3327
  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
3328
  integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
3329
 
3330
- js-cookie@^2.2.1:
3331
- version "2.2.1"
3332
- resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8"
3333
- integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==
3334
-
3335
  "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
3336
  version "4.0.0"
3337
  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -3430,9 +3436,9 @@ json5@^1.0.1:
3430
  minimist "^1.2.0"
3431
 
3432
  json5@^2.1.2:
3433
- version "2.1.2"
3434
- resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e"
3435
- integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==
3436
  dependencies:
3437
  minimist "^1.2.5"
3438
 
@@ -3495,6 +3501,14 @@ levn@^0.3.0, levn@~0.3.0:
3495
  prelude-ls "~1.1.2"
3496
  type-check "~0.3.2"
3497
 
 
 
 
 
 
 
 
 
3498
  locate-path@^3.0.0:
3499
  version "3.0.0"
3500
  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
@@ -3503,7 +3517,7 @@ locate-path@^3.0.0:
3503
  p-locate "^3.0.0"
3504
  path-exists "^3.0.0"
3505
 
3506
- lodash-cli@^4.17.5:
3507
  version "4.17.5"
3508
  resolved "https://registry.yarnpkg.com/lodash-cli/-/lodash-cli-4.17.5.tgz#1bab72c8c9980febf4fe7a1900b0971ce040dd0b"
3509
  integrity sha512-eeQi+oVS76ofP791g4wEGs4B4nyc4fiHboUCc0BzM8qCkLAzqbroewOt98A8ISoY1HH2di00pENNErXf0MWxiw==
@@ -3729,17 +3743,17 @@ miller-rabin@^4.0.0:
3729
  bn.js "^4.0.0"
3730
  brorand "^1.0.1"
3731
 
3732
- mime-db@1.43.0:
3733
- version "1.43.0"
3734
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58"
3735
- integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==
3736
 
3737
  mime-types@^2.1.12, mime-types@~2.1.19:
3738
- version "2.1.26"
3739
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06"
3740
- integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==
3741
  dependencies:
3742
- mime-db "1.43.0"
3743
 
3744
  mime@1.6.0:
3745
  version "1.6.0"
@@ -3787,9 +3801,9 @@ mixin-deep@^1.2.0:
3787
  is-extendable "^1.0.1"
3788
 
3789
  mkdirp@^0.5.1, mkdirp@~0.5.1:
3790
- version "0.5.4"
3791
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512"
3792
- integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==
3793
  dependencies:
3794
  minimist "^1.2.5"
3795
 
@@ -3814,9 +3828,9 @@ mute-stream@0.0.8:
3814
  integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
3815
 
3816
  nan@^2.12.1:
3817
- version "2.14.0"
3818
- resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
3819
- integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
3820
 
3821
  nanomatch@^1.2.9:
3822
  version "1.2.13"
@@ -3884,12 +3898,10 @@ node-libs-browser@^2.0.0:
3884
  util "^0.11.0"
3885
  vm-browserify "^1.0.1"
3886
 
3887
- node-releases@^1.1.52:
3888
- version "1.1.52"
3889
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9"
3890
- integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ==
3891
- dependencies:
3892
- semver "^6.3.0"
3893
 
3894
  normalize-html-whitespace@^1.0.0:
3895
  version "1.0.0"
@@ -4070,13 +4082,27 @@ os-tmpdir@~1.0.2:
4070
  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
4071
  integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
4072
 
 
 
 
 
 
 
 
4073
  p-limit@^2.0.0:
4074
- version "2.2.2"
4075
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e"
4076
- integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==
4077
  dependencies:
4078
  p-try "^2.0.0"
4079
 
 
 
 
 
 
 
 
4080
  p-locate@^3.0.0:
4081
  version "3.0.0"
4082
  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
@@ -4084,6 +4110,11 @@ p-locate@^3.0.0:
4084
  dependencies:
4085
  p-limit "^2.0.0"
4086
 
 
 
 
 
 
4087
  p-try@^2.0.0:
4088
  version "2.2.0"
4089
  resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
@@ -4176,7 +4207,7 @@ parent-module@^1.0.0:
4176
  dependencies:
4177
  callsites "^3.0.0"
4178
 
4179
- parse-asn1@^5.0.0:
4180
  version "5.1.5"
4181
  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e"
4182
  integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==
@@ -4262,12 +4293,12 @@ physical-cpu-count@^2.0.0:
4262
  resolved "https://registry.yarnpkg.com/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz#18de2f97e4bf7a9551ad7511942b5496f7aba660"
4263
  integrity sha1-GN4vl+S/epVRrXURlCtUlverpmA=
4264
 
4265
- pkg-up@^3.1.0:
4266
- version "3.1.0"
4267
- resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
4268
- integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==
4269
  dependencies:
4270
- find-up "^3.0.0"
4271
 
4272
  pn@^1.1.0:
4273
  version "1.1.0"
@@ -4581,9 +4612,9 @@ postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.1:
4581
  integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
4582
 
4583
  postcss-value-parser@^4.0.2:
4584
- version "4.0.3"
4585
- resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d"
4586
- integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==
4587
 
4588
  postcss@6.0.1:
4589
  version "6.0.1"
@@ -4604,25 +4635,25 @@ postcss@^6.0.1:
4604
  supports-color "^5.4.0"
4605
 
4606
  postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.11, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.27:
4607
- version "7.0.27"
4608
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9"
4609
- integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==
4610
  dependencies:
4611
  chalk "^2.4.2"
4612
  source-map "^0.6.1"
4613
  supports-color "^6.1.0"
4614
 
4615
- posthtml-parser@^0.4.0, posthtml-parser@^0.4.1:
4616
  version "0.4.2"
4617
  resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.4.2.tgz#a132bbdf0cd4bc199d34f322f5c1599385d7c6c1"
4618
  integrity sha512-BUIorsYJTvS9UhXxPTzupIztOMVNPa/HtAm9KHni9z6qEfiJ1bpOBL5DfUOL9XAc3XkLIEzBzpph+Zbm4AdRAg==
4619
  dependencies:
4620
  htmlparser2 "^3.9.2"
4621
 
4622
- posthtml-render@^1.1.3, posthtml-render@^1.1.5:
4623
- version "1.2.0"
4624
- resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-1.2.0.tgz#3df0c800a8bbb95af583a94748520469477addf4"
4625
- integrity sha512-dQB+hoAKDtnI94RZm/wxBUH9My8OJcXd0uhWmGh2c7tVtQ85A+OS3yCN3LNbFtPz3bViwBJXAeoi+CBGMXM0DA==
4626
 
4627
  posthtml@^0.11.2:
4628
  version "0.11.6"
@@ -4633,12 +4664,12 @@ posthtml@^0.11.2:
4633
  posthtml-render "^1.1.5"
4634
 
4635
  posthtml@^0.12.0:
4636
- version "0.12.0"
4637
- resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.12.0.tgz#6e2a2fcd774eaed1a419a95c5cc3a92b676a40a6"
4638
- integrity sha512-aNUEP/SfKUXAt+ghG51LC5MmafChBZeslVe/SSdfKIgLGUVRE68mrMF4V8XbH07ZifM91tCSuxY3eHIFLlecQw==
4639
  dependencies:
4640
- posthtml-parser "^0.4.1"
4641
- posthtml-render "^1.1.5"
4642
 
4643
  prelude-ls@~1.1.2:
4644
  version "1.1.2"
@@ -4769,7 +4800,7 @@ readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@^2.3.3, readable
4769
  string_decoder "~1.1.1"
4770
  util-deprecate "~1.0.1"
4771
 
4772
- readable-stream@^3.1.1:
4773
  version "3.6.0"
4774
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
4775
  integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -4937,9 +4968,9 @@ resolve-url@^0.2.1:
4937
  integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
4938
 
4939
  resolve@^1.1.5, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1:
4940
- version "1.15.1"
4941
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8"
4942
- integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==
4943
  dependencies:
4944
  path-parse "^1.0.6"
4945
 
@@ -5004,23 +5035,21 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
5004
  inherits "^2.0.1"
5005
 
5006
  run-async@^2.4.0:
5007
- version "2.4.0"
5008
- resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8"
5009
- integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==
5010
- dependencies:
5011
- is-promise "^2.1.0"
5012
 
5013
  rxjs@^6.5.3:
5014
- version "6.5.4"
5015
- resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c"
5016
- integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==
5017
  dependencies:
5018
  tslib "^1.9.0"
5019
 
5020
- safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
5021
- version "5.2.0"
5022
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
5023
- integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
5024
 
5025
  safe-buffer@~5.1.0, safe-buffer@~5.1.1:
5026
  version "5.1.2"
@@ -5066,7 +5095,7 @@ semver@^5.4.1, semver@^5.5.0, semver@^5.5.1:
5066
  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
5067
  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
5068
 
5069
- semver@^6.1.2, semver@^6.3.0:
5070
  version "6.3.0"
5071
  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
5072
  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
@@ -5218,9 +5247,9 @@ source-map-resolve@^0.5.0:
5218
  urix "^0.1.0"
5219
 
5220
  source-map-support@~0.5.10, source-map-support@~0.5.12:
5221
- version "0.5.16"
5222
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042"
5223
- integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==
5224
  dependencies:
5225
  buffer-from "^1.0.0"
5226
  source-map "^0.6.0"
@@ -5354,21 +5383,39 @@ string-width@^4.1.0:
5354
  is-fullwidth-code-point "^3.0.0"
5355
  strip-ansi "^6.0.0"
5356
 
 
 
 
 
 
 
 
 
5357
  string.prototype.trimleft@^2.1.1:
5358
- version "2.1.1"
5359
- resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74"
5360
- integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==
5361
  dependencies:
5362
  define-properties "^1.1.3"
5363
- function-bind "^1.1.1"
 
5364
 
5365
  string.prototype.trimright@^2.1.1:
5366
- version "2.1.1"
5367
- resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9"
5368
- integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==
5369
  dependencies:
5370
  define-properties "^1.1.3"
5371
- function-bind "^1.1.1"
 
 
 
 
 
 
 
 
 
5372
 
5373
  string_decoder@^1.0.0, string_decoder@^1.1.1:
5374
  version "1.3.0"
@@ -5420,9 +5467,9 @@ strip-ansi@^6.0.0:
5420
  ansi-regex "^5.0.0"
5421
 
5422
  strip-json-comments@^3.0.1:
5423
- version "3.0.1"
5424
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7"
5425
- integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==
5426
 
5427
  stylehacks@^4.0.0:
5428
  version "4.0.3"
@@ -5510,9 +5557,9 @@ terser@^3.7.3:
5510
  source-map-support "~0.5.10"
5511
 
5512
  terser@^4.3.9:
5513
- version "4.6.7"
5514
- resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72"
5515
- integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==
5516
  dependencies:
5517
  commander "^2.20.0"
5518
  source-map "~0.6.1"
@@ -5621,9 +5668,9 @@ tr46@^1.0.1:
5621
  punycode "^2.1.0"
5622
 
5623
  tslib@^1.9.0:
5624
- version "1.11.1"
5625
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35"
5626
- integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==
5627
 
5628
  tty-browserify@0.0.0:
5629
  version "0.0.0"
9
  dependencies:
10
  "@babel/highlight" "^7.8.3"
11
 
12
+ "@babel/compat-data@^7.9.6":
13
+ version "7.9.6"
14
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.6.tgz#3f604c40e420131affe6f2c8052e9a275ae2049b"
15
+ integrity sha512-5QPTrNen2bm7RBc7dsOmcA5hbrS4O2Vhmk5XOL4zWW/zD/hV0iinpefDlkm+tBBy8kDtFaaeEvmAqt+nURAV2g==
16
  dependencies:
17
+ browserslist "^4.11.1"
18
  invariant "^2.2.4"
19
  semver "^5.5.0"
20
 
21
  "@babel/core@>=7.7.2", "@babel/core@^7.4.4":
22
+ version "7.9.6"
23
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.6.tgz#d9aa1f580abf3b2286ef40b6904d390904c63376"
24
+ integrity sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==
25
  dependencies:
26
  "@babel/code-frame" "^7.8.3"
27
+ "@babel/generator" "^7.9.6"
28
  "@babel/helper-module-transforms" "^7.9.0"
29
+ "@babel/helpers" "^7.9.6"
30
+ "@babel/parser" "^7.9.6"
31
  "@babel/template" "^7.8.6"
32
+ "@babel/traverse" "^7.9.6"
33
+ "@babel/types" "^7.9.6"
34
  convert-source-map "^1.7.0"
35
  debug "^4.1.0"
36
  gensync "^1.0.0-beta.1"
40
  semver "^5.4.1"
41
  source-map "^0.5.0"
42
 
43
+ "@babel/generator@^7.4.4", "@babel/generator@^7.9.6":
44
+ version "7.9.6"
45
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43"
46
+ integrity sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==
47
  dependencies:
48
+ "@babel/types" "^7.9.6"
49
  jsesc "^2.5.1"
50
  lodash "^4.17.13"
51
  source-map "^0.5.0"
66
  "@babel/types" "^7.8.3"
67
 
68
  "@babel/helper-builder-react-jsx-experimental@^7.9.0":
69
+ version "7.9.5"
70
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.5.tgz#0b4b3e04e6123f03b404ca4dfd6528fe6bb92fe3"
71
+ integrity sha512-HAagjAC93tk748jcXpZ7oYRZH485RCq/+yEv9SIWezHRPv9moZArTnkUNciUNzvwHUABmiWKlcxJvMcu59UwTg==
72
  dependencies:
73
  "@babel/helper-annotate-as-pure" "^7.8.3"
74
  "@babel/helper-module-imports" "^7.8.3"
75
+ "@babel/types" "^7.9.5"
76
 
77
  "@babel/helper-builder-react-jsx@^7.9.0":
78
  version "7.9.0"
82
  "@babel/helper-annotate-as-pure" "^7.8.3"
83
  "@babel/types" "^7.9.0"
84
 
85
+ "@babel/helper-compilation-targets@^7.9.6":
86
+ version "7.9.6"
87
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.9.6.tgz#1e05b7ccc9d38d2f8b40b458b380a04dcfadd38a"
88
+ integrity sha512-x2Nvu0igO0ejXzx09B/1fGBxY9NXQlBW2kZsSxCJft+KHN8t9XWzIvFxtPHnBOAXpVsdxZKZFbRUC8TsNKajMw==
89
  dependencies:
90
+ "@babel/compat-data" "^7.9.6"
91
+ browserslist "^4.11.1"
92
  invariant "^2.2.4"
93
  levenary "^1.1.1"
94
  semver "^5.5.0"
119
  "@babel/traverse" "^7.8.3"
120
  "@babel/types" "^7.8.3"
121
 
122
+ "@babel/helper-function-name@^7.8.3", "@babel/helper-function-name@^7.9.5":
123
+ version "7.9.5"
124
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c"
125
+ integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==
126
  dependencies:
127
  "@babel/helper-get-function-arity" "^7.8.3"
128
  "@babel/template" "^7.8.3"
129
+ "@babel/types" "^7.9.5"
130
 
131
  "@babel/helper-get-function-arity@^7.8.3":
132
  version "7.8.3"
200
  "@babel/types" "^7.8.3"
201
 
202
  "@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6":
203
+ version "7.9.6"
204
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz#03149d7e6a5586ab6764996cd31d6981a17e1444"
205
+ integrity sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA==
206
  dependencies:
207
  "@babel/helper-member-expression-to-functions" "^7.8.3"
208
  "@babel/helper-optimise-call-expression" "^7.8.3"
209
+ "@babel/traverse" "^7.9.6"
210
+ "@babel/types" "^7.9.6"
211
 
212
  "@babel/helper-simple-access@^7.8.3":
213
  version "7.8.3"
224
  dependencies:
225
  "@babel/types" "^7.8.3"
226
 
227
+ "@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5":
228
+ version "7.9.5"
229
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80"
230
+ integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==
231
 
232
  "@babel/helper-wrap-function@^7.8.3":
233
  version "7.8.3"
239
  "@babel/traverse" "^7.8.3"
240
  "@babel/types" "^7.8.3"
241
 
242
+ "@babel/helpers@^7.9.6":
243
+ version "7.9.6"
244
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.6.tgz#092c774743471d0bb6c7de3ad465ab3d3486d580"
245
+ integrity sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==
246
  dependencies:
247
  "@babel/template" "^7.8.3"
248
+ "@babel/traverse" "^7.9.6"
249
+ "@babel/types" "^7.9.6"
250
 
251
  "@babel/highlight@^7.8.3":
252
  version "7.9.0"
257
  chalk "^2.0.0"
258
  js-tokens "^4.0.0"
259
 
260
+ "@babel/parser@^7.4.4", "@babel/parser@^7.8.6", "@babel/parser@^7.9.6":
261
+ version "7.9.6"
262
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7"
263
+ integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==
264
 
265
  "@babel/plugin-proposal-async-generator-functions@^7.8.3":
266
  version "7.8.3"
303
  "@babel/helper-plugin-utils" "^7.8.3"
304
  "@babel/plugin-syntax-numeric-separator" "^7.8.3"
305
 
306
+ "@babel/plugin-proposal-object-rest-spread@^7.9.6":
307
+ version "7.9.6"
308
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz#7a093586fcb18b08266eb1a7177da671ac575b63"
309
+ integrity sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A==
310
  dependencies:
311
  "@babel/helper-plugin-utils" "^7.8.3"
312
  "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
313
+ "@babel/plugin-transform-parameters" "^7.9.5"
314
 
315
  "@babel/plugin-proposal-optional-catch-binding@^7.8.3":
316
  version "7.8.3"
444
  "@babel/helper-plugin-utils" "^7.8.3"
445
  lodash "^4.17.13"
446
 
447
+ "@babel/plugin-transform-classes@^7.9.5":
448
+ version "7.9.5"
449
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c"
450
+ integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==
451
  dependencies:
452
  "@babel/helper-annotate-as-pure" "^7.8.3"
453
  "@babel/helper-define-map" "^7.8.3"
454
+ "@babel/helper-function-name" "^7.9.5"
455
  "@babel/helper-optimise-call-expression" "^7.8.3"
456
  "@babel/helper-plugin-utils" "^7.8.3"
457
  "@babel/helper-replace-supers" "^7.8.6"
465
  dependencies:
466
  "@babel/helper-plugin-utils" "^7.8.3"
467
 
468
+ "@babel/plugin-transform-destructuring@^7.9.5":
469
+ version "7.9.5"
470
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50"
471
+ integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==
472
  dependencies:
473
  "@babel/helper-plugin-utils" "^7.8.3"
474
 
532
  dependencies:
533
  "@babel/helper-plugin-utils" "^7.8.3"
534
 
535
+ "@babel/plugin-transform-modules-amd@^7.9.6":
536
+ version "7.9.6"
537
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz#8539ec42c153d12ea3836e0e3ac30d5aae7b258e"
538
+ integrity sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw==
539
  dependencies:
540
  "@babel/helper-module-transforms" "^7.9.0"
541
  "@babel/helper-plugin-utils" "^7.8.3"
542
+ babel-plugin-dynamic-import-node "^2.3.3"
543
 
544
+ "@babel/plugin-transform-modules-commonjs@^7.4.4", "@babel/plugin-transform-modules-commonjs@^7.9.6":
545
+ version "7.9.6"
546
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz#64b7474a4279ee588cacd1906695ca721687c277"
547
+ integrity sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ==
548
  dependencies:
549
  "@babel/helper-module-transforms" "^7.9.0"
550
  "@babel/helper-plugin-utils" "^7.8.3"
551
  "@babel/helper-simple-access" "^7.8.3"
552
+ babel-plugin-dynamic-import-node "^2.3.3"
553
 
554
+ "@babel/plugin-transform-modules-systemjs@^7.9.6":
555
+ version "7.9.6"
556
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz#207f1461c78a231d5337a92140e52422510d81a4"
557
+ integrity sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg==
558
  dependencies:
559
  "@babel/helper-hoist-variables" "^7.8.3"
560
  "@babel/helper-module-transforms" "^7.9.0"
561
  "@babel/helper-plugin-utils" "^7.8.3"
562
+ babel-plugin-dynamic-import-node "^2.3.3"
563
 
564
  "@babel/plugin-transform-modules-umd@^7.9.0":
565
  version "7.9.0"
591
  "@babel/helper-plugin-utils" "^7.8.3"
592
  "@babel/helper-replace-supers" "^7.8.3"
593
 
594
+ "@babel/plugin-transform-parameters@^7.9.5":
595
+ version "7.9.5"
596
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795"
597
+ integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==
598
  dependencies:
599
  "@babel/helper-get-function-arity" "^7.8.3"
600
  "@babel/helper-plugin-utils" "^7.8.3"
631
  "@babel/helper-plugin-utils" "^7.8.3"
632
 
633
  "@babel/plugin-transform-runtime@>=7.6.2":
634
+ version "7.9.6"
635
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.6.tgz#3ba804438ad0d880a17bca5eaa0cdf1edeedb2fd"
636
+ integrity sha512-qcmiECD0mYOjOIt8YHNsAP1SxPooC/rDmfmiSK9BNY72EitdSc7l44WTEklaWuFtbOEBjNhWWyph/kOImbNJ4w==
637
  dependencies:
638
  "@babel/helper-module-imports" "^7.8.3"
639
  "@babel/helper-plugin-utils" "^7.8.3"
686
  "@babel/helper-plugin-utils" "^7.8.3"
687
 
688
  "@babel/preset-env@^7.4.4":
689
+ version "7.9.6"
690
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.6.tgz#df063b276c6455ec6fcfc6e53aacc38da9b0aea6"
691
+ integrity sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ==
692
  dependencies:
693
+ "@babel/compat-data" "^7.9.6"
694
+ "@babel/helper-compilation-targets" "^7.9.6"
695
  "@babel/helper-module-imports" "^7.8.3"
696
  "@babel/helper-plugin-utils" "^7.8.3"
697
  "@babel/plugin-proposal-async-generator-functions" "^7.8.3"
699
  "@babel/plugin-proposal-json-strings" "^7.8.3"
700
  "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3"
701
  "@babel/plugin-proposal-numeric-separator" "^7.8.3"
702
+ "@babel/plugin-proposal-object-rest-spread" "^7.9.6"
703
  "@babel/plugin-proposal-optional-catch-binding" "^7.8.3"
704
  "@babel/plugin-proposal-optional-chaining" "^7.9.0"
705
  "@babel/plugin-proposal-unicode-property-regex" "^7.8.3"
716
  "@babel/plugin-transform-async-to-generator" "^7.8.3"
717
  "@babel/plugin-transform-block-scoped-functions" "^7.8.3"
718
  "@babel/plugin-transform-block-scoping" "^7.8.3"
719
+ "@babel/plugin-transform-classes" "^7.9.5"
720
  "@babel/plugin-transform-computed-properties" "^7.8.3"
721
+ "@babel/plugin-transform-destructuring" "^7.9.5"
722
  "@babel/plugin-transform-dotall-regex" "^7.8.3"
723
  "@babel/plugin-transform-duplicate-keys" "^7.8.3"
724
  "@babel/plugin-transform-exponentiation-operator" "^7.8.3"
726
  "@babel/plugin-transform-function-name" "^7.8.3"
727
  "@babel/plugin-transform-literals" "^7.8.3"
728
  "@babel/plugin-transform-member-expression-literals" "^7.8.3"
729
+ "@babel/plugin-transform-modules-amd" "^7.9.6"
730
+ "@babel/plugin-transform-modules-commonjs" "^7.9.6"
731
+ "@babel/plugin-transform-modules-systemjs" "^7.9.6"
732
  "@babel/plugin-transform-modules-umd" "^7.9.0"
733
  "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3"
734
  "@babel/plugin-transform-new-target" "^7.8.3"
735
  "@babel/plugin-transform-object-super" "^7.8.3"
736
+ "@babel/plugin-transform-parameters" "^7.9.5"
737
  "@babel/plugin-transform-property-literals" "^7.8.3"
738
  "@babel/plugin-transform-regenerator" "^7.8.7"
739
  "@babel/plugin-transform-reserved-words" "^7.8.3"
744
  "@babel/plugin-transform-typeof-symbol" "^7.8.4"
745
  "@babel/plugin-transform-unicode-regex" "^7.8.3"
746
  "@babel/preset-modules" "^0.1.3"
747
+ "@babel/types" "^7.9.6"
748
+ browserslist "^4.11.1"
749
  core-js-compat "^3.6.2"
750
  invariant "^2.2.2"
751
  levenary "^1.1.1"
763
  esutils "^2.0.2"
764
 
765
  "@babel/runtime@>=7.7.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.8.4":
766
+ version "7.9.6"
767
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.6.tgz#a9102eb5cadedf3f31d08a9ecf294af7827ea29f"
768
+ integrity sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==
769
  dependencies:
770
  regenerator-runtime "^0.13.4"
771
 
778
  "@babel/parser" "^7.8.6"
779
  "@babel/types" "^7.8.6"
780
 
781
+ "@babel/traverse@^7.4.4", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.6":
782
+ version "7.9.6"
783
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.6.tgz#5540d7577697bf619cc57b92aa0f1c231a94f442"
784
+ integrity sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==
785
  dependencies:
786
  "@babel/code-frame" "^7.8.3"
787
+ "@babel/generator" "^7.9.6"
788
+ "@babel/helper-function-name" "^7.9.5"
789
  "@babel/helper-split-export-declaration" "^7.8.3"
790
+ "@babel/parser" "^7.9.6"
791
+ "@babel/types" "^7.9.6"
792
  debug "^4.1.0"
793
  globals "^11.1.0"
794
  lodash "^4.17.13"
795
 
796
+ "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5", "@babel/types@^7.9.6":
797
+ version "7.9.6"
798
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7"
799
+ integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==
800
  dependencies:
801
+ "@babel/helper-validator-identifier" "^7.9.5"
802
  lodash "^4.17.13"
803
  to-fast-properties "^2.0.0"
804
 
805
  "@iarna/toml@^2.2.0":
806
+ version "2.2.5"
807
+ resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c"
808
+ integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==
809
 
810
  "@mrmlnc/readdir-enhanced@^2.2.1":
811
  version "2.2.1"
867
  integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
868
 
869
  "@types/q@^1.5.1":
870
+ version "1.5.4"
871
+ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24"
872
+ integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==
873
 
874
  abab@^2.0.0:
875
  version "2.0.3"
900
  integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==
901
 
902
  acorn@^7.1.1:
903
+ version "7.2.0"
904
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe"
905
+ integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==
906
 
907
  ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5:
908
+ version "6.12.2"
909
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd"
910
+ integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==
911
  dependencies:
912
  fast-deep-equal "^3.1.1"
913
  fast-json-stable-stringify "^2.0.0"
1136
  dependencies:
1137
  babel-runtime "^6.22.0"
1138
 
1139
+ babel-plugin-dynamic-import-node@^2.3.3:
1140
+ version "2.3.3"
1141
+ resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
1142
+ integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
1143
  dependencies:
1144
  object.assign "^4.1.0"
1145
 
1265
  dependencies:
1266
  file-uri-to-path "1.0.0"
1267
 
1268
+ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0:
1269
  version "4.11.8"
1270
  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
1271
  integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
1272
 
1273
+ bn.js@^5.1.1:
1274
+ version "5.1.1"
1275
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.1.tgz#48efc4031a9c4041b9c99c6941d903463ab62eb5"
1276
+ integrity sha512-IUTD/REb78Z2eodka1QZyyEk66pciRcP6Sroka0aI3tG/iwIdYLrBD62RsubR7vqdt3WyX8p4jxeatzmRSphtA==
1277
+
1278
  boolbase@^1.0.0, boolbase@~1.0.0:
1279
  version "1.0.0"
1280
  resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
1355
  inherits "^2.0.1"
1356
  safe-buffer "^5.1.2"
1357
 
1358
+ browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
1359
  version "4.0.1"
1360
  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
1361
  integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=
1364
  randombytes "^2.0.1"
1365
 
1366
  browserify-sign@^4.0.0:
1367
+ version "4.2.0"
1368
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11"
1369
+ integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==
1370
+ dependencies:
1371
+ bn.js "^5.1.1"
1372
+ browserify-rsa "^4.0.1"
1373
+ create-hash "^1.2.0"
1374
+ create-hmac "^1.1.7"
1375
+ elliptic "^6.5.2"
1376
+ inherits "^2.0.4"
1377
+ parse-asn1 "^5.1.5"
1378
+ readable-stream "^3.6.0"
1379
+ safe-buffer "^5.2.0"
1380
 
1381
  browserify-zlib@^0.2.0:
1382
  version "0.2.0"
1385
  dependencies:
1386
  pako "~1.0.5"
1387
 
1388
+ browserslist@^4.0.0, browserslist@^4.1.0, browserslist@^4.11.1, browserslist@^4.8.5:
1389
+ version "4.12.0"
1390
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d"
1391
+ integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==
1392
  dependencies:
1393
+ caniuse-lite "^1.0.30001043"
1394
+ electron-to-chromium "^1.3.413"
1395
+ node-releases "^1.1.53"
1396
+ pkg-up "^2.0.0"
1397
 
1398
  buffer-equal@0.0.1:
1399
  version "0.0.1"
1488
  lodash.memoize "^4.1.2"
1489
  lodash.uniq "^4.5.0"
1490
 
1491
+ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001043:
1492
+ version "1.0.30001062"
1493
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001062.tgz#d814b648338504b315222ace6f1a533d9a55e390"
1494
+ integrity sha512-ei9ZqeOnN7edDrb24QfJ0OZicpEbsWxv7WusOiQGz/f2SfvBgHHbOEwBJ8HKGVSyx8Z6ndPjxzR6m0NQq+0bfw==
1495
 
1496
  caseless@~0.12.0:
1497
  version "0.12.0"
1596
  integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==
1597
 
1598
  cli-width@^2.0.0:
1599
+ version "2.2.1"
1600
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48"
1601
+ integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==
1602
 
1603
  cliui@^2.1.0:
1604
  version "2.1.0"
1708
  delayed-stream "~1.0.0"
1709
 
1710
  command-exists@^1.2.6:
1711
+ version "1.2.9"
1712
+ resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69"
1713
+ integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==
1714
 
1715
  commander@^2.11.0, commander@^2.19.0, commander@^2.20.0:
1716
  version "2.20.3"
1760
  integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
1761
 
1762
  core-js-compat@^3.6.2:
1763
+ version "3.6.5"
1764
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c"
1765
+ integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==
1766
  dependencies:
1767
+ browserslist "^4.8.5"
1768
  semver "7.0.0"
1769
 
1770
  core-js@^2.4.0, core-js@^2.6.5:
1795
  bn.js "^4.1.0"
1796
  elliptic "^6.0.0"
1797
 
1798
+ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
1799
  version "1.2.0"
1800
  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
1801
  integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
1806
  ripemd160 "^2.0.1"
1807
  sha.js "^2.4.0"
1808
 
1809
+ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
1810
  version "1.1.7"
1811
  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
1812
  integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
2025
  whatwg-url "^7.0.0"
2026
 
2027
  deasync@^0.1.14:
2028
+ version "0.1.20"
2029
+ resolved "https://registry.yarnpkg.com/deasync/-/deasync-0.1.20.tgz#546fd2660688a1eeed55edce2308c5cf7104f9da"
2030
+ integrity sha512-E1GI7jMI57hL30OX6Ht/hfQU8DO4AuB9m72WFm4c38GNbUD4Q03//XZaOIHZiY+H1xUaomcot5yk2q/qIZQkGQ==
2031
  dependencies:
2032
  bindings "^1.5.0"
2033
  node-addon-api "^1.7.1"
2218
  resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
2219
  integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
2220
 
2221
+ electron-to-chromium@^1.3.413:
2222
+ version "1.3.443"
2223
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.443.tgz#b01c8933e820a728afc5dde7dd535c53ff55ab11"
2224
+ integrity sha512-ty0LEroTap/xfMy31oQ3XX+Q377QvWvJaha2cmuXcbmBiX2EIB5SNDQ0hp8lhvxj63WG0zOgm/4MQ/oUBdfQqg==
2225
 
2226
+ elliptic@^6.0.0, elliptic@^6.5.2:
2227
  version "6.5.2"
2228
  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762"
2229
  integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==
2237
  minimalistic-crypto-utils "^1.0.0"
2238
 
2239
  emoji-flags@matiassingers/emoji-flags#master:
2240
+ version "1.3.0"
2241
+ resolved "https://codeload.github.com/matiassingers/emoji-flags/tar.gz/93ae74505d09bb55a3eb3a511f1dfc0dd60a5347"
2242
  dependencies:
2243
  columnify "1.5.1"
2244
  lodash.find "3.2.1"
2264
  integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
2265
 
2266
  entities@^2.0.0:
2267
+ version "2.0.2"
2268
+ resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.2.tgz#ac74db0bba8d33808bbf36809c3a5c3683531436"
2269
+ integrity sha512-dmD3AvJQBUjKpcNkoqr+x+IF0SdRtPz9Vk0uTy4yWqga9ibB6s4v++QFWNohjiUGoMlF552ZvNyXDxz5iW0qmw==
2270
 
2271
  envinfo@^7.3.1:
2272
+ version "7.5.1"
2273
+ resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.5.1.tgz#93c26897225a00457c75e734d354ea9106a72236"
2274
+ integrity sha512-hQBkDf2iO4Nv0CNHpCuSBeaSrveU6nThVxFGTrq/eDlV716UQk09zChaJae4mZRsos1x4YLY2TaH3LHUae3ZmQ==
2275
 
2276
  error-ex@^1.3.1:
2277
  version "1.3.2"
2280
  dependencies:
2281
  is-arrayish "^0.2.1"
2282
 
2283
+ es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5:
2284
  version "1.17.5"
2285
  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9"
2286
  integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==
2423
  integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
2424
 
2425
  esquery@^1.0.1:
2426
+ version "1.3.1"
2427
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
2428
+ integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
2429
  dependencies:
2430
+ estraverse "^5.1.0"
2431
 
2432
  esrecurse@^4.1.0:
2433
  version "4.2.1"
2441
  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
2442
  integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
2443
 
2444
+ estraverse@^5.1.0:
2445
+ version "5.1.0"
2446
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642"
2447
+ integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==
2448
 
2449
  esutils@^2.0.2:
2450
  version "2.0.3"
2611
  repeat-string "^1.6.1"
2612
  to-regex-range "^2.1.0"
2613
 
2614
+ find-up@^2.1.0:
2615
+ version "2.1.0"
2616
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
2617
+ integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
2618
+ dependencies:
2619
+ locate-path "^2.0.0"
2620
+
2621
  find-up@^3.0.0:
2622
  version "3.0.0"
2623
  resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
2635
  write "1.0.3"
2636
 
2637
  flatted@^2.0.0:
2638
+ version "2.0.2"
2639
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
2640
+ integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
2641
 
2642
  for-in@^1.0.2:
2643
  version "1.0.2"
2681
  integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
2682
 
2683
  fsevents@^1.2.7:
2684
+ version "1.2.13"
2685
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38"
2686
+ integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==
2687
  dependencies:
2688
  bindings "^1.5.0"
2689
  nan "^2.12.1"
2792
  integrity sha1-PQHGyt5leQqb+04wshWLdjWsut4=
2793
 
2794
  graceful-fs@^4.1.11:
2795
+ version "4.2.4"
2796
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
2797
+ integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
2798
 
2799
  grapheme-breaker@^0.3.2:
2800
  version "0.3.2"
2883
  function-bind "^1.1.1"
2884
 
2885
  hash-base@^3.0.0:
2886
+ version "3.1.0"
2887
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
2888
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
2889
  dependencies:
2890
+ inherits "^2.0.4"
2891
+ readable-stream "^3.6.0"
2892
+ safe-buffer "^5.2.0"
2893
 
2894
  hash.js@^1.0.0, hash.js@^1.0.3:
2895
  version "1.1.7"
3047
  once "^1.3.0"
3048
  wrappy "1"
3049
 
3050
+ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
3051
  version "2.0.4"
3052
  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
3053
  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
3260
  dependencies:
3261
  isobject "^3.0.1"
3262
 
 
 
 
 
 
3263
  is-regex@^1.0.5:
3264
  version "1.0.5"
3265
  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
3338
  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
3339
  integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
3340
 
 
 
 
 
 
3341
  "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
3342
  version "4.0.0"
3343
  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
3436
  minimist "^1.2.0"
3437
 
3438
  json5@^2.1.2:
3439
+ version "2.1.3"
3440
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
3441
+ integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
3442
  dependencies:
3443
  minimist "^1.2.5"
3444
 
3501
  prelude-ls "~1.1.2"
3502
  type-check "~0.3.2"
3503
 
3504
+ locate-path@^2.0.0:
3505
+ version "2.0.0"
3506
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
3507
+ integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
3508
+ dependencies:
3509
+ p-locate "^2.0.0"
3510
+ path-exists "^3.0.0"
3511
+
3512
  locate-path@^3.0.0:
3513
  version "3.0.0"
3514
  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
3517
  p-locate "^3.0.0"
3518
  path-exists "^3.0.0"
3519
 
3520
+ lodash-cli@>=4.17.5:
3521
  version "4.17.5"
3522
  resolved "https://registry.yarnpkg.com/lodash-cli/-/lodash-cli-4.17.5.tgz#1bab72c8c9980febf4fe7a1900b0971ce040dd0b"
3523
  integrity sha512-eeQi+oVS76ofP791g4wEGs4B4nyc4fiHboUCc0BzM8qCkLAzqbroewOt98A8ISoY1HH2di00pENNErXf0MWxiw==
3743
  bn.js "^4.0.0"
3744
  brorand "^1.0.1"
3745
 
3746
+ mime-db@1.44.0:
3747
+ version "1.44.0"
3748
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
3749
+ integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
3750
 
3751
  mime-types@^2.1.12, mime-types@~2.1.19:
3752
+ version "2.1.27"
3753
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
3754
+ integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
3755
  dependencies:
3756
+ mime-db "1.44.0"
3757
 
3758
  mime@1.6.0:
3759
  version "1.6.0"
3801
  is-extendable "^1.0.1"
3802
 
3803
  mkdirp@^0.5.1, mkdirp@~0.5.1:
3804
+ version "0.5.5"
3805
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
3806
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
3807
  dependencies:
3808
  minimist "^1.2.5"
3809
 
3828
  integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
3829
 
3830
  nan@^2.12.1:
3831
+ version "2.14.1"
3832
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01"
3833
+ integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==
3834
 
3835
  nanomatch@^1.2.9:
3836
  version "1.2.13"
3898
  util "^0.11.0"
3899
  vm-browserify "^1.0.1"
3900
 
3901
+ node-releases@^1.1.53:
3902
+ version "1.1.55"
3903
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.55.tgz#8af23b7c561d8e2e6e36a46637bab84633b07cee"
3904
+ integrity sha512-H3R3YR/8TjT5WPin/wOoHOUPHgvj8leuU/Keta/rwelEQN9pA/S2Dx8/se4pZ2LBxSd0nAGzsNzhqwa77v7F1w==
 
 
3905
 
3906
  normalize-html-whitespace@^1.0.0:
3907
  version "1.0.0"
4082
  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
4083
  integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
4084
 
4085
+ p-limit@^1.1.0:
4086
+ version "1.3.0"
4087
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
4088
+ integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
4089
+ dependencies:
4090
+ p-try "^1.0.0"
4091
+
4092
  p-limit@^2.0.0:
4093
+ version "2.3.0"
4094
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
4095
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
4096
  dependencies:
4097
  p-try "^2.0.0"
4098
 
4099
+ p-locate@^2.0.0:
4100
+ version "2.0.0"
4101
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
4102
+ integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
4103
+ dependencies:
4104
+ p-limit "^1.1.0"
4105
+
4106
  p-locate@^3.0.0:
4107
  version "3.0.0"
4108
  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
4110
  dependencies:
4111
  p-limit "^2.0.0"
4112
 
4113
+ p-try@^1.0.0:
4114
+ version "1.0.0"
4115
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
4116
+ integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
4117
+
4118
  p-try@^2.0.0:
4119
  version "2.2.0"
4120
  resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
4207
  dependencies:
4208
  callsites "^3.0.0"
4209
 
4210
+ parse-asn1@^5.0.0, parse-asn1@^5.1.5:
4211
  version "5.1.5"
4212
  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e"
4213
  integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==
4293
  resolved "https://registry.yarnpkg.com/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz#18de2f97e4bf7a9551ad7511942b5496f7aba660"
4294
  integrity sha1-GN4vl+S/epVRrXURlCtUlverpmA=
4295
 
4296
+ pkg-up@^2.0.0:
4297
+ version "2.0.0"
4298
+ resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f"
4299
+ integrity sha1-yBmscoBZpGHKscOImivjxJoATX8=
4300
  dependencies:
4301
+ find-up "^2.1.0"
4302
 
4303
  pn@^1.1.0:
4304
  version "1.1.0"
4612
  integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
4613
 
4614
  postcss-value-parser@^4.0.2:
4615
+ version "4.1.0"
4616
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
4617
+ integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
4618
 
4619
  postcss@6.0.1:
4620
  version "6.0.1"
4635
  supports-color "^5.4.0"
4636
 
4637
  postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.11, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.27:
4638
+ version "7.0.30"
4639
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.30.tgz#cc9378beffe46a02cbc4506a0477d05fcea9a8e2"
4640
+ integrity sha512-nu/0m+NtIzoubO+xdAlwZl/u5S5vi/y6BCsoL8D+8IxsD3XvBS8X4YEADNIVXKVuQvduiucnRv+vPIqj56EGMQ==
4641
  dependencies:
4642
  chalk "^2.4.2"
4643
  source-map "^0.6.1"
4644
  supports-color "^6.1.0"
4645
 
4646
+ posthtml-parser@^0.4.0, posthtml-parser@^0.4.1, posthtml-parser@^0.4.2:
4647
  version "0.4.2"
4648
  resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.4.2.tgz#a132bbdf0cd4bc199d34f322f5c1599385d7c6c1"
4649
  integrity sha512-BUIorsYJTvS9UhXxPTzupIztOMVNPa/HtAm9KHni9z6qEfiJ1bpOBL5DfUOL9XAc3XkLIEzBzpph+Zbm4AdRAg==
4650
  dependencies:
4651
  htmlparser2 "^3.9.2"
4652
 
4653
+ posthtml-render@^1.1.3, posthtml-render@^1.1.5, posthtml-render@^1.2.2:
4654
+ version "1.2.2"
4655
+ resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-1.2.2.tgz#f554a19ed40d40e2bfc160826b0a91d4a23656cd"
4656
+ integrity sha512-MbIXTWwAfJ9qET6Zl29UNwJcDJEEz9Zkr5oDhiujitJa7YBJwEpbkX2cmuklCDxubTMoRWpid3q8DrSyGnUUzQ==
4657
 
4658
  posthtml@^0.11.2:
4659
  version "0.11.6"
4664
  posthtml-render "^1.1.5"
4665
 
4666
  posthtml@^0.12.0:
4667
+ version "0.12.3"
4668
+ resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.12.3.tgz#8fa5b903907e9c10ba5b883863cc550189a309d5"
4669
+ integrity sha512-Fbpi95+JJyR0tqU7pUy1zTSQFjAsluuwB9pJ1h0jtnGk7n/O2TBtP5nDl9rV0JVACjQ1Lm5wSp4ppChr8u3MhA==
4670
  dependencies:
4671
+ posthtml-parser "^0.4.2"
4672
+ posthtml-render "^1.2.2"
4673
 
4674
  prelude-ls@~1.1.2:
4675
  version "1.1.2"
4800
  string_decoder "~1.1.1"
4801
  util-deprecate "~1.0.1"
4802
 
4803
+ readable-stream@^3.1.1, readable-stream@^3.6.0:
4804
  version "3.6.0"
4805
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
4806
  integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
4968
  integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
4969
 
4970
  resolve@^1.1.5, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1:
4971
+ version "1.17.0"
4972
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
4973
+ integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
4974
  dependencies:
4975
  path-parse "^1.0.6"
4976
 
5035
  inherits "^2.0.1"
5036
 
5037
  run-async@^2.4.0:
5038
+ version "2.4.1"
5039
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
5040
+ integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
 
 
5041
 
5042
  rxjs@^6.5.3:
5043
+ version "6.5.5"
5044
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec"
5045
+ integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==
5046
  dependencies:
5047
  tslib "^1.9.0"
5048
 
5049
+ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
5050
+ version "5.2.1"
5051
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
5052
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
5053
 
5054
  safe-buffer@~5.1.0, safe-buffer@~5.1.1:
5055
  version "5.1.2"
5095
  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
5096
  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
5097
 
5098
+ semver@^6.1.2:
5099
  version "6.3.0"
5100
  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
5101
  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
5247
  urix "^0.1.0"
5248
 
5249
  source-map-support@~0.5.10, source-map-support@~0.5.12:
5250
+ version "0.5.19"
5251
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
5252
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
5253
  dependencies:
5254
  buffer-from "^1.0.0"
5255
  source-map "^0.6.0"
5383
  is-fullwidth-code-point "^3.0.0"
5384
  strip-ansi "^6.0.0"
5385
 
5386
+ string.prototype.trimend@^1.0.0:
5387
+ version "1.0.1"
5388
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913"
5389
+ integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==
5390
+ dependencies:
5391
+ define-properties "^1.1.3"
5392
+ es-abstract "^1.17.5"
5393
+
5394
  string.prototype.trimleft@^2.1.1:
5395
+ version "2.1.2"
5396
+ resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc"
5397
+ integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==
5398
  dependencies:
5399
  define-properties "^1.1.3"
5400
+ es-abstract "^1.17.5"
5401
+ string.prototype.trimstart "^1.0.0"
5402
 
5403
  string.prototype.trimright@^2.1.1:
5404
+ version "2.1.2"
5405
+ resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3"
5406
+ integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==
5407
  dependencies:
5408
  define-properties "^1.1.3"
5409
+ es-abstract "^1.17.5"
5410
+ string.prototype.trimend "^1.0.0"
5411
+
5412
+ string.prototype.trimstart@^1.0.0:
5413
+ version "1.0.1"
5414
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
5415
+ integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==
5416
+ dependencies:
5417
+ define-properties "^1.1.3"
5418
+ es-abstract "^1.17.5"
5419
 
5420
  string_decoder@^1.0.0, string_decoder@^1.1.1:
5421
  version "1.3.0"
5467
  ansi-regex "^5.0.0"
5468
 
5469
  strip-json-comments@^3.0.1:
5470
+ version "3.1.0"
5471
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180"
5472
+ integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==
5473
 
5474
  stylehacks@^4.0.0:
5475
  version "4.0.3"
5557
  source-map-support "~0.5.10"
5558
 
5559
  terser@^4.3.9:
5560
+ version "4.7.0"
5561
+ resolved "https://registry.yarnpkg.com/terser/-/terser-4.7.0.tgz#15852cf1a08e3256a80428e865a2fa893ffba006"
5562
+ integrity sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==
5563
  dependencies:
5564
  commander "^2.20.0"
5565
  source-map "~0.6.1"
5668
  punycode "^2.1.0"
5669
 
5670
  tslib@^1.9.0:
5671
+ version "1.13.0"
5672
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
5673
+ integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
5674
 
5675
  tty-browserify@0.0.0:
5676
  version "0.0.0"