summaryrefslogtreecommitdiff
path: root/www/wiki/vendor/willdurand
diff options
context:
space:
mode:
authorYaco <franco@reevo.org>2020-06-04 11:01:00 -0300
committerYaco <franco@reevo.org>2020-06-04 11:01:00 -0300
commitfc7369835258467bf97eb64f184b93691f9a9fd5 (patch)
treedaabd60089d2dd76d9f5fb416b005fbe159c799d /www/wiki/vendor/willdurand
first commit
Diffstat (limited to 'www/wiki/vendor/willdurand')
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Assert.php71
-rw-r--r--www/wiki/vendor/willdurand/geocoder/CHANGELOG.md83
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Collection.php59
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Dumper/AbstractArrayDumper.php65
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Dumper/AbstractDumper.php45
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Dumper/Dumper.php31
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Dumper/GeoArray.php29
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Dumper/GeoJson.php29
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Dumper/Gpx.php72
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Dumper/Kml.php52
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Dumper/Wkb.php36
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Dumper/Wkt.php36
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Exception/CollectionIsEmpty.php22
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Exception/Exception.php20
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Exception/ExtensionNotLoaded.php22
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Exception/FunctionNotFound.php31
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Exception/InvalidArgument.php20
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Exception/InvalidCredentials.php22
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Exception/InvalidServerResponse.php42
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Exception/LogicException.php18
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Exception/OutOfBounds.php18
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Exception/ProviderNotRegistered.php37
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Exception/QuotaExceeded.php22
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Exception/UnsupportedOperation.php23
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Formatter/StringFormatter.php85
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Geocoder.php56
-rw-r--r--www/wiki/vendor/willdurand/geocoder/GeocoderTrait.php44
-rw-r--r--www/wiki/vendor/willdurand/geocoder/LICENSE21
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Location.php116
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Model/Address.php370
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Model/AddressBuilder.php326
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Model/AddressCollection.php106
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Model/AdminLevel.php86
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Model/AdminLevelCollection.php140
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Model/Bounds.php125
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Model/Coordinates.php80
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Model/Country.php77
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Provider/AbstractProvider.php36
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Provider/Provider.php51
-rw-r--r--www/wiki/vendor/willdurand/geocoder/ProviderAggregator.php192
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Query/GeocodeQuery.php209
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Query/Query.php69
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Query/ReverseQuery.php187
-rw-r--r--www/wiki/vendor/willdurand/geocoder/Readme.md39
-rw-r--r--www/wiki/vendor/willdurand/geocoder/StatefulGeocoder.php164
-rw-r--r--www/wiki/vendor/willdurand/geocoder/TimedGeocoder.php94
-rw-r--r--www/wiki/vendor/willdurand/geocoder/composer.json40
47 files changed, 3618 insertions, 0 deletions
diff --git a/www/wiki/vendor/willdurand/geocoder/Assert.php b/www/wiki/vendor/willdurand/geocoder/Assert.php
new file mode 100644
index 00000000..489c8b92
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Assert.php
@@ -0,0 +1,71 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder;
+
+use Geocoder\Exception\InvalidArgument;
+
+class Assert
+{
+ /**
+ * @param float $value
+ * @param string $message
+ */
+ public static function latitude($value, string $message = '')
+ {
+ self::float($value, $message);
+ if ($value < -90 || $value > 90) {
+ throw new InvalidArgument(sprintf($message ?: 'Latitude should be between -90 and 90. Got: %s', $value));
+ }
+ }
+
+ /**
+ * @param float $value
+ * @param string $message
+ */
+ public static function longitude($value, string $message = '')
+ {
+ self::float($value, $message);
+ if ($value < -180 || $value > 180) {
+ throw new InvalidArgument(sprintf($message ?: 'Longitude should be between -180 and 180. Got: %s', $value));
+ }
+ }
+
+ /**
+ * @param mixed $value
+ * @param string $message
+ */
+ public static function notNull($value, string $message = '')
+ {
+ if (null === $value) {
+ throw new InvalidArgument(sprintf($message ?: 'Value cannot be null'));
+ }
+ }
+
+ private static function typeToString($value): string
+ {
+ return is_object($value) ? get_class($value) : gettype($value);
+ }
+
+ /**
+ * @param $value
+ * @param $message
+ */
+ private static function float($value, string $message)
+ {
+ if (!is_float($value)) {
+ throw new InvalidArgument(
+ sprintf($message ?: 'Expected a float. Got: %s', self::typeToString($value))
+ );
+ }
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/CHANGELOG.md b/www/wiki/vendor/willdurand/geocoder/CHANGELOG.md
new file mode 100644
index 00000000..3e991d5e
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/CHANGELOG.md
@@ -0,0 +1,83 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## Unreleased
+
+## 4.2.1
+
+### Fixed
+- Bug in `AddressBuilder` where same expression is compare twice
+
+## 4.2.0
+
+### Added
+
+- Add `Coordinates::toArray`
+
+### Fixed
+
+- Bug in `StatefulGeocoder` where different locale or bounds did not have any effect.
+
+## 4.1.0
+
+### Changed
+
+- Make sure a `Country` never will be empty of data.
+
+## 4.0.0
+
+No changes since Beta 5.
+
+## 4.0.0 - Beta 5
+
+### Changed
+
+- `GeocodeQuery::withTest` was renamed to `GeocodeQuery::withText`
+
+## 4.0.0 - Beta 4
+
+### Added
+
+- Add `GeocodeQuery::withText` and `ReverseQuery::withCoordinates`.
+- Create interface for GeocodeQuery and ReverseQuery
+
+## 4.0.0 - Beta 3
+
+### Added
+
+- The constructor of `ProvierAggregator` will accept a callable that can decide what providers should be used for a specific query.
+
+### Changed
+
+- `ProvierAggregator::getProvider` is now private
+- `ProvierAggregator::limit` was removed
+- `ProvierAggregator::getLimit` was removed
+- `ProvierAggregator::__constructor` changed the order of the parameters.
+- `ProvierAggregator` is not final.
+
+
+## 4.0.0 - Beta 2
+
+### Added
+
+- PHP7 type hints.
+- `AbstractArrayDumper` and `AbstractDumper`
+- `LogicException` and `OutOfBounds`
+- `GeocodeQuery::__toString` and `ReverseQuery::__toString`
+
+### Changed
+
+- All Dumpers are now final.
+- All Exceptions are now final.
+- `AddressCollection` is now final.
+- `ProviderAggregator` is now final.
+- `StatefulGeocoder` is now final.
+- `TimedGeocoder` is now final.
+- `ProviderAggregator::getName()` will return "provider_aggregator"
+- `TimedGeocoder::getName()` will return "timed_geocoder"
+
+
+## 4.0.0 - Beta1
+
+First release of this library.
diff --git a/www/wiki/vendor/willdurand/geocoder/Collection.php b/www/wiki/vendor/willdurand/geocoder/Collection.php
new file mode 100644
index 00000000..64f4ec99
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Collection.php
@@ -0,0 +1,59 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder;
+
+use Geocoder\Exception\CollectionIsEmpty;
+use Geocoder\Exception\OutOfBounds;
+
+/**
+ * This is the interface that is always return from a Geocoder.
+ *
+ * @author William Durand <william.durand1@gmail.com>
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ */
+interface Collection extends \IteratorAggregate, \Countable
+{
+ /**
+ * @return Location
+ *
+ * @throws CollectionIsEmpty
+ */
+ public function first(): Location;
+
+ /**
+ * @return bool
+ */
+ public function isEmpty(): bool;
+
+ /**
+ * @return Location[]
+ */
+ public function slice(int $offset, int $length = null);
+
+ /**
+ * @return bool
+ */
+ public function has(int $index): bool;
+
+ /**
+ * @return Location
+ *
+ * @throws OutOfBounds
+ */
+ public function get(int $index): Location;
+
+ /**
+ * @return Location[]
+ */
+ public function all(): array;
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Dumper/AbstractArrayDumper.php b/www/wiki/vendor/willdurand/geocoder/Dumper/AbstractArrayDumper.php
new file mode 100644
index 00000000..b3226f1f
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Dumper/AbstractArrayDumper.php
@@ -0,0 +1,65 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Dumper;
+
+use Geocoder\Location;
+
+/**
+ * @author Tomas Norkūnas <norkunas.tom@gmail.com>
+ */
+abstract class AbstractArrayDumper
+{
+ /**
+ * @param Location $location
+ *
+ * @return array
+ */
+ protected function getArray(Location $location): array
+ {
+ $properties = array_filter($location->toArray(), function ($value) {
+ return !empty($value);
+ });
+
+ unset(
+ $properties['latitude'],
+ $properties['longitude'],
+ $properties['bounds']
+ );
+
+ if (0 === count($properties)) {
+ $properties = null;
+ }
+
+ $lat = 0;
+ $lon = 0;
+ if (null !== $coordinates = $location->getCoordinates()) {
+ $lat = $coordinates->getLatitude();
+ $lon = $coordinates->getLongitude();
+ }
+
+ $array = [
+ 'type' => 'Feature',
+ 'geometry' => [
+ 'type' => 'Point',
+ 'coordinates' => [$lon, $lat],
+ ],
+ 'properties' => $properties,
+ ];
+
+ if (null !== $bounds = $location->getBounds()) {
+ $array['bounds'] = $bounds->toArray();
+ }
+
+ return $array;
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Dumper/AbstractDumper.php b/www/wiki/vendor/willdurand/geocoder/Dumper/AbstractDumper.php
new file mode 100644
index 00000000..b46025f3
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Dumper/AbstractDumper.php
@@ -0,0 +1,45 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Dumper;
+
+use Geocoder\Location;
+
+abstract class AbstractDumper
+{
+ /**
+ * @param Location $address
+ *
+ * @return string
+ */
+ protected function formatName(Location $address): string
+ {
+ $name = [];
+ $array = $address->toArray();
+
+ foreach (['streetNumber', 'streetName', 'postalCode', 'locality'] as $attr) {
+ $name[] = $array[$attr];
+ }
+
+ if (isset($array['adminLevels'][2])) {
+ $name[] = $array['adminLevels'][2]['name'];
+ }
+
+ if (isset($array['adminLevels'][1])) {
+ $name[] = $array['adminLevels'][1]['name'];
+ }
+
+ $name[] = $array['country'];
+
+ return implode(', ', array_filter($name));
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Dumper/Dumper.php b/www/wiki/vendor/willdurand/geocoder/Dumper/Dumper.php
new file mode 100644
index 00000000..44529252
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Dumper/Dumper.php
@@ -0,0 +1,31 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Dumper;
+
+use Geocoder\Location;
+
+/**
+ * @author William Durand <william.durand1@gmail.com>
+ */
+interface Dumper
+{
+ /**
+ * Dumps an `Location` object as a string representation of
+ * the implemented format.
+ *
+ * @param Location $location
+ *
+ * @return mixed
+ */
+ public function dump(Location $location);
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Dumper/GeoArray.php b/www/wiki/vendor/willdurand/geocoder/Dumper/GeoArray.php
new file mode 100644
index 00000000..f9926862
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Dumper/GeoArray.php
@@ -0,0 +1,29 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Dumper;
+
+use Geocoder\Location;
+
+/**
+ * @author Tomas Norkūnas <norkunas.tom@gmail.com>
+ */
+final class GeoArray extends AbstractArrayDumper implements Dumper
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function dump(Location $location): array
+ {
+ return $this->getArray($location);
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Dumper/GeoJson.php b/www/wiki/vendor/willdurand/geocoder/Dumper/GeoJson.php
new file mode 100644
index 00000000..c992be8f
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Dumper/GeoJson.php
@@ -0,0 +1,29 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Dumper;
+
+use Geocoder\Location;
+
+/**
+ * @author Jan Sorgalla <jsorgalla@googlemail.com>
+ */
+final class GeoJson extends AbstractArrayDumper
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function dump(Location $location): string
+ {
+ return json_encode($this->getArray($location));
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Dumper/Gpx.php b/www/wiki/vendor/willdurand/geocoder/Dumper/Gpx.php
new file mode 100644
index 00000000..935a9dad
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Dumper/Gpx.php
@@ -0,0 +1,72 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Dumper;
+
+use Geocoder\Geocoder;
+use Geocoder\Location;
+
+/**
+ * @author William Durand <william.durand1@gmail.com>
+ */
+final class Gpx extends AbstractDumper implements Dumper
+{
+ /**
+ * @param Location $location
+ *
+ * @return string
+ */
+ public function dump(Location $location): string
+ {
+ $gpx = sprintf(<<<'GPX'
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<gpx
+version="1.0"
+ creator="Geocoder" version="%s"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="http://www.topografix.com/GPX/1/0"
+ xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
+
+GPX
+ , Geocoder::VERSION);
+
+ if (null !== $bounds = $location->getBounds()) {
+ $gpx .= sprintf(<<<'GPX'
+ <bounds minlat="%f" minlon="%f" maxlat="%f" maxlon="%f"/>
+
+GPX
+ , $bounds->getWest(), $bounds->getSouth(), $bounds->getEast(), $bounds->getNorth());
+ }
+
+ $lat = null;
+ $lon = null;
+ if (null !== $coordinates = $location->getCoordinates()) {
+ $lat = $coordinates->getLatitude();
+ $lon = $coordinates->getLongitude();
+ }
+
+ $gpx .= sprintf(<<<'GPX'
+ <wpt lat="%.7f" lon="%.7f">
+ <name><![CDATA[%s]]></name>
+ <type><![CDATA[Address]]></type>
+ </wpt>
+
+GPX
+ , $lat, $lon, $this->formatName($location));
+
+ $gpx .= <<<'GPX'
+</gpx>
+GPX;
+
+ return $gpx;
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Dumper/Kml.php b/www/wiki/vendor/willdurand/geocoder/Dumper/Kml.php
new file mode 100644
index 00000000..9182c25c
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Dumper/Kml.php
@@ -0,0 +1,52 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Dumper;
+
+use Geocoder\Location;
+
+/**
+ * @author Jan Sorgalla <jsorgalla@googlemail.com>
+ */
+final class Kml extends AbstractDumper implements Dumper
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function dump(Location $location): string
+ {
+ $name = $this->formatName($location);
+ $kml = <<<'KML'
+<?xml version="1.0" encoding="UTF-8"?>
+<kml xmlns="http://www.opengis.net/kml/2.2">
+ <Document>
+ <Placemark>
+ <name><![CDATA[%s]]></name>
+ <description><![CDATA[%s]]></description>
+ <Point>
+ <coordinates>%.7F,%.7F,0</coordinates>
+ </Point>
+ </Placemark>
+ </Document>
+</kml>
+KML;
+
+ $lat = null;
+ $lon = null;
+ if (null !== $coordinates = $location->getCoordinates()) {
+ $lat = $coordinates->getLatitude();
+ $lon = $coordinates->getLongitude();
+ }
+
+ return sprintf($kml, $name, $name, $lon, $lat);
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Dumper/Wkb.php b/www/wiki/vendor/willdurand/geocoder/Dumper/Wkb.php
new file mode 100644
index 00000000..9cbf2145
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Dumper/Wkb.php
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Dumper;
+
+use Geocoder\Location;
+
+/**
+ * @author Jan Sorgalla <jsorgalla@googlemail.com>
+ */
+final class Wkb implements Dumper
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function dump(Location $location): string
+ {
+ $lat = null;
+ $lon = null;
+ if (null !== $coordinates = $location->getCoordinates()) {
+ $lat = $coordinates->getLatitude();
+ $lon = $coordinates->getLongitude();
+ }
+
+ return pack('cLdd', 1, 1, $lon, $lat);
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Dumper/Wkt.php b/www/wiki/vendor/willdurand/geocoder/Dumper/Wkt.php
new file mode 100644
index 00000000..e07331f2
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Dumper/Wkt.php
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Dumper;
+
+use Geocoder\Location;
+
+/**
+ * @author Jan Sorgalla <jsorgalla@googlemail.com>
+ */
+final class Wkt implements Dumper
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function dump(Location $location): string
+ {
+ $lat = null;
+ $lon = null;
+ if (null !== $coordinates = $location->getCoordinates()) {
+ $lat = $coordinates->getLatitude();
+ $lon = $coordinates->getLongitude();
+ }
+
+ return sprintf('POINT(%F %F)', $lon, $lat);
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Exception/CollectionIsEmpty.php b/www/wiki/vendor/willdurand/geocoder/Exception/CollectionIsEmpty.php
new file mode 100644
index 00000000..c21b34f3
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Exception/CollectionIsEmpty.php
@@ -0,0 +1,22 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Exception;
+
+/**
+ * When you are trying to access an element on en empty collection.
+ *
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ */
+final class CollectionIsEmpty extends \LogicException implements Exception
+{
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Exception/Exception.php b/www/wiki/vendor/willdurand/geocoder/Exception/Exception.php
new file mode 100644
index 00000000..1600333c
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Exception/Exception.php
@@ -0,0 +1,20 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Exception;
+
+/**
+ * @author William Durand <william.durand1@gmail.com>
+ */
+interface Exception
+{
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Exception/ExtensionNotLoaded.php b/www/wiki/vendor/willdurand/geocoder/Exception/ExtensionNotLoaded.php
new file mode 100644
index 00000000..045bd999
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Exception/ExtensionNotLoaded.php
@@ -0,0 +1,22 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Exception;
+
+/**
+ * When a required PHP extension is missing.
+ *
+ * @author Antoine Corcy <contact@sbin.dk>
+ */
+final class ExtensionNotLoaded extends \RuntimeException implements Exception
+{
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Exception/FunctionNotFound.php b/www/wiki/vendor/willdurand/geocoder/Exception/FunctionNotFound.php
new file mode 100644
index 00000000..a4ba0f60
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Exception/FunctionNotFound.php
@@ -0,0 +1,31 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Exception;
+
+/**
+ * @author William Durand <william.durand1@gmail.com>
+ */
+final class FunctionNotFound extends \RuntimeException implements Exception
+{
+ /**
+ * @param string $functionName
+ * @param string $description
+ */
+ public function __construct(string $functionName, $description = null)
+ {
+ parent::__construct(sprintf('The function "%s" cannot be found. %s',
+ $functionName,
+ null !== $description ? sprintf(' %s', $description) : ''
+ ));
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Exception/InvalidArgument.php b/www/wiki/vendor/willdurand/geocoder/Exception/InvalidArgument.php
new file mode 100644
index 00000000..a704f2b2
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Exception/InvalidArgument.php
@@ -0,0 +1,20 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Exception;
+
+/**
+ * @author William Durand <william.durand1@gmail.com>
+ */
+class InvalidArgument extends \InvalidArgumentException implements Exception
+{
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Exception/InvalidCredentials.php b/www/wiki/vendor/willdurand/geocoder/Exception/InvalidCredentials.php
new file mode 100644
index 00000000..90dbba36
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Exception/InvalidCredentials.php
@@ -0,0 +1,22 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Exception;
+
+/**
+ * Thrown when the Provider API declines the request because of wrong credentials.
+ *
+ * @author Markus Bachmann <markus.bachmann@bachi.biz>
+ */
+final class InvalidCredentials extends \RuntimeException implements Exception
+{
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Exception/InvalidServerResponse.php b/www/wiki/vendor/willdurand/geocoder/Exception/InvalidServerResponse.php
new file mode 100644
index 00000000..3c2dc519
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Exception/InvalidServerResponse.php
@@ -0,0 +1,42 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Exception;
+
+/**
+ * When the geocoder server returns something that we cannot process.
+ *
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ */
+final class InvalidServerResponse extends \RuntimeException implements Exception
+{
+ /**
+ * @param string $query
+ * @param int $code
+ *
+ * @return InvalidServerResponse
+ */
+ public static function create(string $query, int $code = 0): self
+ {
+ return new self(sprintf('The geocoder server returned an invalid response (%d) for query "%s". We could not parse it.', $code, $query));
+ }
+
+ /**
+ * @param string $query
+ *
+ * @return InvalidServerResponse
+ */
+ public static function emptyResponse(string $query): self
+ {
+ return new self(sprintf('The geocoder server returned an empty response for query "%s".', $query));
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Exception/LogicException.php b/www/wiki/vendor/willdurand/geocoder/Exception/LogicException.php
new file mode 100644
index 00000000..3938ca23
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Exception/LogicException.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Exception;
+
+/**
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ */
+final class LogicException extends \LogicException implements Exception
+{
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Exception/OutOfBounds.php b/www/wiki/vendor/willdurand/geocoder/Exception/OutOfBounds.php
new file mode 100644
index 00000000..23932a5e
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Exception/OutOfBounds.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Exception;
+
+/**
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ */
+final class OutOfBounds extends \OutOfBoundsException implements Exception
+{
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Exception/ProviderNotRegistered.php b/www/wiki/vendor/willdurand/geocoder/Exception/ProviderNotRegistered.php
new file mode 100644
index 00000000..eb479afa
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Exception/ProviderNotRegistered.php
@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Exception;
+
+/**
+ * @author William Durand <william.durand1@gmail.com>
+ */
+final class ProviderNotRegistered extends \RuntimeException implements Exception
+{
+ /**
+ * @param string $providerName
+ * @param array $registeredProviders
+ */
+ public static function create(string $providerName, array $registeredProviders = [])
+ {
+ return new self(sprintf(
+ 'Provider "%s" is not registered, so you cannot use it. Did you forget to register it or made a typo?%s',
+ $providerName,
+ 0 == count($registeredProviders) ? '' : sprintf(' Registered providers are: %s.', implode(', ', $registeredProviders))
+ ));
+ }
+
+ public static function noProviderRegistered()
+ {
+ return new self('No provider registered.');
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Exception/QuotaExceeded.php b/www/wiki/vendor/willdurand/geocoder/Exception/QuotaExceeded.php
new file mode 100644
index 00000000..012b20f1
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Exception/QuotaExceeded.php
@@ -0,0 +1,22 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Exception;
+
+/**
+ * Thrown when you no longer may access the API because your quota has exceeded.
+ *
+ * @author Max V. Kovrigovich <mvk@tut.by>
+ */
+final class QuotaExceeded extends \RuntimeException implements Exception
+{
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Exception/UnsupportedOperation.php b/www/wiki/vendor/willdurand/geocoder/Exception/UnsupportedOperation.php
new file mode 100644
index 00000000..3e9b75e9
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Exception/UnsupportedOperation.php
@@ -0,0 +1,23 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Exception;
+
+/**
+ * Thrown when you are trying to use a Provider for something it does not support. Example if you trying to reverse
+ * geocode an IP address.
+ *
+ * @author William Durand <william.durand1@gmail.com>
+ */
+final class UnsupportedOperation extends InvalidArgument implements Exception
+{
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Formatter/StringFormatter.php b/www/wiki/vendor/willdurand/geocoder/Formatter/StringFormatter.php
new file mode 100644
index 00000000..95adcf66
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Formatter/StringFormatter.php
@@ -0,0 +1,85 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Formatter;
+
+use Geocoder\Model\AdminLevelCollection;
+use Geocoder\Location;
+
+/**
+ * @author William Durand <william.durand1@gmail.com>
+ */
+final class StringFormatter
+{
+ const STREET_NUMBER = '%n';
+
+ const STREET_NAME = '%S';
+
+ const LOCALITY = '%L';
+
+ const POSTAL_CODE = '%z';
+
+ const SUB_LOCALITY = '%D';
+
+ const ADMIN_LEVEL = '%A';
+
+ const ADMIN_LEVEL_CODE = '%a';
+
+ const COUNTRY = '%C';
+
+ const COUNTRY_CODE = '%c';
+
+ const TIMEZONE = '%T';
+
+ /**
+ * Transform an `Address` instance into a string representation.
+ *
+ * @param Location $location
+ * @param string $format
+ *
+ * @return string
+ */
+ public function format(Location $location, string $format): string
+ {
+ $countryName = null;
+ $code = null;
+ if (null !== $country = $location->getCountry()) {
+ $countryName = $country->getName();
+ if (null !== $code = $country->getCode()) {
+ $code = strtoupper($code);
+ }
+ }
+
+ $replace = [
+ self::STREET_NUMBER => $location->getStreetNumber(),
+ self::STREET_NAME => $location->getStreetName(),
+ self::LOCALITY => $location->getLocality(),
+ self::POSTAL_CODE => $location->getPostalCode(),
+ self::SUB_LOCALITY => $location->getSubLocality(),
+ self::COUNTRY => $countryName,
+ self::COUNTRY_CODE => $code,
+ self::TIMEZONE => $location->getTimezone(),
+ ];
+
+ for ($level = 1; $level <= AdminLevelCollection::MAX_LEVEL_DEPTH; ++$level) {
+ $replace[self::ADMIN_LEVEL.$level] = null;
+ $replace[self::ADMIN_LEVEL_CODE.$level] = null;
+ }
+
+ foreach ($location->getAdminLevels() as $level => $adminLevel) {
+ $replace[self::ADMIN_LEVEL.$level] = $adminLevel->getName();
+ $replace[self::ADMIN_LEVEL_CODE.$level] = $adminLevel->getCode();
+ }
+
+ return strtr($format, $replace);
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Geocoder.php b/www/wiki/vendor/willdurand/geocoder/Geocoder.php
new file mode 100644
index 00000000..d52e1f3b
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Geocoder.php
@@ -0,0 +1,56 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder;
+
+use Geocoder\Provider\Provider;
+
+/**
+ * @author William Durand <william.durand1@gmail.com>
+ */
+interface Geocoder extends Provider
+{
+ /**
+ * Version of this package.
+ */
+ const MAJOR_VERSION = 4;
+
+ const VERSION = '4.0';
+
+ /**
+ * The default result limit.
+ */
+ const DEFAULT_RESULT_LIMIT = 5;
+
+ /**
+ * Geocodes a given value.
+ *
+ * @param string $value
+ *
+ * @return Collection
+ *
+ * @throws \Geocoder\Exception\Exception
+ */
+ public function geocode(string $value): Collection;
+
+ /**
+ * Reverses geocode given latitude and longitude values.
+ *
+ * @param float $latitude
+ * @param float $longitude
+ *
+ * @return Collection
+ *
+ * @throws \Geocoder\Exception\Exception
+ */
+ public function reverse(float $latitude, float $longitude): Collection;
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/GeocoderTrait.php b/www/wiki/vendor/willdurand/geocoder/GeocoderTrait.php
new file mode 100644
index 00000000..7d5949ec
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/GeocoderTrait.php
@@ -0,0 +1,44 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder;
+
+use Geocoder\Query\GeocodeQuery;
+use Geocoder\Query\ReverseQuery;
+
+/**
+ * A trait that turns a Provider into a Geocoder.
+ *
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ */
+trait GeocoderTrait
+{
+ abstract public function geocodeQuery(GeocodeQuery $query): Collection;
+
+ abstract public function reverseQuery(ReverseQuery $query): Collection;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function geocode(string $value): Collection
+ {
+ return $this->geocodeQuery(GeocodeQuery::create($value));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function reverse(float $latitude, float $longitude): Collection
+ {
+ return $this->reverseQuery(ReverseQuery::fromCoordinates($latitude, $longitude));
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/LICENSE b/www/wiki/vendor/willdurand/geocoder/LICENSE
new file mode 100644
index 00000000..8aa8246e
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2011 — William Durand <william.durand1@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/www/wiki/vendor/willdurand/geocoder/Location.php b/www/wiki/vendor/willdurand/geocoder/Location.php
new file mode 100644
index 00000000..5d9b9e44
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Location.php
@@ -0,0 +1,116 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder;
+
+use Geocoder\Model\AdminLevelCollection;
+use Geocoder\Model\Bounds;
+use Geocoder\Model\Coordinates;
+use Geocoder\Model\Country;
+
+/**
+ * A location is a single result from a Geocoder.
+ *
+ * @author William Durand <william.durand1@gmail.com>
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ */
+interface Location
+{
+ /**
+ * Will always return the coordinates value object.
+ *
+ * @return Coordinates|null
+ */
+ public function getCoordinates();
+
+ /**
+ * Returns the bounds value object.
+ *
+ * @return Bounds|null
+ */
+ public function getBounds();
+
+ /**
+ * Returns the street number value.
+ *
+ * @return string|int|null
+ */
+ public function getStreetNumber();
+
+ /**
+ * Returns the street name value.
+ *
+ * @return string|null
+ */
+ public function getStreetName();
+
+ /**
+ * Returns the city or locality value.
+ *
+ * @return string|null
+ */
+ public function getLocality();
+
+ /**
+ * Returns the postal code or zipcode value.
+ *
+ * @return string|null
+ */
+ public function getPostalCode();
+
+ /**
+ * Returns the locality district, or
+ * sublocality, or neighborhood.
+ *
+ * @return string|null
+ */
+ public function getSubLocality();
+
+ /**
+ * Returns the administrative levels.
+ *
+ * This method MUST NOT return null.
+ *
+ * @return AdminLevelCollection
+ */
+ public function getAdminLevels(): AdminLevelCollection;
+
+ /**
+ * Returns the country value object.
+ *
+ * @return Country|null
+ */
+ public function getCountry();
+
+ /**
+ * Returns the timezone for the Location. The timezone MUST be in the list of supported timezones.
+ *
+ * {@link http://php.net/manual/en/timezones.php}
+ *
+ * @return string|null
+ */
+ public function getTimezone();
+
+ /**
+ * Returns an array with data indexed by name.
+ *
+ * @return array
+ */
+ public function toArray(): array;
+
+ /**
+ * The name of the provider that created this Location.
+ *
+ * @return string
+ */
+ public function getProvidedBy(): string;
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Model/Address.php b/www/wiki/vendor/willdurand/geocoder/Model/Address.php
new file mode 100644
index 00000000..27237f45
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Model/Address.php
@@ -0,0 +1,370 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Model;
+
+use Geocoder\Location;
+
+/**
+ * @author William Durand <william.durand1@gmail.com>
+ */
+class Address implements Location
+{
+ /**
+ * @var Coordinates|null
+ */
+ private $coordinates;
+
+ /**
+ * @var Bounds|null
+ */
+ private $bounds;
+
+ /**
+ * @var string|int|null
+ */
+ private $streetNumber;
+
+ /**
+ * @var string|null
+ */
+ private $streetName;
+
+ /**
+ * @var string|null
+ */
+ private $subLocality;
+
+ /**
+ * @var string|null
+ */
+ private $locality;
+
+ /**
+ * @var string|null
+ */
+ private $postalCode;
+
+ /**
+ * @var AdminLevelCollection
+ */
+ private $adminLevels;
+
+ /**
+ * @var Country|null
+ */
+ private $country;
+
+ /**
+ * @var string|null
+ */
+ private $timezone;
+
+ /**
+ * @var string
+ */
+ private $providedBy;
+
+ /**
+ * @param string $providedBy
+ * @param AdminLevelCollection $adminLevels
+ * @param Coordinates|null $coordinates
+ * @param Bounds|null $bounds
+ * @param string|null $streetNumber
+ * @param string|null $streetName
+ * @param string|null $postalCode
+ * @param string|null $locality
+ * @param string|null $subLocality
+ * @param Country|null $country
+ * @param string|null $timezone
+ */
+ public function __construct(
+ string $providedBy,
+ AdminLevelCollection $adminLevels,
+ Coordinates $coordinates = null,
+ Bounds $bounds = null,
+ string $streetNumber = null,
+ string $streetName = null,
+ string $postalCode = null,
+ string $locality = null,
+ string $subLocality = null,
+ Country $country = null,
+ string $timezone = null
+ ) {
+ $this->providedBy = $providedBy;
+ $this->adminLevels = $adminLevels;
+ $this->coordinates = $coordinates;
+ $this->bounds = $bounds;
+ $this->streetNumber = $streetNumber;
+ $this->streetName = $streetName;
+ $this->postalCode = $postalCode;
+ $this->locality = $locality;
+ $this->subLocality = $subLocality;
+ $this->country = $country;
+ $this->timezone = $timezone;
+ }
+
+ /**
+ * @return string
+ */
+ public function getProvidedBy(): string
+ {
+ return $this->providedBy;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCoordinates()
+ {
+ return $this->coordinates;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getBounds()
+ {
+ return $this->bounds;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getStreetNumber()
+ {
+ return $this->streetNumber;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getStreetName()
+ {
+ return $this->streetName;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getLocality()
+ {
+ return $this->locality;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPostalCode()
+ {
+ return $this->postalCode;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getSubLocality()
+ {
+ return $this->subLocality;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAdminLevels(): AdminLevelCollection
+ {
+ return $this->adminLevels;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCountry()
+ {
+ return $this->country;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTimezone()
+ {
+ return $this->timezone;
+ }
+
+ /**
+ * Create an Address with an array. Useful for testing.
+ *
+ * @param array $data
+ *
+ * @return static
+ */
+ public static function createFromArray(array $data)
+ {
+ $defaults = [
+ 'providedBy' => 'n/a',
+ 'latitude' => null,
+ 'longitude' => null,
+ 'bounds' => [
+ 'south' => null,
+ 'west' => null,
+ 'north' => null,
+ 'east' => null,
+ ],
+ 'streetNumber' => null,
+ 'streetName' => null,
+ 'locality' => null,
+ 'postalCode' => null,
+ 'subLocality' => null,
+ 'adminLevels' => [],
+ 'country' => null,
+ 'countryCode' => null,
+ 'timezone' => null,
+ ];
+
+ $data = array_merge($defaults, $data);
+
+ $adminLevels = [];
+ foreach ($data['adminLevels'] as $adminLevel) {
+ if (empty($adminLevel['level'])) {
+ continue;
+ }
+
+ $name = $adminLevel['name'] ?? $adminLevel['code'] ?? null;
+ if (empty($name)) {
+ continue;
+ }
+
+ $adminLevels[] = new AdminLevel($adminLevel['level'], $name, $adminLevel['code'] ?? null);
+ }
+
+ return new static(
+ $data['providedBy'],
+ new AdminLevelCollection($adminLevels),
+ self::createCoordinates(
+ $data['latitude'],
+ $data['longitude']
+ ),
+ self::createBounds(
+ $data['bounds']['south'],
+ $data['bounds']['west'],
+ $data['bounds']['north'],
+ $data['bounds']['east']
+ ),
+ $data['streetNumber'],
+ $data['streetName'],
+ $data['postalCode'],
+ $data['locality'],
+ $data['subLocality'],
+ self::createCountry($data['country'], $data['countryCode']),
+ $data['timezone']
+ );
+ }
+
+ /**
+ * @param float $latitude
+ * @param float $longitude
+ *
+ * @return Coordinates|null
+ */
+ private static function createCoordinates($latitude, $longitude)
+ {
+ if (null === $latitude || null === $longitude) {
+ return null;
+ }
+
+ return new Coordinates($latitude, $longitude);
+ }
+
+ /**
+ * @param string|null $name
+ * @param string|null $code
+ *
+ * @return Country|null
+ */
+ private static function createCountry($name, $code)
+ {
+ if (null === $name && null === $code) {
+ return null;
+ }
+
+ return new Country($name, $code);
+ }
+
+ /**
+ * @param float $south
+ * @param float $west
+ * @param float $north
+ *
+ * @return Bounds|null
+ */
+ private static function createBounds($south, $west, $north, $east)
+ {
+ if (null === $south || null === $west || null === $north || null === $east) {
+ return null;
+ }
+
+ return new Bounds($south, $west, $north, $east);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toArray(): array
+ {
+ $adminLevels = [];
+ foreach ($this->adminLevels as $adminLevel) {
+ $adminLevels[$adminLevel->getLevel()] = [
+ 'name' => $adminLevel->getName(),
+ 'code' => $adminLevel->getCode(),
+ 'level' => $adminLevel->getLevel(),
+ ];
+ }
+
+ $lat = null;
+ $lon = null;
+ if (null !== $coordinates = $this->getCoordinates()) {
+ $lat = $coordinates->getLatitude();
+ $lon = $coordinates->getLongitude();
+ }
+
+ $countryName = null;
+ $countryCode = null;
+ if (null !== $country = $this->getCountry()) {
+ $countryName = $country->getName();
+ $countryCode = $country->getCode();
+ }
+
+ $noBounds = [
+ 'south' => null,
+ 'west' => null,
+ 'north' => null,
+ 'east' => null,
+ ];
+
+ return [
+ 'providedBy' => $this->providedBy,
+ 'latitude' => $lat,
+ 'longitude' => $lon,
+ 'bounds' => null !== $this->bounds ? $this->bounds->toArray() : $noBounds,
+ 'streetNumber' => $this->streetNumber,
+ 'streetName' => $this->streetName,
+ 'postalCode' => $this->postalCode,
+ 'locality' => $this->locality,
+ 'subLocality' => $this->subLocality,
+ 'adminLevels' => $adminLevels,
+ 'country' => $countryName,
+ 'countryCode' => $countryCode,
+ 'timezone' => $this->timezone,
+ ];
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Model/AddressBuilder.php b/www/wiki/vendor/willdurand/geocoder/Model/AddressBuilder.php
new file mode 100644
index 00000000..5695f6d6
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Model/AddressBuilder.php
@@ -0,0 +1,326 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Model;
+
+use Geocoder\Exception\InvalidArgument;
+use Geocoder\Exception\LogicException;
+
+/**
+ * A class that builds a Location or any of its subclasses.
+ *
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ */
+final class AddressBuilder
+{
+ /**
+ * @var string
+ */
+ private $providedBy;
+
+ /**
+ * @var Coordinates|null
+ */
+ private $coordinates;
+
+ /**
+ * @var Bounds|null
+ */
+ private $bounds;
+
+ /**
+ * @var string|null
+ */
+ private $streetNumber;
+
+ /**
+ * @var string|null
+ */
+ private $streetName;
+
+ /**
+ * @var string|null
+ */
+ private $locality;
+
+ /**
+ * @var string|null
+ */
+ private $postalCode;
+
+ /**
+ * @var string|null
+ */
+ private $subLocality;
+
+ /**
+ * @var array
+ */
+ private $adminLevels = [];
+
+ /**
+ * @var string|null
+ */
+ private $country;
+
+ /**
+ * @var string|null
+ */
+ private $countryCode;
+
+ /**
+ * @var string|null
+ */
+ private $timezone;
+
+ /**
+ * A storage for extra parameters.
+ *
+ * @var array
+ */
+ private $data = [];
+
+ /**
+ * @param string $providedBy
+ */
+ public function __construct(string $providedBy)
+ {
+ $this->providedBy = $providedBy;
+ }
+
+ /**
+ * @param string $class
+ *
+ * @return Address
+ */
+ public function build(string $class = Address::class): Address
+ {
+ if (!is_a($class, Address::class, true)) {
+ throw new LogicException('First parameter to LocationBuilder::build must be a class name extending Geocoder\Model\Address');
+ }
+
+ $country = null;
+ if (!empty($this->country) || !empty($this->countryCode)) {
+ $country = new Country($this->country, $this->countryCode);
+ }
+
+ return new $class(
+ $this->providedBy,
+ new AdminLevelCollection($this->adminLevels),
+ $this->coordinates,
+ $this->bounds,
+ $this->streetNumber,
+ $this->streetName,
+ $this->postalCode,
+ $this->locality,
+ $this->subLocality,
+ $country,
+ $this->timezone
+ );
+ }
+
+ /**
+ * @param float $south
+ * @param float $west
+ * @param float $north
+ * @param float $east
+ *
+ * @return AddressBuilder
+ */
+ public function setBounds($south, $west, $north, $east): self
+ {
+ try {
+ $this->bounds = new Bounds($south, $west, $north, $east);
+ } catch (InvalidArgument $e) {
+ $this->bounds = null;
+ }
+
+ return $this;
+ }
+
+ /**
+ * @param float $latitude
+ * @param float $longitude
+ *
+ * @return AddressBuilder
+ */
+ public function setCoordinates($latitude, $longitude): self
+ {
+ try {
+ $this->coordinates = new Coordinates($latitude, $longitude);
+ } catch (InvalidArgument $e) {
+ $this->coordinates = null;
+ }
+
+ return $this;
+ }
+
+ /**
+ * @param int $level
+ * @param string $name
+ * @param string|null $code
+ *
+ * @return AddressBuilder
+ */
+ public function addAdminLevel(int $level, string $name, string $code = null): self
+ {
+ $this->adminLevels[] = new AdminLevel($level, $name, $code);
+
+ return $this;
+ }
+
+ /**
+ * @param null|string $streetNumber
+ *
+ * @return AddressBuilder
+ */
+ public function setStreetNumber($streetNumber): self
+ {
+ $this->streetNumber = $streetNumber;
+
+ return $this;
+ }
+
+ /**
+ * @param null|string $streetName
+ *
+ * @return AddressBuilder
+ */
+ public function setStreetName($streetName): self
+ {
+ $this->streetName = $streetName;
+
+ return $this;
+ }
+
+ /**
+ * @param null|string $locality
+ *
+ * @return AddressBuilder
+ */
+ public function setLocality($locality): self
+ {
+ $this->locality = $locality;
+
+ return $this;
+ }
+
+ /**
+ * @param null|string $postalCode
+ *
+ * @return AddressBuilder
+ */
+ public function setPostalCode($postalCode): self
+ {
+ $this->postalCode = $postalCode;
+
+ return $this;
+ }
+
+ /**
+ * @param null|string $subLocality
+ *
+ * @return AddressBuilder
+ */
+ public function setSubLocality($subLocality): self
+ {
+ $this->subLocality = $subLocality;
+
+ return $this;
+ }
+
+ /**
+ * @param array $adminLevels
+ *
+ * @return AddressBuilder
+ */
+ public function setAdminLevels($adminLevels): self
+ {
+ $this->adminLevels = $adminLevels;
+
+ return $this;
+ }
+
+ /**
+ * @param null|string $country
+ *
+ * @return AddressBuilder
+ */
+ public function setCountry($country): self
+ {
+ $this->country = $country;
+
+ return $this;
+ }
+
+ /**
+ * @param null|string $countryCode
+ *
+ * @return AddressBuilder
+ */
+ public function setCountryCode($countryCode): self
+ {
+ $this->countryCode = $countryCode;
+
+ return $this;
+ }
+
+ /**
+ * @param null|string $timezone
+ *
+ * @return AddressBuilder
+ */
+ public function setTimezone($timezone): self
+ {
+ $this->timezone = $timezone;
+
+ return $this;
+ }
+
+ /**
+ * @param string $name
+ * @param mixed $value
+ *
+ * @return AddressBuilder
+ */
+ public function setValue(string $name, $value): self
+ {
+ $this->data[$name] = $value;
+
+ return $this;
+ }
+
+ /**
+ * @param string $name
+ * @param mixed|null $default
+ *
+ * @return mixed
+ */
+ public function getValue(string $name, $default = null)
+ {
+ if ($this->hasValue($name)) {
+ return $this->data[$name];
+ }
+
+ return $default;
+ }
+
+ /**
+ * @param string $name
+ *
+ * @return bool
+ */
+ public function hasValue(string $name): bool
+ {
+ return array_key_exists($name, $this->data);
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Model/AddressCollection.php b/www/wiki/vendor/willdurand/geocoder/Model/AddressCollection.php
new file mode 100644
index 00000000..9895b18d
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Model/AddressCollection.php
@@ -0,0 +1,106 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Model;
+
+use Geocoder\Collection;
+use Geocoder\Exception\CollectionIsEmpty;
+use Geocoder\Exception\OutOfBounds;
+use Geocoder\Location;
+
+final class AddressCollection implements Collection
+{
+ /**
+ * @var Location[]
+ */
+ private $locations;
+
+ /**
+ * @param Location[] $locations
+ */
+ public function __construct(array $locations = [])
+ {
+ $this->locations = array_values($locations);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getIterator()
+ {
+ return new \ArrayIterator($this->all());
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function count()
+ {
+ return count($this->locations);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function first(): Location
+ {
+ if (empty($this->locations)) {
+ throw new CollectionIsEmpty();
+ }
+
+ return reset($this->locations);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isEmpty(): bool
+ {
+ return empty($this->locations);
+ }
+
+ /**
+ * @return Location[]
+ */
+ public function slice(int $offset, int $length = null)
+ {
+ return array_slice($this->locations, $offset, $length);
+ }
+
+ /**
+ * @return bool
+ */
+ public function has(int $index): bool
+ {
+ return isset($this->locations[$index]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get(int $index): Location
+ {
+ if (!isset($this->locations[$index])) {
+ throw new OutOfBounds(sprintf('The index "%s" does not exist in this collection.', $index));
+ }
+
+ return $this->locations[$index];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function all(): array
+ {
+ return $this->locations;
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Model/AdminLevel.php b/www/wiki/vendor/willdurand/geocoder/Model/AdminLevel.php
new file mode 100644
index 00000000..d2271b8b
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Model/AdminLevel.php
@@ -0,0 +1,86 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Model;
+
+/**
+ * @author William Durand <william.durand1@gmail.com>
+ */
+final class AdminLevel
+{
+ /**
+ * @var int
+ */
+ private $level;
+
+ /**
+ * @var string
+ */
+ private $name;
+
+ /**
+ * @var string|null
+ */
+ private $code;
+
+ /**
+ * @param int $level
+ * @param string $name
+ * @param string|null $code
+ */
+ public function __construct(int $level, string $name, string $code = null)
+ {
+ $this->level = $level;
+ $this->name = $name;
+ $this->code = $code;
+ }
+
+ /**
+ * Returns the administrative level.
+ *
+ * @return int Level number [1,5]
+ */
+ public function getLevel(): int
+ {
+ return $this->level;
+ }
+
+ /**
+ * Returns the administrative level name.
+ *
+ * @return string
+ */
+ public function getName(): string
+ {
+ return $this->name;
+ }
+
+ /**
+ * Returns the administrative level short name.
+ *
+ * @return string|null
+ */
+ public function getCode()
+ {
+ return $this->code;
+ }
+
+ /**
+ * Returns a string with the administrative level name.
+ *
+ * @return string
+ */
+ public function __toString(): string
+ {
+ return $this->getName();
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Model/AdminLevelCollection.php b/www/wiki/vendor/willdurand/geocoder/Model/AdminLevelCollection.php
new file mode 100644
index 00000000..ecb71aca
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Model/AdminLevelCollection.php
@@ -0,0 +1,140 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Model;
+
+use Geocoder\Exception\CollectionIsEmpty;
+use Geocoder\Exception\InvalidArgument;
+use Geocoder\Exception\OutOfBounds;
+
+/**
+ * @author Giorgio Premi <giosh94mhz@gmail.com>
+ */
+final class AdminLevelCollection implements \IteratorAggregate, \Countable
+{
+ const MAX_LEVEL_DEPTH = 5;
+
+ /**
+ * @var AdminLevel[]
+ */
+ private $adminLevels;
+
+ /**
+ * @param AdminLevel[] $adminLevels
+ */
+ public function __construct(array $adminLevels = [])
+ {
+ $this->adminLevels = [];
+
+ foreach ($adminLevels as $adminLevel) {
+ $level = $adminLevel->getLevel();
+
+ $this->checkLevel($level);
+
+ if ($this->has($level)) {
+ throw new InvalidArgument(sprintf('Administrative level %d is defined twice', $level));
+ }
+
+ $this->adminLevels[$level] = $adminLevel;
+ }
+
+ ksort($this->adminLevels, SORT_NUMERIC);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getIterator()
+ {
+ return new \ArrayIterator($this->all());
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function count()
+ {
+ return count($this->adminLevels);
+ }
+
+ /**
+ * @return AdminLevel
+ *
+ * @throws CollectionIsEmpty
+ */
+ public function first(): AdminLevel
+ {
+ if (empty($this->adminLevels)) {
+ throw new CollectionIsEmpty();
+ }
+
+ return reset($this->adminLevels);
+ }
+
+ /**
+ * @param int $offset
+ * @param int|null $length
+ *
+ * @return AdminLevel[]
+ */
+ public function slice(int $offset, int $length = null): array
+ {
+ return array_slice($this->adminLevels, $offset, $length, true);
+ }
+
+ /**
+ * @return bool
+ */
+ public function has(int $level): bool
+ {
+ return isset($this->adminLevels[$level]);
+ }
+
+ /**
+ * @return AdminLevel
+ *
+ * @throws \OutOfBoundsException
+ * @throws InvalidArgument
+ */
+ public function get(int $level): AdminLevel
+ {
+ $this->checkLevel($level);
+
+ if (!isset($this->adminLevels[$level])) {
+ throw new InvalidArgument(sprintf('Administrative level %d is not set for this address', $level));
+ }
+
+ return $this->adminLevels[$level];
+ }
+
+ /**
+ * @return AdminLevel[]
+ */
+ public function all(): array
+ {
+ return $this->adminLevels;
+ }
+
+ /**
+ * @param int $level
+ *
+ * @throws \OutOfBoundsException
+ */
+ private function checkLevel(int $level)
+ {
+ if ($level <= 0 || $level > self::MAX_LEVEL_DEPTH) {
+ throw new OutOfBounds(
+ sprintf('Administrative level should be an integer in [1,%d], %d given', self::MAX_LEVEL_DEPTH, $level)
+ );
+ }
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Model/Bounds.php b/www/wiki/vendor/willdurand/geocoder/Model/Bounds.php
new file mode 100644
index 00000000..02f01740
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Model/Bounds.php
@@ -0,0 +1,125 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Model;
+
+use Geocoder\Assert;
+
+/**
+ * @author William Durand <william.durand1@gmail.com>
+ */
+final class Bounds
+{
+ /**
+ * @var float
+ */
+ private $south;
+
+ /**
+ * @var float
+ */
+ private $west;
+
+ /**
+ * @var float
+ */
+ private $north;
+
+ /**
+ * @var float
+ */
+ private $east;
+
+ /**
+ * @param float $south South bound, also min latitude
+ * @param float $west West bound, also min longitude
+ * @param float $north North bound, also max latitude
+ * @param float $east East bound, also max longitude
+ */
+ public function __construct($south, $west, $north, $east)
+ {
+ Assert::notNull($south);
+ Assert::notNull($west);
+ Assert::notNull($north);
+ Assert::notNull($east);
+
+ $south = (float) $south;
+ $north = (float) $north;
+ $west = (float) $west;
+ $east = (float) $east;
+
+ Assert::latitude($south);
+ Assert::latitude($north);
+ Assert::longitude($west);
+ Assert::longitude($east);
+
+ $this->south = $south;
+ $this->west = $west;
+ $this->north = $north;
+ $this->east = $east;
+ }
+
+ /**
+ * Returns the south bound.
+ *
+ * @return float
+ */
+ public function getSouth(): float
+ {
+ return $this->south;
+ }
+
+ /**
+ * Returns the west bound.
+ *
+ * @return float
+ */
+ public function getWest(): float
+ {
+ return $this->west;
+ }
+
+ /**
+ * Returns the north bound.
+ *
+ * @return float
+ */
+ public function getNorth(): float
+ {
+ return $this->north;
+ }
+
+ /**
+ * Returns the east bound.
+ *
+ * @return float
+ */
+ public function getEast(): float
+ {
+ return $this->east;
+ }
+
+ /**
+ * Returns an array with bounds.
+ *
+ * @return array
+ */
+ public function toArray(): array
+ {
+ return [
+ 'south' => $this->getSouth(),
+ 'west' => $this->getWest(),
+ 'north' => $this->getNorth(),
+ 'east' => $this->getEast(),
+ ];
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Model/Coordinates.php b/www/wiki/vendor/willdurand/geocoder/Model/Coordinates.php
new file mode 100644
index 00000000..7969af5f
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Model/Coordinates.php
@@ -0,0 +1,80 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Model;
+
+use Geocoder\Assert;
+
+/**
+ * @author William Durand <william.durand1@gmail.com>
+ */
+final class Coordinates
+{
+ /**
+ * @var float
+ */
+ private $latitude;
+
+ /**
+ * @var float
+ */
+ private $longitude;
+
+ /**
+ * @param float $latitude
+ * @param float $longitude
+ */
+ public function __construct($latitude, $longitude)
+ {
+ Assert::notNull($latitude);
+ Assert::notNull($longitude);
+
+ $latitude = (float) $latitude;
+ $longitude = (float) $longitude;
+
+ Assert::latitude($latitude);
+ Assert::longitude($longitude);
+
+ $this->latitude = $latitude;
+ $this->longitude = $longitude;
+ }
+
+ /**
+ * Returns the latitude.
+ *
+ * @return float
+ */
+ public function getLatitude(): float
+ {
+ return $this->latitude;
+ }
+
+ /**
+ * Returns the longitude.
+ *
+ * @return float
+ */
+ public function getLongitude(): float
+ {
+ return $this->longitude;
+ }
+
+ /**
+ * Returns the coordinates as a tuple
+ *
+ * @return array
+ */
+ public function toArray(): array
+ {
+ return [$this->getLongitude(), $this->getLatitude()];
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Model/Country.php b/www/wiki/vendor/willdurand/geocoder/Model/Country.php
new file mode 100644
index 00000000..6230e323
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Model/Country.php
@@ -0,0 +1,77 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Model;
+
+use Geocoder\Exception\InvalidArgument;
+
+/**
+ * A Country has either a name or a code. A Country will never be without data.
+ *
+ * @author William Durand <william.durand1@gmail.com>
+ */
+final class Country
+{
+ /**
+ * @var string|null
+ */
+ private $name;
+
+ /**
+ * @var string|null
+ */
+ private $code;
+
+ /**
+ * @param string $name
+ * @param string $code
+ */
+ public function __construct(string $name = null, string $code = null)
+ {
+ if (null === $name && null === $code) {
+ throw new InvalidArgument('A country must have either a name or a code');
+ }
+
+ $this->name = $name;
+ $this->code = $code;
+ }
+
+ /**
+ * Returns the country name.
+ *
+ * @return string|null
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * Returns the country ISO code.
+ *
+ * @return string|null
+ */
+ public function getCode()
+ {
+ return $this->code;
+ }
+
+ /**
+ * Returns a string with the country name.
+ *
+ * @return string
+ */
+ public function __toString(): string
+ {
+ return $this->getName() ?: '';
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Provider/AbstractProvider.php b/www/wiki/vendor/willdurand/geocoder/Provider/AbstractProvider.php
new file mode 100644
index 00000000..7c8b8b6c
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Provider/AbstractProvider.php
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Provider;
+
+use Geocoder\Location;
+use Geocoder\Model\Address;
+
+/**
+ * @author William Durand <william.durand1@gmail.com>
+ */
+abstract class AbstractProvider implements Provider
+{
+ /**
+ * Returns the results for the 'localhost' special case.
+ *
+ * @return Location
+ */
+ protected function getLocationForLocalhost(): Location
+ {
+ return Address::createFromArray([
+ 'providedBy' => $this->getName(),
+ 'locality' => 'localhost',
+ 'country' => 'localhost',
+ ]);
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Provider/Provider.php b/www/wiki/vendor/willdurand/geocoder/Provider/Provider.php
new file mode 100644
index 00000000..bea5d02b
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Provider/Provider.php
@@ -0,0 +1,51 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Provider;
+
+use Geocoder\Collection;
+use Geocoder\Query\GeocodeQuery;
+use Geocoder\Query\ReverseQuery;
+
+/**
+ * Providers MUST always be stateless and immutable.
+ *
+ * @author William Durand <william.durand1@gmail.com>
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ */
+interface Provider
+{
+ /**
+ * @param GeocodeQuery $query
+ *
+ * @return Collection
+ *
+ * @throws \Geocoder\Exception\Exception
+ */
+ public function geocodeQuery(GeocodeQuery $query): Collection;
+
+ /**
+ * @param ReverseQuery $query
+ *
+ * @return Collection
+ *
+ * @throws \Geocoder\Exception\Exception
+ */
+ public function reverseQuery(ReverseQuery $query): Collection;
+
+ /**
+ * Returns the provider's name.
+ *
+ * @return string
+ */
+ public function getName(): string;
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/ProviderAggregator.php b/www/wiki/vendor/willdurand/geocoder/ProviderAggregator.php
new file mode 100644
index 00000000..38d63061
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/ProviderAggregator.php
@@ -0,0 +1,192 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder;
+
+use Geocoder\Exception\ProviderNotRegistered;
+use Geocoder\Model\Coordinates;
+use Geocoder\Query\GeocodeQuery;
+use Geocoder\Query\ReverseQuery;
+use Geocoder\Provider\Provider;
+
+/**
+ * @author William Durand <william.durand1@gmail.com>
+ */
+class ProviderAggregator implements Geocoder
+{
+ /**
+ * @var Provider[]
+ */
+ private $providers = [];
+
+ /**
+ * @var Provider
+ */
+ private $provider;
+
+ /**
+ * @var int
+ */
+ private $limit;
+
+ /**
+ * A callable that decided what provider to use.
+ *
+ * @var callable
+ */
+ private $decider;
+
+ /**
+ * @param callable|null $decider
+ * @param int $limit
+ */
+ public function __construct(callable $decider = null, int $limit = Geocoder::DEFAULT_RESULT_LIMIT)
+ {
+ $this->limit = $limit;
+ $this->decider = $decider ?? __CLASS__.'::getProvider';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function geocodeQuery(GeocodeQuery $query): Collection
+ {
+ if (null === $query->getLimit()) {
+ $query = $query->withLimit($this->limit);
+ }
+
+ return call_user_func($this->decider, $query, $this->providers, $this->provider)->geocodeQuery($query);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function reverseQuery(ReverseQuery $query): Collection
+ {
+ if (null === $query->getLimit()) {
+ $query = $query->withLimit($this->limit);
+ }
+
+ return call_user_func($this->decider, $query, $this->providers, $this->provider)->reverseQuery($query);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getName(): string
+ {
+ return 'provider_aggregator';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function geocode(string $value): Collection
+ {
+ return $this->geocodeQuery(GeocodeQuery::create($value)
+ ->withLimit($this->limit));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function reverse(float $latitude, float $longitude): Collection
+ {
+ return $this->reverseQuery(ReverseQuery::create(new Coordinates($latitude, $longitude))
+ ->withLimit($this->limit));
+ }
+
+ /**
+ * Registers a new provider to the aggregator.
+ *
+ * @param Provider $provider
+ *
+ * @return ProviderAggregator
+ */
+ public function registerProvider(Provider $provider): self
+ {
+ $this->providers[$provider->getName()] = $provider;
+
+ return $this;
+ }
+
+ /**
+ * Registers a set of providers.
+ *
+ * @param Provider[] $providers
+ *
+ * @return ProviderAggregator
+ */
+ public function registerProviders(array $providers = []): self
+ {
+ foreach ($providers as $provider) {
+ $this->registerProvider($provider);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Sets the default provider to use.
+ *
+ * @param string $name
+ *
+ * @return ProviderAggregator
+ */
+ public function using(string $name): self
+ {
+ if (!isset($this->providers[$name])) {
+ throw ProviderNotRegistered::create($name ?? '', $this->providers);
+ }
+
+ $this->provider = $this->providers[$name];
+
+ return $this;
+ }
+
+ /**
+ * Returns all registered providers indexed by their name.
+ *
+ * @return Provider[]
+ */
+ public function getProviders(): array
+ {
+ return $this->providers;
+ }
+
+ /**
+ * Get a provider to use for this query.
+ *
+ * @param GeocodeQuery|ReverseQuery $query
+ * @param Provider[] $providers
+ * @param Provider $currentProvider
+ *
+ * @return Provider
+ *
+ * @throws ProviderNotRegistered
+ */
+ private static function getProvider($query, array $providers, Provider $currentProvider = null): Provider
+ {
+ if (null !== $currentProvider) {
+ return $currentProvider;
+ }
+
+ if (0 === count($providers)) {
+ throw ProviderNotRegistered::noProviderRegistered();
+ }
+
+ // Take first
+ $key = key($providers);
+
+ return $providers[$key];
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Query/GeocodeQuery.php b/www/wiki/vendor/willdurand/geocoder/Query/GeocodeQuery.php
new file mode 100644
index 00000000..46be7ed1
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Query/GeocodeQuery.php
@@ -0,0 +1,209 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Query;
+
+use Geocoder\Exception\InvalidArgument;
+use Geocoder\Geocoder;
+use Geocoder\Model\Bounds;
+
+/**
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ */
+final class GeocodeQuery implements Query
+{
+ /**
+ * The address or text that should be geocoded.
+ *
+ * @var string
+ */
+ private $text;
+
+ /**
+ * @var Bounds|null
+ */
+ private $bounds;
+
+ /**
+ * @var string|null
+ */
+ private $locale;
+
+ /**
+ * @var int
+ */
+ private $limit = Geocoder::DEFAULT_RESULT_LIMIT;
+
+ /**
+ * @var array
+ */
+ private $data = [];
+
+ /**
+ * @param string $text
+ */
+ private function __construct(string $text)
+ {
+ if (empty($text)) {
+ throw new InvalidArgument('Geocode query cannot be empty');
+ }
+
+ $this->text = $text;
+ }
+
+ /**
+ * @param string $text
+ *
+ * @return GeocodeQuery
+ */
+ public static function create(string $text): self
+ {
+ return new self($text);
+ }
+
+ /**
+ * @param string $text
+ *
+ * @return GeocodeQuery
+ */
+ public function withText(string $text): self
+ {
+ $new = clone $this;
+ $new->text = $text;
+
+ return $new;
+ }
+
+ /**
+ * @param Bounds $bounds
+ *
+ * @return GeocodeQuery
+ */
+ public function withBounds(Bounds $bounds): self
+ {
+ $new = clone $this;
+ $new->bounds = $bounds;
+
+ return $new;
+ }
+
+ /**
+ * @param string $locale
+ *
+ * @return GeocodeQuery
+ */
+ public function withLocale(string $locale): self
+ {
+ $new = clone $this;
+ $new->locale = $locale;
+
+ return $new;
+ }
+
+ /**
+ * @param int $limit
+ *
+ * @return GeocodeQuery
+ */
+ public function withLimit(int $limit): self
+ {
+ $new = clone $this;
+ $new->limit = $limit;
+
+ return $new;
+ }
+
+ /**
+ * @param string $name
+ * @param mixed $value
+ *
+ * @return GeocodeQuery
+ */
+ public function withData(string $name, $value): self
+ {
+ $new = clone $this;
+ $new->data[$name] = $value;
+
+ return $new;
+ }
+
+ /**
+ * @return string
+ */
+ public function getText(): string
+ {
+ return $this->text;
+ }
+
+ /**
+ * @return Bounds|null
+ */
+ public function getBounds()
+ {
+ return $this->bounds;
+ }
+
+ /**
+ * @return string|null
+ */
+ public function getLocale()
+ {
+ return $this->locale;
+ }
+
+ /**
+ * @return int
+ */
+ public function getLimit(): int
+ {
+ return $this->limit;
+ }
+
+ /**
+ * @param string $name
+ * @param mixed|null $default
+ *
+ * @return mixed
+ */
+ public function getData(string $name, $default = null)
+ {
+ if (!array_key_exists($name, $this->data)) {
+ return $default;
+ }
+
+ return $this->data[$name];
+ }
+
+ /**
+ * @return array
+ */
+ public function getAllData(): array
+ {
+ return $this->data;
+ }
+
+ /**
+ * String for logging. This is also a unique key for the query
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('GeocodeQuery: %s', json_encode([
+ 'text' => $this->getText(),
+ 'bounds' => $this->getBounds() ? $this->getBounds()->toArray() : 'null',
+ 'locale' => $this->getLocale(),
+ 'limit' => $this->getLimit(),
+ 'data' => $this->getAllData(),
+ ]));
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Query/Query.php b/www/wiki/vendor/willdurand/geocoder/Query/Query.php
new file mode 100644
index 00000000..41e3bee1
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Query/Query.php
@@ -0,0 +1,69 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Query;
+
+/**
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ */
+interface Query
+{
+ /**
+ * @param string $locale
+ *
+ * @return Query
+ */
+ public function withLocale(string $locale);
+
+ /**
+ * @param int $limit
+ *
+ * @return Query
+ */
+ public function withLimit(int $limit);
+
+ /**
+ * @param string $name
+ * @param mixed $value
+ *
+ * @return Query
+ */
+ public function withData(string $name, $value);
+
+ /**
+ * @return string|null
+ */
+ public function getLocale();
+
+ /**
+ * @return int
+ */
+ public function getLimit(): int;
+
+ /**
+ * @param string $name
+ * @param mixed|null $default
+ *
+ * @return mixed
+ */
+ public function getData(string $name, $default = null);
+
+ /**
+ * @return array
+ */
+ public function getAllData(): array;
+
+ /**
+ * @return string
+ */
+ public function __toString();
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Query/ReverseQuery.php b/www/wiki/vendor/willdurand/geocoder/Query/ReverseQuery.php
new file mode 100644
index 00000000..548867ad
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Query/ReverseQuery.php
@@ -0,0 +1,187 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder\Query;
+
+use Geocoder\Geocoder;
+use Geocoder\Model\Coordinates;
+
+/**
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ */
+final class ReverseQuery implements Query
+{
+ /**
+ * @var Coordinates
+ */
+ private $coordinates;
+
+ /**
+ * @var string|null
+ */
+ private $locale;
+
+ /**
+ * @var int
+ */
+ private $limit = Geocoder::DEFAULT_RESULT_LIMIT;
+
+ /**
+ * @var array
+ */
+ private $data = [];
+
+ /**
+ * @param Coordinates $coordinates
+ */
+ private function __construct(Coordinates $coordinates)
+ {
+ $this->coordinates = $coordinates;
+ }
+
+ /**
+ * @param Coordinates $coordinates
+ *
+ * @return ReverseQuery
+ */
+ public static function create(Coordinates $coordinates)
+ {
+ return new self($coordinates);
+ }
+
+ /**
+ * @param float $latitude
+ * @param float $longitude
+ *
+ * @return ReverseQuery
+ */
+ public static function fromCoordinates($latitude, $longitude): self
+ {
+ return new self(new Coordinates($latitude, $longitude));
+ }
+
+ /**
+ * @param Coordinates $coordinates
+ *
+ * @return ReverseQuery
+ */
+ public function withCoordinates(Coordinates $coordinates): self
+ {
+ $new = clone $this;
+ $new->coordinates = $coordinates;
+
+ return $new;
+ }
+
+ /**
+ * @param int $limit
+ *
+ * @return ReverseQuery
+ */
+ public function withLimit(int $limit): self
+ {
+ $new = clone $this;
+ $new->limit = $limit;
+
+ return $new;
+ }
+
+ /**
+ * @param string $locale
+ *
+ * @return ReverseQuery
+ */
+ public function withLocale(string $locale): self
+ {
+ $new = clone $this;
+ $new->locale = $locale;
+
+ return $new;
+ }
+
+ /**
+ * @param string $name
+ * @param mixed $value
+ *
+ * @return ReverseQuery
+ */
+ public function withData(string $name, $value): self
+ {
+ $new = clone $this;
+ $new->data[$name] = $value;
+
+ return $new;
+ }
+
+ /**
+ * @return Coordinates
+ */
+ public function getCoordinates(): Coordinates
+ {
+ return $this->coordinates;
+ }
+
+ /**
+ * @return int
+ */
+ public function getLimit(): int
+ {
+ return $this->limit;
+ }
+
+ /**
+ * @return string
+ */
+ public function getLocale()
+ {
+ return $this->locale;
+ }
+
+ /**
+ * @param string $name
+ * @param mixed|null $default
+ *
+ * @return mixed
+ */
+ public function getData(string $name, $default = null)
+ {
+ if (!array_key_exists($name, $this->data)) {
+ return $default;
+ }
+
+ return $this->data[$name];
+ }
+
+ /**
+ * @return array
+ */
+ public function getAllData(): array
+ {
+ return $this->data;
+ }
+
+ /**
+ * String for logging. This is also a unique key for the query
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('ReverseQuery: %s', json_encode([
+ 'lat' => $this->getCoordinates()->getLatitude(),
+ 'lng' => $this->getCoordinates()->getLongitude(),
+ 'locale' => $this->getLocale(),
+ 'limit' => $this->getLimit(),
+ 'data' => $this->getAllData(),
+ ]));
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/Readme.md b/www/wiki/vendor/willdurand/geocoder/Readme.md
new file mode 100644
index 00000000..caa39c14
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/Readme.md
@@ -0,0 +1,39 @@
+# Common classes for the Geocoder
+[![Build Status](https://travis-ci.org/geocoder-php/php-common.svg?branch=master)](http://travis-ci.org/geocoder-php/php-common)
+[![Latest Stable Version](https://poser.pugx.org/willdurand/geocoder/v/stable)](https://packagist.org/packages/willdurand/geocoder)
+[![Total Downloads](https://poser.pugx.org/willdurand/geocoder/downloads)](https://packagist.org/packages/willdurand/geocoder)
+[![Monthly Downloads](https://poser.pugx.org/willdurand/geocoder/d/monthly.png)](https://packagist.org/packages/willdurand/geocoder)
+[![Code Coverage](https://img.shields.io/scrutinizer/coverage/g/geocoder-php/php-common.svg?style=flat-square)](https://scrutinizer-ci.com/g/geocoder-php/php-common)
+[![Quality Score](https://img.shields.io/scrutinizer/g/geocoder-php/php-common.svg?style=flat-square)](https://scrutinizer-ci.com/g/geocoder-php/php-common)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+### Note
+
+* This repository is **READ ONLY**
+* Post issues and PRs at the main repository: https://github.com/geocoder-php/Geocoder
+
+### History
+
+Just some months before the release of 4.0 of `willdurand/geocoder` we changed the repository to https://github.com/geocoder-php/php-common
+from https://github.com/geocoder-php/Geocoder. The new repository will only contain classes and interfaces shared between
+multiple providers. The original repository is still used for issues and pull requests.
+
+The new repository architecture allows us to use a [git subtree split](https://www.subtreesplit.com) from geocoder-php/Geocoder
+to geocoder-php/php-common and to each provider.
+
+Versions before 4.0 `willdurand/geocoder` will still work as usual, but with the new repository.
+
+
+### Install
+
+In 99% of the cases you do **not** want to install this package directly. You are more likely to install one provider.
+Have a look at [the documentation](https://github.com/geocoder-php/Geocoder) to see the different providers.
+
+```bash
+composer require willdurand/geocoder
+```
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/geocoder-php/Geocoder) or
+report any issues you find on the [issue tracker](https://github.com/geocoder-php/Geocoder/issues).
diff --git a/www/wiki/vendor/willdurand/geocoder/StatefulGeocoder.php b/www/wiki/vendor/willdurand/geocoder/StatefulGeocoder.php
new file mode 100644
index 00000000..e618b25b
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/StatefulGeocoder.php
@@ -0,0 +1,164 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder;
+
+use Geocoder\Model\Bounds;
+use Geocoder\Query\GeocodeQuery;
+use Geocoder\Query\ReverseQuery;
+use Geocoder\Provider\Provider;
+
+/**
+ * @author Tobias Nyholm <tobias.nyholm@gmail.com>
+ */
+final class StatefulGeocoder implements Geocoder
+{
+ /**
+ * @var string
+ */
+ private $locale;
+
+ /**
+ * @var Bounds
+ */
+ private $bounds;
+
+ /**
+ * @var int
+ */
+ private $limit;
+
+ /**
+ * @var Provider
+ */
+ private $provider;
+
+ /**
+ * @param Provider $provider
+ * @param string $locale
+ */
+ public function __construct(Provider $provider, string $locale = null)
+ {
+ $this->provider = $provider;
+ $this->locale = $locale;
+ $this->limit = Geocoder::DEFAULT_RESULT_LIMIT;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function geocode(string $value): Collection
+ {
+ $query = GeocodeQuery::create($value)
+ ->withLimit($this->limit);
+
+ if (!empty($this->locale)) {
+ $query = $query->withLocale($this->locale);
+ }
+
+ if (!empty($this->bounds)) {
+ $query = $query->withBounds($this->bounds);
+ }
+
+ return $this->provider->geocodeQuery($query);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function reverse(float $latitude, float $longitude): Collection
+ {
+ $query = ReverseQuery::fromCoordinates($latitude, $longitude)
+ ->withLimit($this->limit);
+
+ if (!empty($this->locale)) {
+ $query = $query->withLocale($this->locale);
+ }
+
+ return $this->provider->reverseQuery($query);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function geocodeQuery(GeocodeQuery $query): Collection
+ {
+ $locale = $query->getLocale();
+ if (empty($locale) && null !== $this->locale) {
+ $query = $query->withLocale($this->locale);
+ }
+
+ $bounds = $query->getBounds();
+ if (empty($bounds) && null !== $this->bounds) {
+ $query = $query->withBounds($this->bounds);
+ }
+
+ return $this->provider->geocodeQuery($query);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function reverseQuery(ReverseQuery $query): Collection
+ {
+ $locale = $query->getLocale();
+ if (empty($locale) && null !== $this->locale) {
+ $query = $query->withLocale($this->locale);
+ }
+
+ return $this->provider->reverseQuery($query);
+ }
+
+ /**
+ * @param string $locale
+ *
+ * @return StatefulGeocoder
+ */
+ public function setLocale(string $locale): self
+ {
+ $this->locale = $locale;
+
+ return $this;
+ }
+
+ /**
+ * @param Bounds $bounds
+ *
+ * @return StatefulGeocoder
+ */
+ public function setBounds(Bounds $bounds): self
+ {
+ $this->bounds = $bounds;
+
+ return $this;
+ }
+
+ /**
+ * @param int $limit
+ *
+ * @return StatefulGeocoder
+ */
+ public function setLimit(int $limit): self
+ {
+ $this->limit = $limit;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getName(): string
+ {
+ return 'stateful_geocoder';
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/TimedGeocoder.php b/www/wiki/vendor/willdurand/geocoder/TimedGeocoder.php
new file mode 100644
index 00000000..4abebc53
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/TimedGeocoder.php
@@ -0,0 +1,94 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * This file is part of the Geocoder package.
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @license MIT License
+ */
+
+namespace Geocoder;
+
+use Geocoder\Query\GeocodeQuery;
+use Geocoder\Query\ReverseQuery;
+use Geocoder\Provider\Provider;
+use Symfony\Component\Stopwatch\Stopwatch;
+
+/**
+ * This Geocoder allows you to profile your API/Database calls.
+ *
+ * @author Markus Bachmann <markus.bachmann@bachi.biz>
+ */
+final class TimedGeocoder implements Geocoder
+{
+ use GeocoderTrait;
+
+ /**
+ * @var Provider
+ */
+ private $delegate;
+
+ /**
+ * @var Stopwatch
+ */
+ private $stopwatch;
+
+ public function __construct(Provider $delegate, Stopwatch $stopwatch)
+ {
+ $this->delegate = $delegate;
+ $this->stopwatch = $stopwatch;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function geocodeQuery(GeocodeQuery $query): Collection
+ {
+ $this->stopwatch->start('geocode', 'geocoder');
+
+ try {
+ $result = $this->delegate->geocodeQuery($query);
+ } catch (\Throwable $e) {
+ $this->stopwatch->stop('geocode');
+
+ throw $e;
+ }
+
+ $this->stopwatch->stop('geocode');
+
+ return $result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function reverseQuery(ReverseQuery $query): Collection
+ {
+ $this->stopwatch->start('reverse', 'geocoder');
+
+ try {
+ $result = $this->delegate->reverseQuery($query);
+ } catch (\Throwable $e) {
+ $this->stopwatch->stop('reverse');
+
+ throw $e;
+ }
+
+ $this->stopwatch->stop('reverse');
+
+ return $result;
+ }
+
+ public function __call($method, $args)
+ {
+ return call_user_func_array([$this->delegate, $method], $args);
+ }
+
+ public function getName(): string
+ {
+ return 'timed_geocoder';
+ }
+}
diff --git a/www/wiki/vendor/willdurand/geocoder/composer.json b/www/wiki/vendor/willdurand/geocoder/composer.json
new file mode 100644
index 00000000..85648860
--- /dev/null
+++ b/www/wiki/vendor/willdurand/geocoder/composer.json
@@ -0,0 +1,40 @@
+{
+ "name": "willdurand/geocoder",
+ "type": "library",
+ "description": "Common files for PHP Geocoder",
+ "keywords": ["geocoder", "geocoding", "abstraction", "geoip"],
+ "homepage": "http://geocoder-php.org",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "William Durand",
+ "email": "william.durand1@gmail.com"
+ }
+ ],
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "6.3.*",
+ "symfony/stopwatch": "~2.5",
+ "nyholm/nsa": "^1.1"
+ },
+ "suggest": {
+ "symfony/stopwatch": "If you want to use the TimedGeocoder"
+ },
+ "autoload": {
+ "psr-4": { "Geocoder\\": "" },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "scripts": {
+ "test": "vendor/bin/phpunit",
+ "test-ci": "vendor/bin/phpunit --coverage-text --coverage-clover=build/coverage.xml"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ }
+}