Version Description
- 2021-12-13 =
- Changed: show MailPoet logo in emails when using free MailPoet plan;
- Fixed: "# of machine opens" segment not working properly.
Download this release
Release Info
Developer | MailPoet |
Plugin | MailPoet Newsletters (New) |
Version | 3.75.0 |
Comparing to | |
See all releases |
Code changes from version 3.74.3 to 3.75.0
- generated/FreeCachedContainer.php +3 -25
- lang/mailpoet-ar.mo +0 -0
- lang/mailpoet-bg_BG.mo +0 -0
- lang/mailpoet-ca.mo +0 -0
- lang/mailpoet-cs_CZ.mo +0 -0
- lang/mailpoet-da_DK.mo +0 -0
- lang/mailpoet-de_DE.mo +0 -0
- lang/mailpoet-de_DE_formal.mo +0 -0
- lang/mailpoet-el.mo +0 -0
- lang/mailpoet-en_GB.mo +0 -0
- lang/mailpoet-es_ES.mo +0 -0
- lang/mailpoet-es_MX.mo +0 -0
- lang/mailpoet-fa_IR.mo +0 -0
- lang/mailpoet-fr_CA.mo +0 -0
- lang/mailpoet-fr_FR.mo +0 -0
- lang/mailpoet-he_IL.mo +0 -0
- lang/mailpoet-hu_HU.mo +0 -0
- lang/mailpoet-it_IT.mo +0 -0
- lang/mailpoet-ja.mo +0 -0
- lang/mailpoet-nb_NO.mo +0 -0
- lang/mailpoet-nl_NL.mo +0 -0
- lang/mailpoet-nl_NL_formal.mo +0 -0
- lang/mailpoet-pl_PL.mo +0 -0
- lang/mailpoet-pt_BR.mo +0 -0
- lang/mailpoet-pt_PT.mo +0 -0
- lang/mailpoet-ro_RO.mo +0 -0
- lang/mailpoet-ru_RU.mo +0 -0
- lang/mailpoet-sq.mo +0 -0
- lang/mailpoet-sr_RS.mo +0 -0
- lang/mailpoet-sv_SE.mo +0 -0
- lang/mailpoet-tr_TR.mo +0 -0
- lang/mailpoet-zh_CN.mo +0 -0
- lib-3rd-party/Idiorm/idiorm.php +19 -10
- lib-3rd-party/pquery/IQuery.php +154 -0
- lib-3rd-party/pquery/LICENSE +502 -0
- lib-3rd-party/pquery/gan_formatter.php +382 -0
- lib-3rd-party/pquery/gan_node_html.php +2856 -0
- lib-3rd-party/pquery/gan_parser_html.php +840 -0
- lib-3rd-party/pquery/gan_selector_html.php +950 -0
- lib-3rd-party/pquery/gan_tokenizer.php +567 -0
- lib-3rd-party/pquery/gan_xml2array.php +102 -0
- lib-3rd-party/pquery/ganon.php +102 -0
- {vendor/tburry → lib-3rd-party/pquery}/index.php +0 -0
- lib-3rd-party/pquery/pQuery.php +284 -0
- {vendor/tburry/pquery → lib-3rd-party/pquery/third_party}/index.php +0 -0
- lib-3rd-party/pquery/third_party/jsminplus.php +2091 -0
- lib/API/JSON/v1/Subscribers.php +14 -7
- lib/API/MP/v1/API.php +18 -6
- lib/Config/RequirementsChecker.php +0 -1
- lib/Config/ServicesChecker.php +13 -0
- lib/DI/ContainerConfigurator.php +0 -2
- lib/Form/Block/Date.php +8 -8
- lib/Listing/BulkActionController.php +0 -37
- lib/Listing/BulkActionFactory.php +0 -33
- lib/Listing/Handler.php +10 -28
- lib/Mailer/Mailer.php +7 -0
- lib/Mailer/MetaInfo.php +2 -2
- lib/Newsletter/Editor/StructureTransformer.php +2 -2
- lib/Newsletter/Links/Links.php +2 -2
- lib/Newsletter/Renderer/Renderer.php +8 -16
- lib/Segments/DynamicSegments/FilterFactory.php +2 -1
- lib/Segments/SegmentsSimpleListRepository.php +2 -0
- lib/Segments/WP.php +15 -2
- lib/Subscribers/ConfirmationEmailMailer.php +31 -26
- lib/Subscribers/SubscriberActions.php +6 -3
- lib/Util/DOM.php +1 -1
- lib/Util/License/Features/Subscribers.php +5 -0
- lib/Util/pQuery/DomNode.php +11 -2
- lib/Util/pQuery/Html5Parser.php +5 -3
- lib/Util/pQuery/pQuery.php +5 -3
- lib/WooCommerce/Subscription.php +14 -2
- mailpoet.php +2 -2
- readme.txt +6 -2
- vendor-prefixed/autoload.php +1 -1
- vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Connection.php +1 -1
- vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php +1 -1
- vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractException.php +1 -1
- vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/DriverManager.php +1 -1
- vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/AbstractPlatform.php +1 -1
- vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/MariaDb1027Platform.php +1 -1
- vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Portability/Statement.php +1 -1
- vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/SQLParserUtils.php +1 -1
- vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DecimalType.php +1 -1
- vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Version.php +1 -1
- vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Entity/AbstractEntityPersister.php +1 -1
- vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php +1 -1
- vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php +1 -1
- vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query.php +1 -1
- vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/QueryBuilder.php +1 -1
- vendor-prefixed/symfony/service-contracts/ServiceSubscriberTrait.php +1 -1
- vendor-prefixed/symfony/service-contracts/Test/ServiceLocatorTest.php +1 -1
- vendor-prefixed/symfony/translation-contracts/Test/TranslatorTest.php +2 -2
- vendor-prefixed/symfony/translation-contracts/TranslatorTrait.php +2 -2
- vendor/autoload.php +1 -1
- vendor/composer/autoload_classmap.php +1 -1
generated/FreeCachedContainer.php
CHANGED
@@ -160,8 +160,6 @@ class FreeCachedContainer extends Container
|
|
160 |
Â
'MailPoet\\Form\\Util\\CustomFonts' => 'getCustomFontsService',
|
161 |
Â
'MailPoet\\Form\\Util\\FieldNameObfuscator' => 'getFieldNameObfuscatorService',
|
162 |
Â
'MailPoet\\Helpscout\\Beacon' => 'getBeaconService',
|
163 |
-
'MailPoet\\Listing\\BulkActionController' => 'getBulkActionControllerService',
|
164 |
-
'MailPoet\\Listing\\BulkActionFactory' => 'getBulkActionFactoryService',
|
165 |
Â
'MailPoet\\Listing\\Handler' => 'getHandlerService',
|
166 |
Â
'MailPoet\\Listing\\PageLimit' => 'getPageLimitService',
|
167 |
Â
'MailPoet\\Logging\\LogRepository' => 'getLogRepositoryService',
|
@@ -733,7 +731,7 @@ class FreeCachedContainer extends Container
|
|
733 |
Â
*/
|
734 |
Â
protected function getAPI2Service()
|
735 |
Â
{
|
736 |
-
return $this->services['MailPoet\\API\\MP\\v1\\API'] = new \MailPoet\API\MP\v1\API(($this->services['MailPoet\\Subscribers\\NewSubscriberNotificationMailer'] ?? $this->getNewSubscriberNotificationMailerService()), ($this->services['MailPoet\\Subscribers\\ConfirmationEmailMailer'] ?? $this->getConfirmationEmailMailerService()), ($this->services['MailPoet\\Subscribers\\RequiredCustomFieldValidator'] ?? $this->getRequiredCustomFieldValidatorService()), ($this->services['MailPoet\\Newsletter\\Scheduler\\WelcomeScheduler'] ?? $this->getWelcomeSchedulerService()), ($this->services['MailPoet\\API\\MP\\v1\\CustomFields'] ?? $this->getCustomFields2Service()), ($this->services['MailPoet\\Settings\\SettingsController'] ?? $this->getSettingsControllerService()));
|
737 |
Â
}
|
738 |
Â
|
739 |
Â
/**
|
@@ -1701,26 +1699,6 @@ class FreeCachedContainer extends Container
|
|
1701 |
Â
return $this->services['MailPoet\\Helpscout\\Beacon'] = new \MailPoet\Helpscout\Beacon(($this->services['MailPoet\\Settings\\SettingsController'] ?? $this->getSettingsControllerService()), ($this->services['MailPoet\\WP\\Functions'] ?? ($this->services['MailPoet\\WP\\Functions'] = new \MailPoet\WP\Functions())), ($this->services['MailPoet\\Util\\License\\Features\\Subscribers'] ?? $this->getSubscribers3Service()));
|
1702 |
Â
}
|
1703 |
Â
|
1704 |
-
/**
|
1705 |
-
* Gets the public 'MailPoet\Listing\BulkActionController' shared autowired service.
|
1706 |
-
*
|
1707 |
-
* @return \MailPoet\Listing\BulkActionController
|
1708 |
-
*/
|
1709 |
-
protected function getBulkActionControllerService()
|
1710 |
-
{
|
1711 |
-
return $this->services['MailPoet\\Listing\\BulkActionController'] = new \MailPoet\Listing\BulkActionController(($this->services['MailPoet\\Listing\\BulkActionFactory'] ?? ($this->services['MailPoet\\Listing\\BulkActionFactory'] = new \MailPoet\Listing\BulkActionFactory())), ($this->services['MailPoet\\Listing\\Handler'] ?? ($this->services['MailPoet\\Listing\\Handler'] = new \MailPoet\Listing\Handler())));
|
1712 |
-
}
|
1713 |
-
|
1714 |
-
/**
|
1715 |
-
* Gets the public 'MailPoet\Listing\BulkActionFactory' shared autowired service.
|
1716 |
-
*
|
1717 |
-
* @return \MailPoet\Listing\BulkActionFactory
|
1718 |
-
*/
|
1719 |
-
protected function getBulkActionFactoryService()
|
1720 |
-
{
|
1721 |
-
return $this->services['MailPoet\\Listing\\BulkActionFactory'] = new \MailPoet\Listing\BulkActionFactory();
|
1722 |
-
}
|
1723 |
-
|
1724 |
Â
/**
|
1725 |
Â
* Gets the public 'MailPoet\Listing\Handler' shared autowired service.
|
1726 |
Â
*
|
@@ -1948,7 +1926,7 @@ class FreeCachedContainer extends Container
|
|
1948 |
Â
*/
|
1949 |
Â
protected function getRenderer5Service()
|
1950 |
Â
{
|
1951 |
-
return $this->services['MailPoet\\Newsletter\\Renderer\\Renderer'] = new \MailPoet\Newsletter\Renderer\Renderer(($this->services['MailPoet\\Newsletter\\Renderer\\Blocks\\Renderer'] ?? $this->getRenderer3Service()), ($this->services['MailPoet\\Newsletter\\Renderer\\Columns\\Renderer'] ?? ($this->services['MailPoet\\Newsletter\\Renderer\\Columns\\Renderer'] = new \MailPoet\Newsletter\Renderer\Columns\Renderer())), ($this->services['MailPoet\\Newsletter\\Renderer\\Preprocessor'] ?? $this->getPreprocessorService()), ($this->services['MailPoetVendor\\CSS'] ?? ($this->services['MailPoetVendor\\CSS'] = new \MailPoetVendor\CSS())), ($this->services['MailPoet\\
|
1952 |
Â
}
|
1953 |
Â
|
1954 |
Â
/**
|
@@ -2445,7 +2423,7 @@ class FreeCachedContainer extends Container
|
|
2445 |
Â
*/
|
2446 |
Â
protected function getWPService()
|
2447 |
Â
{
|
2448 |
-
return $this->services['MailPoet\\Segments\\WP'] = new \MailPoet\Segments\WP(($this->services['MailPoet\\WP\\Functions'] ?? ($this->services['MailPoet\\WP\\Functions'] = new \MailPoet\WP\Functions())), ($this->services['MailPoet\\Newsletter\\Scheduler\\WelcomeScheduler'] ?? $this->getWelcomeSchedulerService()), ($this->services['MailPoet\\WooCommerce\\Helper'] ?? ($this->services['MailPoet\\WooCommerce\\Helper'] = new \MailPoet\WooCommerce\Helper())));
|
2449 |
Â
}
|
2450 |
Â
|
2451 |
Â
/**
|
160 |
Â
'MailPoet\\Form\\Util\\CustomFonts' => 'getCustomFontsService',
|
161 |
Â
'MailPoet\\Form\\Util\\FieldNameObfuscator' => 'getFieldNameObfuscatorService',
|
162 |
Â
'MailPoet\\Helpscout\\Beacon' => 'getBeaconService',
|
Â
|
|
Â
|
|
163 |
Â
'MailPoet\\Listing\\Handler' => 'getHandlerService',
|
164 |
Â
'MailPoet\\Listing\\PageLimit' => 'getPageLimitService',
|
165 |
Â
'MailPoet\\Logging\\LogRepository' => 'getLogRepositoryService',
|
731 |
Â
*/
|
732 |
Â
protected function getAPI2Service()
|
733 |
Â
{
|
734 |
+
return $this->services['MailPoet\\API\\MP\\v1\\API'] = new \MailPoet\API\MP\v1\API(($this->services['MailPoet\\Subscribers\\NewSubscriberNotificationMailer'] ?? $this->getNewSubscriberNotificationMailerService()), ($this->services['MailPoet\\Subscribers\\ConfirmationEmailMailer'] ?? $this->getConfirmationEmailMailerService()), ($this->services['MailPoet\\Subscribers\\RequiredCustomFieldValidator'] ?? $this->getRequiredCustomFieldValidatorService()), ($this->services['MailPoet\\Newsletter\\Scheduler\\WelcomeScheduler'] ?? $this->getWelcomeSchedulerService()), ($this->services['MailPoet\\API\\MP\\v1\\CustomFields'] ?? $this->getCustomFields2Service()), ($this->services['MailPoet\\Settings\\SettingsController'] ?? $this->getSettingsControllerService()), ($this->services['MailPoet\\Subscribers\\SubscribersRepository'] ?? $this->getSubscribersRepositoryService()));
|
735 |
Â
}
|
736 |
Â
|
737 |
Â
/**
|
1699 |
Â
return $this->services['MailPoet\\Helpscout\\Beacon'] = new \MailPoet\Helpscout\Beacon(($this->services['MailPoet\\Settings\\SettingsController'] ?? $this->getSettingsControllerService()), ($this->services['MailPoet\\WP\\Functions'] ?? ($this->services['MailPoet\\WP\\Functions'] = new \MailPoet\WP\Functions())), ($this->services['MailPoet\\Util\\License\\Features\\Subscribers'] ?? $this->getSubscribers3Service()));
|
1700 |
Â
}
|
1701 |
Â
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
1702 |
Â
/**
|
1703 |
Â
* Gets the public 'MailPoet\Listing\Handler' shared autowired service.
|
1704 |
Â
*
|
1926 |
Â
*/
|
1927 |
Â
protected function getRenderer5Service()
|
1928 |
Â
{
|
1929 |
+
return $this->services['MailPoet\\Newsletter\\Renderer\\Renderer'] = new \MailPoet\Newsletter\Renderer\Renderer(($this->services['MailPoet\\Newsletter\\Renderer\\Blocks\\Renderer'] ?? $this->getRenderer3Service()), ($this->services['MailPoet\\Newsletter\\Renderer\\Columns\\Renderer'] ?? ($this->services['MailPoet\\Newsletter\\Renderer\\Columns\\Renderer'] = new \MailPoet\Newsletter\Renderer\Columns\Renderer())), ($this->services['MailPoet\\Newsletter\\Renderer\\Preprocessor'] ?? $this->getPreprocessorService()), ($this->services['MailPoetVendor\\CSS'] ?? ($this->services['MailPoetVendor\\CSS'] = new \MailPoetVendor\CSS())), ($this->services['MailPoet\\Newsletter\\NewslettersRepository'] ?? $this->getNewslettersRepositoryService()), ($this->services['MailPoet\\Config\\ServicesChecker'] ?? ($this->services['MailPoet\\Config\\ServicesChecker'] = new \MailPoet\Config\ServicesChecker())));
|
1930 |
Â
}
|
1931 |
Â
|
1932 |
Â
/**
|
2423 |
Â
*/
|
2424 |
Â
protected function getWPService()
|
2425 |
Â
{
|
2426 |
+
return $this->services['MailPoet\\Segments\\WP'] = new \MailPoet\Segments\WP(($this->services['MailPoet\\WP\\Functions'] ?? ($this->services['MailPoet\\WP\\Functions'] = new \MailPoet\WP\Functions())), ($this->services['MailPoet\\Newsletter\\Scheduler\\WelcomeScheduler'] ?? $this->getWelcomeSchedulerService()), ($this->services['MailPoet\\WooCommerce\\Helper'] ?? ($this->services['MailPoet\\WooCommerce\\Helper'] = new \MailPoet\WooCommerce\Helper())), ($this->services['MailPoet\\Subscribers\\SubscribersRepository'] ?? $this->getSubscribersRepositoryService()));
|
2427 |
Â
}
|
2428 |
Â
|
2429 |
Â
/**
|
lang/mailpoet-ar.mo
CHANGED
Binary file
|
lang/mailpoet-bg_BG.mo
CHANGED
Binary file
|
lang/mailpoet-ca.mo
CHANGED
Binary file
|
lang/mailpoet-cs_CZ.mo
CHANGED
Binary file
|
lang/mailpoet-da_DK.mo
CHANGED
Binary file
|
lang/mailpoet-de_DE.mo
CHANGED
Binary file
|
lang/mailpoet-de_DE_formal.mo
CHANGED
Binary file
|
lang/mailpoet-el.mo
CHANGED
Binary file
|
lang/mailpoet-en_GB.mo
CHANGED
Binary file
|
lang/mailpoet-es_ES.mo
CHANGED
Binary file
|
lang/mailpoet-es_MX.mo
CHANGED
Binary file
|
lang/mailpoet-fa_IR.mo
CHANGED
Binary file
|
lang/mailpoet-fr_CA.mo
CHANGED
Binary file
|
lang/mailpoet-fr_FR.mo
CHANGED
Binary file
|
lang/mailpoet-he_IL.mo
CHANGED
Binary file
|
lang/mailpoet-hu_HU.mo
CHANGED
Binary file
|
lang/mailpoet-it_IT.mo
CHANGED
Binary file
|
lang/mailpoet-ja.mo
CHANGED
Binary file
|
lang/mailpoet-nb_NO.mo
CHANGED
Binary file
|
lang/mailpoet-nl_NL.mo
CHANGED
Binary file
|
lang/mailpoet-nl_NL_formal.mo
CHANGED
Binary file
|
lang/mailpoet-pl_PL.mo
CHANGED
Binary file
|
lang/mailpoet-pt_BR.mo
CHANGED
Binary file
|
lang/mailpoet-pt_PT.mo
CHANGED
Binary file
|
lang/mailpoet-ro_RO.mo
CHANGED
Binary file
|
lang/mailpoet-ru_RU.mo
CHANGED
Binary file
|
lang/mailpoet-sq.mo
CHANGED
Binary file
|
lang/mailpoet-sr_RS.mo
CHANGED
Binary file
|
lang/mailpoet-sv_SE.mo
CHANGED
Binary file
|
lang/mailpoet-tr_TR.mo
CHANGED
Binary file
|
lang/mailpoet-zh_CN.mo
CHANGED
Binary file
|
lib-3rd-party/Idiorm/idiorm.php
CHANGED
@@ -13,7 +13,6 @@ use InvalidArgumentException;
|
|
13 |
Â
use IteratorAggregate;
|
14 |
Â
use PDO;
|
15 |
Â
use PDOStatement;
|
16 |
-
use Serializable;
|
17 |
Â
|
18 |
Â
/**
|
19 |
Â
*
|
@@ -2224,22 +2223,23 @@ use Serializable;
|
|
2224 |
Â
// --- ArrayAccess --- //
|
2225 |
Â
// --------------------- //
|
2226 |
Â
|
2227 |
-
public function offsetExists($key) {
|
2228 |
Â
return array_key_exists($key, $this->_data);
|
2229 |
Â
}
|
2230 |
Â
|
Â
|
|
2231 |
Â
public function offsetGet($key) {
|
2232 |
Â
return $this->get($key);
|
2233 |
Â
}
|
2234 |
Â
|
2235 |
-
public function offsetSet($key, $value) {
|
2236 |
Â
if(is_null($key)) {
|
2237 |
Â
throw new InvalidArgumentException('You must specify a key/array index.');
|
2238 |
Â
}
|
2239 |
Â
$this->set($key, $value);
|
2240 |
Â
}
|
2241 |
Â
|
2242 |
-
public function offsetUnset($key) {
|
2243 |
Â
unset($this->_data[$key]);
|
2244 |
Â
unset($this->_dirty_fields[$key]);
|
2245 |
Â
}
|
@@ -2417,7 +2417,7 @@ use Serializable;
|
|
2417 |
Â
* @method null setResults(array $results)
|
2418 |
Â
* @method array getResults()
|
2419 |
Â
*/
|
2420 |
-
class IdiormResultSet implements Countable, IteratorAggregate, ArrayAccess
|
2421 |
Â
/**
|
2422 |
Â
* The current result set as an array
|
2423 |
Â
* @var array
|
@@ -2460,7 +2460,7 @@ use Serializable;
|
|
2460 |
Â
* Get the number of records in the result set
|
2461 |
Â
* @return int
|
2462 |
Â
*/
|
2463 |
-
public function count() {
|
2464 |
Â
return count($this->_results);
|
2465 |
Â
}
|
2466 |
Â
|
@@ -2469,7 +2469,7 @@ use Serializable;
|
|
2469 |
Â
* over the result set.
|
2470 |
Â
* @return \ArrayIterator
|
2471 |
Â
*/
|
2472 |
-
public function getIterator() {
|
2473 |
Â
return new ArrayIterator($this->_results);
|
2474 |
Â
}
|
2475 |
Â
|
@@ -2478,7 +2478,7 @@ use Serializable;
|
|
2478 |
Â
* @param int|string $offset
|
2479 |
Â
* @return bool
|
2480 |
Â
*/
|
2481 |
-
public function offsetExists($offset) {
|
2482 |
Â
return isset($this->_results[$offset]);
|
2483 |
Â
}
|
2484 |
Â
|
@@ -2487,6 +2487,7 @@ use Serializable;
|
|
2487 |
Â
* @param int|string $offset
|
2488 |
Â
* @return mixed
|
2489 |
Â
*/
|
Â
|
|
2490 |
Â
public function offsetGet($offset) {
|
2491 |
Â
return $this->_results[$offset];
|
2492 |
Â
}
|
@@ -2496,7 +2497,7 @@ use Serializable;
|
|
2496 |
Â
* @param int|string $offset
|
2497 |
Â
* @param mixed $value
|
2498 |
Â
*/
|
2499 |
-
public function offsetSet($offset, $value) {
|
2500 |
Â
$this->_results[$offset] = $value;
|
2501 |
Â
}
|
2502 |
Â
|
@@ -2504,7 +2505,7 @@ use Serializable;
|
|
2504 |
Â
* ArrayAccess
|
2505 |
Â
* @param int|string $offset
|
2506 |
Â
*/
|
2507 |
-
public function offsetUnset($offset) {
|
2508 |
Â
unset($this->_results[$offset]);
|
2509 |
Â
}
|
2510 |
Â
|
@@ -2516,6 +2517,10 @@ use Serializable;
|
|
2516 |
Â
return serialize($this->_results);
|
2517 |
Â
}
|
2518 |
Â
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
2519 |
Â
/**
|
2520 |
Â
* Serializable
|
2521 |
Â
* @param string $serialized
|
@@ -2525,6 +2530,10 @@ use Serializable;
|
|
2525 |
Â
return unserialize($serialized);
|
2526 |
Â
}
|
2527 |
Â
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
2528 |
Â
/**
|
2529 |
Â
* Call a method on all models in a result set. This allows for method
|
2530 |
Â
* chaining such as setting a property on all models in a result set or
|
13 |
Â
use IteratorAggregate;
|
14 |
Â
use PDO;
|
15 |
Â
use PDOStatement;
|
Â
|
|
16 |
Â
|
17 |
Â
/**
|
18 |
Â
*
|
2223 |
Â
// --- ArrayAccess --- //
|
2224 |
Â
// --------------------- //
|
2225 |
Â
|
2226 |
+
public function offsetExists($key): bool {
|
2227 |
Â
return array_key_exists($key, $this->_data);
|
2228 |
Â
}
|
2229 |
Â
|
2230 |
+
#[\ReturnTypeWillChange] // Need to use annotation since mixed was added in 8.0
|
2231 |
Â
public function offsetGet($key) {
|
2232 |
Â
return $this->get($key);
|
2233 |
Â
}
|
2234 |
Â
|
2235 |
+
public function offsetSet($key, $value): void {
|
2236 |
Â
if(is_null($key)) {
|
2237 |
Â
throw new InvalidArgumentException('You must specify a key/array index.');
|
2238 |
Â
}
|
2239 |
Â
$this->set($key, $value);
|
2240 |
Â
}
|
2241 |
Â
|
2242 |
+
public function offsetUnset($key): void {
|
2243 |
Â
unset($this->_data[$key]);
|
2244 |
Â
unset($this->_dirty_fields[$key]);
|
2245 |
Â
}
|
2417 |
Â
* @method null setResults(array $results)
|
2418 |
Â
* @method array getResults()
|
2419 |
Â
*/
|
2420 |
+
class IdiormResultSet implements Countable, IteratorAggregate, ArrayAccess {
|
2421 |
Â
/**
|
2422 |
Â
* The current result set as an array
|
2423 |
Â
* @var array
|
2460 |
Â
* Get the number of records in the result set
|
2461 |
Â
* @return int
|
2462 |
Â
*/
|
2463 |
+
public function count(): int {
|
2464 |
Â
return count($this->_results);
|
2465 |
Â
}
|
2466 |
Â
|
2469 |
Â
* over the result set.
|
2470 |
Â
* @return \ArrayIterator
|
2471 |
Â
*/
|
2472 |
+
public function getIterator(): \Traversable {
|
2473 |
Â
return new ArrayIterator($this->_results);
|
2474 |
Â
}
|
2475 |
Â
|
2478 |
Â
* @param int|string $offset
|
2479 |
Â
* @return bool
|
2480 |
Â
*/
|
2481 |
+
public function offsetExists($offset): bool {
|
2482 |
Â
return isset($this->_results[$offset]);
|
2483 |
Â
}
|
2484 |
Â
|
2487 |
Â
* @param int|string $offset
|
2488 |
Â
* @return mixed
|
2489 |
Â
*/
|
2490 |
+
#[\ReturnTypeWillChange] // Can't use mixed return typehint since it was added in 8.0
|
2491 |
Â
public function offsetGet($offset) {
|
2492 |
Â
return $this->_results[$offset];
|
2493 |
Â
}
|
2497 |
Â
* @param int|string $offset
|
2498 |
Â
* @param mixed $value
|
2499 |
Â
*/
|
2500 |
+
public function offsetSet($offset, $value): void {
|
2501 |
Â
$this->_results[$offset] = $value;
|
2502 |
Â
}
|
2503 |
Â
|
2505 |
Â
* ArrayAccess
|
2506 |
Â
* @param int|string $offset
|
2507 |
Â
*/
|
2508 |
+
public function offsetUnset($offset): void {
|
2509 |
Â
unset($this->_results[$offset]);
|
2510 |
Â
}
|
2511 |
Â
|
2517 |
Â
return serialize($this->_results);
|
2518 |
Â
}
|
2519 |
Â
|
2520 |
+
public function __serialize() {
|
2521 |
+
return $this->serialize();
|
2522 |
+
}
|
2523 |
+
|
2524 |
Â
/**
|
2525 |
Â
* Serializable
|
2526 |
Â
* @param string $serialized
|
2530 |
Â
return unserialize($serialized);
|
2531 |
Â
}
|
2532 |
Â
|
2533 |
+
public function __unserialize($serialized) {
|
2534 |
+
return $this->unserialize($serialized);
|
2535 |
+
}
|
2536 |
+
|
2537 |
Â
/**
|
2538 |
Â
* Call a method on all models in a result set. This allows for method
|
2539 |
Â
* chaining such as setting a property on all models in a result set or
|
lib-3rd-party/pquery/IQuery.php
ADDED
@@ -0,0 +1,154 @@
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace MailPoetVendor\pQuery;
|
4 |
+
|
5 |
+
if (!defined('ABSPATH')) exit;
|
6 |
+
|
7 |
+
|
8 |
+
interface IQuery extends \Countable {
|
9 |
+
/// Methods ///
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Adds the specified class(es) to each of the set of matched elements.
|
13 |
+
* @param string $classname The name of the class to add. You can add multiple classes by separating them with spaces.
|
14 |
+
* @return IQuery
|
15 |
+
*/
|
16 |
+
function addClass($classname);
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Insert content, specified by the parameter, after each element in the set of matched elements.
|
20 |
+
* @param string $content The content to add.
|
21 |
+
* @return IQuery
|
22 |
+
*/
|
23 |
+
function after($content);
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Insert content, specified by the parameter, to the end of each element in the set of matched elements.
|
27 |
+
* @param string $content The content to append.
|
28 |
+
* @return IQuery
|
29 |
+
*/
|
30 |
+
function append($content);
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Get the value of an attribute for the first element in the set of matched elements or set one
|
34 |
+
* or more attributes for every matched element.
|
35 |
+
* @param string $name The name of the attribute.
|
36 |
+
* @param null|string $value The value to set or null to get the current attribute value.
|
37 |
+
* @return string|IQuery
|
38 |
+
*/
|
39 |
+
function attr($name, $value = null);
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Insert content, specified by the parameter, before each element in the set of matched elements.
|
43 |
+
* @param string $content The content to add.
|
44 |
+
* @return IQuery
|
45 |
+
*/
|
46 |
+
function before($content);
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Remove all child nodes of the set of matched elements from the DOM.
|
50 |
+
* @return IQuery;
|
51 |
+
*/
|
52 |
+
function clear();
|
53 |
+
|
54 |
+
/**
|
55 |
+
* Get the value of a style property for the first element in the set of matched elements or
|
56 |
+
* set one or more CSS properties for every matched element.
|
57 |
+
*/
|
58 |
+
// function css($name, $value = null);
|
59 |
+
|
60 |
+
/**
|
61 |
+
* Determine whether any of the matched elements are assigned the given class.
|
62 |
+
* @param string $classname The name of the class to check.
|
63 |
+
*/
|
64 |
+
function hasClass($classname);
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Get the HTML contents of the first element in the set of matched elements
|
68 |
+
* or set the HTML contents of every matched element.
|
69 |
+
* @param string|null $value The value to set.
|
70 |
+
*/
|
71 |
+
function html($value = null);
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.
|
75 |
+
* @param string $content The content to add.
|
76 |
+
*/
|
77 |
+
function prepend($content);
|
78 |
+
|
79 |
+
/**
|
80 |
+
* Get the value of a property for the first element in the set of matched elements
|
81 |
+
* or set one or more properties for every matched element.
|
82 |
+
* @param string $name The name of the property.
|
83 |
+
* The currently supported properties are `tagname`, `selected`, and `checked`.
|
84 |
+
* @param null|string $value The value to set or null to get the current property value.
|
85 |
+
*/
|
86 |
+
function prop($name, $value = null);
|
87 |
+
|
88 |
+
/**
|
89 |
+
* Remove the set of matched elements from the DOM.
|
90 |
+
* @param null|string $selector A css query to filter the set of removed nodes.
|
91 |
+
*/
|
92 |
+
function remove($selector = null);
|
93 |
+
|
94 |
+
/**
|
95 |
+
* Remove an attribute from each element in the set of matched elements.
|
96 |
+
* @param string $name The name of the attribute to remove.
|
97 |
+
*/
|
98 |
+
function removeAttr($name);
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Remove a single class, multiple classes, or all classes from each element in the set of matched elements.
|
102 |
+
* @param string $classname The name of the class to remove.
|
103 |
+
*/
|
104 |
+
function removeClass($classname);
|
105 |
+
|
106 |
+
/**
|
107 |
+
* Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.
|
108 |
+
* @param string $content The content that will replace the nodes.
|
109 |
+
*/
|
110 |
+
function replaceWith($content);
|
111 |
+
|
112 |
+
/**
|
113 |
+
* Returns the name of the element.
|
114 |
+
* @param null|string $tagName A new tag name or null to return the current tag name.
|
115 |
+
*/
|
116 |
+
function tagName($value = null);
|
117 |
+
|
118 |
+
/**
|
119 |
+
* Get the combined text contents of each element in the set of matched elements, including their descendants, or set the text contents of the matched elements.
|
120 |
+
* @param null|string $value A string to set the text or null to return the current text.
|
121 |
+
*/
|
122 |
+
function text($value = null);
|
123 |
+
|
124 |
+
/**
|
125 |
+
* Add or remove one or more classes from each element in the set of matched elements,
|
126 |
+
* depending on either the class’s presence or the value of the switch argument.
|
127 |
+
* @param string $classname
|
128 |
+
* @param bool|null
|
129 |
+
*/
|
130 |
+
function toggleClass($classname, $switch = null);
|
131 |
+
|
132 |
+
/**
|
133 |
+
* Remove the parents of the set of matched elements from the DOM, leaving the matched elements in their place.
|
134 |
+
*/
|
135 |
+
function unwrap();
|
136 |
+
|
137 |
+
/**
|
138 |
+
* Get the current value of the first element in the set of matched elements or set the value of every matched element.
|
139 |
+
* @param string|null $value The new value of the element or null to return the current value.
|
140 |
+
*/
|
141 |
+
function val($value = null);
|
142 |
+
|
143 |
+
/**
|
144 |
+
* Wrap an HTML structure around each element in the set of matched elements.
|
145 |
+
* @param string A tag name or html string specifying the structure to wrap around the matched elements.
|
146 |
+
*/
|
147 |
+
function wrap($wrapping_element);
|
148 |
+
|
149 |
+
/**
|
150 |
+
* Wrap an HTML structure around the content of each element in the set of matched elements.
|
151 |
+
* @param string A tag name or html string specifying the structure to wrap around the content of the matched elements.
|
152 |
+
*/
|
153 |
+
function wrapInner($wrapping_element);
|
154 |
+
}
|
lib-3rd-party/pquery/LICENSE
ADDED
@@ -0,0 +1,502 @@
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
1 |
+
GNU LESSER GENERAL PUBLIC LICENSE
|
2 |
+
Version 2.1, February 1999
|
3 |
+
|
4 |
+
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
5 |
+
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
6 |
+
Everyone is permitted to copy and distribute verbatim copies
|
7 |
+
of this license document, but changing it is not allowed.
|
8 |
+
|
9 |
+
[This is the first released version of the Lesser GPL. It also counts
|
10 |
+
as the successor of the GNU Library Public License, version 2, hence
|
11 |
+
the version number 2.1.]
|
12 |
+
|
13 |
+
Preamble
|
14 |
+
|
15 |
+
The licenses for most software are designed to take away your
|
16 |
+
freedom to share and change it. By contrast, the GNU General Public
|
17 |
+
Licenses are intended to guarantee your freedom to share and change
|
18 |
+
free software--to make sure the software is free for all its users.
|
19 |
+
|
20 |
+
This license, the Lesser General Public License, applies to some
|
21 |
+
specially designated software packages--typically libraries--of the
|
22 |
+
Free Software Foundation and other authors who decide to use it. You
|
23 |
+
can use it too, but we suggest you first think carefully about whether
|
24 |
+
this license or the ordinary General Public License is the better
|
25 |
+
strategy to use in any particular case, based on the explanations below.
|
26 |
+
|
27 |
+
When we speak of free software, we are referring to freedom of use,
|
28 |
+
not price. Our General Public Licenses are designed to make sure that
|
29 |
+
you have the freedom to distribute copies of free software (and charge
|
30 |
+
for this service if you wish); that you receive source code or can get
|
31 |
+
it if you want it; that you can change the software and use pieces of
|
32 |
+
it in new free programs; and that you are informed that you can do
|
33 |
+
these things.
|
34 |
+
|
35 |
+
To protect your rights, we need to make restrictions that forbid
|
36 |
+
distributors to deny you these rights or to ask you to surrender these
|
37 |
+
rights. These restrictions translate to certain responsibilities for
|
38 |
+
you if you distribute copies of the library or if you modify it.
|
39 |
+
|
40 |
+
For example, if you distribute copies of the library, whether gratis
|
41 |
+
or for a fee, you must give the recipients all the rights that we gave
|
42 |
+
you. You must make sure that they, too, receive or can get the source
|
43 |
+
code. If you link other code with the library, you must provide
|
44 |
+
complete object files to the recipients, so that they can relink them
|
45 |
+
with the library after making changes to the library and recompiling
|
46 |
+
it. And you must show them these terms so they know their rights.
|
47 |
+
|
48 |
+
We protect your rights with a two-step method: (1) we copyright the
|
49 |
+
library, and (2) we offer you this license, which gives you legal
|
50 |
+
permission to copy, distribute and/or modify the library.
|
51 |
+
|
52 |
+
To protect each distributor, we want to make it very clear that
|
53 |
+
there is no warranty for the free library. Also, if the library is
|
54 |
+
modified by someone else and passed on, the recipients should know
|
55 |
+
that what they have is not the original version, so that the original
|
56 |
+
author's reputation will not be affected by problems that might be
|
57 |
+
introduced by others.
|
58 |
+
|
59 |
+
Finally, software patents pose a constant threat to the existence of
|
60 |
+
any free program. We wish to make sure that a company cannot
|
61 |
+
effectively restrict the users of a free program by obtaining a
|
62 |
+
restrictive license from a patent holder. Therefore, we insist that
|
63 |
+
any patent license obtained for a version of the library must be
|
64 |
+
consistent with the full freedom of use specified in this license.
|
65 |
+
|
66 |
+
Most GNU software, including some libraries, is covered by the
|
67 |
+
ordinary GNU General Public License. This license, the GNU Lesser
|
68 |
+
General Public License, applies to certain designated libraries, and
|
69 |
+
is quite different from the ordinary General Public License. We use
|
70 |
+
this license for certain libraries in order to permit linking those
|
71 |
+
libraries into non-free programs.
|
72 |
+
|
73 |
+
When a program is linked with a library, whether statically or using
|
74 |
+
a shared library, the combination of the two is legally speaking a
|
75 |
+
combined work, a derivative of the original library. The ordinary
|
76 |
+
General Public License therefore permits such linking only if the
|
77 |
+
entire combination fits its criteria of freedom. The Lesser General
|
78 |
+
Public License permits more lax criteria for linking other code with
|
79 |
+
the library.
|
80 |
+
|
81 |
+
We call this license the "Lesser" General Public License because it
|
82 |
+
does Less to protect the user's freedom than the ordinary General
|
83 |
+
Public License. It also provides other free software developers Less
|
84 |
+
of an advantage over competing non-free programs. These disadvantages
|
85 |
+
are the reason we use the ordinary General Public License for many
|
86 |
+
libraries. However, the Lesser license provides advantages in certain
|
87 |
+
special circumstances.
|
88 |
+
|
89 |
+
For example, on rare occasions, there may be a special need to
|
90 |
+
encourage the widest possible use of a certain library, so that it becomes
|
91 |
+
a de-facto standard. To achieve this, non-free programs must be
|
92 |
+
allowed to use the library. A more frequent case is that a free
|
93 |
+
library does the same job as widely used non-free libraries. In this
|
94 |
+
case, there is little to gain by limiting the free library to free
|
95 |
+
software only, so we use the Lesser General Public License.
|
96 |
+
|
97 |
+
In other cases, permission to use a particular library in non-free
|
98 |
+
programs enables a greater number of people to use a large body of
|
99 |
+
free software. For example, permission to use the GNU C Library in
|
100 |
+
non-free programs enables many more people to use the whole GNU
|
101 |
+
operating system, as well as its variant, the GNU/Linux operating
|
102 |
+
system.
|
103 |
+
|
104 |
+
Although the Lesser General Public License is Less protective of the
|
105 |
+
users' freedom, it does ensure that the user of a program that is
|
106 |
+
linked with the Library has the freedom and the wherewithal to run
|
107 |
+
that program using a modified version of the Library.
|
108 |
+
|
109 |
+
The precise terms and conditions for copying, distribution and
|
110 |
+
modification follow. Pay close attention to the difference between a
|
111 |
+
"work based on the library" and a "work that uses the library". The
|
112 |
+
former contains code derived from the library, whereas the latter must
|
113 |
+
be combined with the library in order to run.
|
114 |
+
|
115 |
+
GNU LESSER GENERAL PUBLIC LICENSE
|
116 |
+
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
117 |
+
|
118 |
+
0. This License Agreement applies to any software library or other
|
119 |
+
program which contains a notice placed by the copyright holder or
|
120 |
+
other authorized party saying it may be distributed under the terms of
|
121 |
+
this Lesser General Public License (also called "this License").
|
122 |
+
Each licensee is addressed as "you".
|
123 |
+
|
124 |
+
A "library" means a collection of software functions and/or data
|
125 |
+
prepared so as to be conveniently linked with application programs
|
126 |
+
(which use some of those functions and data) to form executables.
|
127 |
+
|
128 |
+
The "Library", below, refers to any such software library or work
|
129 |
+
which has been distributed under these terms. A "work based on the
|
130 |
+
Library" means either the Library or any derivative work under
|
131 |
+
copyright law: that is to say, a work containing the Library or a
|
132 |
+
portion of it, either verbatim or with modifications and/or translated
|
133 |
+
straightforwardly into another language. (Hereinafter, translation is
|
134 |
+
included without limitation in the term "modification".)
|
135 |
+
|
136 |
+
"Source code" for a work means the preferred form of the work for
|
137 |
+
making modifications to it. For a library, complete source code means
|
138 |
+
all the source code for all modules it contains, plus any associated
|
139 |
+
interface definition files, plus the scripts used to control compilation
|
140 |
+
and installation of the library.
|
141 |
+
|
142 |
+
Activities other than copying, distribution and modification are not
|
143 |
+
covered by this License; they are outside its scope. The act of
|
144 |
+
running a program using the Library is not restricted, and output from
|
145 |
+
such a program is covered only if its contents constitute a work based
|
146 |
+
on the Library (independent of the use of the Library in a tool for
|
147 |
+
writing it). Whether that is true depends on what the Library does
|
148 |
+
and what the program that uses the Library does.
|
149 |
+
|
150 |
+
1. You may copy and distribute verbatim copies of the Library's
|
151 |
+
complete source code as you receive it, in any medium, provided that
|
152 |
+
you conspicuously and appropriately publish on each copy an
|
153 |
+
appropriate copyright notice and disclaimer of warranty; keep intact
|
154 |
+
all the notices that refer to this License and to the absence of any
|
155 |
+
warranty; and distribute a copy of this License along with the
|
156 |
+
Library.
|
157 |
+
|
158 |
+
You may charge a fee for the physical act of transferring a copy,
|
159 |
+
and you may at your option offer warranty protection in exchange for a
|
160 |
+
fee.
|
161 |
+
|
162 |
+
2. You may modify your copy or copies of the Library or any portion
|
163 |
+
of it, thus forming a work based on the Library, and copy and
|
164 |
+
distribute such modifications or work under the terms of Section 1
|
165 |
+
above, provided that you also meet all of these conditions:
|
166 |
+
|
167 |
+
a) The modified work must itself be a software library.
|
168 |
+
|
169 |
+
b) You must cause the files modified to carry prominent notices
|
170 |
+
stating that you changed the files and the date of any change.
|
171 |
+
|
172 |
+
c) You must cause the whole of the work to be licensed at no
|
173 |
+
charge to all third parties under the terms of this License.
|
174 |
+
|
175 |
+
d) If a facility in the modified Library refers to a function or a
|
176 |
+
table of data to be supplied by an application program that uses
|
177 |
+
the facility, other than as an argument passed when the facility
|
178 |
+
is invoked, then you must make a good faith effort to ensure that,
|
179 |
+
in the event an application does not supply such function or
|
180 |
+
table, the facility still operates, and performs whatever part of
|
181 |
+
its purpose remains meaningful.
|
182 |
+
|
183 |
+
(For example, a function in a library to compute square roots has
|
184 |
+
a purpose that is entirely well-defined independent of the
|
185 |
+
application. Therefore, Subsection 2d requires that any
|
186 |
+
application-supplied function or table used by this function must
|
187 |
+
be optional: if the application does not supply it, the square
|
188 |
+
root function must still compute square roots.)
|
189 |
+
|
190 |
+
These requirements apply to the modified work as a whole. If
|
191 |
+
identifiable sections of that work are not derived from the Library,
|
192 |
+
and can be reasonably considered independent and separate works in
|
193 |
+
themselves, then this License, and its terms, do not apply to those
|
194 |
+
sections when you distribute them as separate works. But when you
|
195 |
+
distribute the same sections as part of a whole which is a work based
|
196 |
+
on the Library, the distribution of the whole must be on the terms of
|
197 |
+
this License, whose permissions for other licensees extend to the
|
198 |
+
entire whole, and thus to each and every part regardless of who wrote
|
199 |
+
it.
|
200 |
+
|
201 |
+
Thus, it is not the intent of this section to claim rights or contest
|
202 |
+
your rights to work written entirely by you; rather, the intent is to
|
203 |
+
exercise the right to control the distribution of derivative or
|
204 |
+
collective works based on the Library.
|
205 |
+
|
206 |
+
In addition, mere aggregation of another work not based on the Library
|
207 |
+
with the Library (or with a work based on the Library) on a volume of
|
208 |
+
a storage or distribution medium does not bring the other work under
|
209 |
+
the scope of this License.
|
210 |
+
|
211 |
+
3. You may opt to apply the terms of the ordinary GNU General Public
|
212 |
+
License instead of this License to a given copy of the Library. To do
|
213 |
+
this, you must alter all the notices that refer to this License, so
|
214 |
+
that they refer to the ordinary GNU General Public License, version 2,
|
215 |
+
instead of to this License. (If a newer version than version 2 of the
|
216 |
+
ordinary GNU General Public License has appeared, then you can specify
|
217 |
+
that version instead if you wish.) Do not make any other change in
|
218 |
+
these notices.
|
219 |
+
|
220 |
+
Once this change is made in a given copy, it is irreversible for
|
221 |
+
that copy, so the ordinary GNU General Public License applies to all
|
222 |
+
subsequent copies and derivative works made from that copy.
|
223 |
+
|
224 |
+
This option is useful when you wish to copy part of the code of
|
225 |
+
the Library into a program that is not a library.
|
226 |
+
|
227 |
+
4. You may copy and distribute the Library (or a portion or
|
228 |
+
derivative of it, under Section 2) in object code or executable form
|
229 |
+
under the terms of Sections 1 and 2 above provided that you accompany
|
230 |
+
it with the complete corresponding machine-readable source code, which
|
231 |
+
must be distributed under the terms of Sections 1 and 2 above on a
|
232 |
+
medium customarily used for software interchange.
|
233 |
+
|
234 |
+
If distribution of object code is made by offering access to copy
|
235 |
+
from a designated place, then offering equivalent access to copy the
|
236 |
+
source code from the same place satisfies the requirement to
|
237 |
+
distribute the source code, even though third parties are not
|
238 |
+
compelled to copy the source along with the object code.
|
239 |
+
|
240 |
+
5. A program that contains no derivative of any portion of the
|
241 |
+
Library, but is designed to work with the Library by being compiled or
|
242 |
+
linked with it, is called a "work that uses the Library". Such a
|
243 |
+
work, in isolation, is not a derivative work of the Library, and
|
244 |
+
therefore falls outside the scope of this License.
|
245 |
+
|
246 |
+
However, linking a "work that uses the Library" with the Library
|
247 |
+
creates an executable that is a derivative of the Library (because it
|
248 |
+
contains portions of the Library), rather than a "work that uses the
|
249 |
+
library". The executable is therefore covered by this License.
|
250 |
+
Section 6 states terms for distribution of such executables.
|
251 |
+
|
252 |
+
When a "work that uses the Library" uses material from a header file
|
253 |
+
that is part of the Library, the object code for the work may be a
|
254 |
+
derivative work of the Library even though the source code is not.
|
255 |
+
Whether this is true is especially significant if the work can be
|
256 |
+
linked without the Library, or if the work is itself a library. The
|
257 |
+
threshold for this to be true is not precisely defined by law.
|
258 |
+
|
259 |
+
If such an object file uses only numerical parameters, data
|
260 |
+
structure layouts and accessors, and small macros and small inline
|
261 |
+
functions (ten lines or less in length), then the use of the object
|
262 |
+
file is unrestricted, regardless of whether it is legally a derivative
|
263 |
+
work. (Executables containing this object code plus portions of the
|
264 |
+
Library will still fall under Section 6.)
|
265 |
+
|
266 |
+
Otherwise, if the work is a derivative of the Library, you may
|
267 |
+
distribute the object code for the work under the terms of Section 6.
|
268 |
+
Any executables containing that work also fall under Section 6,
|
269 |
+
whether or not they are linked directly with the Library itself.
|
270 |
+
|
271 |
+
6. As an exception to the Sections above, you may also combine or
|
272 |
+
link a "work that uses the Library" with the Library to produce a
|
273 |
+
work containing portions of the Library, and distribute that work
|
274 |
+
under terms of your choice, provided that the terms permit
|
275 |
+
modification of the work for the customer's own use and reverse
|
276 |
+
engineering for debugging such modifications.
|
277 |
+
|
278 |
+
You must give prominent notice with each copy of the work that the
|
279 |
+
Library is used in it and that the Library and its use are covered by
|
280 |
+
this License. You must supply a copy of this License. If the work
|
281 |
+
during execution displays copyright notices, you must include the
|
282 |
+
copyright notice for the Library among them, as well as a reference
|
283 |
+
directing the user to the copy of this License. Also, you must do one
|
284 |
+
of these things:
|
285 |
+
|
286 |
+
a) Accompany the work with the complete corresponding
|
287 |
+
machine-readable source code for the Library including whatever
|
288 |
+
changes were used in the work (which must be distributed under
|
289 |
+
Sections 1 and 2 above); and, if the work is an executable linked
|
290 |
+
with the Library, with the complete machine-readable "work that
|
291 |
+
uses the Library", as object code and/or source code, so that the
|
292 |
+
user can modify the Library and then relink to produce a modified
|
293 |
+
executable containing the modified Library. (It is understood
|
294 |
+
that the user who changes the contents of definitions files in the
|
295 |
+
Library will not necessarily be able to recompile the application
|
296 |
+
to use the modified definitions.)
|
297 |
+
|
298 |
+
b) Use a suitable shared library mechanism for linking with the
|
299 |
+
Library. A suitable mechanism is one that (1) uses at run time a
|
300 |
+
copy of the library already present on the user's computer system,
|
301 |
+
rather than copying library functions into the executable, and (2)
|
302 |
+
will operate properly with a modified version of the library, if
|
303 |
+
the user installs one, as long as the modified version is
|
304 |
+
interface-compatible with the version that the work was made with.
|
305 |
+
|
306 |
+
c) Accompany the work with a written offer, valid for at
|
307 |
+
least three years, to give the same user the materials
|
308 |
+
specified in Subsection 6a, above, for a charge no more
|
309 |
+
than the cost of performing this distribution.
|
310 |
+
|
311 |
+
d) If distribution of the work is made by offering access to copy
|
312 |
+
from a designated place, offer equivalent access to copy the above
|
313 |
+
specified materials from the same place.
|
314 |
+
|
315 |
+
e) Verify that the user has already received a copy of these
|
316 |
+
materials or that you have already sent this user a copy.
|
317 |
+
|
318 |
+
For an executable, the required form of the "work that uses the
|
319 |
+
Library" must include any data and utility programs needed for
|
320 |
+
reproducing the executable from it. However, as a special exception,
|
321 |
+
the materials to be distributed need not include anything that is
|
322 |
+
normally distributed (in either source or binary form) with the major
|
323 |
+
components (compiler, kernel, and so on) of the operating system on
|
324 |
+
which the executable runs, unless that component itself accompanies
|
325 |
+
the executable.
|
326 |
+
|
327 |
+
It may happen that this requirement contradicts the license
|
328 |
+
restrictions of other proprietary libraries that do not normally
|
329 |
+
accompany the operating system. Such a contradiction means you cannot
|
330 |
+
use both them and the Library together in an executable that you
|
331 |
+
distribute.
|
332 |
+
|
333 |
+
7. You may place library facilities that are a work based on the
|
334 |
+
Library side-by-side in a single library together with other library
|
335 |
+
facilities not covered by this License, and distribute such a combined
|
336 |
+
library, provided that the separate distribution of the work based on
|
337 |
+
the Library and of the other library facilities is otherwise
|
338 |
+
permitted, and provided that you do these two things:
|
339 |
+
|
340 |
+
a) Accompany the combined library with a copy of the same work
|
341 |
+
based on the Library, uncombined with any other library
|
342 |
+
facilities. This must be distributed under the terms of the
|
343 |
+
Sections above.
|
344 |
+
|
345 |
+
b) Give prominent notice with the combined library of the fact
|
346 |
+
that part of it is a work based on the Library, and explaining
|
347 |
+
where to find the accompanying uncombined form of the same work.
|
348 |
+
|
349 |
+
8. You may not copy, modify, sublicense, link with, or distribute
|
350 |
+
the Library except as expressly provided under this License. Any
|
351 |
+
attempt otherwise to copy, modify, sublicense, link with, or
|
352 |
+
distribute the Library is void, and will automatically terminate your
|
353 |
+
rights under this License. However, parties who have received copies,
|
354 |
+
or rights, from you under this License will not have their licenses
|
355 |
+
terminated so long as such parties remain in full compliance.
|
356 |
+
|
357 |
+
9. You are not required to accept this License, since you have not
|
358 |
+
signed it. However, nothing else grants you permission to modify or
|
359 |
+
distribute the Library or its derivative works. These actions are
|
360 |
+
prohibited by law if you do not accept this License. Therefore, by
|
361 |
+
modifying or distributing the Library (or any work based on the
|
362 |
+
Library), you indicate your acceptance of this License to do so, and
|
363 |
+
all its terms and conditions for copying, distributing or modifying
|
364 |
+
the Library or works based on it.
|
365 |
+
|
366 |
+
10. Each time you redistribute the Library (or any work based on the
|
367 |
+
Library), the recipient automatically receives a license from the
|
368 |
+
original licensor to copy, distribute, link with or modify the Library
|
369 |
+
subject to these terms and conditions. You may not impose any further
|
370 |
+
restrictions on the recipients' exercise of the rights granted herein.
|
371 |
+
You are not responsible for enforcing compliance by third parties with
|
372 |
+
this License.
|
373 |
+
|
374 |
+
11. If, as a consequence of a court judgment or allegation of patent
|
375 |
+
infringement or for any other reason (not limited to patent issues),
|
376 |
+
conditions are imposed on you (whether by court order, agreement or
|
377 |
+
otherwise) that contradict the conditions of this License, they do not
|
378 |
+
excuse you from the conditions of this License. If you cannot
|
379 |
+
distribute so as to satisfy simultaneously your obligations under this
|
380 |
+
License and any other pertinent obligations, then as a consequence you
|
381 |
+
may not distribute the Library at all. For example, if a patent
|
382 |
+
license would not permit royalty-free redistribution of the Library by
|
383 |
+
all those who receive copies directly or indirectly through you, then
|
384 |
+
the only way you could satisfy both it and this License would be to
|
385 |
+
refrain entirely from distribution of the Library.
|
386 |
+
|
387 |
+
If any portion of this section is held invalid or unenforceable under any
|
388 |
+
particular circumstance, the balance of the section is intended to apply,
|
389 |
+
and the section as a whole is intended to apply in other circumstances.
|
390 |
+
|
391 |
+
It is not the purpose of this section to induce you to infringe any
|
392 |
+
patents or other property right claims or to contest validity of any
|
393 |
+
such claims; this section has the sole purpose of protecting the
|
394 |
+
integrity of the free software distribution system which is
|
395 |
+
implemented by public license practices. Many people have made
|
396 |
+
generous contributions to the wide range of software distributed
|
397 |
+
through that system in reliance on consistent application of that
|
398 |
+
system; it is up to the author/donor to decide if he or she is willing
|
399 |
+
to distribute software through any other system and a licensee cannot
|
400 |
+
impose that choice.
|
401 |
+
|
402 |
+
This section is intended to make thoroughly clear what is believed to
|
403 |
+
be a consequence of the rest of this License.
|
404 |
+
|
405 |
+
12. If the distribution and/or use of the Library is restricted in
|
406 |
+
certain countries either by patents or by copyrighted interfaces, the
|
407 |
+
original copyright holder who places the Library under this License may add
|
408 |
+
an explicit geographical distribution limitation excluding those countries,
|
409 |
+
so that distribution is permitted only in or among countries not thus
|
410 |
+
excluded. In such case, this License incorporates the limitation as if
|
411 |
+
written in the body of this License.
|
412 |
+
|
413 |
+
13. The Free Software Foundation may publish revised and/or new
|
414 |
+
versions of the Lesser General Public License from time to time.
|
415 |
+
Such new versions will be similar in spirit to the present version,
|
416 |
+
but may differ in detail to address new problems or concerns.
|
417 |
+
|
418 |
+
Each version is given a distinguishing version number. If the Library
|
419 |
+
specifies a version number of this License which applies to it and
|
420 |
+
"any later version", you have the option of following the terms and
|
421 |
+
conditions either of that version or of any later version published by
|
422 |
+
the Free Software Foundation. If the Library does not specify a
|
423 |
+
license version number, you may choose any version ever published by
|
424 |
+
the Free Software Foundation.
|
425 |
+
|
426 |
+
14. If you wish to incorporate parts of the Library into other free
|
427 |
+
programs whose distribution conditions are incompatible with these,
|
428 |
+
write to the author to ask for permission. For software which is
|
429 |
+
copyrighted by the Free Software Foundation, write to the Free
|
430 |
+
Software Foundation; we sometimes make exceptions for this. Our
|
431 |
+
decision will be guided by the two goals of preserving the free status
|
432 |
+
of all derivatives of our free software and of promoting the sharing
|
433 |
+
and reuse of software generally.
|
434 |
+
|
435 |
+
NO WARRANTY
|
436 |
+
|
437 |
+
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
438 |
+
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
439 |
+
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
440 |
+
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
441 |
+
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
442 |
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
443 |
+
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
444 |
+
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
445 |
+
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
446 |
+
|
447 |
+
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
448 |
+
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
449 |
+
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
450 |
+
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
451 |
+
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
452 |
+
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
453 |
+
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
454 |
+
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
455 |
+
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
456 |
+
DAMAGES.
|
457 |
+
|
458 |
+
END OF TERMS AND CONDITIONS
|
459 |
+
|
460 |
+
How to Apply These Terms to Your New Libraries
|
461 |
+
|
462 |
+
If you develop a new library, and you want it to be of the greatest
|
463 |
+
possible use to the public, we recommend making it free software that
|
464 |
+
everyone can redistribute and change. You can do so by permitting
|
465 |
+
redistribution under these terms (or, alternatively, under the terms of the
|
466 |
+
ordinary General Public License).
|
467 |
+
|
468 |
+
To apply these terms, attach the following notices to the library. It is
|
469 |
+
safest to attach them to the start of each source file to most effectively
|
470 |
+
convey the exclusion of warranty; and each file should have at least the
|
471 |
+
"copyright" line and a pointer to where the full notice is found.
|
472 |
+
|
473 |
+
<one line to give the library's name and a brief idea of what it does.>
|
474 |
+
Copyright (C) <year> <name of author>
|
475 |
+
|
476 |
+
This library is free software; you can redistribute it and/or
|
477 |
+
modify it under the terms of the GNU Lesser General Public
|
478 |
+
License as published by the Free Software Foundation; either
|
479 |
+
version 2.1 of the License, or (at your option) any later version.
|
480 |
+
|
481 |
+
This library is distributed in the hope that it will be useful,
|
482 |
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
483 |
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
484 |
+
Lesser General Public License for more details.
|
485 |
+
|
486 |
+
You should have received a copy of the GNU Lesser General Public
|
487 |
+
License along with this library; if not, write to the Free Software
|
488 |
+
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
489 |
+
|
490 |
+
Also add information on how to contact you by electronic and paper mail.
|
491 |
+
|
492 |
+
You should also get your employer (if you work as a programmer) or your
|
493 |
+
school, if any, to sign a "copyright disclaimer" for the library, if
|
494 |
+
necessary. Here is a sample; alter the names:
|
495 |
+
|
496 |
+
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
497 |
+
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
498 |
+
|
499 |
+
<signature of Ty Coon>, 1 April 1990
|
500 |
+
Ty Coon, President of Vice
|
501 |
+
|
502 |
+
That's all there is to it!
|
lib-3rd-party/pquery/gan_formatter.php
ADDED
@@ -0,0 +1,382 @@
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* @author Niels A.D.
|
4 |
+
* @author Todd Burry <todd@vanillaforums.com>
|
5 |
+
* @copyright 2010 Niels A.D., 2014 Todd Burry
|
6 |
+
* @license http://opensource.org/licenses/LGPL-2.1 LGPL-2.1
|
7 |
+
* @package pQuery
|
8 |
+
*/
|
9 |
+
|
10 |
+
namespace MailPoetVendor\pQuery;
|
11 |
+
|
12 |
+
if (!defined('ABSPATH')) exit;
|
13 |
+
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Indents text
|
17 |
+
* @param string $text
|
18 |
+
* @param int $indent
|
19 |
+
* @param string $indent_string
|
20 |
+
* @return string
|
21 |
+
*/
|
22 |
+
function indent_text($text, $indent, $indent_string = ' ') {
|
23 |
+
if ($indent && $indent_string) {
|
24 |
+
return str_replace("\n", "\n".str_repeat($indent_string, $indent), $text);
|
25 |
+
} else {
|
26 |
+
return $text;
|
27 |
+
}
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Class used to format/minify HTML nodes
|
32 |
+
*
|
33 |
+
* Used like:
|
34 |
+
* <code>
|
35 |
+
* <?php
|
36 |
+
* $formatter = new HtmlFormatter();
|
37 |
+
* $formatter->format($root);
|
38 |
+
* ?>
|
39 |
+
* </code>
|
40 |
+
*/
|
41 |
+
class HtmlFormatter {
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Determines which elements start on a new line and which function as block
|
45 |
+
* @var array('element' => array('new_line' => true, 'as_block' => true, 'format_inside' => true))
|
46 |
+
*/
|
47 |
+
var $block_elements = array(
|
48 |
+
'p' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
49 |
+
'h1' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
50 |
+
'h2' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
51 |
+
'h3' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
52 |
+
'h4' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
53 |
+
'h5' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
54 |
+
'h6' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
55 |
+
|
56 |
+
'form' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
57 |
+
'fieldset' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
58 |
+
'legend' => array('new_line' => true, 'as_block' => false, 'format_inside' => true),
|
59 |
+
'dl' => array('new_line' => true, 'as_block' => false, 'format_inside' => true),
|
60 |
+
'dt' => array('new_line' => true, 'as_block' => false, 'format_inside' => true),
|
61 |
+
'dd' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
62 |
+
'ol' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
63 |
+
'ul' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
64 |
+
'li' => array('new_line' => true, 'as_block' => false, 'format_inside' => true),
|
65 |
+
|
66 |
+
'table' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
67 |
+
'tr' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
68 |
+
|
69 |
+
'dir' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
70 |
+
'menu' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
71 |
+
'address' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
72 |
+
'blockquote' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
73 |
+
'center' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
74 |
+
'del' => array('new_line' => true, 'as_block' => false, 'format_inside' => true),
|
75 |
+
//'div' => array('new_line' => false, 'as_block' => true, 'format_inside' => true),
|
76 |
+
'hr' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
77 |
+
'ins' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
78 |
+
'noscript' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
79 |
+
'pre' => array('new_line' => true, 'as_block' => true, 'format_inside' => false),
|
80 |
+
'script' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
81 |
+
'style' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
82 |
+
|
83 |
+
'html' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
84 |
+
'head' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
85 |
+
'body' => array('new_line' => true, 'as_block' => true, 'format_inside' => true),
|
86 |
+
'title' => array('new_line' => true, 'as_block' => false, 'format_inside' => false)
|
87 |
+
);
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Determines which characters are considered whitespace
|
91 |
+
* @var array("\t" => true) True to recognize as new line
|
92 |
+
*/
|
93 |
+
var $whitespace = array(
|
94 |
+
' ' => false,
|
95 |
+
"\t" => false,
|
96 |
+
"\x0B" => false,
|
97 |
+
"\0" => false,
|
98 |
+
"\n" => true,
|
99 |
+
"\r" => true
|
100 |
+
);
|
101 |
+
|
102 |
+
/**
|
103 |
+
* String that is used to generate correct indenting
|
104 |
+
* @var string
|
105 |
+
*/
|
106 |
+
var $indent_string = ' ';
|
107 |
+
|
108 |
+
/**
|
109 |
+
* String that is used to break lines
|
110 |
+
* @var string
|
111 |
+
*/
|
112 |
+
var $linebreak_string = "\n";
|
113 |
+
|
114 |
+
/**
|
115 |
+
* Other formatting options
|
116 |
+
* @var array
|
117 |
+
*/
|
118 |
+
public $options = array(
|
119 |
+
'img_alt' => '',
|
120 |
+
'self_close_str' => null,
|
121 |
+
'attribute_shorttag' => false,
|
122 |
+
'sort_attributes' => false,
|
123 |
+
'attributes_case' => CASE_LOWER,
|
124 |
+
'minify_script' => true
|
125 |
+
);
|
126 |
+
|
127 |
+
/**
|
128 |
+
* Errors found during formatting
|
129 |
+
* @var array
|
130 |
+
*/
|
131 |
+
var $errors = array();
|
132 |
+
|
133 |
+
|
134 |
+
/**
|
135 |
+
* Class constructor
|
136 |
+
* @param array $options {@link $options}
|
137 |
+
*/
|
138 |
+
function __construct($options = array()) {
|
139 |
+
$this->options = array_merge($this->options, $options);
|
140 |
+
|
141 |
+
if (isset($options['indent_str']))
|
142 |
+
$this->indent_string = $options['indent_str'];
|
143 |
+
|
144 |
+
if (isset($options['linebreak_str']))
|
145 |
+
$this->linebreak_string = $options['linebreak_str'];
|
146 |
+
}
|
147 |
+
|
148 |
+
#php4 PHP4 class constructor compatibility
|
149 |
+
#function HtmlFormatter($options = array()) {return $this->__construct($options);}
|
150 |
+
#php4e
|
151 |
+
|
152 |
+
/**
|
153 |
+
* Class magic invoke method, performs {@link format()}
|
154 |
+
* @access private
|
155 |
+
*/
|
156 |
+
function __invoke(&$node) {
|
157 |
+
return $this->format($node);
|
158 |
+
}
|
159 |
+
|
160 |
+
/**
|
161 |
+
* Minifies HTML / removes unneeded whitespace
|
162 |
+
* @param DomNode $root
|
163 |
+
* @param bool $strip_comments
|
164 |
+
* @param bool $recursive
|
165 |
+
*/
|
166 |
+
static function minify_html(&$root, $strip_comments = true, $recursive = true) {
|
167 |
+
if ($strip_comments) {
|
168 |
+
foreach($root->select(':comment', false, $recursive, true) as $c) {
|
169 |
+
$prev = $c->getSibling(-1);
|
170 |
+
$next = $c->getSibling(1);
|
171 |
+
$c->delete();
|
172 |
+
if ($prev && $next && ($prev->isText()) && ($next->isText())) {
|
173 |
+
$prev->text .= $next->text;
|
174 |
+
$next->delete();
|
175 |
+
}
|
176 |
+
}
|
177 |
+
}
|
178 |
+
foreach($root->select('(!pre + !xmp + !style + !script + !"?php" + !"~text~" + !"~comment~"):not-empty > "~text~"', false, $recursive, true) as $c) {
|
179 |
+
$c->text = preg_replace('`\s+`', ' ', $c->text);
|
180 |
+
}
|
181 |
+
}
|
182 |
+
|
183 |
+
/**
|
184 |
+
* Minifies javascript using JSMin+
|
185 |
+
* @param DomNode $root
|
186 |
+
* @param string $indent_string
|
187 |
+
* @param bool $wrap_comment Wrap javascript in HTML comments (<!-- ~text~ //-->)
|
188 |
+
* @param bool $recursive
|
189 |
+
* @return bool|array Array of errors on failure, true on succes
|
190 |
+
*/
|
191 |
+
static function minify_javascript(&$root, $indent_string = ' ', $wrap_comment = true, $recursive = true) {
|
192 |
+
#php4 JSMin+ doesn't support PHP4
|
193 |
+
#return true;
|
194 |
+
#php4e
|
195 |
+
#php5
|
196 |
+
include_once('third_party/jsminplus.php');
|
197 |
+
|
198 |
+
$errors = array();
|
199 |
+
foreach($root->select('script:not-empty > "~text~"', false, $recursive, true) as $c) {
|
200 |
+
try {
|
201 |
+
$text = $c->text;
|
202 |
+
while ($text) {
|
203 |
+
$text = trim($text);
|
204 |
+
//Remove comment/CDATA tags at begin and end
|
205 |
+
if (substr($text, 0, 4) === '<!--') {
|
206 |
+
$text = substr($text, 5);
|
207 |
+
continue;
|
208 |
+
} elseif (strtolower(substr($text, 0, 9)) === '<![cdata[') {
|
209 |
+
$text = substr($text, 10);
|
210 |
+
continue;
|
211 |
+
}
|
212 |
+
|
213 |
+
if (($end = substr($text, -3)) && (($end === '-->') || ($end === ']]>'))) {
|
214 |
+
$text = substr($text, 0, -3);
|
215 |
+
continue;
|
216 |
+
}
|
217 |
+
|
218 |
+
break;
|
219 |
+
}
|
220 |
+
|
221 |
+
if (trim($text)) {
|
222 |
+
$text = JSMinPlus::minify($text);
|
223 |
+
if ($wrap_comment) {
|
224 |
+
$text = "<!--\n".$text."\n//-->";
|
225 |
+
}
|
226 |
+
if ($indent_string && ($wrap_comment || (strpos($text, "\n") !== false))) {
|
227 |
+
$text = indent_text("\n".$text, $c->indent(), $indent_string);
|
228 |
+
}
|
229 |
+
}
|
230 |
+
$c->text = $text;
|
231 |
+
} catch (\Exception $e) {
|
232 |
+
$errors[] = array($e, $c->parent->dumpLocation());
|
233 |
+
}
|
234 |
+
}
|
235 |
+
|
236 |
+
return (($errors) ? $errors : true);
|
237 |
+
#php5e
|
238 |
+
}
|
239 |
+
|
240 |
+
/**
|
241 |
+
* Formats HTML
|
242 |
+
* @param DomNode $root
|
243 |
+
* @param bool $recursive
|
244 |
+
* @access private
|
245 |
+
*/
|
246 |
+
function format_html(&$root, $recursive = null) {
|
247 |
+
if ($recursive === null) {
|
248 |
+
$recursive = true;
|
249 |
+
self::minify_html($root);
|
250 |
+
} elseif (is_int($recursive)) {
|
251 |
+
$recursive = (($recursive > 1) ? $recursive - 1 : false);
|
252 |
+
}
|
253 |
+
|
254 |
+
$root_tag = strtolower($root->tag);
|
255 |
+
$in_block = isset($this->block_elements[$root_tag]) && $this->block_elements[$root_tag]['as_block'];
|
256 |
+
$child_count = count($root->children);
|
257 |
+
|
258 |
+
if (isset($this->options['attributes_case']) && $this->options['attributes_case']) {
|
259 |
+
$root->attributes = array_change_key_case($root->attributes, $this->options['attributes_case']);
|
260 |
+
$root->attributes_ns = null;
|
261 |
+
}
|
262 |
+
|
263 |
+
if (isset($this->options['sort_attributes']) && $this->options['sort_attributes']) {
|
264 |
+
if ($this->options['sort_attributes'] === 'reverse') {
|
265 |
+
krsort($root->attributes);
|
266 |
+
} else {
|
267 |
+
ksort($root->attributes);
|
268 |
+
}
|
269 |
+
}
|
270 |
+
|
271 |
+
if ($root->select(':element', true, false, true)) {
|
272 |
+
$root->setTag(strtolower($root->tag), true);
|
273 |
+
if (($this->options['img_alt'] !== null) && ($root_tag === 'img') && (!isset($root->alt))) {
|
274 |
+
$root->setAttribute('alt', $this->options['img_alt']);
|
275 |
+
}
|
276 |
+
}
|
277 |
+
if ($this->options['self_close_str'] !== null) {
|
278 |
+
$root->self_close_str = $this->options['self_close_str'];
|
279 |
+
}
|
280 |
+
if ($this->options['attribute_shorttag'] !== null) {
|
281 |
+
$root->attribute_shorttag = $this->options['attribute_shorttag'];
|
282 |
+
}
|
283 |
+
|
284 |
+
$prev = null;
|
285 |
+
$n_tag = '';
|
286 |
+
// $prev_tag = '';
|
287 |
+
$as_block = false;
|
288 |
+
$prev_asblock = false;
|
289 |
+
for($i = 0; $i < $child_count; $i++) {
|
290 |
+
$n =& $root->children[$i];
|
291 |
+
$indent = $n->indent();
|
292 |
+
|
293 |
+
if (!$n->isText()) {
|
294 |
+
$n_tag = strtolower($n->tag);
|
295 |
+
$new_line = isset($this->block_elements[$n_tag]) && $this->block_elements[$n_tag]['new_line'];
|
296 |
+
$as_block = isset($this->block_elements[$n_tag]) && $this->block_elements[$n_tag]['as_block'];
|
297 |
+
$format_inside = ((!isset($this->block_elements[$n_tag])) || $this->block_elements[$n_tag]['format_inside']);
|
298 |
+
|
299 |
+
if ($prev && ($prev->isText()) && $prev->text && ($char = $prev->text[strlen($prev->text) - 1]) && isset($this->whitespace[$char])) {
|
300 |
+
if ($this->whitespace[$char]) {
|
301 |
+
$prev->text .= str_repeat($this->indent_string, $indent);
|
302 |
+
} else {
|
303 |
+
$prev->text = substr_replace($prev->text, $this->linebreak_string.str_repeat($this->indent_string, $indent), -1, 1);
|
304 |
+
}
|
305 |
+
} elseif (($new_line || $prev_asblock || ($in_block && ($i === 0)))){
|
306 |
+
if ($prev && ($prev->isText())) {
|
307 |
+
$prev->text .= $this->linebreak_string.str_repeat($this->indent_string, $indent);
|
308 |
+
} else {
|
309 |
+
$root->addText($this->linebreak_string.str_repeat($this->indent_string, $indent), $i);
|
310 |
+
++$child_count;
|
311 |
+
}
|
312 |
+
}
|
313 |
+
|
314 |
+
if ($format_inside && count($n->children)) {
|
315 |
+
//$last = end($n->children);
|
316 |
+
$last = $n->children[count($n->children) - 1];
|
317 |
+
$last_tag = ($last) ? strtolower($last->tag) : '';
|
318 |
+
$last_asblock = ($last_tag && isset($this->block_elements[$last_tag]) && $this->block_elements[$last_tag]['as_block']);
|
319 |
+
|
320 |
+
if (($n->childCount(true) > 0) || (trim($n->getPlainText()))) {
|
321 |
+
if ($last && ($last->isText()) && $last->text && ($char = $last->text[strlen($last->text) - 1]) && isset($this->whitespace[$char])) {
|
322 |
+
if ($as_block || ($last->index() > 0) || isset($this->whitespace[$last->text[0]])) {
|
323 |
+
if ($this->whitespace[$char]) {
|
324 |
+
$last->text .= str_repeat($this->indent_string, $indent);
|
325 |
+
} else {
|
326 |
+
$last->text = substr_replace($last->text, $this->linebreak_string.str_repeat($this->indent_string, $indent), -1, 1);
|
327 |
+
}
|
328 |
+
}
|
329 |
+
} elseif (($as_block || $last_asblock || ($in_block && ($i === 0))) && $last) {
|
330 |
+
if ($last && ($last->isText())) {
|
331 |
+
$last->text .= $this->linebreak_string.str_repeat($this->indent_string, $indent);
|
332 |
+
} else {
|
333 |
+
$n->addText($this->linebreak_string.str_repeat($this->indent_string, $indent));
|
334 |
+
}
|
335 |
+
}
|
336 |
+
} elseif (!trim($n->getInnerText())) {
|
337 |
+
$n->clear();
|
338 |
+
}
|
339 |
+
|
340 |
+
if ($recursive) {
|
341 |
+
$this->format_html($n, $recursive);
|
342 |
+
}
|
343 |
+
}
|
344 |
+
|
345 |
+
} elseif (trim($n->text) && ((($i - 1 < $child_count) && ($char = $n->text[0]) && isset($this->whitespace[$char])) || ($in_block && ($i === 0)))) {
|
346 |
+
if (isset($this->whitespace[$char])) {
|
347 |
+
if ($this->whitespace[$char]) {
|
348 |
+
$n->text = str_repeat($this->indent_string, $indent).$n->text;
|
349 |
+
} else {
|
350 |
+
$n->text = substr_replace($n->text, $this->linebreak_string.str_repeat($this->indent_string, $indent), 0, 1);
|
351 |
+
}
|
352 |
+
} else {
|
353 |
+
$n->text = $this->linebreak_string.str_repeat($this->indent_string, $indent).$n->text;
|
354 |
+
}
|
355 |
+
}
|
356 |
+
|
357 |
+
$prev = $n;
|
358 |
+
// $prev_tag = $n_tag;
|
359 |
+
$prev_asblock = $as_block;
|
360 |
+
}
|
361 |
+
|
362 |
+
return true;
|
363 |
+
}
|
364 |
+
|
365 |
+
/**
|
366 |
+
* Formats HTML/Javascript
|
367 |
+
* @param DomNode $root
|
368 |
+
* @see format_html()
|
369 |
+
*/
|
370 |
+
function format(&$node) {
|
371 |
+
$this->errors = array();
|
372 |
+
if ($this->options['minify_script']) {
|
373 |
+
$a = self::minify_javascript($node, $this->indent_string, true, true);
|
374 |
+
if (is_array($a)) {
|
375 |
+
foreach($a as $error) {
|
376 |
+
$this->errors[] = $error[0]->getMessage().' >>> '.$error[1];
|
377 |
+
}
|
378 |
+
}
|
379 |
+
}
|
380 |
+
return $this->format_html($node);
|
381 |
+
}
|
382 |
+
}
|
lib-3rd-party/pquery/gan_node_html.php
ADDED
@@ -0,0 +1,2856 @@
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* @author Niels A.D.
|
4 |
+
* @author Todd Burry <todd@vanillaforums.com>
|
5 |
+
* @copyright 2010 Niels A.D., 2014 Todd Burry
|
6 |
+
* @license http://opensource.org/licenses/LGPL-2.1 LGPL-2.1
|
7 |
+
* @package pQuery
|
8 |
+
*/
|
9 |
+
|
10 |
+
namespace MailPoetVendor\pQuery;
|
11 |
+
|
12 |
+
if (!defined('ABSPATH')) exit;
|
13 |
+
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Holds (x)html/xml tag information like tag name, attributes,
|
17 |
+
* parent, children, self close, etc.
|
18 |
+
*
|
19 |
+
*/
|
20 |
+
class DomNode implements IQuery {
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Element Node, used for regular elements
|
24 |
+
*/
|
25 |
+
const NODE_ELEMENT = 0;
|
26 |
+
/**
|
27 |
+
* Text Node
|
28 |
+
*/
|
29 |
+
const NODE_TEXT = 1;
|
30 |
+
/**
|
31 |
+
* Comment Node
|
32 |
+
*/
|
33 |
+
const NODE_COMMENT = 2;
|
34 |
+
/**
|
35 |
+
* Conditional Node (<![if]> <![endif])
|
36 |
+
*/
|
37 |
+
const NODE_CONDITIONAL = 3;
|
38 |
+
/**
|
39 |
+
* CDATA Node (<![CDATA[]]>
|
40 |
+
*/
|
41 |
+
const NODE_CDATA = 4;
|
42 |
+
/**
|
43 |
+
* Doctype Node
|
44 |
+
*/
|
45 |
+
const NODE_DOCTYPE = 5;
|
46 |
+
/**
|
47 |
+
* XML Node, used for tags that start with ?, like <?xml and <?php
|
48 |
+
*/
|
49 |
+
const NODE_XML = 6;
|
50 |
+
/**
|
51 |
+
* ASP Node
|
52 |
+
*/
|
53 |
+
const NODE_ASP = 7;
|
54 |
+
|
55 |
+
#php4 Compatibility with PHP4, this gets changed to a regular var in release tool
|
56 |
+
#static $NODE_TYPE = self::NODE_ELEMENT;
|
57 |
+
#php4e
|
58 |
+
#php5
|
59 |
+
/**
|
60 |
+
* Node type of class
|
61 |
+
*/
|
62 |
+
const NODE_TYPE = self::NODE_ELEMENT;
|
63 |
+
#php5e
|
64 |
+
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Name of the selector class
|
68 |
+
* @var string
|
69 |
+
* @see select()
|
70 |
+
*/
|
71 |
+
var $selectClass = 'MailPoetVendor\\pQuery\\HtmlSelector';
|
72 |
+
/**
|
73 |
+
* Name of the parser class
|
74 |
+
* @var string
|
75 |
+
* @see setOuterText()
|
76 |
+
* @see setInnerText()
|
77 |
+
*/
|
78 |
+
var $parserClass = 'MailPoetVendor\\pQuery\\Html5Parser';
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Name of the class used for {@link addChild()}
|
82 |
+
* @var string
|
83 |
+
*/
|
84 |
+
var $childClass = __CLASS__;
|
85 |
+
/**
|
86 |
+
* Name of the class used for {@link addText()}
|
87 |
+
* @var string
|
88 |
+
*/
|
89 |
+
var $childClass_Text = 'MailPoetVendor\\pQuery\\TextNode';
|
90 |
+
/**
|
91 |
+
* Name of the class used for {@link addComment()}
|
92 |
+
* @var string
|
93 |
+
*/
|
94 |
+
var $childClass_Comment = 'MailPoetVendor\\pQuery\\CommentNode';
|
95 |
+
/**
|
96 |
+
* Name of the class used for {@link addContional()}
|
97 |
+
* @var string
|
98 |
+
*/
|
99 |
+
var $childClass_Conditional = 'MailPoetVendor\\pQuery\\ConditionalTagNode';
|
100 |
+
/**
|
101 |
+
* Name of the class used for {@link addCDATA()}
|
102 |
+
* @var string
|
103 |
+
*/
|
104 |
+
var $childClass_CDATA = 'MailPoetVendor\\pQuery\\CdataNode';
|
105 |
+
/**
|
106 |
+
* Name of the class used for {@link addDoctype()}
|
107 |
+
* @var string
|
108 |
+
*/
|
109 |
+
var $childClass_Doctype = 'MailPoetVendor\\pQuery\\DoctypeNode';
|
110 |
+
/**
|
111 |
+
* Name of the class used for {@link addXML()}
|
112 |
+
* @var string
|
113 |
+
*/
|
114 |
+
var $childClass_XML = 'MailPoetVendor\\pQuery\\XmlNode';
|
115 |
+
/**
|
116 |
+
* Name of the class used for {@link addASP()}
|
117 |
+
* @var string
|
118 |
+
*/
|
119 |
+
var $childClass_ASP = 'MailPoetVendor\\pQuery\\AspEmbeddedNode';
|
120 |
+
|
121 |
+
/**
|
122 |
+
* Parent node, null if none
|
123 |
+
* @var DomNode
|
124 |
+
* @see changeParent()
|
125 |
+
*/
|
126 |
+
var $parent = null;
|
127 |
+
|
128 |
+
/**
|
129 |
+
* Attributes of node
|
130 |
+
* @var array
|
131 |
+
* @internal array('attribute' => 'value')
|
132 |
+
* @internal Public for faster access!
|
133 |
+
* @see getAttribute()
|
134 |
+
* @see setAttribute()
|
135 |
+
* @access private
|
136 |
+
*/
|
137 |
+
var $attributes = array();
|
138 |
+
|
139 |
+
/**
|
140 |
+
* Namespace info for attributes
|
141 |
+
* @var array
|
142 |
+
* @internal array('tag' => array(array('ns', 'tag', 'ns:tag', index)))
|
143 |
+
* @internal Public for easy outside modifications!
|
144 |
+
* @see findAttribute()
|
145 |
+
* @access private
|
146 |
+
*/
|
147 |
+
var $attributes_ns = null;
|
148 |
+
|
149 |
+
/**
|
150 |
+
* Array of child nodes
|
151 |
+
* @var array
|
152 |
+
* @internal Public for faster access!
|
153 |
+
* @see childCount()
|
154 |
+
* @see getChild()
|
155 |
+
* @see addChild()
|
156 |
+
* @see deleteChild()
|
157 |
+
* @access private
|
158 |
+
*/
|
159 |
+
var $children = array();
|
160 |
+
|
161 |
+
/**
|
162 |
+
* Full tag name (including namespace)
|
163 |
+
* @var string
|
164 |
+
* @see getTagName()
|
165 |
+
* @see getNamespace()
|
166 |
+
*/
|
167 |
+
var $tag = '';
|
168 |
+
|
169 |
+
/**
|
170 |
+
* Namespace info for tag
|
171 |
+
* @var array
|
172 |
+
* @internal array('namespace', 'tag')
|
173 |
+
* @internal Public for easy outside modifications!
|
174 |
+
* @access private
|
175 |
+
*/
|
176 |
+
var $tag_ns = null;
|
177 |
+
|
178 |
+
/**
|
179 |
+
* Is node a self closing node? No closing tag if true.
|
180 |
+
* @var bool
|
181 |
+
*/
|
182 |
+
var $self_close = false;
|
183 |
+
|
184 |
+
/**
|
185 |
+
* If self close, then this will be used to close the tag
|
186 |
+
* @var string
|
187 |
+
* @see $self_close
|
188 |
+
*/
|
189 |
+
var $self_close_str = ' /';
|
190 |
+
|
191 |
+
/**
|
192 |
+
* Use short tags for attributes? If true, then attributes
|
193 |
+
* with values equal to the attribute name will not output
|
194 |
+
* the value, e.g. selected="selected" will be selected.
|
195 |
+
* @var bool
|
196 |
+
*/
|
197 |
+
var $attribute_shorttag = true;
|
198 |
+
|
199 |
+
/**
|
200 |
+
* Function map used for the selector filter
|
201 |
+
* @var array
|
202 |
+
* @internal array('root' => 'filter_root') will cause the
|
203 |
+
* selector to call $this->filter_root at :root
|
204 |
+
* @access private
|
205 |
+
*/
|
206 |
+
var $filter_map = array(
|
207 |
+
'root' => 'filter_root',
|
208 |
+
'nth-child' => 'filter_nchild',
|
209 |
+
'eq' => 'filter_nchild', //jquery (naming) compatibility
|
210 |
+
'gt' => 'filter_gt',
|
211 |
+
'lt' => 'filter_lt',
|
212 |
+
'nth-last-child' => 'filter_nlastchild',
|
213 |
+
'nth-of-type' => 'filter_ntype',
|
214 |
+
'nth-last-of-type' => 'filter_nlastype',
|
215 |
+
'odd' => 'filter_odd',
|
216 |
+
'even' => 'filter_even',
|
217 |
+
'every' => 'filter_every',
|
218 |
+
'first-child' => 'filter_first',
|
219 |
+
'last-child' => 'filter_last',
|
220 |
+
'first-of-type' => 'filter_firsttype',
|
221 |
+
'last-of-type' => 'filter_lasttype',
|
222 |
+
'only-child' => 'filter_onlychild',
|
223 |
+
'only-of-type' => 'filter_onlytype',
|
224 |
+
'empty' => 'filter_empty',
|
225 |
+
'not-empty' => 'filter_notempty',
|
226 |
+
'has-text' => 'filter_hastext',
|
227 |
+
'no-text' => 'filter_notext',
|
228 |
+
'lang' => 'filter_lang',
|
229 |
+
'contains' => 'filter_contains',
|
230 |
+
'has' => 'filter_has',
|
231 |
+
'not' => 'filter_not',
|
232 |
+
'element' => 'filter_element',
|
233 |
+
'text' => 'filter_text',
|
234 |
+
'comment' => 'filter_comment',
|
235 |
+
'checked' => 'filter_checked',
|
236 |
+
'selected' => 'filter_selected',
|
237 |
+
);
|
238 |
+
|
239 |
+
/**
|
240 |
+
* Class constructor
|
241 |
+
* @param string|array $tag Name of the tag, or array with taginfo (array(
|
242 |
+
* 'tag_name' => 'tag',
|
243 |
+
* 'self_close' => false,
|
244 |
+
* 'attributes' => array('attribute' => 'value')))
|
245 |
+
* @param DomNode $parent Parent of node, null if none
|
246 |
+
*/
|
247 |
+
function __construct($tag, $parent) {
|
248 |
+
$this->parent = $parent;
|
249 |
+
|
250 |
+
if (is_string($tag)) {
|
251 |
+
$this->tag = $tag;
|
252 |
+
} else {
|
253 |
+
$this->tag = $tag['tag_name'];
|
254 |
+
$this->self_close = $tag['self_close'];
|
255 |
+
$this->attributes = $tag['attributes'];
|
256 |
+
}
|
257 |
+
}
|
258 |
+
|
259 |
+
#php4 PHP4 class constructor compatibility
|
260 |
+
#function DomNode($tag, $parent) {return $this->__construct($tag, $parent);}
|
261 |
+
#php4e
|
262 |
+
|
263 |
+
/**
|
264 |
+
* Class destructor
|
265 |
+
* @access private
|
266 |
+
*/
|
267 |
+
function __destruct() {
|
268 |
+
$this->delete();
|
269 |
+
}
|
270 |
+
|
271 |
+
/**
|
272 |
+
* Class toString, outputs {@link $tag}
|
273 |
+
* @return string
|
274 |
+
* @access private
|
275 |
+
*/
|
276 |
+
function __toString() {
|
277 |
+
return (($this->tag === '~root~') ? $this->toString(true, true, 1) : $this->tag);
|
278 |
+
}
|
279 |
+
|
280 |
+
/**
|
281 |
+
* Class magic get method, outputs {@link getAttribute()}
|
282 |
+
* @return string
|
283 |
+
* @access private
|
284 |
+
*/
|
285 |
+
function __get($attribute) {
|
286 |
+
return $this->getAttribute($attribute);
|
287 |
+
}
|
288 |
+
|
289 |
+
/**
|
290 |
+
* Class magic set method, performs {@link setAttribute()}
|
291 |
+
* @access private
|
292 |
+
*/
|
293 |
+
function __set($attribute, $value) {
|
294 |
+
$this->setAttribute($attribute, $value);
|
295 |
+
}
|
296 |
+
|
297 |
+
/**
|
298 |
+
* Class magic isset method, returns {@link hasAttribute()}
|
299 |
+
* @return bool
|
300 |
+
* @access private
|
301 |
+
*/
|
302 |
+
function __isset($attribute) {
|
303 |
+
return $this->hasAttribute($attribute);
|
304 |
+
}
|
305 |
+
|
306 |
+
/**
|
307 |
+
* Class magic unset method, performs {@link deleteAttribute()}
|
308 |
+
* @access private
|
309 |
+
*/
|
310 |
+
function __unset($attribute) {
|
311 |
+
return $this->deleteAttribute($attribute);
|
312 |
+
}
|
313 |
+
|
314 |
+
/**
|
315 |
+
* Class magic invoke method, performs {@link query()}.
|
316 |
+
* @param string $query The css query to run on the nodes.
|
317 |
+
* @return pQuery
|
318 |
+
*/
|
319 |
+
function __invoke($query = '*') {
|
320 |
+
return $this->query($query);
|
321 |
+
}
|
322 |
+
|
323 |
+
/**
|
324 |
+
* Returns place in document
|
325 |
+
* @return string
|
326 |
+
*/
|
327 |
+
function dumpLocation() {
|
328 |
+
return (($this->parent) ? (($p = $this->parent->dumpLocation()) ? $p.' > ' : '').$this->tag.'('.$this->typeIndex().')' : '');
|
329 |
+
}
|
330 |
+
|
331 |
+
/**
|
332 |
+
* Returns all the attributes and their values
|
333 |
+
* @return string
|
334 |
+
* @access private
|
335 |
+
*/
|
336 |
+
protected function toString_attributes() {
|
337 |
+
$s = '';
|
338 |
+
foreach($this->attributes as $a => $v) {
|
339 |
+
$s .= ' '.$a;
|
340 |
+
if ((!$this->attribute_shorttag) || ($v !== $a)) {
|
341 |
+
$quote = (strpos($v, '"') === false) ? '"' : "'";
|
342 |
+
$s .= '='.$quote.$v.$quote;
|
343 |
+
}
|
344 |
+
}
|
345 |
+
return $s;
|
346 |
+
}
|
347 |
+
|
348 |
+
/**
|
349 |
+
* Returns the content of the node (child tags and text)
|
350 |
+
* @param bool $attributes Print attributes of child tags
|
351 |
+
* @param bool|int $recursive How many sublevels of childtags to print. True for all.
|
352 |
+
* @param bool $content_only Only print text, false will print tags too.
|
353 |
+
* @return string
|
354 |
+
* @access private
|
355 |
+
*/
|
356 |
+
protected function toString_content($attributes = true, $recursive = true, $content_only = false) {
|
357 |
+
$s = '';
|
358 |
+
foreach($this->children as $c) {
|
359 |
+
$s .= $c->toString($attributes, $recursive, $content_only);
|
360 |
+
}
|
361 |
+
return $s;
|
362 |
+
}
|
363 |
+
|
364 |
+
/**
|
365 |
+
* Returns the node as string
|
366 |
+
* @param bool $attributes Print attributes (of child tags)
|
367 |
+
* @param bool|int $recursive How many sub-levels of child tags to print. True for all.
|
368 |
+
* @param bool|int $content_only Only print text, false will print tags too.
|
369 |
+
* @return string
|
370 |
+
*/
|
371 |
+
function toString($attributes = true, $recursive = true, $content_only = false) {
|
372 |
+
if ($content_only) {
|
373 |
+
if (is_int($content_only)) {
|
374 |
+
--$content_only;
|
375 |
+
}
|
376 |
+
return $this->toString_content($attributes, $recursive, $content_only);
|
377 |
+
}
|
378 |
+
|
379 |
+
$s = '<'.$this->tag;
|
380 |
+
if ($attributes) {
|
381 |
+
$s .= $this->toString_attributes();
|
382 |
+
}
|
383 |
+
if ($this->self_close) {
|
384 |
+
$s .= $this->self_close_str.'>';
|
385 |
+
} else {
|
386 |
+
$s .= '>';
|
387 |
+
if($recursive) {
|
388 |
+
$s .= $this->toString_content($attributes);
|
389 |
+
}
|
390 |
+
$s .= '</'.$this->tag.'>';
|
391 |
+
}
|
392 |
+
return $s;
|
393 |
+
}
|
394 |
+
|
395 |
+
/**
|
396 |
+
* Similar to JavaScript outerText, will return full (html formatted) node
|
397 |
+
* @return string
|
398 |
+
*/
|
399 |
+
function getOuterText() {
|
400 |
+
return html_entity_decode($this->toString(), ENT_QUOTES);
|
401 |
+
}
|
402 |
+
|
403 |
+
/**
|
404 |
+
* Similar to JavaScript outerText, will replace node (and child nodes) with new text
|
405 |
+
* @param string $text
|
406 |
+
* @param HtmlParserBase $parser Null to auto create instance
|
407 |
+
* @return bool|array True on succeed, array with errors on failure
|
408 |
+
*/
|
409 |
+
function setOuterText($text, $parser = null) {
|
410 |
+
if (trim($text)) {
|
411 |
+
$index = $this->index();
|
412 |
+
if ($parser === null) {
|
413 |
+
$parser = new $this->parserClass();
|
414 |
+
}
|
415 |
+
$parser->setDoc($text);
|
416 |
+
$parser->parse_all();
|
417 |
+
$parser->root->moveChildren($this->parent, $index);
|
418 |
+
}
|
419 |
+
$this->delete();
|
420 |
+
return (($parser && $parser->errors) ? $parser->errors : true);
|
421 |
+
}
|
422 |
+
|
423 |
+
/**
|
424 |
+
* Return html code of node
|
425 |
+
* @internal jquery (naming) compatibility
|
426 |
+
* @param string|null $value The value to set or null to get the value.
|
427 |
+
* @see toString()
|
428 |
+
* @return string
|
429 |
+
*/
|
430 |
+
function html($value = null) {
|
431 |
+
if ($value !== null) {
|
432 |
+
$this->setInnerText($value);
|
433 |
+
}
|
434 |
+
return $this->getInnerText();
|
435 |
+
}
|
436 |
+
|
437 |
+
/**
|
438 |
+
* Similar to JavaScript innerText, will return (html formatted) content
|
439 |
+
* @return string
|
440 |
+
*/
|
441 |
+
function getInnerText() {
|
442 |
+
return html_entity_decode($this->toString(true, true, 1), ENT_QUOTES);
|
443 |
+
}
|
444 |
+
|
445 |
+
/**
|
446 |
+
* Similar to JavaScript innerText, will replace child nodes with new text
|
447 |
+
* @param string $text
|
448 |
+
* @param HtmlParserBase $parser Null to auto create instance
|
449 |
+
* @return bool|array True on succeed, array with errors on failure
|
450 |
+
*/
|
451 |
+
function setInnerText($text, $parser = null) {
|
452 |
+
$this->clear();
|
453 |
+
if (trim($text)) {
|
454 |
+
if ($parser === null) {
|
455 |
+
$parser = new $this->parserClass();
|
456 |
+
}
|
457 |
+
$parser->root =& $this;
|
458 |
+
$parser->setDoc($text);
|
459 |
+
$parser->parse_all();
|
460 |
+
}
|
461 |
+
return (($parser && $parser->errors) ? $parser->errors : true);
|
462 |
+
}
|
463 |
+
|
464 |
+
/**
|
465 |
+
* Similar to JavaScript plainText, will return text in node (and subnodes)
|
466 |
+
* @return string
|
467 |
+
*/
|
468 |
+
function getPlainText() {
|
469 |
+
return preg_replace('`\s+`', ' ', html_entity_decode($this->toString(true, true, true), ENT_QUOTES));
|
470 |
+
}
|
471 |
+
|
472 |
+
/**
|
473 |
+
* Return plaintext taking document encoding into account
|
474 |
+
* @return string
|
475 |
+
*/
|
476 |
+
function getPlainTextUTF8() {
|
477 |
+
$txt = $this->toString(true, true, true);
|
478 |
+
$enc = $this->getEncoding();
|
479 |
+
if ($enc !== false) {
|
480 |
+
$txt = mb_convert_encoding($txt, 'UTF-8', $enc);
|
481 |
+
}
|
482 |
+
return preg_replace('`\s+`', ' ', html_entity_decode($txt, ENT_QUOTES, 'UTF-8'));
|
483 |
+
}
|
484 |
+
|
485 |
+
/**
|
486 |
+
* Similar to JavaScript plainText, will replace child nodes with new text (literal)
|
487 |
+
* @param string $text
|
488 |
+
*/
|
489 |
+
function setPlainText($text) {
|
490 |
+
$this->clear();
|
491 |
+
if (trim($text)) {
|
492 |
+
$this->addText(htmlentities($text, ENT_QUOTES));
|
493 |
+
}
|
494 |
+
}
|
495 |
+
|
496 |
+
/**
|
497 |
+
* Delete node from parent and clear node
|
498 |
+
*/
|
499 |
+
function delete() {
|
500 |
+
if (($p = $this->parent) !== null) {
|
501 |
+
$this->parent = null;
|
502 |
+
$p->deleteChild($this);
|
503 |
+
} else {
|
504 |
+
$this->clear();
|
505 |
+
}
|
506 |
+
}
|
507 |
+
|
508 |
+
/**
|
509 |
+
* Detach node from parent
|
510 |
+
* @param bool $move_children_up Only detach current node and replace it with child nodes
|
511 |
+
* @internal jquery (naming) compatibility
|
512 |
+
* @see delete()
|
513 |
+
*/
|
514 |
+
function detach($move_children_up = false) {
|
515 |
+
if (($p = $this->parent) !== null) {
|
516 |
+
$index = $this->index();
|
517 |
+
$this->parent = null;
|
518 |
+
|
519 |
+
if ($move_children_up) {
|
520 |
+
$this->moveChildren($p, $index);
|
521 |
+
}
|
522 |
+
$p->deleteChild($this, true);
|
523 |
+
}
|
524 |
+
}
|
525 |
+
|
526 |
+
/**
|
527 |
+
* Deletes all child nodes from node
|
528 |
+
*/
|
529 |
+
function clear() {
|
530 |
+
foreach($this->children as $c) {
|
531 |
+
$c->parent = null;
|
532 |
+
$c->delete();
|
533 |
+
}
|
534 |
+
$this->children = array();
|
535 |
+
}
|
536 |
+
|
537 |
+
/**
|
538 |
+
* Get top parent
|
539 |
+
* @return DomNode Root, null if node has no parent
|
540 |
+
*/
|
541 |
+
function getRoot() {
|
542 |
+
$r = $this->parent;
|
543 |
+
$n = ($r === null) ? null : $r->parent;
|
544 |
+
while ($n !== null) {
|
545 |
+
$r = $n;
|
546 |
+
$n = $r->parent;
|
547 |
+
}
|
548 |
+
|
549 |
+
return $r;
|
550 |
+
}
|
551 |
+
|
552 |
+
/**
|
553 |
+
* Change parent
|
554 |
+
* @param null|DomNode $to New parent, null if none
|
555 |
+
* @param false|int $index Add child to parent if not present at index, false to not add, negative to count from end, null to append
|
556 |
+
*/
|
557 |
+
#php4
|
558 |
+
#function changeParent($to, &$index) {
|
559 |
+
#php4e
|
560 |
+
#php5
|
561 |
+
function changeParent($to, &$index = null) {
|
562 |
+
#php5e
|
563 |
+
if ($this->parent !== null) {
|
564 |
+
$this->parent->deleteChild($this, true);
|
565 |
+
}
|
566 |
+
$this->parent = $to;
|
567 |
+
if ($index !== false) {
|
568 |
+
$new_index = $this->index();
|
569 |
+
if (!(is_int($new_index) && ($new_index >= 0))) {
|
570 |
+
$this->parent->addChild($this, $index);
|
571 |
+
}
|
572 |
+
}
|
573 |
+
}
|
574 |
+
|
575 |
+
/**
|
576 |
+
* Find out if node has (a certain) parent
|
577 |
+
* @param DomNode|string $tag Match against parent, string to match tag, object to fully match node, null to return if node has parent
|
578 |
+
* @param bool $recursive
|
579 |
+
* @return bool
|
580 |
+
*/
|
581 |
+
function hasParent($tag = null, $recursive = false) {
|
582 |
+
if ($this->parent !== null) {
|
583 |
+
if ($tag === null) {
|
584 |
+
return true;
|
585 |
+
} elseif (is_string($tag)) {
|
586 |
+
return (($this->parent->tag === $tag) || ($recursive && $this->parent->hasParent($tag)));
|
587 |
+
} elseif (is_object($tag)) {
|
588 |
+
return (($this->parent === $tag) || ($recursive && $this->parent->hasParent($tag)));
|
589 |
+
}
|
590 |
+
}
|
591 |
+
|
592 |
+
return false;
|
593 |
+
}
|
594 |
+
|
595 |
+
/**
|
596 |
+
* Find out if node is parent of a certain tag
|
597 |
+
* @param DomNode|string $tag Match against parent, string to match tag, object to fully match node
|
598 |
+
* @param bool $recursive
|
599 |
+
* @return bool
|
600 |
+
* @see hasParent()
|
601 |
+
*/
|
602 |
+
function isParent($tag, $recursive = false) {
|
603 |
+
return ($this->hasParent($tag, $recursive) === ($tag !== null));
|
604 |
+
}
|
605 |
+
|
606 |
+
/**
|
607 |
+
* Find out if node is text
|
608 |
+
* @return bool
|
609 |
+
*/
|
610 |
+
function isText() {
|
611 |
+
return false;
|
612 |
+
}
|
613 |
+
|
614 |
+
/**
|
615 |
+
* Find out if node is comment
|
616 |
+
* @return bool
|
617 |
+
*/
|
618 |
+
function isComment() {
|
619 |
+
return false;
|
620 |
+
}
|
621 |
+
|
622 |
+
/**
|
623 |
+
* Find out if node is text or comment node
|
624 |
+
* @return bool
|
625 |
+
*/
|
626 |
+
function isTextOrComment() {
|
627 |
+
return false;
|
628 |
+
}
|
629 |
+
|
630 |
+
/**
|
631 |
+
* Move node to other node
|
632 |
+
* @param DomNode $to New parent, null if none
|
633 |
+
* @param int $new_index Add child to parent at index if not present, null to not add, negative to count from end
|
634 |
+
* @internal Performs {@link changeParent()}
|
635 |
+
*/
|
636 |
+
#php4
|
637 |
+
#function move($to, &$new_index) {
|
638 |
+
#php4e
|
639 |
+
#php5
|
640 |
+
function move($to, &$new_index = -1) {
|
641 |
+
#php5e
|
642 |
+
$this->changeParent($to, $new_index);
|
643 |
+
}
|
644 |
+
|
645 |
+
/**
|
646 |
+
* Move child nodes to other node
|
647 |
+
* @param DomNode $to New parent, null if none
|
648 |
+
* @param int $new_index Add child to new node at index if not present, null to not add, negative to count from end
|
649 |
+
* @param int $start Index from child node where to start wrapping, 0 for first element
|
650 |
+
* @param int $end Index from child node where to end wrapping, -1 for last element
|
651 |
+
*/
|
652 |
+
#php4
|
653 |
+
#function moveChildren($to, &$new_index, $start = 0, $end = -1) {
|
654 |
+
#php4e
|
655 |
+
#php5
|
656 |
+
function moveChildren($to, &$new_index = -1, $start = 0, $end = -1) {
|
657 |
+
#php5e
|
658 |
+
if ($end < 0) {
|
659 |
+
$end += count($this->children);
|
660 |
+
}
|
661 |
+
for ($i = $start; $i <= $end; $i++) {
|
662 |
+
$this->children[$start]->changeParent($to, $new_index);
|
663 |
+
}
|
664 |
+
}
|
665 |
+
|
666 |
+
/**
|
667 |
+
* Index of node in parent
|
668 |
+
* @param bool $count_all True to count all tags, false to ignore text and comments
|
669 |
+
* @return int -1 if not found
|
670 |
+
*/
|
671 |
+
function index($count_all = true) {
|
672 |
+
if (!$this->parent) {
|
673 |
+
return -1;
|
674 |
+
} elseif ($count_all) {
|
675 |
+
return $this->parent->findChild($this);
|
676 |
+
} else{
|
677 |
+
$index = -1;
|
678 |
+
//foreach($this->parent->children as &$c) {
|
679 |
+
// if (!$c->isTextOrComment()) {
|
680 |
+
// ++$index;
|
681 |
+
// }
|
682 |
+
// if ($c === $this) {
|
683 |
+
// return $index;
|
684 |
+
// }
|
685 |
+
//}
|
686 |
+
|
687 |
+
foreach(array_keys($this->parent->children) as $k) {
|
688 |
+
if (!$this->parent->children[$k]->isTextOrComment()) {
|
689 |
+
++$index;
|
690 |
+
}
|
691 |
+
if ($this->parent->children[$k] === $this) {
|
692 |
+
return $index;
|
693 |
+
}
|
694 |
+
}
|
695 |
+
return -1;
|
696 |
+
}
|
697 |
+
}
|
698 |
+
|
699 |
+
/**
|
700 |
+
* Change index of node in parent
|
701 |
+
* @param int $index New index
|
702 |
+
*/
|
703 |
+
function setIndex($index) {
|
704 |
+
if ($this->parent) {
|
705 |
+
if ($index > $this->index()) {
|
706 |
+
--$index;
|
707 |
+
}
|
708 |
+
$this->delete();
|
709 |
+
$this->parent->addChild($this, $index);
|
710 |
+
}
|
711 |
+
}
|
712 |
+
|
713 |
+
/**
|
714 |
+
* Index of all similar nodes in parent
|
715 |
+
* @return int -1 if not found
|
716 |
+
*/
|
717 |
+
function typeIndex() {
|
718 |
+
if (!$this->parent) {
|
719 |
+
return -1;
|
720 |
+
} else {
|
721 |
+
$index = -1;
|
722 |
+
//foreach($this->parent->children as &$c) {
|
723 |
+
// if (strcasecmp($this->tag, $c->tag) === 0) {
|
724 |
+
// ++$index;
|
725 |
+
// }
|
726 |
+
// if ($c === $this) {
|
727 |
+
// return $index;
|
728 |
+
// }
|
729 |
+
//}
|
730 |
+
|
731 |
+
foreach(array_keys($this->parent->children) as $k) {
|
732 |
+
if (strcasecmp($this->tag, $this->parent->children[$k]->tag) === 0) {
|
733 |
+
++$index;
|
734 |
+
}
|
735 |
+
if ($this->parent->children[$k] === $this) {
|
736 |
+
return $index;
|
737 |
+
}
|
738 |
+
}
|
739 |
+
return -1;
|
740 |
+
}
|
741 |
+
}
|
742 |
+
|
743 |
+
/**
|
744 |
+
* Calculate indent of node (number of parent tags - 1)
|
745 |
+
* @return int
|
746 |
+
*/
|
747 |
+
function indent() {
|
748 |
+
return (($this->parent) ? $this->parent->indent() + 1 : -1);
|
749 |
+
}
|
750 |
+
|
751 |
+
/**
|
752 |
+
* Get sibling node
|
753 |
+
* @param int $offset Offset from current node
|
754 |
+
* @return DomNode Null if not found
|
755 |
+
*/
|
756 |
+
function getSibling($offset = 1) {
|
757 |
+
$index = $this->index() + $offset;
|
758 |
+
if (($index >= 0) && ($index < $this->parent->childCount())) {
|
759 |
+
return $this->parent->getChild($index);
|
760 |
+
} else {
|
761 |
+
return null;
|
762 |
+
}
|
763 |
+
}
|
764 |
+
|
765 |
+
/**
|
766 |
+
* Get node next to current
|
767 |
+
* @param bool $skip_text_comments
|
768 |
+
* @return DomNode Null if not found
|
769 |
+
* @see getSibling()
|
770 |
+
* @see getPreviousSibling()
|
771 |
+
*/
|
772 |
+
function getNextSibling($skip_text_comments = true) {
|
773 |
+
$offset = 1;
|
774 |
+
while (($n = $this->getSibling($offset)) !== null) {
|
775 |
+
if ($skip_text_comments && ($n->tag[0] === '~')) {
|
776 |
+
++$offset;
|
777 |
+
} else {
|
778 |
+
break;
|
779 |
+
}
|
780 |
+
}
|
781 |
+
|
782 |
+
return $n;
|
783 |
+
}
|
784 |
+
|
785 |
+
/**
|
786 |
+
* Get node previous to current
|
787 |
+
* @param bool $skip_text_comments
|
788 |
+
* @return DomNode Null if not found
|
789 |
+
* @see getSibling()
|
790 |
+
* @see getNextSibling()
|
791 |
+
*/
|
792 |
+
function getPreviousSibling($skip_text_comments = true) {
|
793 |
+
$offset = -1;
|
794 |
+
while (($n = $this->getSibling($offset)) !== null) {
|
795 |
+
if ($skip_text_comments && ($n->tag[0] === '~')) {
|
796 |
+
--$offset;
|
797 |
+
} else {
|
798 |
+
break;
|
799 |
+
}
|
800 |
+
}
|
801 |
+
|
802 |
+
return $n;
|
803 |
+
}
|
804 |
+
|
805 |
+
/**
|
806 |
+
* Get namespace of node
|
807 |
+
* @return string
|
808 |
+
* @see setNamespace()
|
809 |
+
*/
|
810 |
+
function getNamespace() {
|
811 |
+
if ($this->tag_ns === null) {
|
812 |
+
$a = explode(':', $this->tag, 2);
|
813 |
+
if (empty($a[1])) {
|
814 |
+
$this->tag_ns = array('', $a[0]);
|
815 |
+
} else {
|
816 |
+
$this->tag_ns = array($a[0], $a[1]);
|
817 |
+
}
|
818 |
+
}
|
819 |
+
|
820 |
+
return $this->tag_ns[0];
|
821 |
+
}
|
822 |
+
|
823 |
+
/**
|
824 |
+
* Set namespace of node
|
825 |
+
* @param string $ns
|
826 |
+
* @see getNamespace()
|
827 |
+
*/
|
828 |
+
function setNamespace($ns) {
|
829 |
+
if ($this->getNamespace() !== $ns) {
|
830 |
+
$this->tag_ns[0] = $ns;
|
831 |
+
$this->tag = $ns.':'.$this->tag_ns[1];
|
832 |
+
}
|
833 |
+
}
|
834 |
+
|
835 |
+
/**
|
836 |
+
* Get tagname of node (without namespace)
|
837 |
+
* @return string
|
838 |
+
* @see setTag()
|
839 |
+
*/
|
840 |
+
function getTag() {
|
841 |
+
if ($this->tag_ns === null) {
|
842 |
+
$this->getNamespace();
|
843 |
+
}
|
844 |
+
|
845 |
+
return $this->tag_ns[1];
|
846 |
+
}
|
847 |
+
|
848 |
+
/**
|
849 |
+
* Set tag (with or without namespace)
|
850 |
+
* @param string $tag
|
851 |
+
* @param bool $with_ns Does $tag include namespace?
|
852 |
+
* @see getTag()
|
853 |
+
*/
|
854 |
+
function setTag($tag, $with_ns = false) {
|
855 |
+
$with_ns = $with_ns || (strpos($tag, ':') !== false);
|
856 |
+
if ($with_ns) {
|
857 |
+
$this->tag = $tag;
|
858 |
+
$this->tag_ns = null;
|
859 |
+
} elseif ($this->getTag() !== $tag) {
|
860 |
+
$this->tag_ns[1] = $tag;
|
861 |
+
$this->tag = (($this->tag_ns[0]) ? $this->tag_ns[0].':' : '').$tag;
|
862 |
+
}
|
863 |
+
}
|
864 |
+
|
865 |
+
/**
|
866 |
+
* Try to determine the encoding of the current tag
|
867 |
+
* @return string|bool False if encoding could not be found
|
868 |
+
*/
|
869 |
+
function getEncoding() {
|
870 |
+
$root = $this->getRoot();
|
871 |
+
if ($root !== null) {
|
872 |
+
if ($enc = $root->select('meta[charset]', 0, true, true)) {
|
873 |
+
return $enc->getAttribute("charset");
|
874 |
+
} elseif ($enc = $root->select('"?xml"[encoding]', 0, true, true)) {
|
875 |
+
return $enc->getAttribute("encoding");
|
876 |
+
} elseif ($enc = $root->select('meta[content*="charset="]', 0, true, true)) {
|
877 |
+
$enc = $enc->getAttribute("content");
|
878 |
+
return substr($enc, strpos($enc, "charset=")+8);
|
879 |
+
}
|
880 |
+
}
|
881 |
+
|
882 |
+
return false;
|
883 |
+
}
|
884 |
+
|
885 |
+
/**
|
886 |
+
* Number of children in node
|
887 |
+
* @param bool $ignore_text_comments Ignore text/comments with calculation
|
888 |
+
* @return int
|
889 |
+
*/
|
890 |
+
function childCount($ignore_text_comments = false) {
|
891 |
+
if (!$ignore_text_comments) {
|
892 |
+
return count($this->children);
|
893 |
+
} else{
|
894 |
+
$count = 0;
|
895 |
+
//foreach($this->children as &$c) {
|
896 |
+
// if (!$c->isTextOrComment()) {
|
897 |
+
// ++$count;
|
898 |
+
// }
|
899 |
+
//}
|
900 |
+
|
901 |
+
foreach(array_keys($this->children) as $k) {
|
902 |
+
if (!$this->children[$k]->isTextOrComment()) {
|
903 |
+
++$count;
|
904 |
+
}
|
905 |
+
}
|
906 |
+
return $count;
|
907 |
+
}
|
908 |
+
}
|
909 |
+
|
910 |
+
/**
|
911 |
+
* Find node in children
|
912 |
+
* @param DomNode $child
|
913 |
+
* @return int False if not found
|
914 |
+
*/
|
915 |
+
function findChild($child) {
|
916 |
+
return array_search($child, $this->children, true);
|
917 |
+
}
|
918 |
+
|
919 |
+
/**
|
920 |
+
* Checks if node has another node as child
|
921 |
+
* @param DomNode $child
|
922 |
+
* @return bool
|
923 |
+
*/
|
924 |
+
function hasChild($child) {
|
925 |
+
return ((bool) findChild($child));
|
926 |
+
}
|
927 |
+
|
928 |
+
/**
|
929 |
+
* Get childnode
|
930 |
+
* @param int|DomNode $child Index, negative to count from end
|
931 |
+
* @param bool $ignore_text_comments Ignore text/comments with index calculation
|
932 |
+
* @return DomNode
|
933 |
+
*/
|
934 |
+
function &getChild($child, $ignore_text_comments = false) {
|
935 |
+
if (!is_int($child)) {
|
936 |
+
$child = $this->findChild($child);
|
937 |
+
} elseif ($child < 0) {
|
938 |
+
$child += $this->childCount($ignore_text_comments);
|
939 |
+
}
|
940 |
+
|
941 |
+
if ($ignore_text_comments) {
|
942 |
+
$count = 0;
|
943 |
+
$last = null;
|
944 |
+
//foreach($this->children as &$c) {
|
945 |
+
// if (!$c->isTextOrComment()) {
|
946 |
+
// if ($count++ === $child) {
|
947 |
+
// return $c;
|
948 |
+
// }
|
949 |
+
// $last = $c;
|
950 |
+
// }
|
951 |
+
//}
|
952 |
+
|
953 |
+
foreach(array_keys($this->children) as $k) {
|
954 |
+
if (!$this->children[$k]->isTextOrComment()) {
|
955 |
+
if ($count++ === $child) {
|
956 |
+
return $this->children[$k];
|
957 |
+
}
|
958 |
+
$last = $this->children[$k];
|
959 |
+
}
|
960 |
+
}
|
961 |
+
return (($child > $count) ? $last : null);
|
962 |
+
} else {
|
963 |
+
return $this->children[$child];
|
964 |
+
}
|
965 |
+
}
|
966 |
+
|
967 |
+
/**
|
968 |
+
* Add child node
|
969 |
+
* @param string|DomNode $tag Tag name or object
|
970 |
+
* @param int $offset Position to insert node, negative to count from end, null to append
|
971 |
+
* @return DomNode Added node
|
972 |
+
*/
|
973 |
+
#php4
|
974 |
+
#function &addChild($tag, &$offset) {
|
975 |
+
#php4e
|
976 |
+
#php5
|
977 |
+
function &addChild($tag, &$offset = null) {
|
978 |
+
#php5e
|
979 |
+
if (is_array($tag)) {
|
980 |
+
$tag = new $this->childClass($tag, $this);
|
981 |
+
} elseif (is_string($tag)) {
|
982 |
+
$nodes = $this->createNodes($tag);
|
983 |
+
$tag = array_shift($nodes);
|
984 |
+
|
985 |
+
if ($tag && $tag->parent !== $this) {
|
986 |
+
$index = false;
|
987 |
+
$tag->changeParent($this, $index);
|
988 |
+
}
|
989 |
+
} elseif (is_object($tag) && $tag->parent !== $this) {
|
990 |
+
$index = false; //Needs to be passed by ref
|
991 |
+
$tag->changeParent($this, $index);
|
992 |
+
}
|
993 |
+
|
994 |
+
if (is_int($offset) && ($offset < count($this->children)) && ($offset !== -1)) {
|
995 |
+
if ($offset < 0) {
|
996 |
+
$offset += count($this->children);
|
997 |
+
}
|
998 |
+
array_splice($this->children, $offset++, 0, array(&$tag));
|
999 |
+
} else {
|
1000 |
+
$this->children[] =& $tag;
|
1001 |
+
}
|
1002 |
+
|
1003 |
+
return $tag;
|
1004 |
+
}
|
1005 |
+
|
1006 |
+
/**
|
1007 |
+
* First child node
|
1008 |
+
* @param bool $ignore_text_comments Ignore text/comments with index calculation
|
1009 |
+
* @return DomNode
|
1010 |
+
*/
|
1011 |
+
function &firstChild($ignore_text_comments = false) {
|
1012 |
+
return $this->getChild(0, $ignore_text_comments);
|
1013 |
+
}
|
1014 |
+
|
1015 |
+
/**
|
1016 |
+
* Last child node
|
1017 |
+
* @param bool $ignore_text_comments Ignore text/comments with index calculation
|
1018 |
+
* @return DomNode
|
1019 |
+
*/
|
1020 |
+
function &lastChild($ignore_text_comments = false) {
|
1021 |
+
return $this->getChild(-1, $ignore_text_comments);
|
1022 |
+
}
|
1023 |
+
|
1024 |
+
/**
|
1025 |
+
* Insert childnode
|
1026 |
+
* @param string|DomNode $tag Tagname or object
|
1027 |
+
* @param int $offset Position to insert node, negative to count from end, null to append
|
1028 |
+
* @return DomNode Added node
|
1029 |
+
* @see addChild();
|
1030 |
+
*/
|
1031 |
+
function &insertChild($tag, $index) {
|
1032 |
+
return $this->addChild($tag, $index);
|
1033 |
+
}
|
1034 |
+
|
1035 |
+
/**
|
1036 |
+
* Add text node
|
1037 |
+
* @param string $text
|
1038 |
+
* @param int $offset Position to insert node, negative to count from end, null to append
|
1039 |
+
* @return DomNode Added node
|
1040 |
+
* @see addChild();
|
1041 |
+
*/
|
1042 |
+
#php4
|
1043 |
+
#function &addText($text, &$offset) {
|
1044 |
+
#php4e
|
1045 |
+
#php5
|
1046 |
+
function &addText($text, &$offset = null) {
|
1047 |
+
#php5e
|
1048 |
+
return $this->addChild(new $this->childClass_Text($this, $text), $offset);
|
1049 |
+
}
|
1050 |
+
|
1051 |
+
/**
|
1052 |
+
* Add comment node
|
1053 |
+
* @param string $text
|
1054 |
+
* @param int $offset Position to insert node, negative to count from end, null to append
|
1055 |
+
* @return DomNode Added node
|
1056 |
+
* @see addChild();
|
1057 |
+
*/
|
1058 |
+
#php4
|
1059 |
+
#function &addComment($text, &$offset) {
|
1060 |
+
#php4e
|
1061 |
+
#php5
|
1062 |
+
function &addComment($text, &$offset = null) {
|
1063 |
+
#php5e
|
1064 |
+
return $this->addChild(new $this->childClass_Comment($this, $text), $offset);
|
1065 |
+
}
|
1066 |
+
|
1067 |
+
/**
|
1068 |
+
* Add conditional node
|
1069 |
+
* @param string $condition
|
1070 |
+
* @param bool True for <!--[if, false for <![if
|
1071 |
+
* @param int $offset Position to insert node, negative to count from end, null to append
|
1072 |
+
* @return DomNode Added node
|
1073 |
+
* @see addChild();
|
1074 |
+
*/
|
1075 |
+
#php4
|
1076 |
+
#function &addConditional($condition, $hidden = true, &$offset) {
|
1077 |
+
#php4e
|
1078 |
+
#php5
|
1079 |
+
function &addConditional($condition, $hidden = true, &$offset = null) {
|
1080 |
+
#php5e
|
1081 |
+
return $this->addChild(new $this->childClass_Conditional($this, $condition, $hidden), $offset);
|
1082 |
+
}
|
1083 |
+
|
1084 |
+
/**
|
1085 |
+
* Add CDATA node
|
1086 |
+
* @param string $text
|
1087 |
+
* @param int $offset Position to insert node, negative to count from end, null to append
|
1088 |
+
* @return DomNode Added node
|
1089 |
+
* @see addChild();
|
1090 |
+
*/
|
1091 |
+
#php4
|
1092 |
+
#function &addCDATA($text, &$offset) {
|
1093 |
+
#php4e
|
1094 |
+
#php5
|
1095 |
+
function &addCDATA($text, &$offset = null) {
|
1096 |
+
#php5e
|
1097 |
+
return $this->addChild(new $this->childClass_CDATA($this, $text), $offset);
|
1098 |
+
}
|
1099 |
+
|
1100 |
+
/**
|
1101 |
+
* Add doctype node
|
1102 |
+
* @param string $dtd
|
1103 |
+
* @param int $offset Position to insert node, negative to count from end, null to append
|
1104 |
+
* @return DomNode Added node
|
1105 |
+
* @see addChild();
|
1106 |
+
*/
|
1107 |
+
#php4
|
1108 |
+
#function &addDoctype($dtd, &$offset) {
|
1109 |
+
#php4e
|
1110 |
+
#php5
|
1111 |
+
function &addDoctype($dtd, &$offset = null) {
|
1112 |
+
#php5e
|
1113 |
+
return $this->addChild(new $this->childClass_Doctype($this, $dtd), $offset);
|
1114 |
+
}
|
1115 |
+
|
1116 |
+
/**
|
1117 |
+
* Add xml node
|
1118 |
+
* @param string $tag Tag name after "?", e.g. "php" or "xml"
|
1119 |
+
* @param string $text
|
1120 |
+
* @param array $attributes Array of attributes (array('attribute' => 'value'))
|
1121 |
+
* @param int $offset Position to insert node, negative to count from end, null to append
|
1122 |
+
* @return DomNode Added node
|
1123 |
+
* @see addChild();
|
1124 |
+
*/
|
1125 |
+
#php4
|
1126 |
+
#function &addXML($tag = 'xml', $text = '', $attributes = array(), &$offset) {
|
1127 |
+
#php4e
|
1128 |
+
#php5
|
1129 |
+
function &addXML($tag = 'xml', $text = '', $attributes = array(), &$offset = null) {
|
1130 |
+
#php5e
|
1131 |
+
return $this->addChild(new $this->childClass_XML($this, $tag, $text, $attributes), $offset);
|
1132 |
+
}
|
1133 |
+
|
1134 |
+
/**
|
1135 |
+
* Add ASP node
|
1136 |
+
* @param string $tag Tag name after "%"
|
1137 |
+
* @param string $text
|
1138 |
+
* @param array $attributes Array of attributes (array('attribute' => 'value'))
|
1139 |
+
* @param int $offset Position to insert node, negative to count from end, null to append
|
1140 |
+
* @return DomNode Added node
|
1141 |
+
* @see addChild();
|
1142 |
+
*/
|
1143 |
+
#php4
|
1144 |
+
#function &addASP($tag = '', $text = '', $attributes = array(), &$offset) {
|
1145 |
+
#php4e
|
1146 |
+
#php5
|
1147 |
+
function &addASP($tag = '', $text = '', $attributes = array(), &$offset = null) {
|
1148 |
+
#php5e
|
1149 |
+
return $this->addChild(new $this->childClass_ASP($this, $tag, $text, $attributes), $offset);
|
1150 |
+
}
|
1151 |
+
|
1152 |
+
/**
|
1153 |
+
* Delete a child node
|
1154 |
+
* @param int|DomNode $child Child(index) to delete, negative to count from end
|
1155 |
+
* @param bool $soft_delete False to call {@link delete()} from child
|
1156 |
+
*/
|
1157 |
+
function deleteChild($child, $soft_delete = false) {
|
1158 |
+
if (is_object($child)) {
|
1159 |
+
$child = $this->findChild($child);
|
1160 |
+
} elseif ($child < 0) {
|
1161 |
+
$child += count($this->children);
|
1162 |
+
}
|
1163 |
+
|
1164 |
+
if (!$soft_delete) {
|
1165 |
+
$this->children[$child]->delete();
|
1166 |
+
}
|
1167 |
+
unset($this->children[$child]);
|
1168 |
+
|
1169 |
+
//Rebuild indices
|
1170 |
+
$tmp = array();
|
1171 |
+
|
1172 |
+
//foreach($this->children as &$c) {
|
1173 |
+
// $tmp[] =& $c;
|
1174 |
+
//}
|
1175 |
+
foreach(array_keys($this->children) as $k) {
|
1176 |
+
$tmp[] =& $this->children[$k];
|
1177 |
+
}
|
1178 |
+
$this->children = $tmp;
|
1179 |
+
}
|
1180 |
+
|
1181 |
+
/**
|
1182 |
+
* Wrap node
|
1183 |
+
* @param string|DomNode $node Wrapping node, string to create new element node
|
1184 |
+
* @param int $wrap_index Index to insert current node in wrapping node, -1 to append
|
1185 |
+
* @param int $node_index Index to insert wrapping node, null to keep at same position
|
1186 |
+
* @return DomNode Wrapping node
|
1187 |
+
*/
|
1188 |
+
function wrap($node, $wrap_index = -1, $node_index = null) {
|
1189 |
+
if ($node_index === null) {
|
1190 |
+
$node_index = $this->index();
|
1191 |
+
}
|
1192 |
+
|
1193 |
+
if (!is_object($node)) {
|
1194 |
+
$node = $this->parent->addChild($node, $node_index);
|
1195 |
+
} elseif ($node->parent !== $this->parent) {
|
1196 |
+
$node->changeParent($this->parent, $node_index);
|
1197 |
+
}
|
1198 |
+
|
1199 |
+
$this->changeParent($node, $wrap_index);
|
1200 |
+
return $node;
|
1201 |
+
}
|
1202 |
+
|
1203 |
+
/**
|
1204 |
+
* Wrap child nodes
|
1205 |
+
* @param string|DomNode $node Wrapping node, string to create new element node
|
1206 |
+
* @param int $start Index from child node where to start wrapping, 0 for first element
|
1207 |
+
* @param int $end Index from child node where to end wrapping, -1 for last element
|
1208 |
+
* @param int $wrap_index Index to insert in wrapping node, -1 to append
|
1209 |
+
* @param int $node_index Index to insert current node, null to keep at same position
|
1210 |
+
* @return DomNode Wrapping node
|
1211 |
+
*/
|
1212 |
+
function wrapInner($node, $start = 0, $end = -1, $wrap_index = -1, $node_index = null) {
|
1213 |
+
if ($end < 0) {
|
1214 |
+
$end += count($this->children);
|
1215 |
+
}
|
1216 |
+
if ($node_index === null) {
|
1217 |
+
$node_index = $end + 1;
|
1218 |
+
}
|
1219 |
+
|
1220 |
+
if (!is_object($node)) {
|
1221 |
+
$node = $this->addChild($node, $node_index);
|
1222 |
+
} elseif ($node->parent !== $this) {
|
1223 |
+
$node->changeParent($this->parent, $node_index);
|
1224 |
+
}
|
1225 |
+
|
1226 |
+
$this->moveChildren($node, $wrap_index, $start, $end);
|
1227 |
+
return $node;
|
1228 |
+
}
|
1229 |
+
|
1230 |
+
/**
|
1231 |
+
* Number of attributes
|
1232 |
+
* @return int
|
1233 |
+
*/
|
1234 |
+
function attributeCount() {
|
1235 |
+
return count($this->attributes);
|
1236 |
+
}
|
1237 |
+
|
1238 |
+
/**
|
1239 |
+
* Find attribute using namespace, name or both
|
1240 |
+
* @param string|int $attr Negative int to count from end
|
1241 |
+
* @param string $compare "namespace", "name" or "total"
|
1242 |
+
* @param bool $case_sensitive Compare with case sensitivity
|
1243 |
+
* @return array array('ns', 'attr', 'ns:attr', index)
|
1244 |
+
* @access private
|
1245 |
+
*/
|
1246 |
+
protected function findAttribute($attr, $compare = 'total', $case_sensitive = false) {
|
1247 |
+
if (is_int($attr)) {
|
1248 |
+
if ($attr < 0) {
|
1249 |
+
$attr += count($this->attributes);
|
1250 |
+
}
|
1251 |
+
$keys = array_keys($this->attributes);
|
1252 |
+
return $this->findAttribute($keys[$attr], 'total', true);
|
1253 |
+
} else if ($compare === 'total') {
|
1254 |
+
$b = explode(':', $attr, 2);
|
1255 |
+
if ($case_sensitive) {
|
1256 |
+
$t =& $this->attributes;
|
1257 |
+
} else {
|
1258 |
+
$t = array_change_key_case($this->attributes);
|
1259 |
+
$attr = strtolower($attr);
|
1260 |
+
}
|
1261 |
+
|
1262 |
+
if (isset($t[$attr])) {
|
1263 |
+
$index = 0;
|
1264 |
+
foreach($this->attributes as $a => $v) {
|
1265 |
+
if (($v === $t[$attr]) && (strcasecmp($a, $attr) === 0)) {
|
1266 |
+
$attr = $a;
|
1267 |
+
$b = explode(':', $attr, 2);
|
1268 |
+
break;
|
1269 |
+
}
|
1270 |
+
++$index;
|
1271 |
+
}
|
1272 |
+
|
1273 |
+
if (empty($b[1])) {
|
1274 |
+
return array(array('', $b[0], $attr, $index));
|
1275 |
+
} else {
|
1276 |
+
return array(array($b[0], $b[1], $attr, $index));
|
1277 |
+
}
|
1278 |
+
} else {
|
1279 |
+
return false;
|
1280 |
+
}
|
1281 |
+
} else {
|
1282 |
+
if ($this->attributes_ns === null) {
|
1283 |
+
$index = 0;
|
1284 |
+
foreach($this->attributes as $a => $v) {
|
1285 |
+
$b = explode(':', $a, 2);
|
1286 |
+
if (empty($b[1])) {
|
1287 |
+
$this->attributes_ns[$b[0]][] = array('', $b[0], $a, $index);
|
1288 |
+
} else {
|
1289 |
+
$this->attributes_ns[$b[1]][] = array($b[0], $b[1], $a, $index);
|
1290 |
+
}
|
1291 |
+
++$index;
|
1292 |
+
}
|
1293 |
+
}
|
1294 |
+
|
1295 |
+
if ($case_sensitive) {
|
1296 |
+
$t =& $this->attributes_ns;
|
1297 |
+
} else {
|
1298 |
+
$t = array_change_key_case($this->attributes_ns);
|
1299 |
+
$attr = strtolower($attr);
|
1300 |
+
}
|
1301 |
+
|
1302 |
+
if ($compare === 'namespace') {
|
1303 |
+
$res = array();
|
1304 |
+
foreach($t as $ar) {
|
1305 |
+
foreach($ar as $a) {
|
1306 |
+
if ($a[0] === $attr) {
|
1307 |
+
$res[] = $a;
|
1308 |
+
}
|
1309 |
+
}
|
1310 |
+
}
|
1311 |
+
return $res;
|
1312 |
+
} elseif ($compare === 'name') {
|
1313 |
+
return ((isset($t[$attr])) ? $t[$attr] : false);
|
1314 |
+
} else {
|
1315 |
+
trigger_error('Unknown comparison mode');
|
1316 |
+
}
|
1317 |
+
}
|
1318 |
+
}
|
1319 |
+
|
1320 |
+
/**
|
1321 |
+
* Checks if node has attribute
|
1322 |
+
* @param string|int$attr Negative int to count from end
|
1323 |
+
* @param string $compare Find node using "namespace", "name" or "total"
|
1324 |
+
* @param bool $case_sensitive Compare with case sensitivity
|
1325 |
+
* @return bool
|
1326 |
+
*/
|
1327 |
+
function hasAttribute($attr, $compare = 'total', $case_sensitive = false) {
|
1328 |
+
return ((bool) $this->findAttribute($attr, $compare, $case_sensitive));
|
1329 |
+
}
|
1330 |
+
|
1331 |
+
/**
|
1332 |
+
* Gets namespace of attribute(s)
|
1333 |
+
* @param string|int $attr Negative int to count from end
|
1334 |
+
* @param string $compare Find node using "namespace", "name" or "total"
|
1335 |
+
* @param bool $case_sensitive Compare with case sensitivity
|
1336 |
+
* @return string|array False if not found
|
1337 |
+
*/
|
1338 |
+
function getAttributeNS($attr, $compare = 'name', $case_sensitive = false) {
|
1339 |
+
$f = $this->findAttribute($attr, $compare, $case_sensitive);
|
1340 |
+
if (is_array($f) && $f) {
|
1341 |
+
if (count($f) === 1) {
|
1342 |
+
return $this->attributes[$f[0][0]];
|
1343 |
+
} else {
|
1344 |
+
$res = array();
|
1345 |
+
foreach($f as $a) {
|
1346 |
+
$res[] = $a[0];
|
1347 |
+
}
|
1348 |
+
return $res;
|
1349 |
+
}
|
1350 |
+
} else {
|
1351 |
+
return false;
|
1352 |
+
}
|
1353 |
+
}
|
1354 |
+
|
1355 |
+
/**
|
1356 |
+
* Sets namespace of attribute(s)
|
1357 |
+
* @param string|int $attr Negative int to count from end
|
1358 |
+
* @param string $namespace
|
1359 |
+
* @param string $compare Find node using "namespace", "name" or "total"
|
1360 |
+
* @param bool $case_sensitive Compare with case sensitivity
|
1361 |
+
* @return bool
|
1362 |
+
*/
|
1363 |
+
function setAttributeNS($attr, $namespace, $compare = 'name', $case_sensitive = false) {
|
1364 |
+
$f = $this->findAttribute($attr, $compare, $case_sensitive);
|
1365 |
+
if (is_array($f) && $f) {
|
1366 |
+
if ($namespace) {
|
1367 |
+
$namespace .= ':';
|
1368 |
+
}
|
1369 |
+
foreach($f as $a) {
|
1370 |
+
$val = $this->attributes[$a[2]];
|
1371 |
+
unset($this->attributes[$a[2]]);
|
1372 |
+
$this->attributes[$namespace.$a[1]] = $val;
|
1373 |
+
}
|
1374 |
+
$this->attributes_ns = null;
|
1375 |
+
return true;
|
1376 |
+
} else {
|
1377 |
+
return false;
|
1378 |
+
}
|
1379 |
+
}
|
1380 |
+
|
1381 |
+
/**
|
1382 |
+
* Gets value(s) of attribute(s)
|
1383 |
+
* @param string|int $attr Negative int to count from end
|
1384 |
+
* @param string $compare Find node using "namespace", "name" or "total"
|
1385 |
+
* @param bool $case_sensitive Compare with case sensitivity
|
1386 |
+
* @return string|array
|
1387 |
+
*/
|
1388 |
+
function getAttribute($attr, $compare = 'total', $case_sensitive = false) {
|
1389 |
+
$f = $this->findAttribute($attr, $compare, $case_sensitive);
|
1390 |
+
if (is_array($f) && $f){
|
1391 |
+
if (count($f) === 1) {
|
1392 |
+
return $this->attributes[$f[0][2]];
|
1393 |
+
} else {
|
1394 |
+
$res = array();
|
1395 |
+
foreach($f as $a) {
|
1396 |
+
$res[] = $this->attributes[$a[2]];
|
1397 |
+
}
|
1398 |
+
return $res;
|
1399 |
+
}
|
1400 |
+
} else {
|
1401 |
+
return null;
|
1402 |
+
}
|
1403 |
+
}
|
1404 |
+
|
1405 |
+
/**
|
1406 |
+
* Sets value(s) of attribute(s)
|
1407 |
+
* @param string|int $attr Negative int to count from end
|
1408 |
+
* @param string $compare Find node using "namespace", "name" or "total"
|
1409 |
+
* @param bool $case_sensitive Compare with case sensitivity
|
1410 |
+
*/
|
1411 |
+
function setAttribute($attr, $val, $compare = 'total', $case_sensitive = false) {
|
1412 |
+
if ($val === null) {
|
1413 |
+
return $this->deleteAttribute($attr, $compare, $case_sensitive);
|
1414 |
+
}
|
1415 |
+
|
1416 |
+
$f = $this->findAttribute($attr, $compare, $case_sensitive);
|
1417 |
+
if (is_array($f) && $f) {
|
1418 |
+
foreach($f as $a) {
|
1419 |
+
$this->attributes[$a[2]] = (string) $val;
|
1420 |
+
}
|
1421 |
+
} else {
|
1422 |
+
$this->attributes[$attr] = (string) $val;
|
1423 |
+
}
|
1424 |
+
}
|
1425 |
+
|
1426 |
+
/**
|
1427 |
+
* Add new attribute
|
1428 |
+
* @param string $attr
|
1429 |
+
* @param string $val
|
1430 |
+
*/
|
1431 |
+
function addAttribute($attr, $val) {
|
1432 |
+
$this->setAttribute($attr, $val, 'total', true);
|
1433 |
+
}
|
1434 |
+
|
1435 |
+
/**
|
1436 |
+
* Delete attribute(s)
|
1437 |
+
* @param string|int $attr Negative int to count from end
|
1438 |
+
* @param string $compare Find node using "namespace", "name" or "total"
|
1439 |
+
* @param bool $case_sensitive Compare with case sensitivity
|
1440 |
+
*/
|
1441 |
+
function deleteAttribute($attr, $compare = 'total', $case_sensitive = false) {
|
1442 |
+
$f = $this->findAttribute($attr, $compare, $case_sensitive);
|
1443 |
+
if (is_array($f) && $f) {
|
1444 |
+
foreach($f as $a) {
|
1445 |
+
unset($this->attributes[$a[2]]);
|
1446 |
+
if ($this->attributes_ns !== null) {
|
1447 |
+
unset($this->attributes_ns[$a[1]]);
|
1448 |
+
}
|
1449 |
+
}
|
1450 |
+
}
|
1451 |
+
}
|
1452 |
+
|
1453 |
+
/**
|
1454 |
+
* Determine if node has a certain class
|
1455 |
+
* @param string $className
|
1456 |
+
* @return bool
|
1457 |
+
*/
|
1458 |
+
function hasClass($className) {
|
1459 |
+
return ($className && preg_match('`\b'.preg_quote($className).'\b`si', $this->class));
|
1460 |
+
}
|
1461 |
+
|
1462 |
+
/**
|
1463 |
+
* Add new class(es)
|
1464 |
+
* @param string|array $className
|
1465 |
+
*/
|
1466 |
+
function addClass($className) {
|
1467 |
+
if (!is_array($className)) {
|
1468 |
+
$className = array($className);
|
1469 |
+
}
|
1470 |
+
$class = $this->class;
|
1471 |
+
foreach ($className as $c) {
|
1472 |
+
if (!(preg_match('`\b'.preg_quote($c).'\b`si', $class) > 0)) {
|
1473 |
+
$class .= ' '.$c;
|
1474 |
+
}
|
1475 |
+
}
|
1476 |
+
$this->class = trim($class);
|
1477 |
+
}
|
1478 |
+
|
1479 |
+
/**
|
1480 |
+
* Remove clas(ses)
|
1481 |
+
* @param string|array $className
|
1482 |
+
*/
|
1483 |
+
function removeClass($className) {
|
1484 |
+
if (!is_array($className)) {
|
1485 |
+
$className = array($className);
|
1486 |
+
}
|
1487 |
+
$class = $this->class;
|
1488 |
+
foreach ($className as $c) {
|
1489 |
+
$class = preg_replace('`\b'.preg_quote($c).'\b`si', '', $class);
|
1490 |
+
}
|
1491 |
+
if ($class) {
|
1492 |
+
$this->class = $class;
|
1493 |
+
} else {
|
1494 |
+
unset($this->class);
|
1495 |
+
}
|
1496 |
+
}
|
1497 |
+
|
1498 |
+
/**
|
1499 |
+
* Finds children using a callback function
|
1500 |
+
* @param callable $callback Function($node) that returns a bool
|
1501 |
+
* @param bool|int $recursive Check recursively
|
1502 |
+
* @param bool $check_self Include this node in search?
|
1503 |
+
* @return array
|
1504 |
+
*/
|
1505 |
+
function getChildrenByCallback($callback, $recursive = true, $check_self = false) {
|
1506 |
+
$count = $this->childCount();
|
1507 |
+
if ($check_self && $callback($this)) {
|
1508 |
+
$res = array($this);
|
1509 |
+
} else {
|
1510 |
+
$res = array();
|
1511 |
+
}
|
1512 |
+
|
1513 |
+
if ($count > 0) {
|
1514 |
+
if (is_int($recursive)) {
|
1515 |
+
$recursive = (($recursive > 1) ? $recursive - 1 : false);
|
1516 |
+
}
|
1517 |
+
|
1518 |
+
for ($i = 0; $i < $count; $i++) {
|
1519 |
+
if ($callback($this->children[$i])) {
|
1520 |
+
$res[] = $this->children[$i];
|
1521 |
+
}
|
1522 |
+
if ($recursive) {
|
1523 |
+
$res = array_merge($res, $this->children[$i]->getChildrenByCallback($callback, $recursive));
|
1524 |
+
}
|
1525 |
+
}
|
1526 |
+
}
|
1527 |
+
|
1528 |
+
return $res;
|
1529 |
+
}
|
1530 |
+
|
1531 |
+
/**
|
1532 |
+
* Finds children using the {$link match()} function
|
1533 |
+
* @param $conditions See {$link match()}
|
1534 |
+
* @param $custom_filters See {$link match()}
|
1535 |
+
* @param bool|int $recursive Check recursively
|
1536 |
+
* @param bool $check_self Include this node in search?
|
1537 |
+
* @return array
|
1538 |
+
*/
|
1539 |
+
function getChildrenByMatch($conditions, $recursive = true, $check_self = false, $custom_filters = array()) {
|
1540 |
+
$count = $this->childCount();
|
1541 |
+
if ($check_self && $this->match($conditions, true, $custom_filters)) {
|
1542 |
+
$res = array($this);
|
1543 |
+
} else {
|
1544 |
+
$res = array();
|
1545 |
+
}
|
1546 |
+
|
1547 |
+
if ($count > 0) {
|
1548 |
+
if (is_int($recursive)) {
|
1549 |
+
$recursive = (($recursive > 1) ? $recursive - 1 : false);
|
1550 |
+
}
|
1551 |
+
|
1552 |
+
for ($i = 0; $i < $count; $i++) {
|
1553 |
+
if ($this->children[$i]->match($conditions, true, $custom_filters)) {
|
1554 |
+
$res[] = $this->children[$i];
|
1555 |
+
}
|
1556 |
+
if ($recursive) {
|
1557 |
+
$res = array_merge($res, $this->children[$i]->getChildrenByMatch($conditions, $recursive, false, $custom_filters));
|
1558 |
+
}
|
1559 |
+
}
|
1560 |
+
}
|
1561 |
+
|
1562 |
+
return $res;
|
1563 |
+
}
|
1564 |
+
|
1565 |
+
/**
|
1566 |
+
* Checks if tag matches certain conditions
|
1567 |
+
* @param array $tags array('tag1', 'tag2') or array(array(
|
1568 |
+
* 'tag' => 'tag1',
|
1569 |
+
* 'operator' => 'or'/'and',
|
1570 |
+
* 'compare' => 'total'/'namespace'/'name',
|
1571 |
+
* 'case_sensitive' => true))
|
1572 |
+
* @return bool
|
1573 |
+
* @internal Used by selector class
|
1574 |
+
* @see match()
|
1575 |
+
* @access private
|
1576 |
+
*/
|
1577 |
+
protected function match_tags($tags) {
|
1578 |
+
$res = false;
|
1579 |
+
|
1580 |
+
foreach($tags as $tag => $match) {
|
1581 |
+
if (!is_array($match)) {
|
1582 |
+
$match = array(
|
1583 |
+
'match' => $match,
|
1584 |
+
'operator' => 'or',
|
1585 |
+
'compare' => 'total',
|
1586 |
+
'case_sensitive' => false
|
1587 |
+
);
|
1588 |
+
} else {
|
1589 |
+
if (is_int($tag)) {
|
1590 |
+
$tag = $match['tag'];
|
1591 |
+
}
|
1592 |
+
if (!isset($match['match'])) {
|
1593 |
+
$match['match'] = true;
|
1594 |
+
}
|
1595 |
+
if (!isset($match['operator'])) {
|
1596 |
+
$match['operator'] = 'or';
|
1597 |
+
}
|
1598 |
+
if (!isset($match['compare'])) {
|
1599 |
+
$match['compare'] = 'total';
|
1600 |
+
}
|
1601 |
+
if (!isset($match['case_sensitive'])) {
|
1602 |
+
$match['case_sensitive'] = false;
|
1603 |
+
}
|
1604 |
+
}
|
1605 |
+
|
1606 |
+
if (($match['operator'] === 'and') && (!$res)) {
|
1607 |
+
return false;
|
1608 |
+
} elseif (!($res && ($match['operator'] === 'or'))) {
|
1609 |
+
if ($match['compare'] === 'total') {
|
1610 |
+
$a = $this->tag;
|
1611 |
+
} elseif ($match['compare'] === 'namespace') {
|
1612 |
+
$a = $this->getNamespace();
|
1613 |
+
} elseif ($match['compare'] === 'name') {
|
1614 |
+
$a = $this->getTag();
|
1615 |
+
}
|
1616 |
+
|
1617 |
+
if ($match['case_sensitive']) {
|
1618 |
+
$res = (($a === $tag) === $match['match']);
|
1619 |
+
} else {
|
1620 |
+
$res = ((strcasecmp($a, $tag) === 0) === $match['match']);
|
1621 |
+
}
|
1622 |
+
}
|
1623 |
+
}
|
1624 |
+
|
1625 |
+
return $res;
|
1626 |
+
}
|
1627 |
+
|
1628 |
+
/**
|
1629 |
+
* Checks if attributes match certain conditions
|
1630 |
+
* @param array $attributes array('attr' => 'val') or array(array(
|
1631 |
+
* 'operator_value' => 'equals'/'='/'contains_regex'/etc
|
1632 |
+
* 'attribute' => 'attr',
|
1633 |
+
* 'value' => 'val',
|
1634 |
+
* 'match' => true,
|
1635 |
+
* 'operator_result' => 'or'/'and',
|
1636 |
+
* 'compare' => 'total'/'namespace'/'name',
|
1637 |
+
* 'case_sensitive' => true))
|
1638 |
+
* @return bool
|
1639 |
+
* @internal Used by selector class
|
1640 |
+
* @see match()
|
1641 |
+
* @access private
|
1642 |
+
*/
|
1643 |
+
protected function match_attributes($attributes) {
|
1644 |
+
$res = false;
|
1645 |
+
|
1646 |
+
foreach($attributes as $attribute => $match) {
|
1647 |
+
if (!is_array($match)) {
|
1648 |
+
$match = array(
|
1649 |
+
'operator_value' => 'equals',
|
1650 |
+
'value' => $match,
|
1651 |
+
'match' => true,
|
1652 |
+
'operator_result' => 'or',
|
1653 |
+
'compare' => 'total',
|
1654 |
+
'case_sensitive' => false
|
1655 |
+
);
|
1656 |
+
} else {
|
1657 |
+
if (is_int($attribute)) {
|
1658 |
+
$attribute = $match['attribute'];
|
1659 |
+
}
|
1660 |
+
if (!isset($match['match'])) {
|
1661 |
+
$match['match'] = true;
|
1662 |
+
}
|
1663 |
+
if (!isset($match['operator_result'])) {
|
1664 |
+
$match['operator_result'] = 'or';
|
1665 |
+
}
|
1666 |
+
if (!isset($match['compare'])) {
|
1667 |
+
$match['compare'] = 'total';
|
1668 |
+
}
|
1669 |
+
if (!isset($match['case_sensitive'])) {
|
1670 |
+
$match['case_sensitive'] = false;
|
1671 |
+
}
|
1672 |
+
}
|
1673 |
+
|
1674 |
+
if (is_string($match['value']) && (!$match['case_sensitive'])) {
|
1675 |
+
$match['value'] = strtolower($match['value']);
|
1676 |
+
}
|
1677 |
+
|
1678 |
+
if (($match['operator_result'] === 'and') && (!$res)) {
|
1679 |
+
return false;
|
1680 |
+
} elseif (!($res && ($match['operator_result'] === 'or'))) {
|
1681 |
+
$possibles = $this->findAttribute($attribute, $match['compare'], $match['case_sensitive']);
|
1682 |
+
|
1683 |
+
$has = (is_array($possibles) && $possibles);
|
1684 |
+
$res = (($match['value'] === $has) || (($match['match'] === false) && ($has === $match['match'])));
|
1685 |
+
|
1686 |
+
if ((!$res) && $has && is_string($match['value'])) {
|
1687 |
+
foreach($possibles as $a) {
|
1688 |
+
$val = $this->attributes[$a[2]];
|
1689 |
+
if (is_string($val) && (!$match['case_sensitive'])) {
|
1690 |
+
$val = strtolower($val);
|
1691 |
+
}
|
1692 |
+
|
1693 |
+
switch($match['operator_value']) {
|
1694 |
+
case '%=':
|
1695 |
+
case 'contains_regex':
|
1696 |
+
$res = ((preg_match('`'.$match['value'].'`s', $val) > 0) === $match['match']);
|
1697 |
+
if ($res) break 1; else break 2;
|
1698 |
+
|
1699 |
+
case '|=':
|
1700 |
+
case 'contains_prefix':
|
1701 |
+
$res = ((preg_match('`\b'.preg_quote($match['value']).'[\-\s]`s', $val) > 0) === $match['match']);
|
1702 |
+
if ($res) break 1; else break 2;
|
1703 |
+
|
1704 |
+
case '~=':
|
1705 |
+
case 'contains_word':
|
1706 |
+
$res = ((preg_match('`\s'.preg_quote($match['value']).'\s`s', " $val ") > 0) === $match['match']);
|
1707 |
+
if ($res) break 1; else break 2;
|
1708 |
+
|
1709 |
+
case '*=':
|
1710 |
+
case 'contains':
|
1711 |
+
$res = ((strpos($val, $match['value']) !== false) === $match['match']);
|
1712 |
+
if ($res) break 1; else break 2;
|
1713 |
+
|
1714 |
+
case '$=':
|
1715 |
+
case 'ends_with':
|
1716 |
+
$res = ((substr($val, -strlen($match['value'])) === $match['value']) === $match['match']);
|
1717 |
+
if ($res) break 1; else break 2;
|
1718 |
+
|
1719 |
+
case '^=':
|
1720 |
+
case 'starts_with':
|
1721 |
+
$res = ((substr($val, 0, strlen($match['value'])) === $match['value']) === $match['match']);
|
1722 |
+
if ($res) break 1; else break 2;
|
1723 |
+
|
1724 |
+
case '!=':
|
1725 |
+
case 'not_equal':
|
1726 |
+
$res = (($val !== $match['value']) === $match['match']);
|
1727 |
+
if ($res) break 1; else break 2;
|
1728 |
+
|
1729 |
+
case '=':
|
1730 |
+
case 'equals':
|
1731 |
+
$res = (($val === $match['value']) === $match['match']);
|
1732 |
+
if ($res) break 1; else break 2;
|
1733 |
+
|
1734 |
+
case '>=':
|
1735 |
+
case 'bigger_than':
|
1736 |
+
$res = (($val >= $match['value']) === $match['match']);
|
1737 |
+
if ($res) break 1; else break 2;
|
1738 |
+
|
1739 |
+
case '<=':
|
1740 |
+
case 'smaller_than':
|
1741 |
+
$res = (($val >= $match['value']) === $match['match']);
|
1742 |
+
if ($res) break 1; else break 2;
|
1743 |
+
|
1744 |
+
default:
|
1745 |
+
trigger_error('Unknown operator "'.$match['operator_value'].'" to match attributes!');
|
1746 |
+
return false;
|
1747 |
+
}
|
1748 |
+
}
|
1749 |
+
}
|
1750 |
+
}
|
1751 |
+
}
|
1752 |
+
|
1753 |
+
return $res;
|
1754 |
+
}
|
1755 |
+
|
1756 |
+
/**
|
1757 |
+
* Checks if node matches certain filters
|
1758 |
+
* @param array $tags array(array(
|
1759 |
+
* 'filter' => 'last-child',
|
1760 |
+
* 'params' => '123'))
|
1761 |
+
* @param array $custom_filters Custom map next to {@link $filter_map}
|
1762 |
+
* @return bool
|
1763 |
+
* @internal Used by selector class
|
1764 |
+
* @see match()
|
1765 |
+
* @access private
|
1766 |
+
*/
|
1767 |
+
protected function match_filters($conditions, $custom_filters = array()) {
|
1768 |
+
foreach($conditions as $c) {
|
1769 |
+
$c['filter'] = strtolower($c['filter']);
|
1770 |
+
if (isset($this->filter_map[$c['filter']])) {
|
1771 |
+
if (!$this->{$this->filter_map[$c['filter']]}($c['params'])) {
|
1772 |
+
return false;
|
1773 |
+
}
|
1774 |
+
} elseif (isset($custom_filters[$c['filter']])) {
|
1775 |
+
if (!call_user_func($custom_filters[$c['filter']], $this, $c['params'])) {
|
1776 |
+
return false;
|
1777 |
+
}
|
1778 |
+
} else {
|
1779 |
+
trigger_error('Unknown filter "'.$c['filter'].'"!');
|
1780 |
+
return false;
|
1781 |
+
}
|
1782 |
+
}
|
1783 |
+
|
1784 |
+
return true;
|
1785 |
+
}
|
1786 |
+
|
1787 |
+
/**
|
1788 |
+
* Checks if node matches certain conditions
|
1789 |
+
* @param array $tags array('tags' => array(tag_conditions), 'attributes' => array(attr_conditions), 'filters' => array(filter_conditions))
|
1790 |
+
* @param array $match Should conditions evaluate to true?
|
1791 |
+
* @param array $custom_filters Custom map next to {@link $filter_map}
|
1792 |
+
* @return bool
|
1793 |
+
* @internal Used by selector class
|
1794 |
+
* @see match_tags();
|
1795 |
+
* @see match_attributes();
|
1796 |
+
* @see match_filters();
|
1797 |
+
* @access private
|
1798 |
+
*/
|
1799 |
+
function match($conditions, $match = true, $custom_filters = array()) {
|
1800 |
+
$t = isset($conditions['tags']);
|
1801 |
+
$a = isset($conditions['attributes']);
|
1802 |
+
$f = isset($conditions['filters']);
|
1803 |
+
|
1804 |
+
if (!($t || $a || $f)) {
|
1805 |
+
if (is_array($conditions) && $conditions) {
|
1806 |
+
foreach($conditions as $c) {
|
1807 |
+
if ($this->match($c, $match)) {
|
1808 |
+
return true;
|
1809 |
+
}
|
1810 |
+
}
|
1811 |
+
}
|
1812 |
+
|
1813 |
+
return false;
|
1814 |
+
} else {
|
1815 |
+
if (($t && (!$this->match_tags($conditions['tags']))) === $match) {
|
1816 |
+
return false;
|
1817 |
+
}
|
1818 |
+
|
1819 |
+
if (($a && (!$this->match_attributes($conditions['attributes']))) === $match) {
|
1820 |
+
return false;
|
1821 |
+
}
|
1822 |
+
|
1823 |
+
if (($f && (!$this->match_filters($conditions['filters'], $custom_filters))) === $match) {
|
1824 |
+
return false;
|
1825 |
+
}
|
1826 |
+
|
1827 |
+
return true;
|
1828 |
+
}
|
1829 |
+
}
|
1830 |
+
|
1831 |
+
/**
|
1832 |
+
* Finds children that match a certain attribute
|
1833 |
+
* @param string $attribute
|
1834 |
+
* @param string $value
|
1835 |
+
* @param string $mode Compare mode, "equals", "|=", "contains_regex", etc.
|
1836 |
+
* @param string $compare "total"/"namespace"/"name"
|
1837 |
+
* @param bool|int $recursive
|
1838 |
+
* @return array
|
1839 |
+
*/
|
1840 |
+
function getChildrenByAttribute($attribute, $value, $mode = 'equals', $compare = 'total', $recursive = true) {
|
1841 |
+
if ($this->childCount() < 1) {
|
1842 |
+
return array();
|
1843 |
+
}
|
1844 |
+
|
1845 |
+
$mode = explode(' ', strtolower($mode));
|
1846 |
+
$match = ((isset($mode[1]) && ($mode[1] === 'not')) ? 'false' : 'true');
|
1847 |
+
|
1848 |
+
return $this->getChildrenByMatch(
|
1849 |
+
array(
|
1850 |
+
'attributes' => array(
|
1851 |
+
$attribute => array(
|
1852 |
+
'operator_value' => $mode[0],
|
1853 |
+
'value' => $value,
|
1854 |
+
'match' => $match,
|
1855 |
+
'compare' => $compare
|
1856 |
+
)
|
1857 |
+
)
|
1858 |
+
),
|
1859 |
+
$recursive
|
1860 |
+
);
|
1861 |
+
}
|
1862 |
+
|
1863 |
+
/**
|
1864 |
+
* Finds children that match a certain tag
|
1865 |
+
* @param string $tag
|
1866 |
+
* @param string $compare "total"/"namespace"/"name"
|
1867 |
+
* @param bool|int $recursive
|
1868 |
+
* @return array
|
1869 |
+
*/
|
1870 |
+
function getChildrenByTag($tag, $compare = 'total', $recursive = true) {
|
1871 |
+
if ($this->childCount() < 1) {
|
1872 |
+
return array();
|
1873 |
+
}
|
1874 |
+
|
1875 |
+
$tag = explode(' ', strtolower($tag));
|
1876 |
+
$match = ((isset($tag[1]) && ($tag[1] === 'not')) ? 'false' : 'true');
|
1877 |
+
|
1878 |
+
return $this->getChildrenByMatch(
|
1879 |
+
array(
|
1880 |
+
'tags' => array(
|
1881 |
+
$tag[0] => array(
|
1882 |
+
'match' => $match,
|
1883 |
+
'compare' => $compare
|
1884 |
+
)
|
1885 |
+
)
|
1886 |
+
),
|
1887 |
+
$recursive
|
1888 |
+
);
|
1889 |
+
}
|
1890 |
+
|
1891 |
+
/**
|
1892 |
+
* Finds all children using ID attribute
|
1893 |
+
* @param string $id
|
1894 |
+
* @param bool|int $recursive
|
1895 |
+
* @return array
|
1896 |
+
*/
|
1897 |
+
function getChildrenByID($id, $recursive = true) {
|
1898 |
+
return $this->getChildrenByAttribute('id', $id, 'equals', 'total', $recursive);
|
1899 |
+
}
|
1900 |
+
|
1901 |
+
/**
|
1902 |
+
* Finds all children using class attribute
|
1903 |
+
* @param string $class
|
1904 |
+
* @param bool|int $recursive
|
1905 |
+
* @return array
|
1906 |
+
*/
|
1907 |
+
function getChildrenByClass($class, $recursive = true) {
|
1908 |
+
return $this->getChildrenByAttribute('class', $class, 'equals', 'total', $recursive);
|
1909 |
+
}
|
1910 |
+
|
1911 |
+
/**
|
1912 |
+
* Finds all children using name attribute
|
1913 |
+
* @param string $name
|
1914 |
+
* @param bool|int $recursive
|
1915 |
+
* @return array
|
1916 |
+
*/
|
1917 |
+
function getChildrenByName($name, $recursive = true) {
|
1918 |
+
return $this->getChildrenByAttribute('name', $name, 'equals', 'total', $recursive);
|
1919 |
+
}
|
1920 |
+
|
1921 |
+
/**
|
1922 |
+
* Performs a css query on the node.
|
1923 |
+
* @param string $query
|
1924 |
+
* @return IQuery Returns the matching nodes from the query.
|
1925 |
+
*/
|
1926 |
+
public function query($query = '*') {
|
1927 |
+
$select = $this->select($query);
|
1928 |
+
$result = new pQuery((array)$select);
|
1929 |
+
return $result;
|
1930 |
+
}
|
1931 |
+
|
1932 |
+
/**
|
1933 |
+
* Performs css query on node
|
1934 |
+
* @param string $query
|
1935 |
+
* @param int|bool $index True to return node instead of array if only 1 match,
|
1936 |
+
* false to return array, int to return match at index, negative int to count from end
|
1937 |
+
* @param bool|int $recursive
|
1938 |
+
* @param bool $check_self Include this node in search or only search child nodes
|
1939 |
+
* @return DomNode[]|DomNode Returns an array of matching {@link DomNode} objects
|
1940 |
+
* or a single {@link DomNode} if `$index` is not false.
|
1941 |
+
*/
|
1942 |
+
function select($query = '*', $index = false, $recursive = true, $check_self = false) {
|
1943 |
+
$s = new $this->selectClass($this, $query, $check_self, $recursive);
|
1944 |
+
$res = $s->result;
|
1945 |
+
unset($s);
|
1946 |
+
if (is_array($res) && ($index === true) && (count($res) === 1)) {
|
1947 |
+
return $res[0];
|
1948 |
+
} elseif (is_int($index) && is_array($res)) {
|
1949 |
+
if ($index < 0) {
|
1950 |
+
$index += count($res);
|
1951 |
+
}
|
1952 |
+
return ($index < count($res)) ? $res[$index] : null;
|
1953 |
+
} else {
|
1954 |
+
return $res;
|
1955 |
+
}
|
1956 |
+
}
|
1957 |
+
|
1958 |
+
/**
|
1959 |
+
* Checks if node matches css query filter ":root"
|
1960 |
+
* @return bool
|
1961 |
+
* @see match()
|
1962 |
+
* @access private
|
1963 |
+
*/
|
1964 |
+
protected function filter_root() {
|
1965 |
+
return (strtolower($this->tag) === 'html');
|
1966 |
+
}
|
1967 |
+
|
1968 |
+
/**
|
1969 |
+
* Checks if node matches css query filter ":nth-child(n)"
|
1970 |
+
* @param string $n 1-based index
|
1971 |
+
* @return bool
|
1972 |
+
* @see match()
|
1973 |
+
* @access private
|
1974 |
+
*/
|
1975 |
+
protected function filter_nchild($n) {
|
1976 |
+
return ($this->index(false)+1 === (int) $n);
|
1977 |
+
}
|
1978 |
+
|
1979 |
+
/**
|
1980 |
+
* Checks if node matches css query filter ":gt(n)"
|
1981 |
+
* @param string $n 0-based index
|
1982 |
+
* @return bool
|
1983 |
+
* @see match()
|
1984 |
+
* @access private
|
1985 |
+
*/
|
1986 |
+
protected function filter_gt($n) {
|
1987 |
+
return ($this->index(false) > (int) $n);
|
1988 |
+
}
|
1989 |
+
|
1990 |
+
/**
|
1991 |
+
* Checks if node matches css query filter ":lt(n)"
|
1992 |
+
* @param string $n 0-based index
|
1993 |
+
* @return bool
|
1994 |
+
* @see match()
|
1995 |
+
* @access private
|
1996 |
+
*/
|
1997 |
+
protected function filter_lt($n) {
|
1998 |
+
return ($this->index(false) < (int) $n);
|
1999 |
+
}
|
2000 |
+
|
2001 |
+
/**
|
2002 |
+
* Checks if node matches css query filter ":nth-last-child(n)"
|
2003 |
+
* @param string $n 1-based index
|
2004 |
+
* @return bool
|
2005 |
+
* @see match()
|
2006 |
+
* @access private
|
2007 |
+
*/
|
2008 |
+
protected function filter_nlastchild($n) {
|
2009 |
+
if ($this->parent === null) {
|
2010 |
+
return false;
|
2011 |
+
} else {
|
2012 |
+
return ($this->parent->childCount(true) - $this->index(false) === (int) $n);
|
2013 |
+
}
|
2014 |
+
}
|
2015 |
+
|
2016 |
+
/**
|
2017 |
+
* Checks if node matches css query filter ":nth-of-type(n)"
|
2018 |
+
* @param string $n 1-based index
|
2019 |
+
* @return bool
|
2020 |
+
* @see match()
|
2021 |
+
* @access private
|
2022 |
+
*/
|
2023 |
+
protected function filter_ntype($n) {
|
2024 |
+
return ($this->typeIndex()+1 === (int) $n);
|
2025 |
+
}
|
2026 |
+
|
2027 |
+
/**
|
2028 |
+
* Checks if node matches css query filter ":nth-last-of-type(n)"
|
2029 |
+
* @param string $n 1-based index
|
2030 |
+
* @return bool
|
2031 |
+
* @see match()
|
2032 |
+
* @access private
|
2033 |
+
*/
|
2034 |
+
protected function filter_nlastype($n) {
|
2035 |
+
if ($this->parent === null) {
|
2036 |
+
return false;
|
2037 |
+
} else {
|
2038 |
+
return (count($this->parent->getChildrenByTag($this->tag, 'total', false)) - $this->typeIndex() === (int) $n);
|
2039 |
+
}
|
2040 |
+
}
|
2041 |
+
|
2042 |
+
/**
|
2043 |
+
* Checks if node matches css query filter ":odd"
|
2044 |
+
* @return bool
|
2045 |
+
* @see match()
|
2046 |
+
* @access private
|
2047 |
+
*/
|
2048 |
+
protected function filter_odd() {
|
2049 |
+
return (($this->index(false) & 1) === 1);
|
2050 |
+
}
|
2051 |
+
|
2052 |
+
/**
|
2053 |
+
* Checks if node matches css query filter ":even"
|
2054 |
+
* @return bool
|
2055 |
+
* @see match()
|
2056 |
+
* @access private
|
2057 |
+
*/
|
2058 |
+
protected function filter_even() {
|
2059 |
+
return (($this->index(false) & 1) === 0);
|
2060 |
+
}
|
2061 |
+
|
2062 |
+
/**
|
2063 |
+
* Checks if node matches css query filter ":every(n)"
|
2064 |
+
* @return bool
|
2065 |
+
* @see match()
|
2066 |
+
* @access private
|
2067 |
+
*/
|
2068 |
+
protected function filter_every($n) {
|
2069 |
+
return (($this->index(false) % (int) $n) === 0);
|
2070 |
+
}
|
2071 |
+
|
2072 |
+
/**
|
2073 |
+
* Checks if node matches css query filter ":first"
|
2074 |
+
* @return bool
|
2075 |
+
* @see match()
|
2076 |
+
* @access private
|
2077 |
+
*/
|
2078 |
+
protected function filter_first() {
|
2079 |
+
return ($this->index(false) === 0);
|
2080 |
+
}
|
2081 |
+
|
2082 |
+
/**
|
2083 |
+
* Checks if node matches css query filter ":last"
|
2084 |
+
* @return bool
|
2085 |
+
* @see match()
|
2086 |
+
* @access private
|
2087 |
+
*/
|
2088 |
+
protected function filter_last() {
|
2089 |
+
if ($this->parent === null) {
|
2090 |
+
return false;
|
2091 |
+
} else {
|
2092 |
+
return ($this->parent->childCount(true) - 1 === $this->index(false));
|
2093 |
+
}
|
2094 |
+
}
|
2095 |
+
|
2096 |
+
/**
|
2097 |
+
* Checks if node matches css query filter ":first-of-type"
|
2098 |
+
* @return bool
|
2099 |
+
* @see match()
|
2100 |
+
* @access private
|
2101 |
+
*/
|
2102 |
+
protected function filter_firsttype() {
|
2103 |
+
return ($this->typeIndex() === 0);
|
2104 |
+
}
|
2105 |
+
|
2106 |
+
/**
|
2107 |
+
* Checks if node matches css query filter ":last-of-type"
|
2108 |
+
* @return bool
|
2109 |
+
* @see match()
|
2110 |
+
* @access private
|
2111 |
+
*/
|
2112 |
+
protected function filter_lasttype() {
|
2113 |
+
if ($this->parent === null) {
|
2114 |
+
return false;
|
2115 |
+
} else {
|
2116 |
+
return (count($this->parent->getChildrenByTag($this->tag, 'total', false)) - 1 === $this->typeIndex());
|
2117 |
+
}
|
2118 |
+
}
|
2119 |
+
|
2120 |
+
/**
|
2121 |
+
* Checks if node matches css query filter ":only-child"
|
2122 |
+
* @return bool
|
2123 |
+
* @see match()
|
2124 |
+
* @access private
|
2125 |
+
*/
|
2126 |
+
protected function filter_onlychild() {
|
2127 |
+
if ($this->parent === null) {
|
2128 |
+
return false;
|
2129 |
+
} else {
|
2130 |
+
return ($this->parent->childCount(true) === 1);
|
2131 |
+
}
|
2132 |
+
}
|
2133 |
+
|
2134 |
+
/**
|
2135 |
+
* Checks if node matches css query filter ":only-of-type"
|
2136 |
+
* @return bool
|
2137 |
+
* @see match()
|
2138 |
+
* @access private
|
2139 |
+
*/
|
2140 |
+
protected function filter_onlytype() {
|
2141 |
+
if ($this->parent === null) {
|
2142 |
+
return false;
|
2143 |
+
} else {
|
2144 |
+
return (count($this->parent->getChildrenByTag($this->tag, 'total', false)) === 1);
|
2145 |
+
}
|
2146 |
+
}
|
2147 |
+
|
2148 |
+
/**
|
2149 |
+
* Checks if node matches css query filter ":empty"
|
2150 |
+
* @return bool
|
2151 |
+
* @see match()
|
2152 |
+
* @access private
|
2153 |
+
*/
|
2154 |
+
protected function filter_empty() {
|
2155 |
+
return ($this->childCount() === 0);
|
2156 |
+
}
|
2157 |
+
|
2158 |
+
/**
|
2159 |
+
* Checks if node matches css query filter ":not-empty"
|
2160 |
+
* @return bool
|
2161 |
+
* @see match()
|
2162 |
+
* @access private
|
2163 |
+
*/
|
2164 |
+
protected function filter_notempty() {
|
2165 |
+
return ($this->childCount() !== 0);
|
2166 |
+
}
|
2167 |
+
|
2168 |
+
/**
|
2169 |
+
* Checks if node matches css query filter ":has-text"
|
2170 |
+
* @return bool
|
2171 |
+
* @see match()
|
2172 |
+
* @access private
|
2173 |
+
*/
|
2174 |
+
protected function filter_hastext() {
|
2175 |
+
return ($this->getPlainText() !== '');
|
2176 |
+
}
|
2177 |
+
|
2178 |
+
/**
|
2179 |
+
* Checks if node matches css query filter ":no-text"
|
2180 |
+
* @return bool
|
2181 |
+
* @see match()
|
2182 |
+
* @access private
|
2183 |
+
*/
|
2184 |
+
protected function filter_notext() {
|
2185 |
+
return ($this->getPlainText() === '');
|
2186 |
+
}
|
2187 |
+
|
2188 |
+
/**
|
2189 |
+
* Checks if node matches css query filter ":lang(s)"
|
2190 |
+
* @param string $lang
|
2191 |
+
* @return bool
|
2192 |
+
* @see match()
|
2193 |
+
* @access private
|
2194 |
+
*/
|
2195 |
+
protected function filter_lang($lang) {
|
2196 |
+
return ($this->lang === $lang);
|
2197 |
+
}
|
2198 |
+
|
2199 |
+
/**
|
2200 |
+
* Checks if node matches css query filter ":contains(s)"
|
2201 |
+
* @param string $text
|
2202 |
+
* @return bool
|
2203 |
+
* @see match()
|
2204 |
+
* @access private
|
2205 |
+
*/
|
2206 |
+
protected function filter_contains($text) {
|
2207 |
+
return (strpos($this->getPlainTextUTF8(), $text) !== false);
|
2208 |
+
}
|
2209 |
+
|
2210 |
+
/**
|
2211 |
+
* Checks if node matches css query filter ":has(s)"
|
2212 |
+
* @param string $selector
|
2213 |
+
* @return bool
|
2214 |
+
* @see match()
|
2215 |
+
* @access private
|
2216 |
+
*/
|
2217 |
+
protected function filter_has($selector) {
|
2218 |
+
$s = $this->select((string) $selector, false);
|
2219 |
+
return (is_array($s) && (count($s) > 0));
|
2220 |
+
}
|
2221 |
+
|
2222 |
+
/**
|
2223 |
+
* Checks if node matches css query filter ":not(s)"
|
2224 |
+
* @param string $selector
|
2225 |
+
* @return bool
|
2226 |
+
* @see match()
|
2227 |
+
* @access private
|
2228 |
+
*/
|
2229 |
+
protected function filter_not($selector) {
|
2230 |
+
$s = $this->select((string) $selector, false, true, true);
|
2231 |
+
return ((!is_array($s)) || (array_search($this, $s, true) === false));
|
2232 |
+
}
|
2233 |
+
|
2234 |
+
/**
|
2235 |
+
* Checks if node matches css query filter ":element"
|
2236 |
+
* @return bool
|
2237 |
+
* @see match()
|
2238 |
+
* @access private
|
2239 |
+
*/
|
2240 |
+
protected function filter_element() {
|
2241 |
+
return true;
|
2242 |
+
}
|
2243 |
+
|
2244 |
+
/**
|
2245 |
+
* Checks if node matches css query filter ":text"
|
2246 |
+
* @return bool
|
2247 |
+
* @see match()
|
2248 |
+
* @access private
|
2249 |
+
*/
|
2250 |
+
protected function filter_text() {
|
2251 |
+
return false;
|
2252 |
+
}
|
2253 |
+
|
2254 |
+
/**
|
2255 |
+
* Checks if a node matches css query filter ":checked"
|
2256 |
+
* @return bool
|
2257 |
+
* @see match()
|
2258 |
+
*/
|
2259 |
+
protected function filter_checked() {
|
2260 |
+
$attr = $this->getAttribute('checked');
|
2261 |
+
if (is_array($attr))
|
2262 |
+
$attr = reset($attr);
|
2263 |
+
return strcasecmp($attr, 'checked') === 0;
|
2264 |
+
}
|
2265 |
+
|
2266 |
+
/**
|
2267 |
+
* Checks if node matches css query filter ":comment"
|
2268 |
+
* @return bool
|
2269 |
+
* @see match()
|
2270 |
+
* @access private
|
2271 |
+
*/
|
2272 |
+
protected function filter_comment() {
|
2273 |
+
return false;
|
2274 |
+
}
|
2275 |
+
|
2276 |
+
/**
|
2277 |
+
* Checks if a node matches css query filter ":selected"
|
2278 |
+
* @return bool
|
2279 |
+
* @see match()
|
2280 |
+
*/
|
2281 |
+
protected function filter_selected() {
|
2282 |
+
$attr = $this->getAttribute('selected');
|
2283 |
+
if (is_array($attr))
|
2284 |
+
$attr = reset($attr);
|
2285 |
+
|
2286 |
+
return strcasecmp($attr, 'selected') === 0;
|
2287 |
+
}
|
2288 |
+
|
2289 |
+
public function after($content) {
|
2290 |
+
$offset = $this->index() + 1;
|
2291 |
+
$parent = $this->parent;
|
2292 |
+
$nodes = $this->createNodes($content);
|
2293 |
+
|
2294 |
+
foreach ($nodes as $node) {
|
2295 |
+
$node->changeParent($parent, $offset);
|
2296 |
+
}
|
2297 |
+
return $this;
|
2298 |
+
}
|
2299 |
+
|
2300 |
+
|
2301 |
+
/**
|
2302 |
+
* Create a {@link DomNode} from its string representation.
|
2303 |
+
* @param string|DomNode $content
|
2304 |
+
* @return DomNode
|
2305 |
+
*/
|
2306 |
+
protected function createNode($content) {
|
2307 |
+
$nodes = $this->createNodes($content);
|
2308 |
+
return reset($nodes);
|
2309 |
+
}
|
2310 |
+
|
2311 |
+
/**
|
2312 |
+
* Create an array of {@link DomNode} objects from their string representation.
|
2313 |
+
* @param string|DomNode $content
|
2314 |
+
* @return DomNode[]
|
2315 |
+
*/
|
2316 |
+
protected function createNodes($content) {
|
2317 |
+
if (is_string($content)) {
|
2318 |
+
if (strpos($content, ' ') === false) {
|
2319 |
+
$nodes = array(new $this->childClass($content, $this));
|
2320 |
+
} else {
|
2321 |
+
$node = new $this->parserClass($content);
|
2322 |
+
$nodes = $node->root->children;
|
2323 |
+
}
|
2324 |
+
} else {
|
2325 |
+
$nodes = (array)$content;
|
2326 |
+
}
|
2327 |
+
return $nodes;
|
2328 |
+
}
|
2329 |
+
|
2330 |
+
public function append($content) {
|
2331 |
+
$nodes = $this->createNodes($content);
|
2332 |
+
foreach ($nodes as $node) {
|
2333 |
+
$node->changeParent($this);
|
2334 |
+
}
|
2335 |
+
return $this;
|
2336 |
+
}
|
2337 |
+
|
2338 |
+
public function attr($name, $value = null) {
|
2339 |
+
if ($value === null)
|
2340 |
+
return $this->getAttribute($name);
|
2341 |
+
|
2342 |
+
$this->setAttribute($name, $value);
|
2343 |
+
return $this;
|
2344 |
+
}
|
2345 |
+
|
2346 |
+
public function before($content) {
|
2347 |
+
$offset = $this->index();
|
2348 |
+
$parent = $this->parent;
|
2349 |
+
$nodes = $this->createNodes($content);
|
2350 |
+
|
2351 |
+
foreach ($nodes as $node) {
|
2352 |
+
$node->changeParent($parent, $offset);
|
2353 |
+
}
|
2354 |
+
|
2355 |
+
return $this;
|
2356 |
+
}
|
2357 |
+
|
2358 |
+
public function count(): int {
|
2359 |
+
return 1;
|
2360 |
+
}
|
2361 |
+
|
2362 |
+
// public function css($name, $value = null) {
|
2363 |
+
//
|
2364 |
+
// }
|
2365 |
+
|
2366 |
+
public function prepend($content = null) {
|
2367 |
+
$offset = 0;
|
2368 |
+
$parent = $this;
|
2369 |
+
$nodes = $this->createNodes($content);
|
2370 |
+
|
2371 |
+
foreach ($nodes as $node) {
|
2372 |
+
$node->changeParent($parent, $offset);
|
2373 |
+
}
|
2374 |
+
|
2375 |
+
return $this;
|
2376 |
+
}
|
2377 |
+
|
2378 |
+
public function prop($name, $value = null) {
|
2379 |
+
switch (strtolower($name)) {
|
2380 |
+
case 'checked':
|
2381 |
+
case 'disabled':
|
2382 |
+
case 'selected':
|
2383 |
+
if ($value !== null) {
|
2384 |
+
if ($value) {
|
2385 |
+
$this->attr($name, $name);
|
2386 |
+
} else {
|
2387 |
+
$this->removeAttr($name);
|
2388 |
+
}
|
2389 |
+
return $this;
|
2390 |
+
}
|
2391 |
+
return $this->attr($name) == $name;
|
2392 |
+
case 'tagname':
|
2393 |
+
return $this->tagName($value);
|
2394 |
+
}
|
2395 |
+
// The property is not supported, degrade gracefully
|
2396 |
+
if ($value === null)
|
2397 |
+
return $this;
|
2398 |
+
else
|
2399 |
+
return null;
|
2400 |
+
}
|
2401 |
+
|
2402 |
+
public function remove($selector = null) {
|
2403 |
+
if ($selector == null) {
|
2404 |
+
$this->delete();
|
2405 |
+
} else {
|
2406 |
+
$nodes = (array)$this->select($selector);
|
2407 |
+
foreach ($nodes as $node) {
|
2408 |
+
$node->delete();
|
2409 |
+
}
|
2410 |
+
}
|
2411 |
+
}
|
2412 |
+
|
2413 |
+
public function removeAttr($name) {
|
2414 |
+
$this->deleteAttribute($name);
|
2415 |
+
|
2416 |
+
return $this;
|
2417 |
+
}
|
2418 |
+
|
2419 |
+
function replaceWith($content) {
|
2420 |
+
$node_index = $this->index();
|
2421 |
+
|
2422 |
+
// Add the new node.
|
2423 |
+
$node = $this->createNode($content);
|
2424 |
+
$node->changeParent($this->parent, $node_index);
|
2425 |
+
|
2426 |
+
// Remove this node.
|
2427 |
+
$this->remove();
|
2428 |
+
|
2429 |
+
return $node;
|
2430 |
+
}
|
2431 |
+
|
2432 |
+
/**
|
2433 |
+
* @param type $value
|
2434 |
+
* @return string|DomNode
|
2435 |
+
*/
|
2436 |
+
public function tagName($value = null) {
|
2437 |
+
if ($value !== null) {
|
2438 |
+
$this->setTag($value);
|
2439 |
+
return $this;
|
2440 |
+
}
|
2441 |
+
return $this->getTag();
|
2442 |
+
}
|
2443 |
+
|
2444 |
+
public function text($value = null) {
|
2445 |
+
if ($value === null)
|
2446 |
+
return $this->getPlainText();
|
2447 |
+
|
2448 |
+
$this->setPlainText($value);
|
2449 |
+
return $this;
|
2450 |
+
}
|
2451 |
+
|
2452 |
+
public function toggleClass($classname, $switch = null) {
|
2453 |
+
if ($switch === true) {
|
2454 |
+
$this->addClass($classname);
|
2455 |
+
} elseif ($switch === false) {
|
2456 |
+
$this->removeClass($classname);
|
2457 |
+
} else {
|
2458 |
+
if ($this->hasClass($classname))
|
2459 |
+
$this->removeClass($classname);
|
2460 |
+
else
|
2461 |
+
$this->addClass($classname);
|
2462 |
+
}
|
2463 |
+
return $this;
|
2464 |
+
}
|
2465 |
+
|
2466 |
+
public function unwrap() {
|
2467 |
+
$this->parent->detach(true);
|
2468 |
+
return $this;
|
2469 |
+
}
|
2470 |
+
|
2471 |
+
public function val($value = null) {
|
2472 |
+
switch (strtolower($this->tag)) {
|
2473 |
+
case 'select':
|
2474 |
+
if ($value === null) {
|
2475 |
+
// Return the value of a selected child.
|
2476 |
+
return $this->query('option:selected')->attr('value');
|
2477 |
+
} else {
|
2478 |
+
// Select the option with the right value and deselect the others.
|
2479 |
+
foreach ($this->query('option') as $option) {
|
2480 |
+
if ($option->attr('value') == $value) {
|
2481 |
+
$option->attr('selected', 'selected');
|
2482 |
+
} else {
|
2483 |
+
$option->removeAttr('selected');
|
2484 |
+
}
|
2485 |
+
}
|
2486 |
+
return $this;
|
2487 |
+
}
|
2488 |
+
case 'textarea':
|
2489 |
+
if ($value === null) {
|
2490 |
+
// Return the contents of the textarea.
|
2491 |
+
return $this->getInnerText();
|
2492 |
+
} else {
|
2493 |
+
// Set the contents of the textarea.
|
2494 |
+
$this->setInnerText($value);
|
2495 |
+
return $this;
|
2496 |
+
}
|
2497 |
+
case 'input':
|
2498 |
+
switch (strtolower($this->getAttribute('type'))) {
|
2499 |
+
case 'checkbox':
|
2500 |
+
if ($value === null)
|
2501 |
+
return $this->prop('checked') ? $this->getAttribute('value') : null;
|
2502 |
+
else {
|
2503 |
+
if (!$value) {
|
2504 |
+
$this->deleteAttribute('checked');
|
2505 |
+
} else {
|
2506 |
+
$this->setAttribute('value', $value);
|
2507 |
+
$this->setAttribute('checked', 'checked');
|
2508 |
+
}
|
2509 |
+
return $this;
|
2510 |
+
}
|
2511 |
+
}
|
2512 |
+
}
|
2513 |
+
|
2514 |
+
// Other node types can just get/set the value attribute.
|
2515 |
+
if ($value !== null) {
|
2516 |
+
$this->setAttribute('value', $value);
|
2517 |
+
return $this;
|
2518 |
+
}
|
2519 |
+
return $this->getAttribute('value');
|
2520 |
+
}
|
2521 |
+
|
2522 |
+
}
|
2523 |
+
|
2524 |
+
/**
|
2525 |
+
* Node subclass for text
|
2526 |
+
*/
|
2527 |
+
class TextNode extends DomNode {
|
2528 |
+
#php4 Compatibility with PHP4, this gets changed to a regular var in release tool
|
2529 |
+
#static $NODE_TYPE = self::NODE_TEXT;
|
2530 |
+
#php4e
|
2531 |
+
#php5
|
2532 |
+
const NODE_TYPE = self::NODE_TEXT;
|
2533 |
+
#php5e
|
2534 |
+
var $tag = '~text~';
|
2535 |
+
|
2536 |
+
/**
|
2537 |
+
* @var string
|
2538 |
+
*/
|
2539 |
+
var $text = '';
|
2540 |
+
|
2541 |
+
/**
|
2542 |
+
* Class constructor
|
2543 |
+
* @param DomNode $parent
|
2544 |
+
* @param string $text
|
2545 |
+
*/
|
2546 |
+
function __construct($parent, $text = '') {
|
2547 |
+
$this->parent = $parent;
|
2548 |
+
$this->text = $text;
|
2549 |
+
}
|
2550 |
+
|
2551 |
+
#php4 PHP4 class constructor compatibility
|
2552 |
+
#function TextNode($parent, $text = '') {return $this->__construct($parent, $text);}
|
2553 |
+
#php4e
|
2554 |
+
|
2555 |
+
function isText() {return true;}
|
2556 |
+
function isTextOrComment() {return true;}
|
2557 |
+
protected function filter_element() {return false;}
|
2558 |
+
protected function filter_text() {return true;}
|
2559 |
+
function toString_attributes() {return '';}
|
2560 |
+
function toString_content($attributes = true, $recursive = true, $content_only = false) {return $this->text;}
|
2561 |
+
function toString($attributes = true, $recursive = true, $content_only = false) {return $this->text;}
|
2562 |
+
|
2563 |
+
/**
|
2564 |
+
* {@inheritdoc}
|
2565 |
+
*/
|
2566 |
+
public function text($value = null) {
|
2567 |
+
if ($value !== null) {
|
2568 |
+
$this->text = $value;
|
2569 |
+
return $this;
|
2570 |
+
}
|
2571 |
+
return $this->text;
|
2572 |
+
}
|
2573 |
+
|
2574 |
+
/**
|
2575 |
+
* {@inheritdoc}
|
2576 |
+
*/
|
2577 |
+
public function html($value = null) {
|
2578 |
+
if ($value !== null) {
|
2579 |
+
$this->text = $value;
|
2580 |
+
return $this;
|
2581 |
+
}
|
2582 |
+
return $this->text;
|
2583 |
+
}
|
2584 |
+
}
|
2585 |
+
|
2586 |
+
/**
|
2587 |
+
* Node subclass for comments
|
2588 |
+
*/
|
2589 |
+
class CommentNode extends DomNode {
|
2590 |
+
#php4 Compatibility with PHP4, this gets changed to a regular var in release tool
|
2591 |
+
#static $NODE_TYPE = self::NODE_COMMENT;
|
2592 |
+
#php4e
|
2593 |
+
#php5
|
2594 |
+
const NODE_TYPE = self::NODE_COMMENT;
|
2595 |
+
#php5e
|
2596 |
+
var $tag = '~comment~';
|
2597 |
+
|
2598 |
+
/**
|
2599 |
+
* @var string
|
2600 |
+
*/
|
2601 |
+
var $text = '';
|
2602 |
+
|
2603 |
+
/**
|
2604 |
+
* Class constructor
|
2605 |
+
* @param DomNode $parent
|
2606 |
+
* @param string $text
|
2607 |
+
*/
|
2608 |
+
function __construct($parent, $text = '') {
|
2609 |
+
$this->parent = $parent;
|
2610 |
+
$this->text = $text;
|
2611 |
+
}
|
2612 |
+
|
2613 |
+
#php4 PHP4 class constructor compatibility
|
2614 |
+
#function CommentNode($parent, $text = '') {return $this->__construct($parent, $text);}
|
2615 |
+
#php4e
|
2616 |
+
|
2617 |
+
function isComment() {return true;}
|
2618 |
+
function isTextOrComment() {return true;}
|
2619 |
+
protected function filter_element() {return false;}
|
2620 |
+
protected function filter_comment() {return true;}
|
2621 |
+
function toString_attributes() {return '';}
|
2622 |
+
function toString_content($attributes = true, $recursive = true, $content_only = false) {return $this->text;}
|
2623 |
+
function toString($attributes = true, $recursive = true, $content_only = false) {return '<!--'.$this->text.'-->';}
|
2624 |
+
}
|
2625 |
+
|
2626 |
+
/**
|
2627 |
+
* Node subclass for conditional tags
|
2628 |
+
*/
|
2629 |
+
class ConditionalTagNode extends DomNode {
|
2630 |
+
#php4 Compatibility with PHP4, this gets changed to a regular var in release tool
|
2631 |
+
#static $NODE_TYPE = self::NODE_CONDITIONAL;
|
2632 |
+
#php4e
|
2633 |
+
#php5
|
2634 |
+
const NODE_TYPE = self::NODE_CONDITIONAL;
|
2635 |
+
#php5e
|
2636 |
+
var $tag = '~conditional~';
|
2637 |
+
|
2638 |
+
/**
|
2639 |
+
* @var string
|
2640 |
+
*/
|
2641 |
+
var $condition = '';
|
2642 |
+
|
2643 |
+
/**
|
2644 |
+
* Class constructor
|
2645 |
+
* @param DomNode $parent
|
2646 |
+
* @param string $condition e.g. "if IE"
|
2647 |
+
* @param bool $hidden <!--[if if true, <![if if false
|
2648 |
+
*/
|
2649 |
+
function __construct($parent, $condition = '', $hidden = true) {
|
2650 |
+
$this->parent = $parent;
|
2651 |
+
$this->hidden = $hidden;
|
2652 |
+
$this->condition = $condition;
|
2653 |
+
}
|
2654 |
+
|
2655 |
+
#php4 PHP4 class constructor compatibility
|
2656 |
+
#function ConditionalTagNode($parent, $condition = '', $hidden = true) {return $this->__construct($parent, $condition, $hidden);}
|
2657 |
+
#php4e
|
2658 |
+
|
2659 |
+
protected function filter_element() {return false;}
|
2660 |
+
function toString_attributes() {return '';}
|
2661 |
+
function toString($attributes = true, $recursive = true, $content_only = false) {
|
2662 |
+
if ($content_only) {
|
2663 |
+
if (is_int($content_only)) {
|
2664 |
+
--$content_only;
|
2665 |
+
}
|
2666 |
+
return $this->toString_content($attributes, $recursive, $content_only);
|
2667 |
+
}
|
2668 |
+
|
2669 |
+
$s = '<!'.(($this->hidden) ? '--' : '').'['.$this->condition.']>';
|
2670 |
+
if($recursive) {
|
2671 |
+
$s .= $this->toString_content($attributes);
|
2672 |
+
}
|
2673 |
+
$s .= '<![endif]'.(($this->hidden) ? '--' : '').'>';
|
2674 |
+
return $s;
|
2675 |
+
}
|
2676 |
+
}
|
2677 |
+
|
2678 |
+
/**
|
2679 |
+
* Node subclass for CDATA tags
|
2680 |
+
*/
|
2681 |
+
class CdataNode extends DomNode {
|
2682 |
+
#php4 Compatibility with PHP4, this gets changed to a regular var in release tool
|
2683 |
+
#static $NODE_TYPE = self::NODE_CDATA;
|
2684 |
+
#php4e
|
2685 |
+
#php5
|
2686 |
+
const NODE_TYPE = self::NODE_CDATA;
|
2687 |
+
#php5e
|
2688 |
+
var $tag = '~cdata~';
|
2689 |
+
|
2690 |
+
/**
|
2691 |
+
* @var string
|
2692 |
+
*/
|
2693 |
+
var $text = '';
|
2694 |
+
|
2695 |
+
/**
|
2696 |
+
* Class constructor
|
2697 |
+
* @param DomNode $parent
|
2698 |
+
* @param string $text
|
2699 |
+
*/
|
2700 |
+
function __construct($parent, $text = '') {
|
2701 |
+
$this->parent = $parent;
|
2702 |
+
$this->text = $text;
|
2703 |
+
}
|
2704 |
+
|
2705 |
+
#php4 PHP4 class constructor compatibility
|
2706 |
+
#function CdataNode($parent, $text = '') {return $this->__construct($parent, $text);}
|
2707 |
+
#php4e
|
2708 |
+
|
2709 |
+
protected function filter_element() {return false;}
|
2710 |
+
function toString_attributes() {return '';}
|
2711 |
+
function toString_content($attributes = true, $recursive = true, $content_only = false) {return $this->text;}
|
2712 |
+
function toString($attributes = true, $recursive = true, $content_only = false) {return '<![CDATA['.$this->text.']]>';}
|
2713 |
+
}
|
2714 |
+
|
2715 |
+
/**
|
2716 |
+
* Node subclass for doctype tags
|
2717 |
+
*/
|
2718 |
+
class DoctypeNode extends DomNode {
|
2719 |
+
#php4 Compatibility with PHP4, this gets changed to a regular var in release tool
|
2720 |
+
#static $NODE_TYPE = self::NODE_DOCTYPE;
|
2721 |
+
#php4e
|
2722 |
+
#php5
|
2723 |
+
const NODE_TYPE = self::NODE_DOCTYPE;
|
2724 |
+
#php5e
|
2725 |
+
var $tag = '!DOCTYPE';
|
2726 |
+
|
2727 |
+
/**
|
2728 |
+
* @var string
|
2729 |
+
*/
|
2730 |
+
var $dtd = '';
|
2731 |
+
|
2732 |
+
/**
|
2733 |
+
* Class constructor
|
2734 |
+
* @param DomNode $parent
|
2735 |
+
* @param string $dtd
|
2736 |
+
*/
|
2737 |
+
function __construct($parent, $dtd = '') {
|
2738 |
+
$this->parent = $parent;
|
2739 |
+
$this->dtd = $dtd;
|
2740 |
+
}
|
2741 |
+
|
2742 |
+
#php4 PHP4 class constructor compatibility
|
2743 |
+
#function DoctypeNode($parent, $dtd = '') {return $this->__construct($parent, $dtd);}
|
2744 |
+
#php4e
|
2745 |
+
|
2746 |
+
protected function filter_element() {return false;}
|
2747 |
+
function toString_attributes() {return '';}
|
2748 |
+
function toString_content($attributes = true, $recursive = true, $content_only = false) {return $this->text;}
|
2749 |
+
function toString($attributes = true, $recursive = true, $content_only = false) {return '<'.$this->tag.' '.$this->dtd.'>';}
|
2750 |
+
}
|
2751 |
+
|
2752 |
+
/**
|
2753 |
+
* Node subclass for embedded tags like xml, php and asp
|
2754 |
+
*/
|
2755 |
+
class EmbeddedNode extends DomNode {
|
2756 |
+
|
2757 |
+
/**
|
2758 |
+
* @var string
|
2759 |
+
* @internal specific char for tags, like ? for php and % for asp
|
2760 |
+
* @access private
|
2761 |
+
*/
|
2762 |
+
var $tag_char = '';
|
2763 |
+
|
2764 |
+
/**
|
2765 |
+
* @var string
|
2766 |
+
*/
|
2767 |
+
var $text = '';
|
2768 |
+
|
2769 |
+
/**
|
2770 |
+
* Class constructor
|
2771 |
+
* @param DomNode $parent
|
2772 |
+
* @param string $tag_char {@link $tag_char}
|
2773 |
+
* @param string $tag {@link $tag}
|
2774 |
+
* @param string $text
|
2775 |
+
* @param array $attributes array('attr' => 'val')
|
2776 |
+
*/
|
2777 |
+
function __construct($parent, $tag_char = '', $tag = '', $text = '', $attributes = array()) {
|
2778 |
+
$this->parent = $parent;
|
2779 |
+
$this->tag_char = $tag_char;
|
2780 |
+
if ($tag[0] !== $this->tag_char) {
|
2781 |
+
$tag = $this->tag_char.$tag;
|
2782 |
+
}
|
2783 |
+
$this->tag = $tag;
|
2784 |
+
$this->text = $text;
|
2785 |
+
$this->attributes = $attributes;
|
2786 |
+
$this->self_close_str = $tag_char;
|
2787 |
+
}
|
2788 |
+
|
2789 |
+
#php4 PHP4 class constructor compatibility
|
2790 |
+
#function EmbeddedNode($parent, $tag_char = '', $tag = '', $text = '', $attributes = array()) {return $this->__construct($parent, $tag_char, $tag, $text, $attributes);}
|
2791 |
+
#php4e
|
2792 |
+
|
2793 |
+
protected function filter_element() {return false;}
|
2794 |
+
function toString($attributes = true, $recursive = true, $content_only = false) {
|
2795 |
+
$s = '<'.$this->tag;
|
2796 |
+
if ($attributes) {
|
2797 |
+
$s .= $this->toString_attributes();
|
2798 |
+
}
|
2799 |
+
$s .= $this->text.$this->self_close_str.'>';
|
2800 |
+
return $s;
|
2801 |
+
}
|
2802 |
+
}
|
2803 |
+
|
2804 |
+
/**
|
2805 |
+
* Node subclass for "?" tags, like php and xml
|
2806 |
+
*/
|
2807 |
+
class XmlNode extends EmbeddedNode {
|
2808 |
+
#php4 Compatibility with PHP4, this gets changed to a regular var in release tool
|
2809 |
+
#static $NODE_TYPE = self::NODE_XML;
|
2810 |
+
#php4e
|
2811 |
+
#php5
|
2812 |
+
const NODE_TYPE = self::NODE_XML;
|
2813 |
+
#php5e
|
2814 |
+
|
2815 |
+
/**
|
2816 |
+
* Class constructor
|
2817 |
+
* @param DomNode $parent
|
2818 |
+
* @param string $tag {@link $tag}
|
2819 |
+
* @param string $text
|
2820 |
+
* @param array $attributes array('attr' => 'val')
|
2821 |
+
*/
|
2822 |
+
function __construct($parent, $tag = 'xml', $text = '', $attributes = array()) {
|
2823 |
+
return parent::__construct($parent, '?', $tag, $text, $attributes);
|
2824 |
+
}
|
2825 |
+
|
2826 |
+
#php4 PHP4 class constructor compatibility
|
2827 |
+
#function XmlNode($parent, $tag = 'xml', $text = '', $attributes = array()) {return $this->__construct($parent, $tag, $text, $attributes);}
|
2828 |
+
#php4e
|
2829 |
+
}
|
2830 |
+
|
2831 |
+
/**
|
2832 |
+
* Node subclass for asp tags
|
2833 |
+
*/
|
2834 |
+
class AspEmbeddedNode extends EmbeddedNode {
|
2835 |
+
#php4 Compatibility with PHP4, this gets changed to a regular var in release tool
|
2836 |
+
#static $NODE_TYPE = self::NODE_ASP;
|
2837 |
+
#php4e
|
2838 |
+
#php5
|
2839 |
+
const NODE_TYPE = self::NODE_ASP;
|
2840 |
+
#php5e
|
2841 |
+
|
2842 |
+
/**
|
2843 |
+
* Class constructor
|
2844 |
+
* @param DomNode $parent
|
2845 |
+
* @param string $tag {@link $tag}
|
2846 |
+
* @param string $text
|
2847 |
+
* @param array $attributes array('attr' => 'val')
|
2848 |
+
*/
|
2849 |
+
function __construct($parent, $tag = '', $text = '', $attributes = array()) {
|
2850 |
+
return parent::__construct($parent, '%', $tag, $text, $attributes);
|
2851 |
+
}
|
2852 |
+
|
2853 |
+
#php4 PHP4 class constructor compatibility
|
2854 |
+
#function AspEmbeddedNode($parent, $tag = '', $text = '', $attributes = array()) {return $this->__construct($parent, $tag, $text, $attributes);}
|
2855 |
+
#php4e
|
2856 |
+
}
|
lib-3rd-party/pquery/gan_parser_html.php
ADDED
@@ -0,0 +1,840 @@
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* @author Niels A.D.
|
4 |
+
* @author Todd Burry <todd@vanillaforums.com>
|
5 |
+
* @copyright 2010 Niels A.D., 2014 Todd Burry
|
6 |
+
* @license http://opensource.org/licenses/LGPL-2.1 LGPL-2.1
|
7 |
+
* @package pQuery
|
8 |
+
*/
|
9 |
+
|
10 |
+
namespace MailPoetVendor\pQuery;
|
11 |
+
|
12 |
+
if (!defined('ABSPATH')) exit;
|
13 |
+
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Parses a HTML document
|
17 |
+
*
|
18 |
+
* Functionality can be extended by overriding functions or adjusting the tag map.
|
19 |
+
* Document may contain small errors, the parser will try to recover and resume parsing.
|
20 |
+
*/
|
21 |
+
class HtmlParserBase extends TokenizerBase {
|
22 |
+
|
23 |
+
/**
|
24 |
+
* Tag open token, used for "<"
|
25 |
+
*/
|
26 |
+
const TOK_TAG_OPEN = 100;
|
27 |
+
/**
|
28 |
+
* Tag close token, used for ">"
|
29 |
+
*/
|
30 |
+
const TOK_TAG_CLOSE = 101;
|
31 |
+
/**
|
32 |
+
* Forward slash token, used for "/"
|
33 |
+
*/
|
34 |
+
const TOK_SLASH_FORWARD = 103;
|
35 |
+
/**
|
36 |
+
* Backslash token, used for "\"
|
37 |
+
*/
|
38 |
+
const TOK_SLASH_BACKWARD = 104;
|
39 |
+
/**
|
40 |
+
* String token, used for attribute values (" and ')
|
41 |
+
*/
|
42 |
+
const TOK_STRING = 104;
|
43 |
+
/**
|
44 |
+
* Equals token, used for "="
|
45 |
+
*/
|
46 |
+
const TOK_EQUALS = 105;
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Sets HTML identifiers, tags/attributes are considered identifiers
|
50 |
+
* @see TokenizerBase::$identifiers
|
51 |
+
* @access private
|
52 |
+
*/
|
53 |
+
var $identifiers = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890:-_!?%';
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Status of the parser (tagname, closing tag, etc)
|
57 |
+
* @var array
|
58 |
+
*/
|
59 |
+
var $status = array();
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Map characters to match their tokens
|
63 |
+
* @see TokenizerBase::$custom_char_map
|
64 |
+
* @access private
|
65 |
+
*/
|
66 |
+
var $custom_char_map = array(
|
67 |
+
'<' => self::TOK_TAG_OPEN,
|
68 |
+
'>' => self::TOK_TAG_CLOSE,
|
69 |
+
"'" => 'parse_string',
|
70 |
+
'"' => 'parse_string',
|
71 |
+
'/' => self::TOK_SLASH_FORWARD,
|
72 |
+
'\\' => self::TOK_SLASH_BACKWARD,
|
73 |
+
'=' => self::TOK_EQUALS
|
74 |
+
);
|
75 |
+
|
76 |
+
function __construct($doc = '', $pos = 0) {
|
77 |
+
parent::__construct($doc, $pos);
|
78 |
+
$this->parse_all();
|
79 |
+
}
|
80 |
+
|
81 |
+
#php4 PHP4 class constructor compatibility
|
82 |
+
#function HtmlParserBase($doc = '', $pos = 0) {return $this->__construct($doc, $pos);}
|
83 |
+
#php4e
|
84 |
+
|
85 |
+
/**
|
86 |
+
Callback functions for certain tags
|
87 |
+
@var array (TAG_NAME => FUNCTION_NAME)
|
88 |
+
@internal Function should be a method in the class
|
89 |
+
@internal Tagname should be lowercase and is everything after <, e.g. "?php" or "!doctype"
|
90 |
+
@access private
|
91 |
+
*/
|
92 |
+
var $tag_map = array(
|
93 |
+
'!doctype' => 'parse_doctype',
|
94 |
+
'?' => 'parse_php',
|
95 |
+
'?php' => 'parse_php',
|
96 |
+
'%' => 'parse_asp',
|
97 |
+
'style' => 'parse_style',
|
98 |
+
'script' => 'parse_script'
|
99 |
+
);
|
100 |
+
|
101 |
+
/**
|
102 |
+
* Parse a HTML string (attributes)
|
103 |
+
* @internal Gets called with ' and "
|
104 |
+
* @return int
|
105 |
+
*/
|
106 |
+
protected function parse_string() {
|
107 |
+
if ($this->next_pos($this->doc[$this->pos], false) !== self::TOK_UNKNOWN) {
|
108 |
+
--$this->pos;
|
109 |
+
}
|
110 |
+
return self::TOK_STRING;
|
111 |
+
}
|
112 |
+
|
113 |
+
/**
|
114 |
+
* Parse text between tags
|
115 |
+
* @internal Gets called between tags, uses {@link $status}[last_pos]
|
116 |
+
* @internal Stores text in {@link $status}[text]
|
117 |
+
*/
|
118 |
+
function parse_text() {
|
119 |
+
$len = $this->pos - 1 - $this->status['last_pos'];
|
120 |
+
$this->status['text'] = (($len > 0) ? substr($this->doc, $this->status['last_pos'] + 1, $len) : '');
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Parse comment tags
|
125 |
+
* @internal Gets called with HTML comments ("<!--")
|
126 |
+
* @internal Stores text in {@link $status}[comment]
|
127 |
+
* @return bool
|
128 |
+
*/
|
129 |
+
function parse_comment() {
|
130 |
+
$this->pos += 3;
|
131 |
+
if ($this->next_pos('-->', false) !== self::TOK_UNKNOWN) {
|
132 |
+
$this->status['comment'] = $this->getTokenString(1, -1);
|
133 |
+
--$this->pos;
|
134 |
+
} else {
|
135 |
+
$this->status['comment'] = $this->getTokenString(1, -1);
|
136 |
+
$this->pos += 2;
|
137 |
+
}
|
138 |
+
$this->status['last_pos'] = $this->pos;
|
139 |
+
|
140 |
+
return true;
|
141 |
+
}
|
142 |
+
|
143 |
+
/**
|
144 |
+
* Parse doctype tag
|
145 |
+
* @internal Gets called with doctype ("<!doctype")
|
146 |
+
* @internal Stores text in {@link $status}[dtd]
|
147 |
+
* @return bool
|
148 |
+
*/
|
149 |
+
function parse_doctype() {
|
150 |
+
$start = $this->pos;
|
151 |
+
if ($this->next_search('[>', false) === self::TOK_UNKNOWN) {
|
152 |
+
if ($this->doc[$this->pos] === '[') {
|
153 |
+
if (($this->next_pos(']', false) !== self::TOK_UNKNOWN) || ($this->next_pos('>', false) !== self::TOK_UNKNOWN)) {
|
154 |
+
$this->addError('Invalid doctype');
|
155 |
+
return false;
|
156 |
+
}
|
157 |
+
}
|
158 |
+
|
159 |
+
$this->token_start = $start;
|
160 |
+
$this->status['dtd'] = $this->getTokenString(2, -1);
|
161 |
+
$this->status['last_pos'] = $this->pos;
|
162 |
+
return true;
|
163 |
+
} else {
|
164 |
+
$this->addError('Invalid doctype');
|
165 |
+
return false;
|
166 |
+
}
|
167 |
+
}
|
168 |
+
|
169 |
+
/**
|
170 |
+
* Parse cdata tag
|
171 |
+
* @internal Gets called with cdata ("<![cdata")
|
172 |
+
* @internal Stores text in {@link $status}[cdata]
|
173 |
+
* @return bool
|
174 |
+
*/
|
175 |
+
function parse_cdata() {
|
176 |
+
if ($this->next_pos(']]>', false) === self::TOK_UNKNOWN) {
|
177 |
+
$this->status['cdata'] = $this->getTokenString(9, -1);
|
178 |
+
$this->status['last_pos'] = $this->pos + 2;
|
179 |
+
return true;
|
180 |
+
} else {
|
181 |
+
$this->addError('Invalid cdata tag');
|
182 |
+
return false;
|
183 |
+
}
|
184 |
+
}
|
185 |
+
|
186 |
+
/**
|
187 |
+
* Parse php tags
|
188 |
+
* @internal Gets called with php tags ("<?php")
|
189 |
+
* @return bool
|
190 |
+
*/
|
191 |
+
function parse_php() {
|
192 |
+
$start = $this->pos;
|
193 |
+
if ($this->next_pos('?>', false) !== self::TOK_UNKNOWN) {
|
194 |
+
$this->pos -= 2; //End of file
|
195 |
+
}
|
196 |
+
|
197 |
+
$len = $this->pos - 1 - $start;
|
198 |
+
$this->status['text'] = (($len > 0) ? substr($this->doc, $start + 1, $len) : '');
|
199 |
+
$this->status['last_pos'] = ++$this->pos;
|
200 |
+
return true;
|
201 |
+
}
|
202 |
+
|
203 |
+
/**
|
204 |
+
* Parse asp tags
|
205 |
+
* @internal Gets called with asp tags ("<%")
|
206 |
+
* @return bool
|
207 |
+
*/
|
208 |
+
function parse_asp() {
|
209 |
+
$start = $this->pos;
|
210 |
+
if ($this->next_pos('%>', false) !== self::TOK_UNKNOWN) {
|
211 |
+
$this->pos -= 2; //End of file
|
212 |
+
}
|
213 |
+
|
214 |
+
$len = $this->pos - 1 - $start;
|
215 |
+
$this->status['text'] = (($len > 0) ? substr($this->doc, $start + 1, $len) : '');
|
216 |
+
$this->status['last_pos'] = ++$this->pos;
|
217 |
+
return true;
|
218 |
+
}
|
219 |
+
|
220 |
+
/**
|
221 |
+
* Parse style tags
|
222 |
+
* @internal Gets called with php tags ("<style>")
|
223 |
+
* @return bool
|
224 |
+
*/
|
225 |
+
function parse_style() {
|
226 |
+
if ($this->parse_attributes() && ($this->token === self::TOK_TAG_CLOSE) && ($start = $this->pos) && ($this->next_pos('</style>', false) === self::TOK_UNKNOWN)) {
|
227 |
+
$len = $this->pos - 1 - $start;
|
228 |
+
$this->status['text'] = (($len > 0) ? substr($this->doc, $start + 1, $len) : '');
|
229 |
+
|
230 |
+
$this->pos += 7;
|
231 |
+
$this->status['last_pos'] = $this->pos;
|
232 |
+
return true;
|
233 |
+
} else {
|
234 |
+
$this->addError('No end for style tag found');
|
235 |
+
return false;
|
236 |
+
}
|
237 |
+
}
|
238 |
+
|
239 |
+
/**
|
240 |
+
* Parse script tags
|
241 |
+
* @internal Gets called with php tags ("<script>")
|
242 |
+
* @return bool
|
243 |
+
*/
|
244 |
+
function parse_script() {
|
245 |
+
if ($this->parse_attributes() && ($this->token === self::TOK_TAG_CLOSE) && ($start = $this->pos) && ($this->next_pos('</script>', false) === self::TOK_UNKNOWN)) {
|
246 |
+
$len = $this->pos - 1 - $start;
|
247 |
+
$this->status['text'] = (($len > 0) ? substr($this->doc, $start + 1, $len) : '');
|
248 |
+
|
249 |
+
$this->pos += 8;
|
250 |
+
$this->status['last_pos'] = $this->pos;
|
251 |
+
return true;
|
252 |
+
} else {
|
253 |
+
$this->addError('No end for script tag found');
|
254 |
+
return false;
|
255 |
+
}
|
256 |
+
}
|
257 |
+
|
258 |
+
/**
|
259 |
+
* Parse conditional tags (+ all conditional tags inside)
|
260 |
+
* @internal Gets called with IE conditionals ("<![if]" and "<!--[if]")
|
261 |
+
* @internal Stores condition in {@link $status}[tag_condition]
|
262 |
+
* @return bool
|
263 |
+
*/
|
264 |
+
function parse_conditional() {
|
265 |
+
if ($this->status['closing_tag']) {
|
266 |
+
$this->pos += 8;
|
267 |
+
} else {
|
268 |
+
$this->pos += (($this->status['comment']) ? 5 : 3);
|
269 |
+
if ($this->next_pos(']', false) !== self::TOK_UNKNOWN) {
|
270 |
+
$this->addError('"]" not found in conditional tag');
|
271 |
+
return false;
|
272 |
+
}
|
273 |
+
$this->status['tag_condition'] = $this->getTokenString(0, -1);
|
274 |
+
}
|
275 |
+
|
276 |
+
if ($this->next_no_whitespace() !== self::TOK_TAG_CLOSE) {
|
277 |
+
$this->addError('No ">" tag found 2 for conditional tag');
|
278 |
+
return false;
|
279 |
+
}
|
280 |
+
|
281 |
+
if ($this->status['comment']) {
|
282 |
+
$this->status['last_pos'] = $this->pos;
|
283 |
+
if ($this->next_pos('-->', false) !== self::TOK_UNKNOWN) {
|
284 |
+
$this->addError('No ending tag found for conditional tag');
|
285 |
+
$this->pos = $this->size - 1;
|
286 |
+
|
287 |
+
$len = $this->pos - 1 - $this->status['last_pos'];
|
288 |
+
$this->status['text'] = (($len > 0) ? substr($this->doc, $this->status['last_pos'] + 1, $len) : '');
|
289 |
+
} else {
|
290 |
+
$len = $this->pos - 10 - $this->status['last_pos'];
|
291 |
+
$this->status['text'] = (($len > 0) ? substr($this->doc, $this->status['last_pos'] + 1, $len) : '');
|
292 |
+
$this->pos += 2;
|
293 |
+
}
|
294 |
+
}
|
295 |
+
|
296 |
+
$this->status['last_pos'] = $this->pos;
|
297 |
+
return true;
|
298 |
+
}
|
299 |
+
|
300 |
+
/**
|
301 |
+
* Parse attributes (names + value)
|
302 |
+
* @internal Stores attributes in {@link $status}[attributes] (array(ATTR => VAL))
|
303 |
+
* @return bool
|
304 |
+
*/
|
305 |
+
function parse_attributes() {
|
306 |
+
$this->status['attributes'] = array();
|
307 |
+
|
308 |
+
while ($this->next_no_whitespace() === self::TOK_IDENTIFIER) {
|
309 |
+
$attr = $this->getTokenString();
|
310 |
+
if (($attr === '?') || ($attr === '%')) {
|
311 |
+
//Probably closing tags
|
312 |
+
break;
|
313 |
+
}
|
314 |
+
|
315 |
+
if ($this->next_no_whitespace() === self::TOK_EQUALS) {
|
316 |
+
if ($this->next_no_whitespace() === self::TOK_STRING) {
|
317 |
+
$val = $this->getTokenString(1, -1);
|
318 |
+
} else {
|
319 |
+
$this->token_start = $this->pos;
|
320 |
+
if (!isset($stop)) {
|
321 |
+
$stop = $this->whitespace;
|
322 |
+
$stop['<'] = true;
|
323 |
+
$stop['>'] = true;
|
324 |
+
}
|
325 |
+
|
326 |
+
while ((++$this->pos < $this->size) && (!isset($stop[$this->doc[$this->pos]]))) {
|
327 |
+
// Do nothing.
|
328 |
+
}
|
329 |
+
--$this->pos;
|
330 |
+
|
331 |
+
$val = $this->getTokenString();
|
332 |
+
|
333 |
+
if (trim($val) === '') {
|
334 |
+
$this->addError('Invalid attribute value');
|
335 |
+
return false;
|
336 |
+
}
|
337 |
+
}
|
338 |
+
} else {
|
339 |
+
$val = $attr;
|
340 |
+
$this->pos = (($this->token_start) ? $this->token_start : $this->pos) - 1;
|
341 |
+
}
|
342 |
+
|
343 |
+
$this->status['attributes'][$attr] = $val;
|
344 |
+
}
|
345 |
+
|
346 |
+
return true;
|
347 |
+
}
|
348 |
+
|
349 |
+
/**
|
350 |
+
* Default callback for tags
|
351 |
+
* @internal Gets called after the tagname (<html*ENTERS_HERE* attribute="value">)
|
352 |
+
* @return bool
|
353 |
+
*/
|
354 |
+
function parse_tag_default() {
|
355 |
+
if ($this->status['closing_tag']) {
|
356 |
+
$this->status['attributes'] = array();
|
357 |
+
$this->next_no_whitespace();
|
358 |
+
} else {
|
359 |
+
if (!$this->parse_attributes()) {
|
360 |
+
return false;
|
361 |
+
}
|
362 |
+
}
|
363 |
+
|
364 |
+
if ($this->token !== self::TOK_TAG_CLOSE) {
|
365 |
+
if ($this->token === self::TOK_SLASH_FORWARD) {
|
366 |
+
$this->status['self_close'] = true;
|
367 |
+
$this->next();
|
368 |
+
} elseif ((($this->status['tag_name'][0] === '?') && ($this->doc[$this->pos] === '?')) || (($this->status['tag_name'][0] === '%') && ($this->doc[$this->pos] === '%'))) {
|
369 |
+
$this->status['self_close'] = true;
|
370 |
+
$this->pos++;
|
371 |
+
|
372 |
+
if (isset($this->char_map[$this->doc[$this->pos]]) && (!is_string($this->char_map[$this->doc[$this->pos]]))) {
|
373 |
+
$this->token = $this->char_map[$this->doc[$this->pos]];
|
374 |
+
} else {
|
375 |
+
$this->token = self::TOK_UNKNOWN;
|
376 |
+
}
|
377 |
+
}/* else {
|
378 |
+
$this->status['self_close'] = false;
|
379 |
+
}*/
|
380 |
+
}
|
381 |
+
|
382 |
+
if ($this->token !== self::TOK_TAG_CLOSE) {
|
383 |
+
$this->addError('Expected ">", but found "'.$this->getTokenString().'"');
|
384 |
+
if ($this->next_pos('>', false) !== self::TOK_UNKNOWN) {
|
385 |
+
$this->addError('No ">" tag found for "'.$this->status['tag_name'].'" tag');
|
386 |
+
return false;
|
387 |
+
}
|
388 |
+
}
|
389 |
+
|
390 |
+
return true;
|
391 |
+
}
|
392 |
+
|
393 |
+
/**
|
394 |
+
* Parse tag
|
395 |
+
* @internal Gets called after opening tag (<*ENTERS_HERE*html attribute="value">)
|
396 |
+
* @internal Stores information about the tag in {@link $status} (comment, closing_tag, tag_name)
|
397 |
+
* @return bool
|
398 |
+
*/
|
399 |
+
function parse_tag() {
|
400 |
+
$start = $this->pos;
|
401 |
+
$this->status['self_close'] = false;
|
402 |
+
$this->parse_text();
|
403 |
+
|
404 |
+
$next = (($this->pos + 1) < $this->size) ? $this->doc[$this->pos + 1] : '';
|
405 |
+
if ($next === '!') {
|
406 |
+
$this->status['closing_tag'] = false;
|
407 |
+
|
408 |
+
if (substr($this->doc, $this->pos + 2, 2) === '--') {
|
409 |
+
$this->status['comment'] = true;
|
410 |
+
|
411 |
+
if (($this->doc[$this->pos + 4] === '[') && (strcasecmp(substr($this->doc, $this->pos + 5, 2), 'if') === 0)) {
|
412 |
+
return $this->parse_conditional();
|
413 |
+
} else {
|
414 |
+
return $this->parse_comment();
|
415 |
+
}
|
416 |
+
} else {
|
417 |
+
$this->status['comment'] = false;
|
418 |
+
|
419 |
+
if ($this->doc[$this->pos + 2] === '[') {
|
420 |
+
if (strcasecmp(substr($this->doc, $this->pos + 3, 2), 'if') === 0) {
|
421 |
+
return $this->parse_conditional();
|
422 |
+
} elseif (strcasecmp(substr($this->doc, $this->pos + 3, 5), 'endif') === 0) {
|
423 |
+
$this->status['closing_tag'] = true;
|
424 |
+
return $this->parse_conditional();
|
425 |
+
} elseif (strcasecmp(substr($this->doc, $this->pos + 3, 5), 'cdata') === 0) {
|
426 |
+
return $this->parse_cdata();
|
427 |
+
}
|
428 |
+
}
|
429 |
+
}
|
430 |
+
} elseif ($next === '/') {
|
431 |
+
$this->status['closing_tag'] = true;
|
432 |
+
++$this->pos;
|
433 |
+
} else {
|
434 |
+
$this->status['closing_tag'] = false;
|
435 |
+
}
|
436 |
+
|
437 |
+
if ($this->next() !== self::TOK_IDENTIFIER) {
|
438 |
+
$this->addError('Tagname expected');
|
439 |
+
//if ($this->next_pos('>', false) === self::TOK_UNKNOWN) {
|
440 |
+
$this->status['last_pos'] = $start - 1;
|
441 |
+
return true;
|
442 |
+
//} else {
|
443 |
+
// return false;
|
444 |
+
//}
|
445 |
+
}
|
446 |
+
|
447 |
+
$tag = $this->getTokenString();
|
448 |
+
$this->status['tag_name'] = $tag;
|
449 |
+
$tag = strtolower($tag);
|
450 |
+
|
451 |
+
if (isset($this->tag_map[$tag])) {
|
452 |
+
$res = $this->{$this->tag_map[$tag]}();
|
453 |
+
} else {
|
454 |
+
$res = $this->parse_tag_default();
|
455 |
+
}
|
456 |
+
|
457 |
+
$this->status['last_pos'] = $this->pos;
|
458 |
+
return $res;
|
459 |
+
}
|
460 |
+
|
461 |
+
/**
|
462 |
+
* Parse full document
|
463 |
+
* @return bool
|
464 |
+
*/
|
465 |
+
function parse_all() {
|
466 |
+
$this->errors = array();
|
467 |
+
$this->status['last_pos'] = -1;
|
468 |
+
|
469 |
+
if (($this->token === self::TOK_TAG_OPEN) || ($this->next_pos('<', false) === self::TOK_UNKNOWN)) {
|
470 |
+
do {
|
471 |
+
if (!$this->parse_tag()) {
|
472 |
+
return false;
|
473 |
+
}
|
474 |
+
} while ($this->next_pos('<') !== self::TOK_NULL);
|
475 |
+
}
|
476 |
+
|
477 |
+
$this->pos = $this->size;
|
478 |
+
$this->parse_text();
|
479 |
+
|
480 |
+
return true;
|
481 |
+
}
|
482 |
+
}
|
483 |
+
|
484 |
+
/**
|
485 |
+
* Parses a HTML document into a HTML DOM
|
486 |
+
*/
|
487 |
+
class HtmlParser extends HtmlParserBase {
|
488 |
+
|
489 |
+
/**
|
490 |
+
* Root object
|
491 |
+
* @internal If string, then it will create a new instance as root
|
492 |
+
* @var DomNode
|
493 |
+
*/
|
494 |
+
var $root = 'MailPoetVendor\\pQuery\\DomNode';
|
495 |
+
|
496 |
+
/**
|
497 |
+
* Current parsing hierarchy
|
498 |
+
* @internal Root is always at index 0, current tag is at the end of the array
|
499 |
+
* @var array
|
500 |
+
* @access private
|
501 |
+
*/
|
502 |
+
var $hierarchy = array();
|
503 |
+
|
504 |
+
/**
|
505 |
+
* Tags that don't need closing tags
|
506 |
+
* @var array
|
507 |
+
* @access private
|
508 |
+
*/
|
509 |
+
var $tags_selfclose = array(
|
510 |
+
'area' => true,
|
511 |
+
'base' => true,
|
512 |
+
'basefont' => true,
|
513 |
+
'br' => true,
|
514 |
+
'col' => true,
|
515 |
+
'command' => true,
|
516 |
+
'embed' => true,
|
517 |
+
'frame' => true,
|
518 |
+
'hr' => true,
|
519 |
+
'img' => true,
|
520 |
+
'input' => true,
|
521 |
+
'ins' => true,
|
522 |
+
'keygen' => true,
|
523 |
+
'link' => true,
|
524 |
+
'meta' => true,
|
525 |
+
'param' => true,
|
526 |
+
'source' => true,
|
527 |
+
'track' => true,
|
528 |
+
'wbr' => true
|
529 |
+
);
|
530 |
+
|
531 |
+
/**
|
532 |
+
* Class constructor
|
533 |
+
* @param string $doc Document to be tokenized
|
534 |
+
* @param int $pos Position to start parsing
|
535 |
+
* @param DomNode $root Root node, null to auto create
|
536 |
+
*/
|
537 |
+
function __construct($doc = '', $pos = 0, $root = null) {
|
538 |
+
if ($root === null) {
|
539 |
+
$root = new $this->root('~root~', null);
|
540 |
+
}
|
541 |
+
$this->root =& $root;
|
542 |
+
|
543 |
+
parent::__construct($doc, $pos);
|
544 |
+
}
|
545 |
+
|
546 |
+
#php4 PHP4 class constructor compatibility
|
547 |
+
#function HtmlParser($doc = '', $pos = 0, $root = null) {return $this->__construct($doc, $pos, $root);}
|
548 |
+
#php4e
|
549 |
+
|
550 |
+
/**
|
551 |
+
* Class magic invoke method, performs {@link select()}
|
552 |
+
* @return array
|
553 |
+
* @access private
|
554 |
+
*/
|
555 |
+
function __invoke($query = '*') {
|
556 |
+
return $this->select($query);
|
557 |
+
}
|
558 |
+
|
559 |
+
/**
|
560 |
+
* Class magic toString method, performs {@link DomNode::toString()}
|
561 |
+
* @return string
|
562 |
+
* @access private
|
563 |
+
*/
|
564 |
+
function __toString() {
|
565 |
+
return $this->root->getInnerText();
|
566 |
+
}
|
567 |
+
|
568 |
+
/**
|
569 |
+
* Performs a css select query on the root node
|
570 |
+
* @see DomNode::select()
|
571 |
+
* @return array
|
572 |
+
*/
|
573 |
+
function select($query = '*', $index = false, $recursive = true, $check_self = false) {
|
574 |
+
return $this->root->select($query, $index, $recursive, $check_self);
|
575 |
+
}
|
576 |
+
|
577 |
+
/**
|
578 |
+
* Updates the current hierarchy status and checks for
|
579 |
+
* correct opening/closing of tags
|
580 |
+
* @param bool $self_close Is current tag self closing? Null to use {@link tags_selfclose}
|
581 |
+
* @internal This is were most of the nodes get added
|
582 |
+
* @access private
|
583 |
+
*/
|
584 |
+
protected function parse_hierarchy($self_close = null) {
|
585 |
+
if ($self_close === null) {
|
586 |
+
$this->status['self_close'] = ($self_close = isset($this->tags_selfclose[strtolower($this->status['tag_name'])]));
|
587 |
+
}
|
588 |
+
|
589 |
+
if ($self_close) {
|
590 |
+
if ($this->status['closing_tag']) {
|
591 |
+
|
592 |
+
//$c = end($this->hierarchy)->children
|
593 |
+
$c = $this->hierarchy[count($this->hierarchy) - 1]->children;
|
594 |
+
$found = false;
|
595 |
+
for ($count = count($c), $i = $count - 1; $i >= 0; $i--) {
|
596 |
+
if (strcasecmp($c[$i]->tag, $this->status['tag_name']) === 0) {
|
597 |
+
for($ii = $i + 1; $ii < $count; $ii++) {
|
598 |
+
$index = null; //Needs to be passed by ref
|
599 |
+
$c[$i + 1]->changeParent($c[$i], $index);
|
600 |
+
}
|
601 |
+
$c[$i]->self_close = false;
|
602 |
+
|
603 |
+
$found = true;
|
604 |
+
break;
|
605 |
+
}
|
606 |
+
}
|
607 |
+
|
608 |
+
if (!$found) {
|
609 |
+
$this->addError('Closing tag "'.$this->status['tag_name'].'" which is not open');
|
610 |
+
}
|
611 |
+
|
612 |
+
} elseif ($this->status['tag_name'][0] === '?') {
|
613 |
+
//end($this->hierarchy)->addXML($this->status['tag_name'], '', $this->status['attributes']);
|
614 |
+
$index = null; //Needs to be passed by ref
|
615 |
+
$this->hierarchy[count($this->hierarchy) - 1]->addXML($this->status['tag_name'], '', $this->status['attributes'], $index);
|
616 |
+
} elseif ($this->status['tag_name'][0] === '%') {
|
617 |
+
//end($this->hierarchy)->addASP($this->status['tag_name'], '', $this->status['attributes']);
|
618 |
+
$index = null; //Needs to be passed by ref
|
619 |
+
$this->hierarchy[count($this->hierarchy) - 1]->addASP($this->status['tag_name'], '', $this->status['attributes'], $index);
|
620 |
+
} else {
|
621 |
+
//end($this->hierarchy)->addChild($this->status);
|
622 |
+
$index = null; //Needs to be passed by ref
|
623 |
+
$this->hierarchy[count($this->hierarchy) - 1]->addChild($this->status, $index);
|
624 |
+
}
|
625 |
+
} elseif ($this->status['closing_tag']) {
|
626 |
+
$found = false;
|
627 |
+
for ($count = count($this->hierarchy), $i = $count - 1; $i >= 0; $i--) {
|
628 |
+
if (strcasecmp($this->hierarchy[$i]->tag, $this->status['tag_name']) === 0) {
|
629 |
+
|
630 |
+
for($ii = ($count - $i - 1); $ii >= 0; $ii--) {
|
631 |
+
$e = array_pop($this->hierarchy);
|
632 |
+
if ($ii > 0) {
|
633 |
+
$this->addError('Closing tag "'.$this->status['tag_name'].'" while "'.$e->tag.'" is not closed yet');
|
634 |
+
}
|
635 |
+
}
|
636 |
+
|
637 |
+
$found = true;
|
638 |
+
break;
|
639 |
+
}
|
640 |
+
}
|
641 |
+
|
642 |
+
if (!$found) {
|
643 |
+
$this->addError('Closing tag "'.$this->status['tag_name'].'" which is not open');
|
644 |
+
}
|
645 |
+
|
646 |
+
} else {
|
647 |
+
//$this->hierarchy[] = end($this->hierarchy)->addChild($this->status);
|
648 |
+
$index = null; //Needs to be passed by ref
|
649 |
+
$this->hierarchy[] = $this->hierarchy[count($this->hierarchy) - 1]->addChild($this->status, $index);
|
650 |
+
}
|
651 |
+
}
|
652 |
+
|
653 |
+
function parse_cdata() {
|
654 |
+
if (!parent::parse_cdata()) {return false;}
|
655 |
+
|
656 |
+
//end($this->hierarchy)->addCDATA($this->status['cdata']);
|
657 |
+
$index = null; //Needs to be passed by ref
|
658 |
+
$this->hierarchy[count($this->hierarchy) - 1]->addCDATA($this->status['cdata'], $index);
|
659 |
+
return true;
|
660 |
+
}
|
661 |
+
|
662 |
+
function parse_comment() {
|
663 |
+
if (!parent::parse_comment()) {return false;}
|
664 |
+
|
665 |
+
//end($this->hierarchy)->addComment($this->status['comment']);
|
666 |
+
$index = null; //Needs to be passed by ref
|
667 |
+
$this->hierarchy[count($this->hierarchy) - 1]->addComment($this->status['comment'], $index);
|
668 |
+
return true;
|
669 |
+
}
|
670 |
+
|
671 |
+
function parse_conditional() {
|
672 |
+
if (!parent::parse_conditional()) {return false;}
|
673 |
+
|
674 |
+
if ($this->status['comment']) {
|
675 |
+
//$e = end($this->hierarchy)->addConditional($this->status['tag_condition'], true);
|
676 |
+
$index = null; //Needs to be passed by ref
|
677 |
+
$e = $this->hierarchy[count($this->hierarchy) - 1]->addConditional($this->status['tag_condition'], true, $index);
|
678 |
+
if ($this->status['text'] !== '') {
|
679 |
+
$index = null; //Needs to be passed by ref
|
680 |
+
$e->addText($this->status['text'], $index);
|
681 |
+
}
|
682 |
+
} else {
|
683 |
+
if ($this->status['closing_tag']) {
|
684 |
+
$this->parse_hierarchy(false);
|
685 |
+
} else {
|
686 |
+
//$this->hierarchy[] = end($this->hierarchy)->addConditional($this->status['tag_condition'], false);
|
687 |
+
$index = null; //Needs to be passed by ref
|
688 |
+
$this->hierarchy[] = $this->hierarchy[count($this->hierarchy) - 1]->addConditional($this->status['tag_condition'], false, $index);
|
689 |
+
}
|
690 |
+
}
|
691 |
+
|
692 |
+
return true;
|
693 |
+
}
|
694 |
+
|
695 |
+
function parse_doctype() {
|
696 |
+
if (!parent::parse_doctype()) {return false;}
|
697 |
+
|
698 |
+
//end($this->hierarchy)->addDoctype($this->status['dtd']);
|
699 |
+
$index = null; //Needs to be passed by ref
|
700 |
+
$this->hierarchy[count($this->hierarchy) - 1]->addDoctype($this->status['dtd'], $index);
|
701 |
+
return true;
|
702 |
+
}
|
703 |
+
|
704 |
+
function parse_php() {
|
705 |
+
if (!parent::parse_php()) {return false;}
|
706 |
+
|
707 |
+
//end($this->hierarchy)->addXML('php', $this->status['text']);
|
708 |
+
$index = null; //Needs to be passed by ref
|
709 |
+
$this->hierarchy[count($this->hierarchy) - 1]->addXML('php', $this->status['text'], $index);
|
710 |
+
return true;
|
711 |
+
}
|
712 |
+
|
713 |
+
function parse_asp() {
|
714 |
+
if (!parent::parse_asp()) {return false;}
|
715 |
+
|
716 |
+
//end($this->hierarchy)->addASP('', $this->status['text']);
|
717 |
+
$index = null; //Needs to be passed by ref
|
718 |
+
$this->hierarchy[count($this->hierarchy) - 1]->addASP('', $this->status['text'], $index);
|
719 |
+
return true;
|
720 |
+
}
|
721 |
+
|
722 |
+
function parse_script() {
|
723 |
+
if (!parent::parse_script()) {return false;}
|
724 |
+
|
725 |
+
//$e = end($this->hierarchy)->addChild($this->status);
|
726 |
+
$index = null; //Needs to be passed by ref
|
727 |
+
$e = $this->hierarchy[count($this->hierarchy) - 1]->addChild($this->status, $index);
|
728 |
+
if ($this->status['text'] !== '') {
|
729 |
+
$index = null; //Needs to be passed by ref
|
730 |
+
$e->addText($this->status['text'], $index);
|
731 |
+
}
|
732 |
+
return true;
|
733 |
+
}
|
734 |
+
|
735 |
+
function parse_style() {
|
736 |
+
if (!parent::parse_style()) {return false;}
|
737 |
+
|
738 |
+
//$e = end($this->hierarchy)->addChild($this->status);
|
739 |
+
$index = null; //Needs to be passed by ref
|
740 |
+
$e = $this->hierarchy[count($this->hierarchy) - 1]->addChild($this->status, $index);
|
741 |
+
if ($this->status['text'] !== '') {
|
742 |
+
$index = null; //Needs to be passed by ref
|
743 |
+
$e->addText($this->status['text'], $index);
|
744 |
+
}
|
745 |
+
return true;
|
746 |
+
}
|
747 |
+
|
748 |
+
function parse_tag_default() {
|
749 |
+
if (!parent::parse_tag_default()) {return false;}
|
750 |
+
|
751 |
+
$this->parse_hierarchy(($this->status['self_close']) ? true : null);
|
752 |
+
return true;
|
753 |
+
}
|
754 |
+
|
755 |
+
function parse_text() {
|
756 |
+
parent::parse_text();
|
757 |
+
if ($this->status['text'] !== '') {
|
758 |
+
//end($this->hierarchy)->addText($this->status['text']);
|
759 |
+
$index = null; //Needs to be passed by ref
|
760 |
+
$this->hierarchy[count($this->hierarchy) - 1]->addText($this->status['text'], $index);
|
761 |
+
}
|
762 |
+
}
|
763 |
+
|
764 |
+
function parse_all() {
|
765 |
+
$this->hierarchy = array(&$this->root);
|
766 |
+
return ((parent::parse_all()) ? $this->root : false);
|
767 |
+
}
|
768 |
+
}
|
769 |
+
|
770 |
+
/**
|
771 |
+
* HTML5 specific parser (adds support for omittable closing tags)
|
772 |
+
*/
|
773 |
+
class Html5Parser extends HtmlParser {
|
774 |
+
|
775 |
+
/**
|
776 |
+
* Tags with ommitable closing tags
|
777 |
+
* @var array array('tag2' => 'tag1') will close tag1 if following (not child) tag is tag2
|
778 |
+
* @access private
|
779 |
+
*/
|
780 |
+
var $tags_optional_close = array(
|
781 |
+
//Current tag => Previous tag
|
782 |
+
'li' => array('li' => true),
|
783 |
+
'dt' => array('dt' => true, 'dd' => true),
|
784 |
+
'dd' => array('dt' => true, 'dd' => true),
|
785 |
+
'address' => array('p' => true),
|
786 |
+
'article' => array('p' => true),
|
787 |
+
'aside' => array('p' => true),
|
788 |
+
'blockquote' => array('p' => true),
|
789 |
+
'dir' => array('p' => true),
|
790 |
+
'div' => array('p' => true),
|
791 |
+
'dl' => array('p' => true),
|
792 |
+
'fieldset' => array('p' => true),
|
793 |
+
'footer' => array('p' => true),
|
794 |
+
'form' => array('p' => true),
|
795 |
+
'h1' => array('p' => true),
|
796 |
+
'h2' => array('p' => true),
|
797 |
+
'h3' => array('p' => true),
|
798 |
+
'h4' => array('p' => true),
|
799 |
+
'h5' => array('p' => true),
|
800 |
+
'h6' => array('p' => true),
|
801 |
+
'header' => array('p' => true),
|
802 |
+
'hgroup' => array('p' => true),
|
803 |
+
'hr' => array('p' => true),
|
804 |
+
'menu' => array('p' => true),
|
805 |
+
'nav' => array('p' => true),
|
806 |
+
'ol' => array('p' => true),
|
807 |
+
'p' => array('p' => true),
|
808 |
+
'pre' => array('p' => true),
|
809 |
+
'section' => array('p' => true),
|
810 |
+
'table' => array('p' => true),
|
811 |
+
'ul' => array('p' => true),
|
812 |
+
'rt' => array('rt' => true, 'rp' => true),
|
813 |
+
'rp' => array('rt' => true, 'rp' => true),
|
814 |
+
'optgroup' => array('optgroup' => true, 'option' => true),
|
815 |
+
'option' => array('option'),
|
816 |
+
'tbody' => array('thread' => true, 'tbody' => true, 'tfoot' => true),
|
817 |
+
'tfoot' => array('thread' => true, 'tbody' => true),
|
818 |
+
'tr' => array('tr' => true),
|
819 |
+
'td' => array('td' => true, 'th' => true),
|
820 |
+
'th' => array('td' => true, 'th' => true),
|
821 |
+
'body' => array('head' => true)
|
822 |
+
);
|
823 |
+
|
824 |
+
protected function parse_hierarchy($self_close = null) {
|
825 |
+
$tag_curr = strtolower($this->status['tag_name']);
|
826 |
+
if ($self_close === null) {
|
827 |
+
$this->status['self_close'] = ($self_close = isset($this->tags_selfclose[$tag_curr]));
|
828 |
+
}
|
829 |
+
|
830 |
+
if (! ($self_close || $this->status['closing_tag'])) {
|
831 |
+
//$tag_prev = strtolower(end($this->hierarchy)->tag);
|
832 |
+
$tag_prev = strtolower($this->hierarchy[count($this->hierarchy) - 1]->tag);
|
833 |
+
if (isset($this->tags_optional_close[$tag_curr]) && isset($this->tags_optional_close[$tag_curr][$tag_prev])) {
|
834 |
+
array_pop($this->hierarchy);
|
835 |
+
}
|
836 |
+
}
|
837 |
+
|
838 |
+
return parent::parse_hierarchy($self_close);
|
839 |
+
}
|
840 |
+
}
|
lib-3rd-party/pquery/gan_selector_html.php
ADDED
@@ -0,0 +1,950 @@
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* @author Niels A.D.
|
4 |
+
* @author Todd Burry <todd@vanillaforums.com>
|
5 |
+
* @copyright 2010 Niels A.D., 2014 Todd Burry
|
6 |
+
* @license http://opensource.org/licenses/LGPL-2.1 LGPL-2.1
|
7 |
+
* @package pQuery
|
8 |
+
*/
|
9 |
+
|
10 |
+
namespace MailPoetVendor\pQuery;
|
11 |
+
|
12 |
+
if (!defined('ABSPATH')) exit;
|
13 |
+
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Tokenizes a css selector query
|
17 |
+
*/
|
18 |
+
class CSSQueryTokenizer extends TokenizerBase {
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Opening bracket token, used for "["
|
22 |
+
*/
|
23 |
+
const TOK_BRACKET_OPEN = 100;
|
24 |
+
/**
|
25 |
+
* Closing bracket token, used for "]"
|
26 |
+
*/
|
27 |
+
const TOK_BRACKET_CLOSE = 101;
|
28 |
+
/**
|
29 |
+
* Opening brace token, used for "("
|
30 |
+
*/
|
31 |
+
const TOK_BRACE_OPEN = 102;
|
32 |
+
/**
|
33 |
+
* Closing brace token, used for ")"
|
34 |
+
*/
|
35 |
+
const TOK_BRACE_CLOSE = 103;
|
36 |
+
/**
|
37 |
+
* String token
|
38 |
+
*/
|
39 |
+
const TOK_STRING = 104;
|
40 |
+
/**
|
41 |
+
* Colon token, used for ":"
|
42 |
+
*/
|
43 |
+
const TOK_COLON = 105;
|
44 |
+
/**
|
45 |
+
* Comma token, used for ","
|
46 |
+
*/
|
47 |
+
const TOK_COMMA = 106;
|
48 |
+
/**
|
49 |
+
* "Not" token, used for "!"
|
50 |
+
*/
|
51 |
+
const TOK_NOT = 107;
|
52 |
+
|
53 |
+
/**
|
54 |
+
* "All" token, used for "*" in query
|
55 |
+
*/
|
56 |
+
const TOK_ALL = 108;
|
57 |
+
/**
|
58 |
+
* Pipe token, used for "|"
|
59 |
+
*/
|
60 |
+
const TOK_PIPE = 109;
|
61 |
+
/**
|
62 |
+
* Plus token, used for "+"
|
63 |
+
*/
|
64 |
+
const TOK_PLUS = 110;
|
65 |
+
/**
|
66 |
+
* "Sibling" token, used for "~" in query
|
67 |
+
*/
|
68 |
+
const TOK_SIBLING = 111;
|
69 |
+
/**
|
70 |
+
* Class token, used for "." in query
|
71 |
+
*/
|
72 |
+
const TOK_CLASS = 112;
|
73 |
+
/**
|
74 |
+
* ID token, used for "#" in query
|
75 |
+
*/
|
76 |
+
const TOK_ID = 113;
|
77 |
+
/**
|
78 |
+
* Child token, used for ">" in query
|
79 |
+
*/
|
80 |
+
const TOK_CHILD = 114;
|
81 |
+
|
82 |
+
/**
|
83 |
+
* Attribute compare prefix token, used for "|="
|
84 |
+
*/
|
85 |
+
const TOK_COMPARE_PREFIX = 115;
|
86 |
+
/**
|
87 |
+
* Attribute contains token, used for "*="
|
88 |
+
*/
|
89 |
+
const TOK_COMPARE_CONTAINS = 116;
|
90 |
+
/**
|
91 |
+
* Attribute contains word token, used for "~="
|
92 |
+
*/
|
93 |
+
const TOK_COMPARE_CONTAINS_WORD = 117;
|
94 |
+
/**
|
95 |
+
* Attribute compare end token, used for "$="
|
96 |
+
*/
|
97 |
+
const TOK_COMPARE_ENDS = 118;
|
98 |
+
/**
|
99 |
+
* Attribute equals token, used for "="
|
100 |
+
*/
|
101 |
+
const TOK_COMPARE_EQUALS = 119;
|
102 |
+
/**
|
103 |
+
* Attribute not equal token, used for "!="
|
104 |
+
*/
|
105 |
+
const TOK_COMPARE_NOT_EQUAL = 120;
|
106 |
+
/**
|
107 |
+
* Attribute compare bigger than token, used for ">="
|
108 |
+
*/
|
109 |
+
const TOK_COMPARE_BIGGER_THAN = 121;
|
110 |
+
/**
|
111 |
+
* Attribute compare smaller than token, used for "<="
|
112 |
+
*/
|
113 |
+
const TOK_COMPARE_SMALLER_THAN = 122;
|
114 |
+
/**
|
115 |
+
* Attribute compare with regex, used for "%="
|
116 |
+
*/
|
117 |
+
const TOK_COMPARE_REGEX = 123;
|
118 |
+
/**
|
119 |
+
* Attribute compare start token, used for "^="
|
120 |
+
*/
|
121 |
+
const TOK_COMPARE_STARTS = 124;
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Sets query identifiers
|
125 |
+
* @see TokenizerBase::$identifiers
|
126 |
+
* @access private
|
127 |
+
*/
|
128 |
+
var $identifiers = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_-?';
|
129 |
+
|
130 |
+
/**
|
131 |
+
* Map characters to match their tokens
|
132 |
+
* @see TokenizerBase::$custom_char_map
|
133 |
+
* @access private
|
134 |
+
*/
|
135 |
+
var $custom_char_map = array(
|
136 |
+
'.' => self::TOK_CLASS,
|
137 |
+
'#' => self::TOK_ID,
|
138 |
+
',' => self::TOK_COMMA,
|
139 |
+
'>' => 'parse_gt',//self::TOK_CHILD,
|
140 |
+
|
141 |
+
'+' => self::TOK_PLUS,
|
142 |
+
'~' => 'parse_sibling',
|
143 |
+
|
144 |
+
'|' => 'parse_pipe',
|
145 |
+
'*' => 'parse_star',
|
146 |
+
'$' => 'parse_compare',
|
147 |
+
'=' => self::TOK_COMPARE_EQUALS,
|
148 |
+
'!' => 'parse_not',
|
149 |
+
'%' => 'parse_compare',
|
150 |
+
'^' => 'parse_compare',
|
151 |
+
'<' => 'parse_compare',
|
152 |
+
|
153 |
+
'"' => 'parse_string',
|
154 |
+
"'" => 'parse_string',
|
155 |
+
'(' => self::TOK_BRACE_OPEN,
|
156 |
+
')' => self::TOK_BRACE_CLOSE,
|
157 |
+
'[' => self::TOK_BRACKET_OPEN,
|
158 |
+
']' => self::TOK_BRACKET_CLOSE,
|
159 |
+
':' => self::TOK_COLON
|
160 |
+
);
|
161 |
+
|
162 |
+
/**
|
163 |
+
* Parse ">" character
|
164 |
+
* @internal Could be {@link TOK_CHILD} or {@link TOK_COMPARE_BIGGER_THAN}
|
165 |
+
* @return int
|
166 |
+
*/
|
167 |
+
protected function parse_gt() {
|
168 |
+
if ((($this->pos + 1) < $this->size) && ($this->doc[$this->pos + 1] === '=')) {
|
169 |
+
++$this->pos;
|
170 |
+
return ($this->token = self::TOK_COMPARE_BIGGER_THAN);
|
171 |
+
} else {
|
172 |
+
return ($this->token = self::TOK_CHILD);
|
173 |
+
}
|
174 |
+
}
|
175 |
+
|
176 |
+
/**
|
177 |
+
* Parse "~" character
|
178 |
+
* @internal Could be {@link TOK_SIBLING} or {@link TOK_COMPARE_CONTAINS_WORD}
|
179 |
+
* @return int
|
180 |
+
*/
|
181 |
+
protected function parse_sibling() {
|
182 |
+
if ((($this->pos + 1) < $this->size) && ($this->doc[$this->pos + 1] === '=')) {
|
183 |
+
++$this->pos;
|
184 |
+
return ($this->token = self::TOK_COMPARE_CONTAINS_WORD);
|
185 |
+
} else {
|
186 |
+
return ($this->token = self::TOK_SIBLING);
|
187 |
+
}
|
188 |
+
}
|
189 |
+
|
190 |
+
/**
|
191 |
+
* Parse "|" character
|
192 |
+
* @internal Could be {@link TOK_PIPE} or {@link TOK_COMPARE_PREFIX}
|
193 |
+
* @return int
|
194 |
+
*/
|
195 |
+
protected function parse_pipe() {
|
196 |
+
if ((($this->pos + 1) < $this->size) && ($this->doc[$this->pos + 1] === '=')) {
|
197 |
+
++$this->pos;
|
198 |
+
return ($this->token = self::TOK_COMPARE_PREFIX);
|
199 |
+
} else {
|
200 |
+
return ($this->token = self::TOK_PIPE);
|
201 |
+
}
|
202 |
+
}
|
203 |
+
|
204 |
+
/**
|
205 |
+
* Parse "*" character
|
206 |
+
* @internal Could be {@link TOK_ALL} or {@link TOK_COMPARE_CONTAINS}
|
207 |
+
* @return int
|
208 |
+
*/
|
209 |
+
protected function parse_star() {
|
210 |
+
if ((($this->pos + 1) < $this->size) && ($this->doc[$this->pos + 1] === '=')) {
|
211 |
+
++$this->pos;
|
212 |
+
return ($this->token = self::TOK_COMPARE_CONTAINS);
|
213 |
+
} else {
|
214 |
+
return ($this->token = self::TOK_ALL);
|
215 |
+
}
|
216 |
+
}
|
217 |
+
|
218 |
+
/**
|
219 |
+
* Parse "!" character
|
220 |
+
* @internal Could be {@link TOK_NOT} or {@link TOK_COMPARE_NOT_EQUAL}
|
221 |
+
* @return int
|
222 |
+
*/
|
223 |
+
protected function parse_not() {
|
224 |
+
if ((($this->pos + 1) < $this->size) && ($this->doc[$this->pos + 1] === '=')) {
|
225 |
+
++$this->pos;
|
226 |
+
return ($this->token = self::TOK_COMPARE_NOT_EQUAL);
|
227 |
+
} else {
|
228 |
+
return ($this->token = self::TOK_NOT);
|
229 |
+
}
|
230 |
+
}
|
231 |
+
|
232 |
+
/**
|
233 |
+
* Parse several compare characters
|
234 |
+
* @return int
|
235 |
+
*/
|
236 |
+
protected function parse_compare() {
|
237 |
+
if ((($this->pos + 1) < $this->size) && ($this->doc[$this->pos + 1] === '=')) {
|
238 |
+
switch($this->doc[$this->pos++]) {
|
239 |
+
case '$':
|
240 |
+
return ($this->token = self::TOK_COMPARE_ENDS);
|
241 |
+
case '%':
|
242 |
+
return ($this->token = self::TOK_COMPARE_REGEX);
|
243 |
+
case '^':
|
244 |
+
return ($this->token = self::TOK_COMPARE_STARTS);
|
245 |
+
case '<':
|
246 |
+
return ($this->token = self::TOK_COMPARE_SMALLER_THAN);
|
247 |
+
}
|
248 |
+
}
|
249 |
+
return false;
|
250 |
+
}
|
251 |
+
|
252 |
+
/**
|
253 |
+
* Parse strings (" and ')
|
254 |
+
* @return int
|
255 |
+
*/
|
256 |
+
protected function parse_string() {
|
257 |
+
$char = $this->doc[$this->pos];
|
258 |
+
|
259 |
+
while (true) {
|
260 |
+
if ($this->next_search($char.'\\', false) !== self::TOK_NULL) {
|
261 |
+
if($this->doc[$this->pos] === $char) {
|
262 |
+
break;
|
263 |
+
} else {
|
264 |
+
++$this->pos;
|
265 |
+
}
|
266 |
+
} else {
|
267 |
+
$this->pos = $this->size - 1;
|
268 |
+
break;
|
269 |
+
}
|
270 |
+
}
|
271 |
+
|
272 |
+
return ($this->token = self::TOK_STRING);
|
273 |
+
}
|
274 |
+
|
275 |
+
}
|
276 |
+
|
277 |
+
/**
|
278 |
+
* Performs a css select query on HTML nodes
|
279 |
+
*/
|
280 |
+
class HtmlSelector {
|
281 |
+
|
282 |
+
/**
|
283 |
+
* Parser object
|
284 |
+
* @internal If string, then it will create a new instance as parser
|
285 |
+
* @var CSSQueryTokenizer
|
286 |
+
*/
|
287 |
+
var $parser = 'MailPoetVendor\\pQuery\\CSSQueryTokenizer';
|
288 |
+
|
289 |
+
/**
|
290 |
+
* Target of queries
|
291 |
+
* @var DomNode
|
292 |
+
*/
|
293 |
+
var $root = null;
|
294 |
+
|
295 |
+
/**
|
296 |
+
* Last performed query, result in {@link $result}
|
297 |
+
* @var string
|
298 |
+
*/
|
299 |
+
var $query = '';
|
300 |
+
|
301 |
+
/**
|
302 |
+
* Array of matching nodes
|
303 |
+
* @var array
|
304 |
+
*/
|
305 |
+
var $result = array();
|
306 |
+
|
307 |
+
/**
|
308 |
+
* Include root in search, if false the only child nodes are evaluated
|
309 |
+
* @var bool
|
310 |
+
*/
|
311 |
+
var $search_root = false;
|
312 |
+
|
313 |
+
/**
|
314 |
+
* Search recursively
|
315 |
+
* @var bool
|
316 |
+
*/
|
317 |
+
var $search_recursive = true;
|
318 |
+
|
319 |
+
/**
|
320 |
+
* Extra function map for custom filters
|
321 |
+
* @var array
|
322 |
+
* @internal array('root' => 'filter_root') will cause the
|
323 |
+
* selector to call $this->filter_root at :root
|
324 |
+
* @see DomNode::$filter_map
|
325 |
+
*/
|
326 |
+
var $custom_filter_map = array();
|
327 |
+
|
328 |
+
/**
|
329 |
+
* Class constructor
|
330 |
+
* @param DomNode $root {@link $root}
|
331 |
+
* @param string $query
|
332 |
+
* @param bool $search_root {@link $search_root}
|
333 |
+
* @param bool $search_recursive {@link $search_recursive}
|
334 |
+
* @param CSSQueryTokenizer $parser If null, then default class will be used
|
335 |
+
*/
|
336 |
+
function __construct($root, $query = '*', $search_root = false, $search_recursive = true, $parser = null) {
|
337 |
+
if ($parser === null) {
|
338 |
+
$parser = new $this->parser();
|
339 |
+
}
|
340 |
+
$this->parser = $parser;
|
341 |
+
$this->root =& $root;
|
342 |
+
|
343 |
+
$this->search_root = $search_root;
|
344 |
+
$this->search_recursive = $search_recursive;
|
345 |
+
|
346 |
+
$this->select($query);
|
347 |
+
}
|
348 |
+
|
349 |
+
#php4 PHP4 class constructor compatibility
|
350 |
+
#function HtmlSelector($root, $query = '*', $search_root = false, $search_recursive = true, $parser = null) {return $this->__construct($root, $query, $search_root, $search_recursive, $parser);}
|
351 |
+
#php4e
|
352 |
+
|
353 |
+
/**
|
354 |
+
* toString method, returns {@link $query}
|
355 |
+
* @return string
|
356 |
+
* @access private
|
357 |
+
*/
|
358 |
+
function __toString() {
|
359 |
+
return $this->query;
|
360 |
+
}
|
361 |
+
|
362 |
+
/**
|
363 |
+
* Class magic invoke method, performs {@link select()}
|
364 |
+
* @return array
|
365 |
+
* @access private
|
366 |
+
*/
|
367 |
+
function __invoke($query = '*') {
|
368 |
+
return $this->select($query);
|
369 |
+
}
|
370 |
+
|
371 |
+
/**
|
372 |
+
* Perform query
|
373 |
+
* @param string $query
|
374 |
+
* @return array False on failure
|
375 |
+
*/
|
376 |
+
function select($query = '*') {
|
377 |
+
$this->parser->setDoc($query);
|
378 |
+
$this->query = $query;
|
379 |
+
return (($this->parse()) ? $this->result : false);
|
380 |
+
}
|
381 |
+
|
382 |
+
/**
|
383 |
+
* Trigger error
|
384 |
+
* @param string $error
|
385 |
+
* @internal %pos% and %tok% will be replace in string with position and token(string)
|
386 |
+
* @access private
|
387 |
+
*/
|
388 |
+
protected function error($error) {
|
389 |
+
$error = htmlentities(str_replace(
|
390 |
+
array('%tok%', '%pos%'),
|
391 |
+
array($this->parser->getTokenString(), (int) $this->parser->getPos()),
|
392 |
+
$error
|
393 |
+
));
|
394 |
+
|
395 |
+
trigger_error($error);
|
396 |
+
}
|
397 |
+
|
398 |
+
/**
|
399 |
+
* Get identifier (parse identifier or string)
|
400 |
+
* @param bool $do_error Error on failure
|
401 |
+
* @return string False on failure
|
402 |
+
* @access private
|
403 |
+
*/
|
404 |
+
protected function parse_getIdentifier($do_error = true) {
|
405 |
+
$p =& $this->parser;
|
406 |
+
$tok = $p->token;
|
407 |
+
|
408 |
+
if ($tok === CSSQueryTokenizer::TOK_IDENTIFIER) {
|
409 |
+
return $p->getTokenString();
|
410 |
+
} elseif($tok === CSSQueryTokenizer::TOK_STRING) {
|
411 |
+
return str_replace(array('\\\'', '\\"', '\\\\'), array('\'', '"', '\\'), $p->getTokenString(1, -1));
|
412 |
+
} elseif ($do_error) {
|
413 |
+
$this->error('Expected identifier at %pos%!');
|
414 |
+
}
|
415 |
+
return false;
|
416 |
+
}
|
417 |
+
|
418 |
+
/**
|
419 |
+
* Get query conditions (tag, attribute and filter conditions)
|
420 |
+
* @return array False on failure
|
421 |
+
* @see DomNode::match()
|
422 |
+
* @access private
|
423 |
+
*/
|
424 |
+
protected function parse_conditions() {
|
425 |
+
$p =& $this->parser;
|
426 |
+
$tok = $p->token;
|
427 |
+
|
428 |
+
if ($tok === CSSQueryTokenizer::TOK_NULL) {
|
429 |
+
$this->error('Invalid search pattern(1): Empty string!');
|
430 |
+
return false;
|
431 |
+
}
|
432 |
+
$conditions_all = array();
|
433 |
+
|
434 |
+
//Tags
|
435 |
+
while ($tok !== CSSQueryTokenizer::TOK_NULL) {
|
436 |
+
$conditions = array('tags' => array(), 'attributes' => array());
|
437 |
+
|
438 |
+
if ($tok === CSSQueryTokenizer::TOK_ALL) {
|
439 |
+
$tok = $p->next();
|
440 |
+
if (($tok === CSSQueryTokenizer::TOK_PIPE) && ($tok = $p->next()) && ($tok !== CSSQueryTokenizer::TOK_ALL)) {
|
441 |
+
if (($tag = $this->parse_getIdentifier()) === false) {
|
442 |
+
return false;
|
443 |
+
}
|
444 |
+
$conditions['tags'][] = array(
|
445 |
+
'tag' => $tag,
|
446 |
+
'compare' => 'name'
|
447 |
+
);
|
448 |
+
$tok = $p->next_no_whitespace();
|
449 |
+
} else {
|
450 |
+
$conditions['tags'][''] = array(
|
451 |
+
'tag' => '',
|
452 |
+
'match' => false
|
453 |
+
);
|
454 |
+
if ($tok === CSSQueryTokenizer::TOK_ALL) {
|
455 |
+
$tok = $p->next_no_whitespace();
|
456 |
+
}
|
457 |
+
}
|
458 |
+
} elseif ($tok === CSSQueryTokenizer::TOK_PIPE) {
|
459 |
+
$tok = $p->next();
|
460 |
+
if ($tok === CSSQueryTokenizer::TOK_ALL) {
|
461 |
+
$conditions['tags'][] = array(
|
462 |
+
'tag' => '',
|
463 |
+
'compare' => 'namespace',
|
464 |
+
);
|
465 |
+
} elseif (($tag = $this->parse_getIdentifier()) !== false) {
|
466 |
+
$conditions['tags'][] = array(
|
467 |
+
'tag' => $tag,
|
468 |
+
'compare' => 'total',
|
469 |
+
);
|
470 |
+
} else {
|
471 |
+
return false;
|
472 |
+
}
|
473 |
+
$tok = $p->next_no_whitespace();
|
474 |
+
} elseif ($tok === CSSQueryTokenizer::TOK_BRACE_OPEN) {
|
475 |
+
$tok = $p->next_no_whitespace();
|
476 |
+
$last_mode = 'or';
|
477 |
+
|
478 |
+
while (true) {
|
479 |
+
$match = true;
|
480 |
+
$compare = 'total';
|
481 |
+
|
482 |
+
if ($tok === CSSQueryTokenizer::TOK_NOT) {
|
483 |
+
$match = false;
|
484 |
+
$tok = $p->next_no_whitespace();
|
485 |
+
}
|
486 |
+
|
487 |
+
if ($tok === CSSQueryTokenizer::TOK_ALL) {
|
488 |
+
$tok = $p->next();
|
489 |
+
if ($tok === CSSQueryTokenizer::TOK_PIPE) {
|
490 |
+
$this->next();
|
491 |
+
$compare = 'name';
|
492 |
+
if (($tag = $this->parse_getIdentifier()) === false) {
|
493 |
+
return false;
|
494 |
+
}
|
495 |
+
}
|
496 |
+
} elseif ($tok === CSSQueryTokenizer::TOK_PIPE) {
|
497 |
+
$tok = $p->next();
|
498 |
+
if ($tok === CSSQueryTokenizer::TOK_ALL) {
|
499 |
+
$tag = '';
|
500 |
+
$compare = 'namespace';
|
501 |
+
} elseif (($tag = $this->parse_getIdentifier()) === false) {
|
502 |
+
return false;
|
503 |
+
}
|
504 |
+
$tok = $p->next_no_whitespace();
|
505 |
+
} else {
|
506 |
+
if (($tag = $this->parse_getIdentifier()) === false) {
|
507 |
+
return false;
|
508 |
+
}
|
509 |
+
$tok = $p->next();
|
510 |
+
if ($tok === CSSQueryTokenizer::TOK_PIPE) {
|
511 |
+
$tok = $p->next();
|
512 |
+
|
513 |
+
if ($tok === CSSQueryTokenizer::TOK_ALL) {
|
514 |
+
$compare = 'namespace';
|
515 |
+
} elseif (($tag_name = $this->parse_getIdentifier()) !== false) {
|
516 |
+
$tag = $tag.':'.$tag_name;
|
517 |
+
} else {
|
518 |
+
return false;
|
519 |
+
}
|
520 |
+
|
521 |
+
$tok = $p->next_no_whitespace();
|
522 |
+
}
|
523 |
+
}
|
524 |
+
if ($tok === CSSQueryTokenizer::TOK_WHITESPACE) {
|
525 |
+
$tok = $p->next_no_whitespace();
|
526 |
+
}
|
527 |
+
|
528 |
+
$conditions['tags'][] = array(
|
529 |
+
'tag' => $tag,
|
530 |
+
'match' => $match,
|
531 |
+
'operator' => $last_mode,
|
532 |
+
'compare' => $compare
|
533 |
+
);
|
534 |
+
switch($tok) {
|
535 |
+
case CSSQueryTokenizer::TOK_COMMA:
|
536 |
+
$tok = $p->next_no_whitespace();
|
537 |
+
$last_mode = 'or';
|
538 |
+
continue 2;
|
539 |
+
case CSSQueryTokenizer::TOK_PLUS:
|
540 |
+
$tok = $p->next_no_whitespace();
|
541 |
+
$last_mode = 'and';
|
542 |
+
continue 2;
|
543 |
+
case CSSQueryTokenizer::TOK_BRACE_CLOSE:
|
544 |
+
$tok = $p->next();
|
545 |
+
break 2;
|
546 |
+
default:
|
547 |
+
$this->error('Expected closing brace or comma at pos %pos%!');
|
548 |
+
return false;
|
549 |
+
}
|
550 |
+
}
|
551 |
+
} elseif (($tag = $this->parse_getIdentifier(false)) !== false) {
|
552 |
+
$tok = $p->next();
|
553 |
+
if ($tok === CSSQueryTokenizer::TOK_PIPE) {
|
554 |
+
$tok = $p->next();
|
555 |
+
|
556 |
+
if ($tok === CSSQueryTokenizer::TOK_ALL) {
|
557 |
+
$conditions['tags'][] = array(
|
558 |
+
'tag' => $tag,
|
559 |
+
'compare' => 'namespace'
|
560 |
+
);
|
561 |
+
} elseif (($tag_name = $this->parse_getIdentifier()) !== false) {
|
562 |
+
$tag = $tag.':'.$tag_name;
|
563 |
+
$conditions['tags'][] = array(
|
564 |
+
'tag' => $tag,
|
565 |
+
'match' => true
|
566 |
+
);
|
567 |
+
} else {
|
568 |
+
return false;
|
569 |
+
}
|
570 |
+
|
571 |
+
$tok = $p->next();
|
572 |
+
} elseif ($tag === 'text' && $tok === CSSQueryTokenizer::TOK_BRACE_OPEN) {
|
573 |
+
$pos = $p->getPos();
|
574 |
+
$tok = $p->next();
|
575 |
+
if ($tok === CSSQueryTokenizer::TOK_BRACE_CLOSE) {
|
576 |
+
$conditions['tags'][] = array(
|
577 |
+
'tag' => '~text~',
|
578 |
+
'match' => true
|
579 |
+
);
|
580 |
+
$p->next();
|
581 |
+
} else {
|
582 |
+
$p->setPos($pos);
|
583 |
+
}
|
584 |
+
} else {
|
585 |
+
$conditions['tags'][] = array(
|
586 |
+
'tag' => $tag,
|
587 |
+
'match' => true
|
588 |
+
);
|
589 |
+
}
|
590 |
+
} else {
|
591 |
+
unset($conditions['tags']);
|
592 |
+
}
|
593 |
+
|
594 |
+
//Class
|
595 |
+
$last_mode = 'or';
|
596 |
+
if ($tok === CSSQueryTokenizer::TOK_CLASS) {
|
597 |
+
$p->next();
|
598 |
+
if (($class = $this->parse_getIdentifier()) === false) {
|
599 |
+
return false;
|
600 |
+
}
|
601 |
+
|
602 |
+
$conditions['attributes'][] = array(
|
603 |
+
'attribute' => 'class',
|
604 |
+
'operator_value' => 'contains_word',
|
605 |
+
'value' => $class,
|
606 |
+
'operator_result' => $last_mode
|
607 |
+
);
|
608 |
+
$last_mode = 'and';
|
609 |
+
$tok = $p->next();
|
610 |
+
}
|
611 |
+
|
612 |
+
//ID
|
613 |
+
if ($tok === CSSQueryTokenizer::TOK_ID) {
|
614 |
+
$p->next();
|
615 |
+
if (($id = $this->parse_getIdentifier()) === false) {
|
616 |
+
return false;
|
617 |
+
}
|
618 |
+
|
619 |
+
$conditions['attributes'][] = array(
|
620 |
+
'attribute' => 'id',
|
621 |
+
'operator_value' => 'equals',
|
622 |
+
'value' => $id,
|
623 |
+
'operator_result' => $last_mode
|
624 |
+
);
|
625 |
+
$last_mode = 'and';
|
626 |
+
$tok = $p->next();
|
627 |
+
}
|
628 |
+
|
629 |
+
//Attributes
|
630 |
+
if ($tok === CSSQueryTokenizer::TOK_BRACKET_OPEN) {
|
631 |
+
$tok = $p->next_no_whitespace();
|
632 |
+
|
633 |
+
while (true) {
|
634 |
+
$match = true;
|
635 |
+
$compare = 'total';
|
636 |
+
if ($tok === CSSQueryTokenizer::TOK_NOT) {
|
637 |
+
$match = false;
|
638 |
+
$tok = $p->next_no_whitespace();
|
639 |
+
}
|
640 |
+
|
641 |
+
if ($tok === CSSQueryTokenizer::TOK_ALL) {
|
642 |
+
$tok = $p->next();
|
643 |
+
if ($tok === CSSQueryTokenizer::TOK_PIPE) {
|
644 |
+
$tok = $p->next();
|
645 |
+
if (($attribute = $this->parse_getIdentifier()) === false) {
|
646 |
+
return false;
|
647 |
+
}
|
648 |
+
$compare = 'name';
|
649 |
+
$tok = $p->next();
|
650 |
+
} else {
|
651 |
+
$this->error('Expected pipe at pos %pos%!');
|
652 |
+
return false;
|
653 |
+
}
|
654 |
+
} elseif ($tok === CSSQueryTokenizer::TOK_PIPE) {
|
655 |
+
$tok = $p->next();
|
656 |
+
if (($tag = $this->parse_getIdentifier()) === false) {
|
657 |
+
return false;
|
658 |
+
}
|
659 |
+
$tok = $p->next_no_whitespace();
|
660 |
+
} elseif (($attribute = $this->parse_getIdentifier()) !== false) {
|
661 |
+
$tok = $p->next();
|
662 |
+
if ($tok === CSSQueryTokenizer::TOK_PIPE) {
|
663 |
+
$tok = $p->next();
|
664 |
+
|
665 |
+
if (($attribute_name = $this->parse_getIdentifier()) !== false) {
|
666 |
+
$attribute = $attribute.':'.$attribute_name;
|
667 |
+
} else {
|
668 |
+
return false;
|
669 |
+
}
|
670 |
+
|
671 |
+
$tok = $p->next();
|
672 |
+
}
|
673 |
+
} else {
|
674 |
+
return false;
|
675 |
+
}
|
676 |
+
if ($tok === CSSQueryTokenizer::TOK_WHITESPACE) {
|
677 |
+
$tok = $p->next_no_whitespace();
|
678 |
+
}
|
679 |
+
|
680 |
+
$operator_value = '';
|
681 |
+
$val = '';
|
682 |
+
switch($tok) {
|
683 |
+
case CSSQueryTokenizer::TOK_COMPARE_PREFIX:
|
684 |
+
case CSSQueryTokenizer::TOK_COMPARE_CONTAINS:
|
685 |
+
case CSSQueryTokenizer::TOK_COMPARE_CONTAINS_WORD:
|
686 |
+
case CSSQueryTokenizer::TOK_COMPARE_ENDS:
|
687 |
+
case CSSQueryTokenizer::TOK_COMPARE_EQUALS:
|
688 |
+
case CSSQueryTokenizer::TOK_COMPARE_NOT_EQUAL:
|
689 |
+
case CSSQueryTokenizer::TOK_COMPARE_REGEX:
|
690 |
+
case CSSQueryTokenizer::TOK_COMPARE_STARTS:
|
691 |
+
case CSSQueryTokenizer::TOK_COMPARE_BIGGER_THAN:
|
692 |
+
case CSSQueryTokenizer::TOK_COMPARE_SMALLER_THAN:
|
693 |
+
$operator_value = $p->getTokenString(($tok === CSSQueryTokenizer::TOK_COMPARE_EQUALS) ? 0 : -1);
|
694 |
+
$p->next_no_whitespace();
|
695 |
+
|
696 |
+
if (($val = $this->parse_getIdentifier()) === false) {
|
697 |
+
return false;
|
698 |
+
}
|
699 |
+
|
700 |
+
$tok = $p->next_no_whitespace();
|
701 |
+
break;
|
702 |
+
}
|
703 |
+
|
704 |
+
if ($operator_value && $val) {
|
705 |
+
$conditions['attributes'][] = array(
|
706 |
+
'attribute' => $attribute,
|
707 |
+
'operator_value' => $operator_value,
|
708 |
+
'value' => $val,
|
709 |
+
'match' => $match,
|
710 |
+
'operator_result' => $last_mode,
|
711 |
+
'compare' => $compare
|
712 |
+
);
|
713 |
+
} else {
|
714 |
+
$conditions['attributes'][] = array(
|
715 |
+
'attribute' => $attribute,
|
716 |
+
'value' => $match,
|
717 |
+
'operator_result' => $last_mode,
|
718 |
+
'compare' => $compare
|
719 |
+
);
|
720 |
+
}
|
721 |
+
|
722 |
+
switch($tok) {
|
723 |
+
case CSSQueryTokenizer::TOK_COMMA:
|
724 |
+
$tok = $p->next_no_whitespace();
|
725 |
+
$last_mode = 'or';
|
726 |
+
continue 2;
|
727 |
+
case CSSQueryTokenizer::TOK_PLUS:
|
728 |
+
$tok = $p->next_no_whitespace();
|
729 |
+
$last_mode = 'and';
|
730 |
+
continue 2;
|
731 |
+
case CSSQueryTokenizer::TOK_BRACKET_CLOSE:
|
732 |
+
$tok = $p->next();
|
733 |
+
break 2;
|
734 |
+
default:
|
735 |
+
$this->error('Expected closing bracket or comma at pos %pos%!');
|
736 |
+
return false;
|
737 |
+
}
|
738 |
+
}
|
739 |
+
}
|
740 |
+
|
741 |
+
if (count($conditions['attributes']) < 1) {
|
742 |
+
unset($conditions['attributes']);
|
743 |
+
}
|
744 |
+
|
745 |
+
while($tok === CSSQueryTokenizer::TOK_COLON) {
|
746 |
+
if (count($conditions) < 1) {
|
747 |
+
$conditions['tags'] = array(array(
|
748 |
+
'tag' => '',
|
749 |
+
'match' => false
|
750 |
+
));
|
751 |
+
}
|
752 |
+
|
753 |
+
$tok = $p->next();
|
754 |
+
if (($filter = $this->parse_getIdentifier()) === false) {
|
755 |
+
return false;
|
756 |
+
}
|
757 |
+
|
758 |
+
if (($tok = $p->next()) === CSSQueryTokenizer::TOK_BRACE_OPEN) {
|
759 |
+
$start = $p->pos;
|
760 |
+
$count = 1;
|
761 |
+
while ((($tok = $p->next()) !== CSSQueryTokenizer::TOK_NULL) && !(($tok === CSSQueryTokenizer::TOK_BRACE_CLOSE) && (--$count === 0))) {
|
762 |
+
if ($tok === CSSQueryTokenizer::TOK_BRACE_OPEN) {
|
763 |
+
++$count;
|
764 |
+
}
|
765 |
+
}
|
766 |
+
|
767 |
+
|
768 |
+
if ($tok !== CSSQueryTokenizer::TOK_BRACE_CLOSE) {
|
769 |
+
$this->error('Expected closing brace at pos %pos%!');
|
770 |
+
return false;
|
771 |
+
}
|
772 |
+
$len = $p->pos - 1 - $start;
|
773 |
+
$params = (($len > 0) ? substr($p->doc, $start + 1, $len) : '');
|
774 |
+
$tok = $p->next();
|
775 |
+
} else {
|
776 |
+
$params = '';
|
777 |
+
}
|
778 |
+
|
779 |
+
$conditions['filters'][] = array('filter' => $filter, 'params' => $params);
|
780 |
+
}
|
781 |
+
if (count($conditions) < 1) {
|
782 |
+
$this->error('Invalid search pattern(2): No conditions found!');
|
783 |
+
return false;
|
784 |
+
}
|
785 |
+
$conditions_all[] = $conditions;
|
786 |
+
|
787 |
+
if ($tok === CSSQueryTokenizer::TOK_WHITESPACE) {
|
788 |
+
$tok = $p->next_no_whitespace();
|
789 |
+
}
|
790 |
+
|
791 |
+
if ($tok === CSSQueryTokenizer::TOK_COMMA) {
|
792 |
+
$tok = $p->next_no_whitespace();
|
793 |
+
continue;
|
794 |
+
} else {
|
795 |
+
break;
|
796 |
+
}
|
797 |
+
}
|
798 |
+
|
799 |
+
return $conditions_all;
|
800 |
+
}
|
801 |
+
|
802 |
+
|
803 |
+
/**
|
804 |
+
* Evaluate root node using custom callback
|
805 |
+
* @param array $conditions {@link parse_conditions()}
|
806 |
+
* @param bool|int $recursive
|
807 |
+
* @param bool $check_root
|
808 |
+
* @return array
|
809 |
+
* @access private
|
810 |
+
*/
|
811 |
+
protected function parse_callback($conditions, $recursive = true, $check_root = false) {
|
812 |
+
return ($this->result = $this->root->getChildrenByMatch(
|
813 |
+
$conditions,
|
814 |
+
$recursive,
|
815 |
+
$check_root,
|
816 |
+
$this->custom_filter_map
|
817 |
+
));
|
818 |
+
}
|
819 |
+
|
820 |
+
/**
|
821 |
+
* Parse first bit of query, only root node has to be evaluated now
|
822 |
+
* @param bool|int $recursive
|
823 |
+
* @return bool
|
824 |
+
* @internal Result of query is set in {@link $result}
|
825 |
+
* @access private
|
826 |
+
*/
|
827 |
+
protected function parse_single($recursive = true) {
|
828 |
+
if (($c = $this->parse_conditions()) === false) {
|
829 |
+
return false;
|
830 |
+
}
|
831 |
+
|
832 |
+
$this->parse_callback($c, $recursive, $this->search_root);
|
833 |
+
return true;
|
834 |
+
}
|
835 |
+
|
836 |
+
/**
|
837 |
+
* Evaluate sibling nodes
|
838 |
+
* @return bool
|
839 |
+
* @internal Result of query is set in {@link $result}
|
840 |
+
* @access private
|
841 |
+
*/
|
842 |
+
protected function parse_adjacent() {
|
843 |
+
$tmp = $this->result;
|
844 |
+
$this->result = array();
|
845 |
+
if (($c = $this->parse_conditions()) === false) {
|
846 |
+
return false;
|
847 |
+
}
|
848 |
+
|
849 |
+
foreach($tmp as $t) {
|
850 |
+
if (($sibling = $t->getNextSibling()) !== false) {
|
851 |
+
if ($sibling->match($c, true, $this->custom_filter_map)) {
|
852 |
+
$this->result[] = $sibling;
|
853 |
+
}
|
854 |
+
}
|
855 |
+
}
|
856 |
+
|
857 |
+
return true;
|
858 |
+
}
|
859 |
+
|
860 |
+
/**
|
861 |
+
* Evaluate {@link $result}
|
862 |
+
* @param bool $parent Evaluate parent nodes
|
863 |
+
* @param bool|int $recursive
|
864 |
+
* @return bool
|
865 |
+
* @internal Result of query is set in {@link $result}
|
866 |
+
* @access private
|
867 |
+
*/
|
868 |
+
protected function parse_result($parent = false, $recursive = true) {
|
869 |
+
$tmp = $this->result;
|
870 |
+
$tmp_res = array();
|
871 |
+
if (($c = $this->parse_conditions()) === false) {
|
872 |
+
return false;
|
873 |
+
}
|
874 |
+
|
875 |
+
foreach(array_keys($tmp) as $t) {
|
876 |
+
$this->root = (($parent) ? $tmp[$t]->parent : $tmp[$t]);
|
877 |
+
$this->parse_callback($c, $recursive);
|
878 |
+
foreach(array_keys($this->result) as $r) {
|
879 |
+
if (!in_array($this->result[$r], $tmp_res, true)) {
|
880 |
+
$tmp_res[] = $this->result[$r];
|
881 |
+
}
|
882 |
+
}
|
883 |
+
}
|
884 |
+
$this->result = $tmp_res;
|
885 |
+
return true;
|
886 |
+
}
|
887 |
+
|
888 |
+
/**
|
889 |
+
* Parse full query
|
890 |
+
* @return bool
|
891 |
+
* @internal Result of query is set in {@link $result}
|
892 |
+
* @access private
|
893 |
+
*/
|
894 |
+
protected function parse() {
|
895 |
+
$p =& $this->parser;
|
896 |
+
$p->setPos(0);
|
897 |
+
$this->result = array();
|
898 |
+
|
899 |
+
if (!$this->parse_single()) {
|
900 |
+
return false;
|
901 |
+
}
|
902 |
+
|
903 |
+
while (count($this->result) > 0) {
|
904 |
+
switch($p->token) {
|
905 |
+
case CSSQueryTokenizer::TOK_CHILD:
|
906 |
+
$this->parser->next_no_whitespace();
|
907 |
+
if (!$this->parse_result(false, 1)) {
|
908 |
+
return false;
|
909 |
+
}
|
910 |
+
break;
|
911 |
+
|
912 |
+
case CSSQueryTokenizer::TOK_SIBLING:
|
913 |
+
$this->parser->next_no_whitespace();
|
914 |
+
if (!$this->parse_result(true, 1)) {
|
915 |
+
return false;
|
916 |
+
}
|
917 |
+
break;
|
918 |
+
|
919 |
+
case CSSQueryTokenizer::TOK_PLUS:
|
920 |
+
$this->parser->next_no_whitespace();
|
921 |
+
if (!$this->parse_adjacent()) {
|
922 |
+
return false;
|
923 |
+
}
|
924 |
+
break;
|
925 |
+
|
926 |
+
case CSSQueryTokenizer::TOK_ALL:
|
927 |
+
case CSSQueryTokenizer::TOK_IDENTIFIER:
|
928 |
+
case CSSQueryTokenizer::TOK_STRING:
|
929 |
+
case CSSQueryTokenizer::TOK_BRACE_OPEN:
|
930 |
+
case CSSQueryTokenizer::TOK_BRACKET_OPEN:
|
931 |
+
case CSSQueryTokenizer::TOK_ID:
|
932 |
+
case CSSQueryTokenizer::TOK_CLASS:
|
933 |
+
case CSSQueryTokenizer::TOK_COLON:
|
934 |
+
if (!$this->parse_result()) {
|
935 |
+
return false;
|
936 |
+
}
|
937 |
+
break;
|
938 |
+
|
939 |
+
case CSSQueryTokenizer::TOK_NULL:
|
940 |
+
break 2;
|
941 |
+
|
942 |
+
default:
|
943 |
+
$this->error('Invalid search pattern(3): No result modifier found!');
|
944 |
+
return false;
|
945 |
+
}
|
946 |
+
}
|
947 |
+
|
948 |
+
return true;
|
949 |
+
}
|
950 |
+
}
|
lib-3rd-party/pquery/gan_tokenizer.php
ADDED
@@ -0,0 +1,567 @@
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* @author Niels A.D.
|
4 |
+
* @author Todd Burry <todd@vanillaforums.com>
|
5 |
+
* @copyright 2010 Niels A.D., 2014 Todd Burry
|
6 |
+
* @license http://opensource.org/licenses/LGPL-2.1 LGPL-2.1
|
7 |
+
* @package pQuery
|
8 |
+
*/
|
9 |
+
|
10 |
+
namespace MailPoetVendor\pQuery;
|
11 |
+
|
12 |
+
if (!defined('ABSPATH')) exit;
|
13 |
+
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Converts a document into tokens
|
17 |
+
*
|
18 |
+
* Can convert any string into tokens. The base class only supports
|
19 |
+
* identifier/whitespace tokens. For more tokens, the class can be
|
20 |
+
* easily extended.
|
21 |
+
*
|
22 |
+
* Use like:
|
23 |
+
* <code>
|
24 |
+
* <?php
|
25 |
+
* $a = new TokenizerBase('hello word');
|
26 |
+
* while ($a->next() !== $a::TOK_NULL) {
|
27 |
+
* echo $a->token, ': ',$a->getTokenString(), "<br>\n";
|
28 |
+
* }
|
29 |
+
* ?>
|
30 |
+
* </code>
|
31 |
+
*
|
32 |
+
* @internal The tokenizer works with a character map that connects a certain
|
33 |
+
* character to a certain function/token. This class is build with speed in mind.
|
34 |
+
*/
|
35 |
+
class TokenizerBase {
|
36 |
+
|
37 |
+
/**
|
38 |
+
* NULL Token, used at end of document (parsing should stop after this token)
|
39 |
+
*/
|
40 |
+
const TOK_NULL = 0;
|
41 |
+
/**
|
42 |
+
* Unknown token, used at unidentified character
|
43 |
+
*/
|
44 |
+
const TOK_UNKNOWN = 1;
|
45 |
+
/**
|
46 |
+
* Whitespace token, used with whitespace
|
47 |
+
*/
|
48 |
+
const TOK_WHITESPACE = 2;
|
49 |
+
/**
|
50 |
+
* Identifier token, used with identifiers
|
51 |
+
*/
|
52 |
+
const TOK_IDENTIFIER = 3;
|
53 |
+
|
54 |
+
/**
|
55 |
+
* The document that is being tokenized
|
56 |
+
* @var string
|
57 |
+
* @internal Public for faster access!
|
58 |
+
* @see setDoc()
|
59 |
+
* @see getDoc()
|
60 |
+
* @access private
|
61 |
+
*/
|
62 |
+
var $doc = '';
|
63 |
+
|
64 |
+
/**
|
65 |
+
* The size of the document (length of string)
|
66 |
+
* @var int
|
67 |
+
* @internal Public for faster access!
|
68 |
+
* @see $doc
|
69 |
+
* @access private
|
70 |
+
*/
|
71 |
+
var $size = 0;
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Current (character) position in the document
|
75 |
+
* @var int
|
76 |
+
* @internal Public for faster access!
|
77 |
+
* @see setPos()
|
78 |
+
* @see getPos()
|
79 |
+
* @access private
|
80 |
+
*/
|
81 |
+
var $pos = 0;
|
82 |
+
|
83 |
+
/**
|
84 |
+
* Current (Line/Column) position in document
|
85 |
+
* @var array (Current_Line, Line_Starting_Pos)
|
86 |
+
* @internal Public for faster access!
|
87 |
+
* @see getLinePos()
|
88 |
+
* @access private
|
89 |
+
*/
|
90 |
+
var $line_pos = array(0, 0);
|
91 |
+
|
92 |
+
/**
|
93 |
+
* Current token
|
94 |
+
* @var int
|
95 |
+
* @internal Public for faster access!
|
96 |
+
* @see getToken()
|
97 |
+
* @access private
|
98 |
+
*/
|
99 |
+
var $token = self::TOK_NULL;
|
100 |
+
|
101 |
+
/**
|
102 |
+
* Start position of token. If NULL, then current position is used.
|
103 |
+
* @var int
|
104 |
+
* @internal Public for faster access!
|
105 |
+
* @see getTokenString()
|
106 |
+
* @access private
|
107 |
+
*/
|
108 |
+
var $token_start = null;
|
109 |
+
|
110 |
+
/**
|
111 |
+
* List with all the character that can be considered as whitespace
|
112 |
+
* @var array|string
|
113 |
+
* @internal Variable is public + associated array for faster access!
|
114 |
+
* @internal array(' ' => true) will recognize space (' ') as whitespace
|
115 |
+
* @internal String will be converted to array in constructor
|
116 |
+
* @internal Result token will be {@link self::TOK_WHITESPACE};
|
117 |
+
* @see setWhitespace()
|
118 |
+
* @see getWhitespace()
|
119 |
+
* @access private
|
120 |
+
*/
|
121 |
+
var $whitespace = " \t\n\r\0\x0B";
|
122 |
+
|
123 |
+
/**
|
124 |
+
* List with all the character that can be considered as identifier
|
125 |
+
* @var array|string
|
126 |
+
* @internal Variable is public + associated array for faster access!
|
127 |
+
* @internal array('a' => true) will recognize 'a' as identifier
|
128 |
+
* @internal String will be converted to array in constructor
|
129 |
+
* @internal Result token will be {@link self::TOK_IDENTIFIER};
|
130 |
+
* @see setIdentifiers()
|
131 |
+
* @see getIdentifiers()
|
132 |
+
* @access private
|
133 |
+
*/
|
134 |
+
var $identifiers = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_';
|
135 |
+
|
136 |
+
/**
|
137 |
+
* All characters that should be mapped to a token/function that cannot be considered as whitespace or identifier
|
138 |
+
* @var array
|
139 |
+
* @internal Variable is public + associated array for faster access!
|
140 |
+
* @internal array('a' => 'parse_a') will call $this->parse_a() if it matches the character 'a'
|
141 |
+
* @internal array('a' => self::TOK_A) will set token to TOK_A if it matches the character 'a'
|
142 |
+
* @see mapChar()
|
143 |
+
* @see unmapChar()
|
144 |
+
* @access private
|
145 |
+
*/
|
146 |
+
var $custom_char_map = array();
|
147 |
+
|
148 |
+
/**
|
149 |
+
* Automatically built character map. Built using {@link $identifiers}, {@link $whitespace} and {@link $custom_char_map}
|
150 |
+
* @var array
|
151 |
+
* @internal Public for faster access!
|
152 |
+
* @access private
|
153 |
+
*/
|
154 |
+
var $char_map = array();
|
155 |
+
|
156 |
+
/**
|
157 |
+
* All errors found while parsing the document
|
158 |
+
* @var array
|
159 |
+
* @see addError()
|
160 |
+
*/
|
161 |
+
var $errors = array();
|
162 |
+
|
163 |
+
/**
|
164 |
+
* Class constructor
|
165 |
+
* @param string $doc Document to be tokenized
|
166 |
+
* @param int $pos Position to start parsing
|
167 |
+
* @see setDoc()
|
168 |
+
* @see setPos()
|
169 |
+
*/
|
170 |
+
function __construct($doc = '', $pos = 0) {
|
171 |
+
$this->setWhitespace($this->whitespace);
|
172 |
+
$this->setIdentifiers($this->identifiers);
|
173 |
+
|
174 |
+
$this->setDoc($doc, $pos);
|
175 |
+
}
|
176 |
+
|
177 |
+
#php4 PHP4 class constructor compatibility
|
178 |
+
#function TokenizerBase($doc = '', $pos = 0) {return $this->__construct($doc, $pos);}
|
179 |
+
#php4e
|
180 |
+
|
181 |
+
/**
|
182 |
+
* Sets target document
|
183 |
+
* @param string $doc Document to be tokenized
|
184 |
+
* @param int $pos Position to start parsing
|
185 |
+
* @see getDoc()
|
186 |
+
* @see setPos()
|
187 |
+
*/
|
188 |
+
function setDoc($doc, $pos = 0) {
|
189 |
+
$this->doc = $doc;
|
190 |
+
$this->size = strlen($doc);
|
191 |
+
$this->setPos($pos);
|
192 |
+
}
|
193 |
+
|
194 |
+
/**
|
195 |
+
* Returns target document
|
196 |
+
* @return string
|
197 |
+
* @see setDoc()
|
198 |
+
*/
|
199 |
+
function getDoc() {
|
200 |
+
return $this->doc;
|
201 |
+
}
|
202 |
+
|
203 |
+
/**
|
204 |
+
* Sets position in document
|
205 |
+
* @param int $pos
|
206 |
+
* @see getPos()
|
207 |
+
*/
|
208 |
+
function setPos($pos = 0) {
|
209 |
+
$this->pos = $pos - 1;
|
210 |
+
$this->line_pos = array(0, 0);
|
211 |
+
$this->next();
|
212 |
+
}
|
213 |
+
|
214 |
+
/**
|
215 |
+
* Returns current position in document (Index)
|
216 |
+
* @return int
|
217 |
+
* @see setPos()
|
218 |
+
*/
|
219 |
+
function getPos() {
|
220 |
+
return $this->pos;
|
221 |
+
}
|
222 |
+
|
223 |
+
/**
|
224 |
+
* Returns current position in document (Line/Char)
|
225 |
+
* @return array array(Line, Column)
|
226 |
+
*/
|
227 |
+
function getLinePos() {
|
228 |
+
return array($this->line_pos[0], $this->pos - $this->line_pos[1]);
|
229 |
+
}
|
230 |
+
|
231 |
+
/**
|
232 |
+
* Returns current token
|
233 |
+
* @return int
|
234 |
+
* @see $token
|
235 |
+
*/
|
236 |
+
function getToken() {
|
237 |
+
return $this->token;
|
238 |
+
}
|
239 |
+
|
240 |
+
/**
|
241 |
+
* Returns current token as string
|
242 |
+
* @param int $start_offset Offset from token start
|
243 |
+
* @param int $end_offset Offset from token end
|
244 |
+
* @return string
|
245 |
+
*/
|
246 |
+
function getTokenString($start_offset = 0, $end_offset = 0) {
|
247 |
+
$token_start = ((is_int($this->token_start)) ? $this->token_start : $this->pos) + $start_offset;
|
248 |
+
$len = $this->pos - $token_start + 1 + $end_offset;
|
249 |
+
return (($len > 0) ? substr($this->doc, $token_start, $len) : '');
|
250 |
+
}
|
251 |
+
|
252 |
+
/**
|
253 |
+
* Sets characters to be recognized as whitespace
|
254 |
+
*
|
255 |
+
* Used like: setWhitespace('ab') or setWhitespace(array('a' => true, 'b', 'c'));
|
256 |
+
* @param string|array $ws
|
257 |
+
* @see getWhitespace();
|
258 |
+
*/
|
259 |
+
function setWhitespace($ws) {
|
260 |
+
if (is_array($ws)) {
|
261 |
+
$this->whitespace = array_fill_keys(array_values($ws), true);
|
262 |
+
$this->buildCharMap();
|
263 |
+
} else {
|
264 |
+
$this->setWhiteSpace(str_split($ws));
|
265 |
+
}
|
266 |
+
}
|
267 |
+
|
268 |
+
/**
|
269 |
+
* Returns whitespace characters as string/array
|
270 |
+
* @param bool $as_string Should the result be a string or an array?
|
271 |
+
* @return string|array
|
272 |
+
* @see setWhitespace()
|
273 |
+
*/
|
274 |
+
function getWhitespace($as_string = true) {
|
275 |
+
$ws = array_keys($this->whitespace);
|
276 |
+
return (($as_string) ? implode('', $ws) : $ws);
|
277 |
+
}
|
278 |
+
|
279 |
+
/**
|
280 |
+
* Sets characters to be recognized as identifier
|
281 |
+
*
|
282 |
+
* Used like: setIdentifiers('ab') or setIdentifiers(array('a' => true, 'b', 'c'));
|
283 |
+
* @param string|array $ident
|
284 |
+
* @see getIdentifiers();
|
285 |
+
*/
|
286 |
+
function setIdentifiers($ident) {
|
287 |
+
if (is_array($ident)) {
|
288 |
+
$this->identifiers = array_fill_keys(array_values($ident), true);
|
289 |
+
$this->buildCharMap();
|
290 |
+
} else {
|
291 |
+
$this->setIdentifiers(str_split($ident));
|
292 |
+
}
|
293 |
+
}
|
294 |
+
|
295 |
+
/**
|
296 |
+
* Returns identifier characters as string/array
|
297 |
+
* @param bool $as_string Should the result be a string or an array?
|
298 |
+
* @return string|array
|
299 |
+
* @see setIdentifiers()
|
300 |
+
*/
|
301 |
+
function getIdentifiers($as_string = true) {
|
302 |
+
$ident = array_keys($this->identifiers);
|
303 |
+
return (($as_string) ? implode('', $ident) : $ident);
|
304 |
+
}
|
305 |
+
|
306 |
+
/**
|
307 |
+
* Maps a custom character to a token/function
|
308 |
+
*
|
309 |
+
* Used like: mapChar('a', self::{@link TOK_IDENTIFIER}) or mapChar('a', 'parse_identifier');
|
310 |
+
* @param string $char Character that should be mapped. If set, it will be overridden
|
311 |
+
* @param int|string $map If function name, then $this->function will be called, otherwise token is set to $map
|
312 |
+
* @see unmapChar()
|
313 |
+
*/
|
314 |
+
function mapChar($char, $map) {
|
315 |
+
$this->custom_char_map[$char] = $map;
|
316 |
+
$this->buildCharMap();
|
317 |
+
}
|
318 |
+
|
319 |
+
/**
|
320 |
+
* Removes a char mapped with {@link mapChar()}
|
321 |
+
* @param string $char Character that should be unmapped
|
322 |
+
* @see mapChar()
|
323 |
+
*/
|
324 |
+
function unmapChar($char) {
|
325 |
+
unset($this->custom_char_map[$char]);
|
326 |
+
$this->buildCharMap();
|
327 |
+
}
|
328 |
+
|
329 |
+
/**
|
330 |
+
* Builds the {@link $map_char} array
|
331 |
+
* @internal Builds single array that maps all characters. Gets called if {@link $whitespace}, {@link $identifiers} or {@link $custom_char_map} get modified
|
332 |
+
*/
|
333 |
+
protected function buildCharMap() {
|
334 |
+
$this->char_map = $this->custom_char_map;
|
335 |
+
if (is_array($this->whitespace)) {
|
336 |
+
foreach($this->whitespace as $w => $v) {
|
337 |
+
$this->char_map[$w] = 'parse_whitespace';
|
338 |
+
}
|
339 |
+
}
|
340 |
+
if (is_array($this->identifiers)) {
|
341 |
+
foreach($this->identifiers as $i => $v) {
|
342 |
+
$this->char_map[$i] = 'parse_identifier';
|
343 |
+
}
|
344 |
+
}
|
345 |
+
}
|
346 |
+
|
347 |
+
/**
|
348 |
+
* Add error to the array and appends current position
|
349 |
+
* @param string $error
|
350 |
+
*/
|
351 |
+
function addError($error) {
|
352 |
+
$this->errors[] = htmlentities($error.' at '.($this->line_pos[0] + 1).', '.($this->pos - $this->line_pos[1] + 1).'!');
|
353 |
+
}
|
354 |
+
|
355 |
+
/**
|
356 |
+
* Parse line breaks and increase line number
|
357 |
+
* @internal Gets called to process line breaks
|
358 |
+
*/
|
359 |
+
protected function parse_linebreak() {
|
360 |
+
if($this->doc[$this->pos] === "\r") {
|
361 |
+
++$this->line_pos[0];
|
362 |
+
if ((($this->pos + 1) < $this->size) && ($this->doc[$this->pos + 1] === "\n")) {
|
363 |
+
++$this->pos;
|
364 |
+
}
|
365 |
+
$this->line_pos[1] = $this->pos;
|
366 |
+
} elseif($this->doc[$this->pos] === "\n") {
|
367 |
+
++$this->line_pos[0];
|
368 |
+
$this->line_pos[1] = $this->pos;
|
369 |
+
}
|
370 |
+
}
|
371 |
+
|
372 |
+
/**
|
373 |
+
* Parse whitespace
|
374 |
+
* @return int Token
|
375 |
+
* @internal Gets called with {@link $whitespace} characters
|
376 |
+
*/
|
377 |
+
protected function parse_whitespace() {
|
378 |
+
$this->token_start = $this->pos;
|
379 |
+
|
380 |
+
while(++$this->pos < $this->size) {
|
381 |
+
if (!isset($this->whitespace[$this->doc[$this->pos]])) {
|
382 |
+
break;
|
383 |
+
} else {
|
384 |
+
$this->parse_linebreak();
|
385 |
+
}
|
386 |
+
}
|
387 |
+
|
388 |
+
--$this->pos;
|
389 |
+
return self::TOK_WHITESPACE;
|
390 |
+
}
|
391 |
+
|
392 |
+
/**
|
393 |
+
* Parse identifiers
|
394 |
+
* @return int Token
|
395 |
+
* @internal Gets called with {@link $identifiers} characters
|
396 |
+
*/
|
397 |
+
protected function parse_identifier() {
|
398 |
+
$this->token_start = $this->pos;
|
399 |
+
|
400 |
+
while((++$this->pos < $this->size) && isset($this->identifiers[$this->doc[$this->pos]])) {}
|
401 |
+
|
402 |
+
--$this->pos;
|
403 |
+
return self::TOK_IDENTIFIER;
|
404 |
+
}
|
405 |
+
|
406 |
+
/**
|
407 |
+
* Continues to the next token
|
408 |
+
* @return int Next token ({@link TOK_NULL} if none)
|
409 |
+
*/
|
410 |
+
function next() {
|
411 |
+
$this->token_start = null;
|
412 |
+
|
413 |
+
if (++$this->pos < $this->size) {
|
414 |
+
if (isset($this->char_map[$this->doc[$this->pos]])) {
|
415 |
+
if (is_string($this->char_map[$this->doc[$this->pos]])) {
|
416 |
+
return ($this->token = $this->{$this->char_map[$this->doc[$this->pos]]}());
|
417 |
+
} else {
|
418 |
+
return ($this->token = $this->char_map[$this->doc[$this->pos]]);
|
419 |
+
}
|
420 |
+
} else {
|
421 |
+
return ($this->token = self::TOK_UNKNOWN);
|
422 |
+
}
|
423 |
+
} else {
|
424 |
+
return ($this->token = self::TOK_NULL);
|
425 |
+
}
|
426 |
+
}
|
427 |
+
|
428 |
+
/**
|
429 |
+
* Finds the next token, but skips whitespace
|
430 |
+
* @return int Next token ({@link TOK_NULL} if none)
|
431 |
+
*/
|
432 |
+
function next_no_whitespace() {
|
433 |
+
$this->token_start = null;
|
434 |
+
|
435 |
+
while (++$this->pos < $this->size) {
|
436 |
+
if (!isset($this->whitespace[$this->doc[$this->pos]])) {
|
437 |
+
if (isset($this->char_map[$this->doc[$this->pos]])) {
|
438 |
+
if (is_string($this->char_map[$this->doc[$this->pos]])) {
|
439 |
+
return ($this->token = $this->{$this->char_map[$this->doc[$this->pos]]}());
|
440 |
+
} else {
|
441 |
+
return ($this->token = $this->char_map[$this->doc[$this->pos]]);
|
442 |
+
}
|
443 |
+
} else {
|
444 |
+
return ($this->token = self::TOK_UNKNOWN);
|
445 |
+
}
|
446 |
+
} else {
|
447 |
+
$this->parse_linebreak();
|
448 |
+
}
|
449 |
+
}
|
450 |
+
|
451 |
+
return ($this->token = self::TOK_NULL);
|
452 |
+
}
|
453 |
+
|
454 |
+
/**
|
455 |
+
* Finds the next token using stop characters.
|
456 |
+
*
|
457 |
+
* Used like: next_search('abc') or next_search(array('a' => true, 'b' => true, 'c' => true));
|
458 |
+
* @param string|array $characters Characters to search for
|
459 |
+
* @param bool $callback Should the function check the charmap after finding a character?
|
460 |
+
* @return int Next token ({@link TOK_NULL} if none)
|
461 |
+
*/
|
462 |
+
function next_search($characters, $callback = true) {
|
463 |
+
$this->token_start = $this->pos;
|
464 |
+
if (!is_array($characters)) {
|
465 |
+
$characters = array_fill_keys(str_split($characters), true);
|
466 |
+
}
|
467 |
+
|
468 |
+
while(++$this->pos < $this->size) {
|
469 |
+
if (isset($characters[$this->doc[$this->pos]])) {
|
470 |
+
if ($callback && isset($this->char_map[$this->doc[$this->pos]])) {
|
471 |
+
if (is_string($this->char_map[$this->doc[$this->pos]])) {
|
472 |
+
return ($this->token = $this->{$this->char_map[$this->doc[$this->pos]]}());
|
473 |
+
} else {
|
474 |
+
return ($this->token = $this->char_map[$this->doc[$this->pos]]);
|
475 |
+
}
|
476 |
+
} else {
|
477 |
+
return ($this->token = self::TOK_UNKNOWN);
|
478 |
+
}
|
479 |
+
} else {
|
480 |
+
$this->parse_linebreak();
|
481 |
+
}
|
482 |
+
}
|
483 |
+
|
484 |
+
return ($this->token = self::TOK_NULL);
|
485 |
+
}
|
486 |
+
|
487 |
+
/**
|
488 |
+
* Finds the next token by searching for a string
|
489 |
+
* @param string $needle The needle that's being searched for
|
490 |
+
* @param bool $callback Should the function check the charmap after finding the needle?
|
491 |
+
* @return int Next token ({@link TOK_NULL} if none)
|
492 |
+
*/
|
493 |
+
function next_pos($needle, $callback = true) {
|
494 |
+
$this->token_start = $this->pos;
|
495 |
+
if (($this->pos < $this->size) && (($p = stripos($this->doc, $needle, $this->pos + 1)) !== false)) {
|
496 |
+
|
497 |
+
$len = $p - $this->pos - 1;
|
498 |
+
if ($len > 0) {
|
499 |
+
$str = substr($this->doc, $this->pos + 1, $len);
|
500 |
+
|
501 |
+
if (($l = strrpos($str, "\n")) !== false) {
|
502 |
+
++$this->line_pos[0];
|
503 |
+
$this->line_pos[1] = $l + $this->pos + 1;
|
504 |
+
|
505 |
+
$len -= $l;
|
506 |
+
if ($len > 0) {
|
507 |
+
$str = substr($str, 0, -$len);
|
508 |
+
$this->line_pos[0] += substr_count($str, "\n");
|
509 |
+
}
|
510 |
+
}
|
511 |
+
}
|
512 |
+
|
513 |
+
$this->pos = $p;
|
514 |
+
if ($callback && isset($this->char_map[$this->doc[$this->pos]])) {
|
515 |
+
if (is_string($this->char_map[$this->doc[$this->pos]])) {
|
516 |
+
return ($this->token = $this->{$this->char_map[$this->doc[$this->pos]]}());
|
517 |
+
} else {
|
518 |
+
return ($this->token = $this->char_map[$this->doc[$this->pos]]);
|
519 |
+
}
|
520 |
+
} else {
|
521 |
+
return ($this->token = self::TOK_UNKNOWN);
|
522 |
+
}
|
523 |
+
} else {
|
524 |
+
$this->pos = $this->size;
|
525 |
+
return ($this->token = self::TOK_NULL);
|
526 |
+
}
|
527 |
+
}
|
528 |
+
|
529 |
+
/**
|
530 |
+
* Expect a specific token or character. Adds error if token doesn't match.
|
531 |
+
* @param string|int $token Character or token to expect
|
532 |
+
* @param bool|int $do_next Go to next character before evaluating. 1 for next char, true to ignore whitespace
|
533 |
+
* @param bool|int $try_next Try next character if current doesn't match. 1 for next char, true to ignore whitespace
|
534 |
+
* @param bool|int $next_on_match Go to next character after evaluating. 1 for next char, true to ignore whitespace
|
535 |
+
* @return bool
|
536 |
+
*/
|
537 |
+
protected function expect($token, $do_next = true, $try_next = false, $next_on_match = 1) {
|
538 |
+
if ($do_next) {
|
539 |
+
if ($do_next === 1) {
|
540 |
+
$this->next();
|
541 |
+
} else {
|
542 |
+
$this->next_no_whitespace();
|
543 |
+
}
|
544 |
+
}
|
545 |
+
|
546 |
+
if (is_int($token)) {
|
547 |
+
if (($this->token !== $token) && ((!$try_next) || ((($try_next === 1) && ($this->next() !== $token)) || (($try_next === true) && ($this->next_no_whitespace() !== $token))))) {
|
548 |
+
$this->addError('Unexpected "'.$this->getTokenString().'"');
|
549 |
+
return false;
|
550 |
+
}
|
551 |
+
} else {
|
552 |
+
if (($this->doc[$this->pos] !== $token) && ((!$try_next) || (((($try_next === 1) && ($this->next() !== self::TOK_NULL)) || (($try_next === true) && ($this->next_no_whitespace() !== self::TOK_NULL))) && ($this->doc[$this->pos] !== $token)))) {
|
553 |
+
$this->addError('Expected "'.$token.'", but found "'.$this->getTokenString().'"');
|
554 |
+
return false;
|
555 |
+
}
|
556 |
+
}
|
557 |
+
|
558 |
+
if ($next_on_match) {
|
559 |
+
if ($next_on_match === 1) {
|
560 |
+
$this->next();
|
561 |
+
} else {
|
562 |
+
$this->next_no_whitespace();
|
563 |
+
}
|
564 |
+
}
|
565 |
+
return true;
|
566 |
+
}
|
567 |
+
}
|
lib-3rd-party/pquery/gan_xml2array.php
ADDED
@@ -0,0 +1,102 @@
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* @author Niels A.D.
|
4 |
+
* @author Todd Burry <todd@vanillaforums.com>
|
5 |
+
* @copyright 2010 Niels A.D., 2014 Todd Burry
|
6 |
+
* @license http://opensource.org/licenses/LGPL-2.1 LGPL-2.1
|
7 |
+
* @package pQuery
|
8 |
+
*/
|
9 |
+
|
10 |
+
namespace MailPoetVendor\pQuery;
|
11 |
+
|
12 |
+
if (!defined('ABSPATH')) exit;
|
13 |
+
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Converts a XML document to an array
|
17 |
+
*/
|
18 |
+
class XML2ArrayParser extends HtmlParserBase {
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Holds the document structure
|
22 |
+
* @var array array('name' => 'tag', 'attrs' => array('attr' => 'val'), 'childen' => array())
|
23 |
+
*/
|
24 |
+
var $root = array(
|
25 |
+
'name' => '',
|
26 |
+
'attrs' => array(),
|
27 |
+
'children' => array()
|
28 |
+
);
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Current parsing hierarchy
|
32 |
+
* @var array
|
33 |
+
* @access private
|
34 |
+
*/
|
35 |
+
var $hierarchy = array();
|
36 |
+
|
37 |
+
protected function parse_hierarchy($self_close) {
|
38 |
+
if ($this->status['closing_tag']) {
|
39 |
+
$found = false;
|
40 |
+
for ($count = count($this->hierarchy), $i = $count - 1; $i >= 0; $i--) {
|
41 |
+
if (strcasecmp($this->hierarchy[$i]['name'], $this->status['tag_name']) === 0) {
|
42 |
+
|
43 |
+
for($ii = ($count - $i - 1); $ii >= 0; $ii--) {
|
44 |
+
$e = array_pop($this->hierarchy);
|
45 |
+
if ($ii > 0) {
|
46 |
+
$this->addError('Closing tag "'.$this->status['tag_name'].'" while "'.$e['name'].'" is not closed yet');
|
47 |
+
}
|
48 |
+
}
|
49 |
+
|
50 |
+
$found = true;
|
51 |
+
break;
|
52 |
+
}
|
53 |
+
}
|
54 |
+
|
55 |
+
if (!$found) {
|
56 |
+
$this->addError('Closing tag "'.$this->status['tag_name'].'" which is not open');
|
57 |
+
}
|
58 |
+
} else {
|
59 |
+
$tag = array(
|
60 |
+
'name' => $this->status['tag_name'],
|
61 |
+
'attrs' => $this->status['attributes'],
|
62 |
+
'children' => array()
|
63 |
+
);
|
64 |
+
if ($this->hierarchy) {
|
65 |
+
$current =& $this->hierarchy[count($this->hierarchy) - 1];
|
66 |
+
$current['children'][] = $tag;
|
67 |
+
$tag =& $current['children'][count($current['children']) - 1];
|
68 |
+
unset($current['tagData']);
|
69 |
+
} else {
|
70 |
+
$this->root = $tag;
|
71 |
+
$tag =& $this->root;
|
72 |
+
$self_close = false;
|
73 |
+
}
|
74 |
+
if (!$self_close) {
|
75 |
+
$this->hierarchy[] =& $tag;
|
76 |
+
}
|
77 |
+
}
|
78 |
+
}
|
79 |
+
|
80 |
+
function parse_tag_default() {
|
81 |
+
if (!parent::parse_tag_default()) {return false;}
|
82 |
+
|
83 |
+
if ($this->status['tag_name'][0] !== '?') {
|
84 |
+
$this->parse_hierarchy(($this->status['self_close']) ? true : null);
|
85 |
+
}
|
86 |
+
return true;
|
87 |
+
}
|
88 |
+
|
89 |
+
function parse_text() {
|
90 |
+
parent::parse_text();
|
91 |
+
if (($this->status['text'] !== '') && $this->hierarchy) {
|
92 |
+
$current =& $this->hierarchy[count($this->hierarchy) - 1];
|
93 |
+
if (!$current['children']) {
|
94 |
+
$current['tagData'] = $this->status['text'];
|
95 |
+
}
|
96 |
+
}
|
97 |
+
}
|
98 |
+
|
99 |
+
function parse_all() {
|
100 |
+
return ((parent::parse_all()) ? $this->root : false);
|
101 |
+
}
|
102 |
+
}
|
lib-3rd-party/pquery/ganon.php
ADDED
@@ -0,0 +1,102 @@
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
1 |
+
<?php
|
2 |
+
|
3 |
+
if (!defined('ABSPATH')) exit;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* @author Niels A.D.
|
7 |
+
* @author Todd Burry <todd@vanillaforums.com>
|
8 |
+
* @copyright 2010 Niels A.D., 2014 Todd Burry
|
9 |
+
* @license http://opensource.org/licenses/LGPL-2.1 LGPL-2.1
|
10 |
+
* @package pQuery
|
11 |
+
*/
|
12 |
+
|
13 |
+
use MailPoetVendor\pQuery\Html5Parser;
|
14 |
+
use MailPoetVendor\pQuery\HtmlFormatter;
|
15 |
+
|
16 |
+
/**
|
17 |
+
* Returns HTML DOM from string
|
18 |
+
* @param string $str
|
19 |
+
* @param bool $return_root Return root node or return parser object
|
20 |
+
* @return Html5Parser|DomNode
|
21 |
+
*/
|
22 |
+
function str_get_dom($str, $return_root = true) {
|
23 |
+
$a = new Html5Parser($str);
|
24 |
+
return (($return_root) ? $a->root : $a);
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Returns HTML DOM from file/website
|
29 |
+
* @param string $str
|
30 |
+
* @param bool $return_root Return root node or return parser object
|
31 |
+
* @param bool $use_include_path Use include path search in file_get_contents
|
32 |
+
* @param resource $context Context resource used in file_get_contents (PHP >= 5.0.0)
|
33 |
+
* @return Html5Parser|DomNode
|
34 |
+
*/
|
35 |
+
function file_get_dom($file, $return_root = true, $use_include_path = false, $context = null) {
|
36 |
+
if (version_compare(PHP_VERSION, '5.0.0', '>='))
|
37 |
+
$f = file_get_contents($file, $use_include_path, $context);
|
38 |
+
else {
|
39 |
+
if ($context !== null)
|
40 |
+
trigger_error('Context parameter not supported in this PHP version');
|
41 |
+
$f = file_get_contents($file, $use_include_path);
|
42 |
+
}
|
43 |
+
|
44 |
+
return (($f === false) ? false : str_get_dom($f, $return_root));
|
45 |
+
}
|
46 |
+
|
47 |
+
/**
|
48 |
+
* Format/beautify DOM
|
49 |
+
* @param DomNode $root
|
50 |
+
* @param array $options Extra formatting options {@link Formatter::$options}
|
51 |
+
* @return bool
|
52 |
+
*/
|
53 |
+
function dom_format(&$root, $options = array()) {
|
54 |
+
$formatter = new HtmlFormatter($options);
|
55 |
+
return $formatter->format($root);
|
56 |
+
}
|
57 |
+
|
58 |
+
if (version_compare(PHP_VERSION, '5.0.0', '<')) {
|
59 |
+
/**
|
60 |
+
* PHP alternative to str_split, for backwards compatibility
|
61 |
+
* @param string $string
|
62 |
+
* @return string
|
63 |
+
*/
|
64 |
+
function str_split($string) {
|
65 |
+
$res = array();
|
66 |
+
$size = strlen($string);
|
67 |
+
for ($i = 0; $i < $size; $i++) {
|
68 |
+
$res[] = $string[$i];
|
69 |
+
}
|
70 |
+
|
71 |
+
return $res;
|
72 |
+
}
|
73 |
+
}
|
74 |
+
|
75 |
+
if (version_compare(PHP_VERSION, '5.2.0', '<')) {
|
76 |
+
/**
|
77 |
+
* PHP alternative to array_fill_keys, for backwards compatibility
|
78 |
+
* @param array $keys
|
79 |
+
* @param mixed $value
|
80 |
+
* @return array
|
81 |
+
*/
|
82 |
+
function array_fill_keys($keys, $value) {
|
83 |
+
$res = array();
|
84 |
+
foreach($keys as $k) {
|
85 |
+
$res[$k] = $value;
|
86 |
+
}
|
87 |
+
|
88 |
+
return $res;
|
89 |
+
}
|
90 |
+
}
|
91 |
+
|
92 |
+
#!! <- Ignore when converting to single file
|
93 |
+
if (!defined('GANON_NO_INCLUDES')) {
|
94 |
+
define('GANON_NO_INCLUDES', true);
|
95 |
+
include_once('IQuery.php');
|
96 |
+
include_once('gan_tokenizer.php');
|
97 |
+
include_once('gan_parser_html.php');
|
98 |
+
include_once('gan_node_html.php');
|
99 |
+
include_once('gan_selector_html.php');
|
100 |
+
include_once('gan_formatter.php');
|
101 |
+
}
|
102 |
+
#!
|
{vendor/tburry → lib-3rd-party/pquery}/index.php
RENAMED
File without changes
|
lib-3rd-party/pquery/pQuery.php
ADDED
@@ -0,0 +1,284 @@
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* @author Niels A.D.
|
4 |
+
* @author Todd Burry <todd@vanillaforums.com>
|
5 |
+
* @copyright 2010 Niels A.D., 2014 Todd Burry
|
6 |
+
* @license http://opensource.org/licenses/LGPL-2.1 LGPL-2.1
|
7 |
+
* @package pQuery
|
8 |
+
*/
|
9 |
+
|
10 |
+
namespace MailPoetVendor\pQuery;
|
11 |
+
|
12 |
+
if (!defined('ABSPATH')) exit;
|
13 |
+
|
14 |
+
|
15 |
+
|
16 |
+
/**
|
17 |
+
* A jQuery-like object for php.
|
18 |
+
*/
|
19 |
+
class pQuery implements \ArrayAccess, \IteratorAggregate, IQuery {
|
20 |
+
/// Properties ///
|
21 |
+
|
22 |
+
/**
|
23 |
+
* @var IQuery[]
|
24 |
+
*/
|
25 |
+
protected $nodes = array();
|
26 |
+
|
27 |
+
/// Methods ///
|
28 |
+
|
29 |
+
public function __construct($nodes = array()) {
|
30 |
+
$this->nodes = $nodes;
|
31 |
+
}
|
32 |
+
|
33 |
+
public function addClass($classname) {
|
34 |
+
foreach ($this->nodes as $node) {
|
35 |
+
$node->addClass($classname);
|
36 |
+
}
|
37 |
+
return $this;
|
38 |
+
}
|
39 |
+
|
40 |
+
public function after($content) {
|
41 |
+
foreach ($this->nodes as $node) {
|
42 |
+
$node->after($content);
|
43 |
+
}
|
44 |
+
return $this;
|
45 |
+
}
|
46 |
+
|
47 |
+
public function append($content) {
|
48 |
+
foreach ($this->nodes as $node) {
|
49 |
+
$node->append($content);
|
50 |
+
}
|
51 |
+
return $this;
|
52 |
+
}
|
53 |
+
|
54 |
+
public function attr($name, $value = null) {
|
55 |
+
if (empty($this->nodes) && $value === null)
|
56 |
+
return '';
|
57 |
+
|
58 |
+
foreach ($this->nodes as $node) {
|
59 |
+
if ($value === null)
|
60 |
+
return $node->attr($name);
|
61 |
+
$node->attr($name, $value);
|
62 |
+
}
|
63 |
+
return $this;
|
64 |
+
}
|
65 |
+
|
66 |
+
public function before($content) {
|
67 |
+
foreach ($this->nodes as $node) {
|
68 |
+
$node->before($content);
|
69 |
+
}
|
70 |
+
return $this;
|
71 |
+
}
|
72 |
+
|
73 |
+
public function clear() {
|
74 |
+
foreach ($this->nodes as $node) {
|
75 |
+
$node->clear();
|
76 |
+
}
|
77 |
+
return $this;
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Get the count of matched elements.
|
82 |
+
*
|
83 |
+
* @return int Returns the count of matched elements.
|
84 |
+
*/
|
85 |
+
public function count(): int {
|
86 |
+
return count($this->nodes);
|
87 |
+
}
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Format/beautify a DOM.
|
91 |
+
*
|
92 |
+
* @param DomNode $dom The dom to format.
|
93 |
+
* @param array $options Extra formatting options. See {@link HtmlFormatter::$options}.
|
94 |
+
* @return bool Returns `true` on sucess and `false` on failure.
|
95 |
+
*/
|
96 |
+
// public static function format($dom, $options = array()) {
|
97 |
+
// $formatter = new pQuery\HtmlFormatter($options);
|
98 |
+
// return $formatter->format($dom);
|
99 |
+
// }
|
100 |
+
|
101 |
+
public function getIterator(): \ArrayIterator {
|
102 |
+
return new \ArrayIterator($this->nodes);
|
103 |
+
}
|
104 |
+
|
105 |
+
public function hasClass($classname) {
|
106 |
+
foreach ($this->nodes as $node) {
|
107 |
+
if ($node->hasClass($classname))
|
108 |
+
return true;
|
109 |
+
}
|
110 |
+
return false;
|
111 |
+
}
|
112 |
+
|
113 |
+
public function html($value = null) {
|
114 |
+
if (empty($this->nodes) && $value === null)
|
115 |
+
return '';
|
116 |
+
|
117 |
+
foreach ($this->nodes as $node) {
|
118 |
+
if ($value === null)
|
119 |
+
return $node->html();
|
120 |
+
$node->html($value);
|
121 |
+
}
|
122 |
+
return $this;
|
123 |
+
}
|
124 |
+
|
125 |
+
public function offsetExists($offset): bool {
|
126 |
+
return isset($this->nodes[$offset]);
|
127 |
+
}
|
128 |
+
|
129 |
+
#[\ReturnTypeWillChange]
|
130 |
+
public function offsetGet($offset) {
|
131 |
+
return isset($this->nodes[$offset]) ? $this->nodes[$offset] : null;
|
132 |
+
}
|
133 |
+
|
134 |
+
public function offsetSet($offset, $value): void {
|
135 |
+
|
136 |
+
if (is_null($offset) || !isset($this->nodes[$offset])) {
|
137 |
+
throw new \BadMethodCallException("You are not allowed to add new nodes to the pQuery object.");
|
138 |
+
} else {
|
139 |
+
$this->nodes[$offset]->replaceWith($value);
|
140 |
+
}
|
141 |
+
}
|
142 |
+
|
143 |
+
public function offsetUnset($offset): void {
|
144 |
+
if (isset($this->nodes[$offset])) {
|
145 |
+
$this->nodes[$offset]->remove();
|
146 |
+
unset($this->nodes[$offset]);
|
147 |
+
}
|
148 |
+
}
|
149 |
+
|
150 |
+
/**
|
151 |
+
* Query a file or url.
|
152 |
+
*
|
153 |
+
* @param string $path The path to the url.
|
154 |
+
* @param resource $context A context suitable to be passed into {@link file_get_contents}
|
155 |
+
* @return DomNode Returns the root dom node for the html file.
|
156 |
+
*/
|
157 |
+
public static function parseFile($path, $context = null) {
|
158 |
+
$html_str = file_get_contents($path, false, $context);
|
159 |
+
return static::parseStr($html_str);
|
160 |
+
}
|
161 |
+
|
162 |
+
/**
|
163 |
+
* Query a string of html.
|
164 |
+
*
|
165 |
+
* @param string $html
|
166 |
+
* @return DomNode Returns the root dom node for the html string.
|
167 |
+
*/
|
168 |
+
public static function parseStr($html) {
|
169 |
+
$parser = new Html5Parser($html);
|
170 |
+
return $parser->root;
|
171 |
+
}
|
172 |
+
|
173 |
+
public function prepend($content = null) {
|
174 |
+
foreach ($this->nodes as $node) {
|
175 |
+
$node->prepend($content);
|
176 |
+
}
|
177 |
+
return $this;
|
178 |
+
}
|
179 |
+
|
180 |
+
public function prop($name, $value = null) {
|
181 |
+
if (empty($this->nodes) && $value === null)
|
182 |
+
return '';
|
183 |
+
|
184 |
+
foreach ($this->nodes as $node) {
|
185 |
+
if ($value === null)
|
186 |
+
return $node->prop($name);
|
187 |
+
$node->prop($name, $value);
|
188 |
+
}
|
189 |
+
return $this;
|
190 |
+
}
|
191 |
+
|
192 |
+
public function remove($selector = null) {
|
193 |
+
foreach ($this->nodes as $node) {
|
194 |
+
$node->remove($selector);
|
195 |
+
}
|
196 |
+
if ($selector === null)
|
197 |
+
$this->nodes = array();
|
198 |
+
|
199 |
+
return $this;
|
200 |
+
}
|
201 |
+
|
202 |
+
public function removeAttr($name) {
|
203 |
+
foreach ($this->nodes as $node) {
|
204 |
+
$node->removeAttr($name);
|
205 |
+
}
|
206 |
+
return $this;
|
207 |
+
}
|
208 |
+
|
209 |
+
public function removeClass($classname) {
|
210 |
+
foreach ($this->nodes as $node) {
|
211 |
+
$node->removeClass($classname);
|
212 |
+
}
|
213 |
+
return $this;
|
214 |
+
}
|
215 |
+
|
216 |
+
public function replaceWith($content) {
|
217 |
+
foreach ($this->nodes as &$node) {
|
218 |
+
$node = $node->replaceWith($content);
|
219 |
+
}
|
220 |
+
return $this;
|
221 |
+
}
|
222 |
+
|
223 |
+
public function tagName($value = null) {
|
224 |
+
foreach ($this->nodes as $node) {
|
225 |
+
if ($value === null)
|
226 |
+
return $node->tagName();
|
227 |
+
$node->tagName($value);
|
228 |
+
}
|
229 |
+
return $this;
|
230 |
+
}
|
231 |
+
|
232 |
+
public function text($value = null) {
|
233 |
+
if (empty($this->nodes) && $value === null)
|
234 |
+
return '';
|
235 |
+
|
236 |
+
foreach ($this->nodes as $node) {
|
237 |
+
if ($value === null)
|
238 |
+
return $node->text();
|
239 |
+
$node->text($value);
|
240 |
+
}
|
241 |
+
return $this;
|
242 |
+
}
|
243 |
+
|
244 |
+
public function toggleClass($classname, $switch = null) {
|
245 |
+
foreach ($this->nodes as $node) {
|
246 |
+
$node->toggleClass($classname, $switch);
|
247 |
+
}
|
248 |
+
|
249 |
+
return $this;
|
250 |
+
}
|
251 |
+
|
252 |
+
public function unwrap() {
|
253 |
+
foreach ($this->nodes as $node) {
|
254 |
+
$node->unwrap();
|
255 |
+
}
|
256 |
+
return $this;
|
257 |
+
}
|
258 |
+
|
259 |
+
public function val($value = null) {
|
260 |
+
if (empty($this->nodes) && $value === null)
|
261 |
+
return '';
|
262 |
+
|
263 |
+
foreach ($this->nodes as $node) {
|
264 |
+
if ($value === null)
|
265 |
+
return $node->val();
|
266 |
+
$node->val($value);
|
267 |
+
}
|
268 |
+
return $this;
|
269 |
+
}
|
270 |
+
|
271 |
+
public function wrap($wrapping_element) {
|
272 |
+
foreach ($this->nodes as $node) {
|
273 |
+
$node->wrap($wrapping_element);
|
274 |
+
}
|
275 |
+
return $this;
|
276 |
+
}
|
277 |
+
|
278 |
+
public function wrapInner($wrapping_element) {
|
279 |
+
foreach ($this->nodes as $node) {
|
280 |
+
$node->wrapInner($wrapping_element);
|
281 |
+
}
|
282 |
+
return $this;
|
283 |
+
}
|
284 |
+
}
|
{vendor/tburry/pquery → lib-3rd-party/pquery/third_party}/index.php
RENAMED
File without changes
|
lib-3rd-party/pquery/third_party/jsminplus.php
ADDED
@@ -0,0 +1,2091 @@
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace MailPoetVendor\pQuery;
|
4 |
+
|
5 |
+
if (!defined('ABSPATH')) exit;
|
6 |
+
|
7 |
+
|
8 |
+
/**
|
9 |
+
* JSMinPlus version 1.4
|
10 |
+
*
|
11 |
+
* Minifies a javascript file using a javascript parser
|
12 |
+
*
|
13 |
+
* This implements a PHP port of Brendan Eich's Narcissus open source javascript engine (in javascript)
|
14 |
+
* References: http://en.wikipedia.org/wiki/Narcissus_(JavaScript_engine)
|
15 |
+
* Narcissus sourcecode: http://mxr.mozilla.org/mozilla/source/js/narcissus/
|
16 |
+
* JSMinPlus weblog: http://crisp.tweakblogs.net/blog/cat/716
|
17 |
+
*
|
18 |
+
* Tino Zijdel <crisp@tweakers.net>
|
19 |
+
*
|
20 |
+
* Usage: $minified = JSMinPlus::minify($script [, $filename])
|
21 |
+
*
|
22 |
+
* Versionlog (see also changelog.txt):
|
23 |
+
* 23-07-2011 - remove dynamic creation of OP_* and KEYWORD_* defines and declare them on top
|
24 |
+
* reduce memory footprint by minifying by block-scope
|
25 |
+
* some small byte-saving and performance improvements
|
26 |
+
* 12-05-2009 - fixed hook:colon precedence, fixed empty body in loop and if-constructs
|
27 |
+
* 18-04-2009 - fixed crashbug in PHP 5.2.9 and several other bugfixes
|
28 |
+
* 12-04-2009 - some small bugfixes and performance improvements
|
29 |
+
* 09-04-2009 - initial open sourced version 1.0
|
30 |
+
*
|
31 |
+
* Latest version of this script: http://files.tweakers.net/jsminplus/jsminplus.zip
|
32 |
+
*
|
33 |
+
*/
|
34 |
+
|
35 |
+
/* ***** BEGIN LICENSE BLOCK *****
|
36 |
+
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
37 |
+
*
|
38 |
+
* The contents of this file are subject to the Mozilla Public License Version
|
39 |
+
* 1.1 (the "License"); you may not use this file except in compliance with
|
40 |
+
* the License. You may obtain a copy of the License at
|
41 |
+
* http://www.mozilla.org/MPL/
|
42 |
+
*
|
43 |
+
* Software distributed under the License is distributed on an "AS IS" basis,
|
44 |
+
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
45 |
+
* for the specific language governing rights and limitations under the
|
46 |
+
* License.
|
47 |
+
*
|
48 |
+
* The Original Code is the Narcissus JavaScript engine.
|
49 |
+
*
|
50 |
+
* The Initial Developer of the Original Code is
|
51 |
+
* Brendan Eich <brendan@mozilla.org>.
|
52 |
+
* Portions created by the Initial Developer are Copyright (C) 2004
|
53 |
+
* the Initial Developer. All Rights Reserved.
|
54 |
+
*
|
55 |
+
* Contributor(s): Tino Zijdel <crisp@tweakers.net>
|
56 |
+
* PHP port, modifications and minifier routine are (C) 2009-2011
|
57 |
+
*
|
58 |
+
* Alternatively, the contents of this file may be used under the terms of
|
59 |
+
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
60 |
+
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
61 |
+
* in which case the provisions of the GPL or the LGPL are applicable instead
|
62 |
+
* of those above. If you wish to allow use of your version of this file only
|
63 |
+
* under the terms of either the GPL or the LGPL, and not to allow others to
|
64 |
+
* use your version of this file under the terms of the MPL, indicate your
|
65 |
+
* decision by deleting the provisions above and replace them with the notice
|
66 |
+
* and other provisions required by the GPL or the LGPL. If you do not delete
|
67 |
+
* the provisions above, a recipient may use your version of this file under
|
68 |
+
* the terms of any one of the MPL, the GPL or the LGPL.
|
69 |
+
*
|
70 |
+
* ***** END LICENSE BLOCK ***** */
|
71 |
+
|
72 |
+
define('TOKEN_END', 1);
|
73 |
+
define('TOKEN_NUMBER', 2);
|
74 |
+
define('TOKEN_IDENTIFIER', 3);
|
75 |
+
define('TOKEN_STRING', 4);
|
76 |
+
define('TOKEN_REGEXP', 5);
|
77 |
+
define('TOKEN_NEWLINE', 6);
|
78 |
+
define('TOKEN_CONDCOMMENT_START', 7);
|
79 |
+
define('TOKEN_CONDCOMMENT_END', 8);
|
80 |
+
|
81 |
+
define('JS_SCRIPT', 100);
|
82 |
+
define('JS_BLOCK', 101);
|
83 |
+
define('JS_LABEL', 102);
|
84 |
+
define('JS_FOR_IN', 103);
|
85 |
+
define('JS_CALL', 104);
|
86 |
+
define('JS_NEW_WITH_ARGS', 105);
|
87 |
+
define('JS_INDEX', 106);
|
88 |
+
define('JS_ARRAY_INIT', 107);
|
89 |
+
define('JS_OBJECT_INIT', 108);
|
90 |
+
define('JS_PROPERTY_INIT', 109);
|
91 |
+
define('JS_GETTER', 110);
|
92 |
+
define('JS_SETTER', 111);
|
93 |
+
define('JS_GROUP', 112);
|
94 |
+
define('JS_LIST', 113);
|
95 |
+
|
96 |
+
define('JS_MINIFIED', 999);
|
97 |
+
|
98 |
+
define('DECLARED_FORM', 0);
|
99 |
+
define('EXPRESSED_FORM', 1);
|
100 |
+
define('STATEMENT_FORM', 2);
|
101 |
+
|
102 |
+
/* Operators */
|
103 |
+
define('OP_SEMICOLON', ';');
|
104 |
+
define('OP_COMMA', ',');
|
105 |
+
define('OP_HOOK', '?');
|
106 |
+
define('OP_COLON', ':');
|
107 |
+
define('OP_OR', '||');
|
108 |
+
define('OP_AND', '&&');
|
109 |
+
define('OP_BITWISE_OR', '|');
|
110 |
+
define('OP_BITWISE_XOR', '^');
|
111 |
+
define('OP_BITWISE_AND', '&');
|
112 |
+
define('OP_STRICT_EQ', '===');
|
113 |
+
define('OP_EQ', '==');
|
114 |
+
define('OP_ASSIGN', '=');
|
115 |
+
define('OP_STRICT_NE', '!==');
|
116 |
+
define('OP_NE', '!=');
|
117 |
+
define('OP_LSH', '<<');
|
118 |
+
define('OP_LE', '<=');
|
119 |
+
define('OP_LT', '<');
|
120 |
+
define('OP_URSH', '>>>');
|
121 |
+
define('OP_RSH', '>>');
|
122 |
+
define('OP_GE', '>=');
|
123 |
+
define('OP_GT', '>');
|
124 |
+
define('OP_INCREMENT', '++');
|
125 |
+
define('OP_DECREMENT', '--');
|
126 |
+
define('OP_PLUS', '+');
|
127 |
+
define('OP_MINUS', '-');
|
128 |
+
define('OP_MUL', '*');
|
129 |
+
define('OP_DIV', '/');
|
130 |
+
define('OP_MOD', '%');
|
131 |
+
define('OP_NOT', '!');
|
132 |
+
define('OP_BITWISE_NOT', '~');
|
133 |
+
define('OP_DOT', '.');
|
134 |
+
define('OP_LEFT_BRACKET', '[');
|
135 |
+
define('OP_RIGHT_BRACKET', ']');
|
136 |
+
define('OP_LEFT_CURLY', '{');
|
137 |
+
define('OP_RIGHT_CURLY', '}');
|
138 |
+
define('OP_LEFT_PAREN', '(');
|
139 |
+
define('OP_RIGHT_PAREN', ')');
|
140 |
+
define('OP_CONDCOMMENT_END', '@*/');
|
141 |
+
|
142 |
+
define('OP_UNARY_PLUS', 'U+');
|
143 |
+
define('OP_UNARY_MINUS', 'U-');
|
144 |
+
|
145 |
+
/* Keywords */
|
146 |
+
define('KEYWORD_BREAK', 'break');
|
147 |
+
define('KEYWORD_CASE', 'case');
|
148 |
+
define('KEYWORD_CATCH', 'catch');
|
149 |
+
define('KEYWORD_CONST', 'const');
|
150 |
+
define('KEYWORD_CONTINUE', 'continue');
|
151 |
+
define('KEYWORD_DEBUGGER', 'debugger');
|
152 |
+
define('KEYWORD_DEFAULT', 'default');
|
153 |
+
define('KEYWORD_DELETE', 'delete');
|
154 |
+
define('KEYWORD_DO', 'do');
|
155 |
+
define('KEYWORD_ELSE', 'else');
|
156 |
+
define('KEYWORD_ENUM', 'enum');
|
157 |
+
define('KEYWORD_FALSE', 'false');
|
158 |
+
define('KEYWORD_FINALLY', 'finally');
|
159 |
+
define('KEYWORD_FOR', 'for');
|
160 |
+
define('KEYWORD_FUNCTION', 'function');
|
161 |
+
define('KEYWORD_IF', 'if');
|
162 |
+
define('KEYWORD_IN', 'in');
|
163 |
+
define('KEYWORD_INSTANCEOF', 'instanceof');
|
164 |
+
define('KEYWORD_NEW', 'new');
|
165 |
+
define('KEYWORD_NULL', 'null');
|
166 |
+
define('KEYWORD_RETURN', 'return');
|
167 |
+
define('KEYWORD_SWITCH', 'switch');
|
168 |
+
define('KEYWORD_THIS', 'this');
|
169 |
+
define('KEYWORD_THROW', 'throw');
|
170 |
+
define('KEYWORD_TRUE', 'true');
|
171 |
+
define('KEYWORD_TRY', 'try');
|
172 |
+
define('KEYWORD_TYPEOF', 'typeof');
|
173 |
+
define('KEYWORD_VAR', 'var');
|
174 |
+
define('KEYWORD_VOID', 'void');
|
175 |
+
define('KEYWORD_WHILE', 'while');
|
176 |
+
define('KEYWORD_WITH', 'with');
|
177 |
+
|
178 |
+
|
179 |
+
class JSMinPlus
|
180 |
+
{
|
181 |
+
private $parser;
|
182 |
+
private $reserved = array(
|
183 |
+
'break', 'case', 'catch', 'continue', 'default', 'delete', 'do',
|
184 |
+
'else', 'finally', 'for', 'function', 'if', 'in', 'instanceof',
|
185 |
+
'new', 'return', 'switch', 'this', 'throw', 'try', 'typeof', 'var',
|
186 |
+
'void', 'while', 'with',
|
187 |
+
// Words reserved for future use
|
188 |
+
'abstract', 'boolean', 'byte', 'char', 'class', 'const', 'debugger',
|
189 |
+
'double', 'enum', 'export', 'extends', 'final', 'float', 'goto',
|
190 |
+
'implements', 'import', 'int', 'interface', 'long', 'native',
|
191 |
+
'package', 'private', 'protected', 'public', 'short', 'static',
|
192 |
+
'super', 'synchronized', 'throws', 'transient', 'volatile',
|
193 |
+
// These are not reserved, but should be taken into account
|
194 |
+
// in isValidIdentifier (See jslint source code)
|
195 |
+
'arguments', 'eval', 'true', 'false', 'Infinity', 'NaN', 'null', 'undefined'
|
196 |
+
);
|
197 |
+
|
198 |
+
private function __construct()
|
199 |
+
{
|
200 |
+
$this->parser = new JSParser($this);
|
201 |
+
}
|
202 |
+
|
203 |
+
public static function minify($js, $filename='')
|
204 |
+
{
|
205 |
+
static $instance;
|
206 |
+
|
207 |
+
// this is a singleton
|
208 |
+
if(!$instance)
|
209 |
+
$instance = new JSMinPlus();
|
210 |
+
|
211 |
+
return $instance->min($js, $filename);
|
212 |
+
}
|
213 |
+
|
214 |
+
private function min($js, $filename)
|
215 |
+
{
|
216 |
+
try
|
217 |
+
{
|
218 |
+
$n = $this->parser->parse($js, $filename, 1);
|
219 |
+
return $this->parseTree($n);
|
220 |
+
}
|
221 |
+
catch(Exception $e)
|
222 |
+
{
|
223 |
+
echo $e->getMessage() . "\n";
|
224 |
+
}
|
225 |
+
|
226 |
+
return false;
|
227 |
+
}
|
228 |
+
|
229 |
+
public function parseTree($n, $noBlockGrouping = false)
|
230 |
+
{
|
231 |
+
$s = '';
|
232 |
+
|
233 |
+
switch ($n->type)
|
234 |
+
{
|
235 |
+
case JS_MINIFIED:
|
236 |
+
$s = $n->value;
|
237 |
+
break;
|
238 |
+
|
239 |
+
case JS_SCRIPT:
|
240 |
+
// we do nothing yet with funDecls or varDecls
|
241 |
+
$noBlockGrouping = true;
|
242 |
+
// FALL THROUGH
|
243 |
+
|
244 |
+
case JS_BLOCK:
|
245 |
+
$childs = $n->treeNodes;
|
246 |
+
$lastType = 0;
|
247 |
+
for ($c = 0, $i = 0, $j = count($childs); $i < $j; $i++)
|
248 |
+
{
|
249 |
+
$type = $childs[$i]->type;
|
250 |
+
$t = $this->parseTree($childs[$i]);
|
251 |
+
if (strlen($t))
|
252 |
+
{
|
253 |
+
if ($c)
|
254 |
+
{
|
255 |
+
$s = rtrim($s, ';');
|
256 |
+
|
257 |
+
if ($type == KEYWORD_FUNCTION && $childs[$i]->functionForm == DECLARED_FORM)
|
258 |
+
{
|
259 |
+
// put declared functions on a new line
|
260 |
+
$s .= "\n";
|
261 |
+
}
|
262 |
+
elseif ($type == KEYWORD_VAR && $type == $lastType)
|
263 |
+
{
|
264 |
+
// mutiple var-statements can go into one
|
265 |
+
$t = ',' . substr($t, 4);
|
266 |
+
}
|
267 |
+
else
|
268 |
+
{
|
269 |
+
// add terminator
|
270 |
+
$s .= ';';
|
271 |
+
}
|
272 |
+
}
|
273 |
+
|
274 |
+
$s .= $t;
|
275 |
+
|
276 |
+
$c++;
|
277 |
+
$lastType = $type;
|
278 |
+
}
|
279 |
+
}
|
280 |
+
|
281 |
+
if ($c > 1 && !$noBlockGrouping)
|
282 |
+
{
|
283 |
+
$s = '{' . $s . '}';
|
284 |
+
}
|
285 |
+
break;
|
286 |
+
|
287 |
+
case KEYWORD_FUNCTION:
|
288 |
+
$s .= 'function' . ($n->name ? ' ' . $n->name : '') . '(';
|
289 |
+
$params = $n->params;
|
290 |
+
for ($i = 0, $j = count($params); $i < $j; $i++)
|
291 |
+
$s .= ($i ? ',' : '') . $params[$i];
|
292 |
+
$s .= '){' . $this->parseTree($n->body, true) . '}';
|
293 |
+
break;
|
294 |
+
|
295 |
+
case KEYWORD_IF:
|
296 |
+
$s = 'if(' . $this->parseTree($n->condition) . ')';
|
297 |
+
$thenPart = $this->parseTree($n->thenPart);
|
298 |
+
$elsePart = $n->elsePart ? $this->parseTree($n->elsePart) : null;
|
299 |
+
|
300 |
+
// empty if-statement
|
301 |
+
if ($thenPart == '')
|
302 |
+
$thenPart = ';';
|
303 |
+
|
304 |
+
if ($elsePart)
|
305 |
+
{
|
306 |
+
// be carefull and always make a block out of the thenPart; could be more optimized but is a lot of trouble
|
307 |
+
if ($thenPart != ';' && $thenPart[0] != '{')
|
308 |
+
$thenPart = '{' . $thenPart . '}';
|
309 |
+
|
310 |
+
$s .= $thenPart . 'else';
|
311 |
+
|
312 |
+
// we could check for more, but that hardly ever applies so go for performance
|
313 |
+
if ($elsePart[0] != '{')
|
314 |
+
$s .= ' ';
|
315 |
+
|
316 |
+
$s .= $elsePart;
|
317 |
+
}
|
318 |
+
else
|
319 |
+
{
|
320 |
+
$s .= $thenPart;
|
321 |
+
}
|
322 |
+
break;
|
323 |
+
|
324 |
+
case KEYWORD_SWITCH:
|
325 |
+
$s = 'switch(' . $this->parseTree($n->discriminant) . '){';
|
326 |
+
$cases = $n->cases;
|
327 |
+
for ($i = 0, $j = count($cases); $i < $j; $i++)
|
328 |
+
{
|
329 |
+
$case = $cases[$i];
|
330 |
+
if ($case->type == KEYWORD_CASE)
|
331 |
+
$s .= 'case' . ($case->caseLabel->type != TOKEN_STRING ? ' ' : '') . $this->parseTree($case->caseLabel) . ':';
|
332 |
+
else
|
333 |
+
$s .= 'default:';
|
334 |
+
|
335 |
+
$statement = $this->parseTree($case->statements, true);
|
336 |
+
if ($statement)
|
337 |
+
{
|
338 |
+
$s .= $statement;
|
339 |
+
// no terminator for last statement
|
340 |
+
if ($i + 1 < $j)
|
341 |
+
$s .= ';';
|
342 |
+
}
|
343 |
+
}
|
344 |
+
$s .= '}';
|
345 |
+
break;
|
346 |
+
|
347 |
+
case KEYWORD_FOR:
|
348 |
+
$s = 'for(' . ($n->setup ? $this->parseTree($n->setup) : '')
|
349 |
+
. ';' . ($n->condition ? $this->parseTree($n->condition) : '')
|
350 |
+
. ';' . ($n->update ? $this->parseTree($n->update) : '') . ')';
|
351 |
+
|
352 |
+
$body = $this->parseTree($n->body);
|
353 |
+
if ($body == '')
|
354 |
+
$body = ';';
|
355 |
+
|
356 |
+
$s .= $body;
|
357 |
+
break;
|
358 |
+
|
359 |
+
case KEYWORD_WHILE:
|
360 |
+
$s = 'while(' . $this->parseTree($n->condition) . ')';
|
361 |
+
|
362 |
+
$body = $this->parseTree($n->body);
|
363 |
+
if ($body == '')
|
364 |
+
$body = ';';
|
365 |
+
|
366 |
+
$s .= $body;
|
367 |
+
break;
|
368 |
+
|
369 |
+
case JS_FOR_IN:
|
370 |
+
$s = 'for(' . ($n->varDecl ? $this->parseTree($n->varDecl) : $this->parseTree($n->iterator)) . ' in ' . $this->parseTree($n->object) . ')';
|
371 |
+
|
372 |
+
$body = $this->parseTree($n->body);
|
373 |
+
if ($body == '')
|
374 |
+
$body = ';';
|
375 |
+
|
376 |
+
$s .= $body;
|
377 |
+
break;
|
378 |
+
|
379 |
+
case KEYWORD_DO:
|
380 |
+
$s = 'do{' . $this->parseTree($n->body, true) . '}while(' . $this->parseTree($n->condition) . ')';
|
381 |
+
break;
|
382 |
+
|
383 |
+
case KEYWORD_BREAK:
|
384 |
+
case KEYWORD_CONTINUE:
|
385 |
+
$s = $n->value . ($n->label ? ' ' . $n->label : '');
|
386 |
+
break;
|
387 |
+
|
388 |
+
case KEYWORD_TRY:
|
389 |
+
$s = 'try{' . $this->parseTree($n->tryBlock, true) . '}';
|
390 |
+
$catchClauses = $n->catchClauses;
|
391 |
+
for ($i = 0, $j = count($catchClauses); $i < $j; $i++)
|
392 |
+
{
|
393 |
+
$t = $catchClauses[$i];
|
394 |
+
$s .= 'catch(' . $t->varName . ($t->guard ? ' if ' . $this->parseTree($t->guard) : '') . '){' . $this->parseTree($t->block, true) . '}';
|
395 |
+
}
|
396 |
+
if ($n->finallyBlock)
|
397 |
+
$s .= 'finally{' . $this->parseTree($n->finallyBlock, true) . '}';
|
398 |
+
break;
|
399 |
+
|
400 |
+
case KEYWORD_THROW:
|
401 |
+
case KEYWORD_RETURN:
|
402 |
+
$s = $n->type;
|
403 |
+
if ($n->value)
|
404 |
+
{
|
405 |
+
$t = $this->parseTree($n->value);
|
406 |
+
if (strlen($t))
|
407 |
+
{
|
408 |
+
if ($this->isWordChar($t[0]) || $t[0] == '\\')
|
409 |
+
$s .= ' ';
|
410 |
+
|
411 |
+
$s .= $t;
|
412 |
+
}
|
413 |
+
}
|
414 |
+
break;
|
415 |
+
|
416 |
+
case KEYWORD_WITH:
|
417 |
+
$s = 'with(' . $this->parseTree($n->object) . ')' . $this->parseTree($n->body);
|
418 |
+
break;
|
419 |
+
|
420 |
+
case KEYWORD_VAR:
|
421 |
+
case KEYWORD_CONST:
|
422 |
+
$s = $n->value . ' ';
|
423 |
+
$childs = $n->treeNodes;
|
424 |
+
for ($i = 0, $j = count($childs); $i < $j; $i++)
|
425 |
+
{
|
426 |
+
$t = $childs[$i];
|
427 |
+
$s .= ($i ? ',' : '') . $t->name;
|
428 |
+
$u = $t->initializer;
|
429 |
+
if ($u)
|
430 |
+
$s .= '=' . $this->parseTree($u);
|
431 |
+
}
|
432 |
+
break;
|
433 |
+
|
434 |
+
case KEYWORD_IN:
|
435 |
+
case KEYWORD_INSTANCEOF:
|
436 |
+
$left = $this->parseTree($n->treeNodes[0]);
|
437 |
+
$right = $this->parseTree($n->treeNodes[1]);
|
438 |
+
|
439 |
+
$s = $left;
|
440 |
+
|
441 |
+
if ($this->isWordChar(substr($left, -1)))
|
442 |
+
$s .= ' ';
|
443 |
+
|
444 |
+
$s .= $n->type;
|
445 |
+
|
446 |
+
if ($this->isWordChar($right[0]) || $right[0] == '\\')
|
447 |
+
$s .= ' ';
|
448 |
+
|
449 |
+
$s .= $right;
|
450 |
+
break;
|
451 |
+
|
452 |
+
case KEYWORD_DELETE:
|
453 |
+
case KEYWORD_TYPEOF:
|
454 |
+
$right = $this->parseTree($n->treeNodes[0]);
|
455 |
+
|
456 |
+
$s = $n->type;
|
457 |
+
|
458 |
+
if ($this->isWordChar($right[0]) || $right[0] == '\\')
|
459 |
+
$s .= ' ';
|
460 |
+
|
461 |
+
$s .= $right;
|
462 |
+
break;
|
463 |
+
|
464 |
+
case KEYWORD_VOID:
|
465 |
+
$s = 'void(' . $this->parseTree($n->treeNodes[0]) . ')';
|
466 |
+
break;
|
467 |
+
|
468 |
+
case KEYWORD_DEBUGGER:
|
469 |
+
throw new Exception('NOT IMPLEMENTED: DEBUGGER');
|
470 |
+
break;
|
471 |
+
|
472 |
+
case TOKEN_CONDCOMMENT_START:
|
473 |
+
case TOKEN_CONDCOMMENT_END:
|
474 |
+
$s = $n->value . ($n->type == TOKEN_CONDCOMMENT_START ? ' ' : '');
|
475 |
+
$childs = $n->treeNodes;
|
476 |
+
for ($i = 0, $j = count($childs); $i < $j; $i++)
|
477 |
+
$s .= $this->parseTree($childs[$i]);
|
478 |
+
break;
|
479 |
+
|
480 |
+
case OP_SEMICOLON:
|
481 |
+
if ($expression = $n->expression)
|
482 |
+
$s = $this->parseTree($expression);
|
483 |
+
break;
|
484 |
+
|
485 |
+
case JS_LABEL:
|
486 |
+
$s = $n->label . ':' . $this->parseTree($n->statement);
|
487 |
+
break;
|
488 |
+
|
489 |
+
case OP_COMMA:
|
490 |
+
$childs = $n->treeNodes;
|
491 |
+
for ($i = 0, $j = count($childs); $i < $j; $i++)
|
492 |
+
$s .= ($i ? ',' : '') . $this->parseTree($childs[$i]);
|
493 |
+
break;
|
494 |
+
|
495 |
+
case OP_ASSIGN:
|
496 |
+
$s = $this->parseTree($n->treeNodes[0]) . $n->value . $this->parseTree($n->treeNodes[1]);
|
497 |
+
break;
|
498 |
+
|
499 |
+
case OP_HOOK:
|
500 |
+
$s = $this->parseTree($n->treeNodes[0]) . '?' . $this->parseTree($n->treeNodes[1]) . ':' . $this->parseTree($n->treeNodes[2]);
|
501 |
+
break;
|
502 |
+
|
503 |
+
case OP_OR: case OP_AND:
|
504 |
+
case OP_BITWISE_OR: case OP_BITWISE_XOR: case OP_BITWISE_AND:
|
505 |
+
case OP_EQ: case OP_NE: case OP_STRICT_EQ: case OP_STRICT_NE:
|
506 |
+
case OP_LT: case OP_LE: case OP_GE: case OP_GT:
|
507 |
+
case OP_LSH: case OP_RSH: case OP_URSH:
|
508 |
+
case OP_MUL: case OP_DIV: case OP_MOD:
|
509 |
+
$s = $this->parseTree($n->treeNodes[0]) . $n->type . $this->parseTree($n->treeNodes[1]);
|
510 |
+
break;
|
511 |
+
|
512 |
+
case OP_PLUS:
|
513 |
+
case OP_MINUS:
|
514 |
+
$left = $this->parseTree($n->treeNodes[0]);
|
515 |
+
$right = $this->parseTree($n->treeNodes[1]);
|
516 |
+
|
517 |
+
switch ($n->treeNodes[1]->type)
|
518 |
+
{
|
519 |
+
case OP_PLUS:
|
520 |
+
case OP_MINUS:
|
521 |
+
case OP_INCREMENT:
|
522 |
+
case OP_DECREMENT:
|
523 |
+
case OP_UNARY_PLUS:
|
524 |
+
case OP_UNARY_MINUS:
|
525 |
+
$s = $left . $n->type . ' ' . $right;
|
526 |
+
break;
|
527 |
+
|
528 |
+
case TOKEN_STRING:
|
529 |
+
//combine concatted strings with same quotestyle
|
530 |
+
if ($n->type == OP_PLUS && substr($left, -1) == $right[0])
|
531 |
+
{
|
532 |
+
$s = substr($left, 0, -1) . substr($right, 1);
|
533 |
+
break;
|
534 |
+
}
|
535 |
+
// FALL THROUGH
|
536 |
+
|
537 |
+
default:
|
538 |
+
$s = $left . $n->type . $right;
|
539 |
+
}
|
540 |
+
break;
|
541 |
+
|
542 |
+
case OP_NOT:
|
543 |
+
case OP_BITWISE_NOT:
|
544 |
+
case OP_UNARY_PLUS:
|
545 |
+
case OP_UNARY_MINUS:
|
546 |
+
$s = $n->value . $this->parseTree($n->treeNodes[0]);
|
547 |
+
break;
|
548 |
+
|
549 |
+
case OP_INCREMENT:
|
550 |
+
case OP_DECREMENT:
|
551 |
+
if ($n->postfix)
|
552 |
+
$s = $this->parseTree($n->treeNodes[0]) . $n->value;
|
553 |
+
else
|
554 |
+
$s = $n->value . $this->parseTree($n->treeNodes[0]);
|
555 |
+
break;
|
556 |
+
|
557 |
+
case OP_DOT:
|
558 |
+
$s = $this->parseTree($n->treeNodes[0]) . '.' . $this->parseTree($n->treeNodes[1]);
|
559 |
+
break;
|
560 |
+
|
561 |
+
case JS_INDEX:
|
562 |
+
$s = $this->parseTree($n->treeNodes[0]);
|
563 |
+
// See if we can replace named index with a dot saving 3 bytes
|
564 |
+
if ( $n->treeNodes[0]->type == TOKEN_IDENTIFIER &&
|
565 |
+
$n->treeNodes[1]->type == TOKEN_STRING &&
|
566 |
+
$this->isValidIdentifier(substr($n->treeNodes[1]->value, 1, -1))
|
567 |
+
)
|
568 |
+
$s .= '.' . substr($n->treeNodes[1]->value, 1, -1);
|
569 |
+
else
|
570 |
+
$s .= '[' . $this->parseTree($n->treeNodes[1]) . ']';
|
571 |
+
break;
|
572 |
+
|
573 |
+
case JS_LIST:
|
574 |
+
$childs = $n->treeNodes;
|
575 |
+
for ($i = 0, $j = count($childs); $i < $j; $i++)
|
576 |
+
$s .= ($i ? ',' : '') . $this->parseTree($childs[$i]);
|
577 |
+
break;
|
578 |
+
|
579 |
+
case JS_CALL:
|
580 |
+
$s = $this->parseTree($n->treeNodes[0]) . '(' . $this->parseTree($n->treeNodes[1]) . ')';
|
581 |
+
break;
|
582 |
+
|
583 |
+
case KEYWORD_NEW:
|
584 |
+
case JS_NEW_WITH_ARGS:
|
585 |
+
$s = 'new ' . $this->parseTree($n->treeNodes[0]) . '(' . ($n->type == JS_NEW_WITH_ARGS ? $this->parseTree($n->treeNodes[1]) : '') . ')';
|
586 |
+
break;
|
587 |
+
|
588 |
+
case JS_ARRAY_INIT:
|
589 |
+
$s = '[';
|
590 |
+
$childs = $n->treeNodes;
|
591 |
+
for ($i = 0, $j = count($childs); $i < $j; $i++)
|
592 |
+
{
|
593 |
+
$s .= ($i ? ',' : '') . $this->parseTree($childs[$i]);
|
594 |
+
}
|
595 |
+
$s .= ']';
|
596 |
+
break;
|
597 |
+
|
598 |
+
case JS_OBJECT_INIT:
|
599 |
+
$s = '{';
|
600 |
+
$childs = $n->treeNodes;
|
601 |
+
for ($i = 0, $j = count($childs); $i < $j; $i++)
|
602 |
+
{
|
603 |
+
$t = $childs[$i];
|
604 |
+
if ($i)
|
605 |
+
$s .= ',';
|
606 |
+
if ($t->type == JS_PROPERTY_INIT)
|
607 |
+
{
|
608 |
+
// Ditch the quotes when the index is a valid identifier
|
609 |
+
if ( $t->treeNodes[0]->type == TOKEN_STRING &&
|
610 |
+
$this->isValidIdentifier(substr($t->treeNodes[0]->value, 1, -1))
|
611 |
+
)
|
612 |
+
$s .= substr($t->treeNodes[0]->value, 1, -1);
|
613 |
+
else
|
614 |
+
$s .= $t->treeNodes[0]->value;
|
615 |
+
|
616 |
+
$s .= ':' . $this->parseTree($t->treeNodes[1]);
|
617 |
+
}
|
618 |
+
else
|
619 |
+
{
|
620 |
+
$s .= $t->type == JS_GETTER ? 'get' : 'set';
|
621 |
+
$s .= ' ' . $t->name . '(';
|
622 |
+
$params = $t->params;
|
623 |
+
for ($i = 0, $j = count($params); $i < $j; $i++)
|
624 |
+
$s .= ($i ? ',' : '') . $params[$i];
|
625 |
+
$s .= '){' . $this->parseTree($t->body, true) . '}';
|
626 |
+
}
|
627 |
+
}
|
628 |
+
$s .= '}';
|
629 |
+
break;
|
630 |
+
|
631 |
+
case TOKEN_NUMBER:
|
632 |
+
$s = $n->value;
|
633 |
+
if (preg_match('/^([1-9]+)(0{3,})$/', $s, $m))
|
634 |
+
$s = $m[1] . 'e' . strlen($m[2]);
|
635 |
+
break;
|
636 |
+
|
637 |
+
case KEYWORD_NULL: case KEYWORD_THIS: case KEYWORD_TRUE: case KEYWORD_FALSE:
|
638 |
+
case TOKEN_IDENTIFIER: case TOKEN_STRING: case TOKEN_REGEXP:
|
639 |
+
$s = $n->value;
|
640 |
+
break;
|
641 |
+
|
642 |
+
case JS_GROUP:
|
643 |
+
if (in_array(
|
644 |
+
$n->treeNodes[0]->type,
|
645 |
+
array(
|
646 |
+
JS_ARRAY_INIT, JS_OBJECT_INIT, JS_GROUP,
|
647 |
+
TOKEN_NUMBER, TOKEN_STRING, TOKEN_REGEXP, TOKEN_IDENTIFIER,
|
648 |
+
KEYWORD_NULL, KEYWORD_THIS, KEYWORD_TRUE, KEYWORD_FALSE
|
649 |
+
)
|
650 |
+
))
|
651 |
+
{
|
652 |
+
$s = $this->parseTree($n->treeNodes[0]);
|
653 |
+
}
|
654 |
+
else
|
655 |
+
{
|
656 |
+
$s = '(' . $this->parseTree($n->treeNodes[0]) . ')';
|
657 |
+
}
|
658 |
+
break;
|
659 |
+
|
660 |
+
default:
|
661 |
+
throw new Exception('UNKNOWN TOKEN TYPE: ' . $n->type);
|
662 |
+
}
|
663 |
+
|
664 |
+
return $s;
|
665 |
+
}
|
666 |
+
|
667 |
+
private function isValidIdentifier($string)
|
668 |
+
{
|
669 |
+
return preg_match('/^[a-zA-Z_][a-zA-Z0-9_]*$/', $string) && !in_array($string, $this->reserved);
|
670 |
+
}
|
671 |
+
|
672 |
+
private function isWordChar($char)
|
673 |
+
{
|
674 |
+
return $char == '_' || $char == '$' || ctype_alnum($char);
|
675 |
+
}
|
676 |
+
}
|
677 |
+
|
678 |
+
class JSParser
|
679 |
+
{
|
680 |
+
private $t;
|
681 |
+
private $minifier;
|
682 |
+
|
683 |
+
private $opPrecedence = array(
|
684 |
+
';' => 0,
|
685 |
+
',' => 1,
|
686 |
+
'=' => 2, '?' => 2, ':' => 2,
|
687 |
+
// The above all have to have the same precedence, see bug 330975
|
688 |
+
'||' => 4,
|
689 |
+
'&&' => 5,
|
690 |
+
'|' => 6,
|
691 |
+
'^' => 7,
|
692 |
+
'&' => 8,
|
693 |
+
'==' => 9, '!=' => 9, '===' => 9, '!==' => 9,
|
694 |
+
'<' => 10, '<=' => 10, '>=' => 10, '>' => 10, 'in' => 10, 'instanceof' => 10,
|
695 |
+
'<<' => 11, '>>' => 11, '>>>' => 11,
|
696 |
+
'+' => 12, '-' => 12,
|
697 |
+
'*' => 13, '/' => 13, '%' => 13,
|
698 |
+
'delete' => 14, 'void' => 14, 'typeof' => 14,
|
699 |
+
'!' => 14, '~' => 14, 'U+' => 14, 'U-' => 14,
|
700 |
+
'++' => 15, '--' => 15,
|
701 |
+
'new' => 16,
|
702 |
+
'.' => 17,
|
703 |
+
JS_NEW_WITH_ARGS => 0, JS_INDEX => 0, JS_CALL => 0,
|
704 |
+
JS_ARRAY_INIT => 0, JS_OBJECT_INIT => 0, JS_GROUP => 0
|
705 |
+
);
|
706 |
+
|
707 |
+
private $opArity = array(
|
708 |
+
',' => -2,
|
709 |
+
'=' => 2,
|
710 |
+
'?' => 3,
|
711 |
+
'||' => 2,
|
712 |
+
'&&' => 2,
|
713 |
+
'|' => 2,
|
714 |
+
'^' => 2,
|
715 |
+
'&' => 2,
|
716 |
+
'==' => 2, '!=' => 2, '===' => 2, '!==' => 2,
|
717 |
+
'<' => 2, '<=' => 2, '>=' => 2, '>' => 2, 'in' => 2, 'instanceof' => 2,
|
718 |
+
'<<' => 2, '>>' => 2, '>>>' => 2,
|
719 |
+
'+' => 2, '-' => 2,
|
720 |
+
'*' => 2, '/' => 2, '%' => 2,
|
721 |
+
'delete' => 1, 'void' => 1, 'typeof' => 1,
|
722 |
+
'!' => 1, '~' => 1, 'U+' => 1, 'U-' => 1,
|
723 |
+
'++' => 1, '--' => 1,
|
724 |
+
'new' => 1,
|
725 |
+
'.' => 2,
|
726 |
+
JS_NEW_WITH_ARGS => 2, JS_INDEX => 2, JS_CALL => 2,
|
727 |
+
JS_ARRAY_INIT => 1, JS_OBJECT_INIT => 1, JS_GROUP => 1,
|
728 |
+
TOKEN_CONDCOMMENT_START => 1, TOKEN_CONDCOMMENT_END => 1
|
729 |
+
);
|
730 |
+
|
731 |
+
public function __construct($minifier=null)
|
732 |
+
{
|
733 |
+
$this->minifier = $minifier;
|
734 |
+
$this->t = new JSTokenizer();
|
735 |
+
}
|
736 |
+
|
737 |
+
public function parse($s, $f, $l)
|
738 |
+
{
|
739 |
+
// initialize tokenizer
|
740 |
+
$this->t->init($s, $f, $l);
|
741 |
+
|
742 |
+
$x = new JSCompilerContext(false);
|
743 |
+
$n = $this->Script($x);
|
744 |
+
if (!$this->t->isDone())
|
745 |
+
throw $this->t->newSyntaxError('Syntax error');
|
746 |
+
|
747 |
+
return $n;
|
748 |
+
}
|
749 |
+
|
750 |
+
private function Script($x)
|
751 |
+
{
|
752 |
+
$n = $this->Statements($x);
|
753 |
+
$n->type = JS_SCRIPT;
|
754 |
+
$n->funDecls = $x->funDecls;
|
755 |
+
$n->varDecls = $x->varDecls;
|
756 |
+
|
757 |
+
// minify by scope
|
758 |
+
if ($this->minifier)
|
759 |
+
{
|
760 |
+
$n->value = $this->minifier->parseTree($n);
|
761 |
+
|
762 |
+
// clear tree from node to save memory
|
763 |
+
$n->treeNodes = null;
|
764 |
+
$n->funDecls = null;
|
765 |
+
$n->varDecls = null;
|
766 |
+
|
767 |
+
$n->type = JS_MINIFIED;
|
768 |
+
}
|
769 |
+
|
770 |
+
return $n;
|
771 |
+
}
|
772 |
+
|
773 |
+
private function Statements($x)
|
774 |
+
{
|
775 |
+
$n = new JSNode($this->t, JS_BLOCK);
|
776 |
+
array_push($x->stmtStack, $n);
|
777 |
+
|
778 |
+
while (!$this->t->isDone() && $this->t->peek() != OP_RIGHT_CURLY)
|
779 |
+
$n->addNode($this->Statement($x));
|
780 |
+
|
781 |
+
array_pop($x->stmtStack);
|
782 |
+
|
783 |
+
return $n;
|
784 |
+
}
|
785 |
+
|
786 |
+
private function Block($x)
|
787 |
+
{
|
788 |
+
$this->t->mustMatch(OP_LEFT_CURLY);
|
789 |
+
$n = $this->Statements($x);
|
790 |
+
$this->t->mustMatch(OP_RIGHT_CURLY);
|
791 |
+
|
792 |
+
return $n;
|
793 |
+
}
|
794 |
+
|
795 |
+
private function Statement($x)
|
796 |
+
{
|
797 |
+
$tt = $this->t->get();
|
798 |
+
$n2 = null;
|
799 |
+
|
800 |
+
// Cases for statements ending in a right curly return early, avoiding the
|
801 |
+
// common semicolon insertion magic after this switch.
|
802 |
+
switch ($tt)
|
803 |
+
{
|
804 |
+
case KEYWORD_FUNCTION:
|
805 |
+
return $this->FunctionDefinition(
|
806 |
+
$x,
|
807 |
+
true,
|
808 |
+
count($x->stmtStack) > 1 ? STATEMENT_FORM : DECLARED_FORM
|
809 |
+
);
|
810 |
+
break;
|
811 |
+
|
812 |
+
case OP_LEFT_CURLY:
|
813 |
+
$n = $this->Statements($x);
|
814 |
+
$this->t->mustMatch(OP_RIGHT_CURLY);
|
815 |
+
return $n;
|
816 |
+
|
817 |
+
case KEYWORD_IF:
|
818 |
+
$n = new JSNode($this->t);
|
819 |
+
$n->condition = $this->ParenExpression($x);
|
820 |
+
array_push($x->stmtStack, $n);
|
821 |
+
$n->thenPart = $this->Statement($x);
|
822 |
+
$n->elsePart = $this->t->match(KEYWORD_ELSE) ? $this->Statement($x) : null;
|
823 |
+
array_pop($x->stmtStack);
|
824 |
+
return $n;
|
825 |
+
|
826 |
+
case KEYWORD_SWITCH:
|
827 |
+
$n = new JSNode($this->t);
|
828 |
+
$this->t->mustMatch(OP_LEFT_PAREN);
|
829 |
+
$n->discriminant = $this->Expression($x);
|
830 |
+
$this->t->mustMatch(OP_RIGHT_PAREN);
|
831 |
+
$n->cases = array();
|
832 |
+
$n->defaultIndex = -1;
|
833 |
+
|
834 |
+
array_push($x->stmtStack, $n);
|
835 |
+
|
836 |
+
$this->t->mustMatch(OP_LEFT_CURLY);
|
837 |
+
|
838 |
+
while (($tt = $this->t->get()) != OP_RIGHT_CURLY)
|
839 |
+
{
|
840 |
+
switch ($tt)
|
841 |
+
{
|
842 |
+
case KEYWORD_DEFAULT:
|
843 |
+
if ($n->defaultIndex >= 0)
|
844 |
+
throw $this->t->newSyntaxError('More than one switch default');
|
845 |
+
// FALL THROUGH
|
846 |
+
case KEYWORD_CASE:
|
847 |
+
$n2 = new JSNode($this->t);
|
848 |
+
if ($tt == KEYWORD_DEFAULT)
|
849 |
+
$n->defaultIndex = count($n->cases);
|
850 |
+
else
|
851 |
+
$n2->caseLabel = $this->Expression($x, OP_COLON);
|
852 |
+
break;
|
853 |
+
default:
|
854 |
+
throw $this->t->newSyntaxError('Invalid switch case');
|
855 |
+
}
|
856 |
+
|
857 |
+
$this->t->mustMatch(OP_COLON);
|
858 |
+
$n2->statements = new JSNode($this->t, JS_BLOCK);
|
859 |
+
while (($tt = $this->t->peek()) != KEYWORD_CASE && $tt != KEYWORD_DEFAULT && $tt != OP_RIGHT_CURLY)
|
860 |
+
$n2->statements->addNode($this->Statement($x));
|
861 |
+
|
862 |
+
array_push($n->cases, $n2);
|
863 |
+
}
|
864 |
+
|
865 |
+
array_pop($x->stmtStack);
|
866 |
+
return $n;
|
867 |
+
|
868 |
+
case KEYWORD_FOR:
|
869 |
+
$n = new JSNode($this->t);
|
870 |
+
$n->isLoop = true;
|
871 |
+
$this->t->mustMatch(OP_LEFT_PAREN);
|
872 |
+
|
873 |
+
if (($tt = $this->t->peek()) != OP_SEMICOLON)
|
874 |
+
{
|
875 |
+
$x->inForLoopInit = true;
|
876 |
+
if ($tt == KEYWORD_VAR || $tt == KEYWORD_CONST)
|
877 |
+
{
|
878 |
+
$this->t->get();
|
879 |
+
$n2 = $this->Variables($x);
|
880 |
+
}
|
881 |
+
else
|
882 |
+
{
|
883 |
+
$n2 = $this->Expression($x);
|
884 |
+
}
|
885 |
+
$x->inForLoopInit = false;
|
886 |
+
}
|
887 |
+
|
888 |
+
if ($n2 && $this->t->match(KEYWORD_IN))
|
889 |
+
{
|
890 |
+
$n->type = JS_FOR_IN;
|
891 |
+
if ($n2->type == KEYWORD_VAR)
|
892 |
+
{
|
893 |
+
if (count($n2->treeNodes) != 1)
|
894 |
+
{
|
895 |
+
throw $this->t->newSyntaxError(
|
896 |
+
'Invalid for..in left-hand side',
|
897 |
+
$this->t->filename,
|
898 |
+
$n2->lineno
|
899 |
+
);
|
900 |
+
}
|
901 |
+
|
902 |
+
// NB: n2[0].type == IDENTIFIER and n2[0].value == n2[0].name.
|
903 |
+
$n->iterator = $n2->treeNodes[0];
|
904 |
+
$n->varDecl = $n2;
|
905 |
+
}
|
906 |
+
else
|
907 |
+
{
|
908 |
+
$n->iterator = $n2;
|
909 |
+
$n->varDecl = null;
|
910 |
+
}
|
911 |
+
|
912 |
+
$n->object = $this->Expression($x);
|
913 |
+
}
|
914 |
+
else
|
915 |
+
{
|
916 |
+
$n->setup = $n2 ? $n2 : null;
|
917 |
+
$this->t->mustMatch(OP_SEMICOLON);
|
918 |
+
$n->condition = $this->t->peek() == OP_SEMICOLON ? null : $this->Expression($x);
|
919 |
+
$this->t->mustMatch(OP_SEMICOLON);
|
920 |
+
$n->update = $this->t->peek() == OP_RIGHT_PAREN ? null : $this->Expression($x);
|
921 |
+
}
|
922 |
+
|
923 |
+
$this->t->mustMatch(OP_RIGHT_PAREN);
|
924 |
+
$n->body = $this->nest($x, $n);
|
925 |
+
return $n;
|
926 |
+
|
927 |
+
case KEYWORD_WHILE:
|
928 |
+
$n = new JSNode($this->t);
|
929 |
+
$n->isLoop = true;
|
930 |
+
$n->condition = $this->ParenExpression($x);
|
931 |
+
$n->body = $this->nest($x, $n);
|
932 |
+
return $n;
|
933 |
+
|
934 |
+
case KEYWORD_DO:
|
935 |
+
$n = new JSNode($this->t);
|
936 |
+
$n->isLoop = true;
|
937 |
+
$n->body = $this->nest($x, $n, KEYWORD_WHILE);
|
938 |
+
$n->condition = $this->ParenExpression($x);
|
939 |
+
if (!$x->ecmaStrictMode)
|
940 |
+
{
|
941 |
+
// <script language="JavaScript"> (without version hints) may need
|
942 |
+
// automatic semicolon insertion without a newline after do-while.
|
943 |
+
// See http://bugzilla.mozilla.org/show_bug.cgi?id=238945.
|
944 |
+
$this->t->match(OP_SEMICOLON);
|
945 |
+
return $n;
|
946 |
+
}
|
947 |
+
break;
|
948 |
+
|
949 |
+
case KEYWORD_BREAK:
|
950 |
+
case KEYWORD_CONTINUE:
|
951 |
+
$n = new JSNode($this->t);
|
952 |
+
|
953 |
+
if ($this->t->peekOnSameLine() == TOKEN_IDENTIFIER)
|
954 |
+
{
|
955 |
+
$this->t->get();
|
956 |
+
$n->label = $this->t->currentToken()->value;
|
957 |
+
}
|
958 |
+
|
959 |
+
$ss = $x->stmtStack;
|
960 |
+
$i = count($ss);
|
961 |
+
$label = $n->label;
|
962 |
+
if ($label)
|
963 |
+
{
|
964 |
+
do
|
965 |
+
{
|
966 |
+
if (--$i < 0)
|
967 |
+
throw $this->t->newSyntaxError('Label not found');
|
968 |
+
}
|
969 |
+
while ($ss[$i]->label != $label);
|
970 |
+
}
|
971 |
+
else
|
972 |
+
{
|
973 |
+
do
|
974 |
+
{
|
975 |
+
if (--$i < 0)
|
976 |
+
throw $this->t->newSyntaxError('Invalid ' . $tt);
|
977 |
+
}
|
978 |
+
while (!$ss[$i]->isLoop && ($tt != KEYWORD_BREAK || $ss[$i]->type != KEYWORD_SWITCH));
|
979 |
+
}
|
980 |
+
|
981 |
+
$n->target = $ss[$i];
|
982 |
+
break;
|
983 |
+
|
984 |
+
case KEYWORD_TRY:
|
985 |
+
$n = new JSNode($this->t);
|
986 |
+
$n->tryBlock = $this->Block($x);
|
987 |
+
$n->catchClauses = array();
|
988 |
+
|
989 |
+
while ($this->t->match(KEYWORD_CATCH))
|
990 |
+
{
|
991 |
+
$n2 = new JSNode($this->t);
|
992 |
+
$this->t->mustMatch(OP_LEFT_PAREN);
|
993 |
+
$n2->varName = $this->t->mustMatch(TOKEN_IDENTIFIER)->value;
|
994 |
+
|
995 |
+
if ($this->t->match(KEYWORD_IF))
|
996 |
+
{
|
997 |
+
if ($x->ecmaStrictMode)
|
998 |
+
throw $this->t->newSyntaxError('Illegal catch guard');
|
999 |
+
|
1000 |
+
if (count($n->catchClauses) && !end($n->catchClauses)->guard)
|
1001 |
+
throw $this->t->newSyntaxError('Guarded catch after unguarded');
|
1002 |
+
|
1003 |
+
$n2->guard = $this->Expression($x);
|
1004 |
+
}
|
1005 |
+
else
|
1006 |
+
{
|
1007 |
+
$n2->guard = null;
|
1008 |
+
}
|
1009 |
+
|
1010 |
+
$this->t->mustMatch(OP_RIGHT_PAREN);
|
1011 |
+
$n2->block = $this->Block($x);
|
1012 |
+
array_push($n->catchClauses, $n2);
|
1013 |
+
}
|
1014 |
+
|
1015 |
+
if ($this->t->match(KEYWORD_FINALLY))
|
1016 |
+
$n->finallyBlock = $this->Block($x);
|
1017 |
+
|
1018 |
+
if (!count($n->catchClauses) && !$n->finallyBlock)
|
1019 |
+
throw $this->t->newSyntaxError('Invalid try statement');
|
1020 |
+
return $n;
|
1021 |
+
|
1022 |
+
case KEYWORD_CATCH:
|
1023 |
+
case KEYWORD_FINALLY:
|
1024 |
+
throw $this->t->newSyntaxError($tt + ' without preceding try');
|
1025 |
+
|
1026 |
+
case KEYWORD_THROW:
|
1027 |
+
$n = new JSNode($this->t);
|
1028 |
+
$n->value = $this->Expression($x);
|
1029 |
+
break;
|
1030 |
+
|
1031 |
+
case KEYWORD_RETURN:
|
1032 |
+
if (!$x->inFunction)
|
1033 |
+
throw $this->t->newSyntaxError('Invalid return');
|
1034 |
+
|
1035 |
+
$n = new JSNode($this->t);
|
1036 |
+
$tt = $this->t->peekOnSameLine();
|
1037 |
+
if ($tt != TOKEN_END && $tt != TOKEN_NEWLINE && $tt != OP_SEMICOLON && $tt != OP_RIGHT_CURLY)
|
1038 |
+
$n->value = $this->Expression($x);
|
1039 |
+
else
|
1040 |
+
$n->value = null;
|
1041 |
+
break;
|
1042 |
+
|
1043 |
+
case KEYWORD_WITH:
|
1044 |
+
$n = new JSNode($this->t);
|
1045 |
+
$n->object = $this->ParenExpression($x);
|
1046 |
+
$n->body = $this->nest($x, $n);
|
1047 |
+
return $n;
|
1048 |
+
|
1049 |
+
case KEYWORD_VAR:
|
1050 |
+
case KEYWORD_CONST:
|
1051 |
+
$n = $this->Variables($x);
|
1052 |
+
break;
|
1053 |
+
|
1054 |
+
case TOKEN_CONDCOMMENT_START:
|
1055 |
+
case TOKEN_CONDCOMMENT_END:
|
1056 |
+
$n = new JSNode($this->t);
|
1057 |
+
return $n;
|
1058 |
+
|
1059 |
+
case KEYWORD_DEBUGGER:
|
1060 |
+
$n = new JSNode($this->t);
|
1061 |
+
break;
|
1062 |
+
|
1063 |
+
case TOKEN_NEWLINE:
|
1064 |
+
case OP_SEMICOLON:
|
1065 |
+
$n = new JSNode($this->t, OP_SEMICOLON);
|
1066 |
+
$n->expression = null;
|
1067 |
+
return $n;
|
1068 |
+
|
1069 |
+
default:
|
1070 |
+
if ($tt == TOKEN_IDENTIFIER)
|
1071 |
+
{
|
1072 |
+
$this->t->scanOperand = false;
|
1073 |
+
$tt = $this->t->peek();
|
1074 |
+
$this->t->scanOperand = true;
|
1075 |
+
if ($tt == OP_COLON)
|
1076 |
+
{
|
1077 |
+
$label = $this->t->currentToken()->value;
|
1078 |
+
$ss = $x->stmtStack;
|
1079 |
+
for ($i = count($ss) - 1; $i >= 0; --$i)
|
1080 |
+
{
|
1081 |
+
if ($ss[$i]->label == $label)
|
1082 |
+
throw $this->t->newSyntaxError('Duplicate label');
|
1083 |
+
}
|
1084 |
+
|
1085 |
+
$this->t->get();
|
1086 |
+
$n = new JSNode($this->t, JS_LABEL);
|
1087 |
+
$n->label = $label;
|
1088 |
+
$n->statement = $this->nest($x, $n);
|
1089 |
+
|
1090 |
+
return $n;
|
1091 |
+
}
|
1092 |
+
}
|
1093 |
+
|
1094 |
+
$n = new JSNode($this->t, OP_SEMICOLON);
|
1095 |
+
$this->t->unget();
|
1096 |
+
$n->expression = $this->Expression($x);
|
1097 |
+
$n->end = $n->expression->end;
|
1098 |
+
break;
|
1099 |
+
}
|
1100 |
+
|
1101 |
+
if ($this->t->lineno == $this->t->currentToken()->lineno)
|
1102 |
+
{
|
1103 |
+
$tt = $this->t->peekOnSameLine();
|
1104 |
+
if ($tt != TOKEN_END && $tt != TOKEN_NEWLINE && $tt != OP_SEMICOLON && $tt != OP_RIGHT_CURLY)
|
1105 |
+
throw $this->t->newSyntaxError('Missing ; before statement');
|
1106 |
+
}
|
1107 |
+
|
1108 |
+
$this->t->match(OP_SEMICOLON);
|
1109 |
+
|
1110 |
+
return $n;
|
1111 |
+
}
|
1112 |
+
|
1113 |
+
private function FunctionDefinition($x, $requireName, $functionForm)
|
1114 |
+
{
|
1115 |
+
$f = new JSNode($this->t);
|
1116 |
+
|
1117 |
+
if ($f->type != KEYWORD_FUNCTION)
|
1118 |
+
$f->type = ($f->value == 'get') ? JS_GETTER : JS_SETTER;
|
1119 |
+
|
1120 |
+
if ($this->t->match(TOKEN_IDENTIFIER))
|
1121 |
+
$f->name = $this->t->currentToken()->value;
|
1122 |
+
elseif ($requireName)
|
1123 |
+
throw $this->t->newSyntaxError('Missing function identifier');
|
1124 |
+
|
1125 |
+
$this->t->mustMatch(OP_LEFT_PAREN);
|
1126 |
+
$f->params = array();
|
1127 |
+
|
1128 |
+
while (($tt = $this->t->get()) != OP_RIGHT_PAREN)
|
1129 |
+
{
|
1130 |
+
if ($tt != TOKEN_IDENTIFIER)
|
1131 |
+
throw $this->t->newSyntaxError('Missing formal parameter');
|
1132 |
+
|
1133 |
+
array_push($f->params, $this->t->currentToken()->value);
|
1134 |
+
|
1135 |
+
if ($this->t->peek() != OP_RIGHT_PAREN)
|
1136 |
+
$this->t->mustMatch(OP_COMMA);
|
1137 |
+
}
|
1138 |
+
|
1139 |
+
$this->t->mustMatch(OP_LEFT_CURLY);
|
1140 |
+
|
1141 |
+
$x2 = new JSCompilerContext(true);
|
1142 |
+
$f->body = $this->Script($x2);
|
1143 |
+
|
1144 |
+
$this->t->mustMatch(OP_RIGHT_CURLY);
|
1145 |
+
$f->end = $this->t->currentToken()->end;
|
1146 |
+
|
1147 |
+
$f->functionForm = $functionForm;
|
1148 |
+
if ($functionForm == DECLARED_FORM)
|
1149 |
+
array_push($x->funDecls, $f);
|
1150 |
+
|
1151 |
+
return $f;
|
1152 |
+
}
|
1153 |
+
|
1154 |
+
private function Variables($x)
|
1155 |
+
{
|
1156 |
+
$n = new JSNode($this->t);
|
1157 |
+
|
1158 |
+
do
|
1159 |
+
{
|
1160 |
+
$this->t->mustMatch(TOKEN_IDENTIFIER);
|
1161 |
+
|
1162 |
+
$n2 = new JSNode($this->t);
|
1163 |
+
$n2->name = $n2->value;
|
1164 |
+
|
1165 |
+
if ($this->t->match(OP_ASSIGN))
|
1166 |
+
{
|
1167 |
+
if ($this->t->currentToken()->assignOp)
|
1168 |
+
throw $this->t->newSyntaxError('Invalid variable initialization');
|
1169 |
+
|
1170 |
+
$n2->initializer = $this->Expression($x, OP_COMMA);
|
1171 |
+
}
|
1172 |
+
|
1173 |
+
$n2->readOnly = $n->type == KEYWORD_CONST;
|
1174 |
+
|
1175 |
+
$n->addNode($n2);
|
1176 |
+
array_push($x->varDecls, $n2);
|
1177 |
+
}
|
1178 |
+
while ($this->t->match(OP_COMMA));
|
1179 |
+
|
1180 |
+
return $n;
|
1181 |
+
}
|
1182 |
+
|
1183 |
+
private function Expression($x, $stop=false)
|
1184 |
+
{
|
1185 |
+
$operators = array();
|
1186 |
+
$operands = array();
|
1187 |
+
$n = false;
|
1188 |
+
|
1189 |
+
$bl = $x->bracketLevel;
|
1190 |
+
$cl = $x->curlyLevel;
|
1191 |
+
$pl = $x->parenLevel;
|
1192 |
+
$hl = $x->hookLevel;
|
1193 |
+
|
1194 |
+
while (($tt = $this->t->get()) != TOKEN_END)
|
1195 |
+
{
|
1196 |
+
if ($tt == $stop &&
|
1197 |
+
$x->bracketLevel == $bl &&
|
1198 |
+
$x->curlyLevel == $cl &&
|
1199 |
+
$x->parenLevel == $pl &&
|
1200 |
+
$x->hookLevel == $hl
|
1201 |
+
)
|
1202 |
+
{
|
1203 |
+
// Stop only if tt matches the optional stop parameter, and that
|
1204 |
+
// token is not quoted by some kind of bracket.
|
1205 |
+
break;
|
1206 |
+
}
|
1207 |
+
|
1208 |
+
switch ($tt)
|
1209 |
+
{
|
1210 |
+
case OP_SEMICOLON:
|
1211 |
+
// NB: cannot be empty, Statement handled that.
|
1212 |
+
break 2;
|
1213 |
+
|
1214 |
+
case OP_HOOK:
|
1215 |
+
if ($this->t->scanOperand)
|
1216 |
+
break 2;
|
1217 |
+
|
1218 |
+
while ( !empty($operators) &&
|
1219 |
+
$this->opPrecedence[end($operators)->type] > $this->opPrecedence[$tt]
|
1220 |
+
)
|
1221 |
+
$this->reduce($operators, $operands);
|
1222 |
+
|
1223 |
+
array_push($operators, new JSNode($this->t));
|
1224 |
+
|
1225 |
+
++$x->hookLevel;
|
1226 |
+
$this->t->scanOperand = true;
|
1227 |
+
$n = $this->Expression($x);
|
1228 |
+
|
1229 |
+
if (!$this->t->match(OP_COLON))
|
1230 |
+
break 2;
|
1231 |
+
|
1232 |
+
--$x->hookLevel;
|
1233 |
+
array_push($operands, $n);
|
1234 |
+
break;
|
1235 |
+
|
1236 |
+
case OP_COLON:
|
1237 |
+
if ($x->hookLevel)
|
1238 |
+
break 2;
|
1239 |
+
|
1240 |
+
throw $this->t->newSyntaxError('Invalid label');
|
1241 |
+
break;
|
1242 |
+
|
1243 |
+
case OP_ASSIGN:
|
1244 |
+
if ($this->t->scanOperand)
|
1245 |
+
break 2;
|
1246 |
+
|
1247 |
+
// Use >, not >=, for right-associative ASSIGN
|
1248 |
+
while ( !empty($operators) &&
|
1249 |
+
$this->opPrecedence[end($operators)->type] > $this->opPrecedence[$tt]
|
1250 |
+
)
|
1251 |
+
$this->reduce($operators, $operands);
|
1252 |
+
|
1253 |
+
array_push($operators, new JSNode($this->t));
|
1254 |
+
end($operands)->assignOp = $this->t->currentToken()->assignOp;
|
1255 |
+
$this->t->scanOperand = true;
|
1256 |
+
break;
|
1257 |
+
|
1258 |
+
case KEYWORD_IN:
|
1259 |
+
// An in operator should not be parsed if we're parsing the head of
|
1260 |
+
// a for (...) loop, unless it is in the then part of a conditional
|
1261 |
+
// expression, or parenthesized somehow.
|
1262 |
+
if ($x->inForLoopInit && !$x->hookLevel &&
|
1263 |
+
!$x->bracketLevel && !$x->curlyLevel &&
|
1264 |
+
!$x->parenLevel
|
1265 |
+
)
|
1266 |
+
break 2;
|
1267 |
+
// FALL THROUGH
|
1268 |
+
case OP_COMMA:
|
1269 |
+
// A comma operator should not be parsed if we're parsing the then part
|
1270 |
+
// of a conditional expression unless it's parenthesized somehow.
|
1271 |
+
if ($tt == OP_COMMA && $x->hookLevel &&
|
1272 |
+
!$x->bracketLevel && !$x->curlyLevel &&
|
1273 |
+
!$x->parenLevel
|
1274 |
+
)
|
1275 |
+
break 2;
|
1276 |
+
// Treat comma as left-associative so reduce can fold left-heavy
|
1277 |
+
// COMMA trees into a single array.
|
1278 |
+
// FALL THROUGH
|
1279 |
+
case OP_OR:
|
1280 |
+
case OP_AND:
|
1281 |
+
case OP_BITWISE_OR:
|
1282 |
+
case OP_BITWISE_XOR:
|
1283 |
+
case OP_BITWISE_AND:
|
1284 |
+
case OP_EQ: case OP_NE: case OP_STRICT_EQ: case OP_STRICT_NE:
|
1285 |
+
case OP_LT: case OP_LE: case OP_GE: case OP_GT:
|
1286 |
+
case KEYWORD_INSTANCEOF:
|
1287 |
+
case OP_LSH: case OP_RSH: case OP_URSH:
|
1288 |
+
case OP_PLUS: case OP_MINUS:
|
1289 |
+
case OP_MUL: case OP_DIV: case OP_MOD:
|
1290 |
+
case OP_DOT:
|
1291 |
+
if ($this->t->scanOperand)
|
1292 |
+
break 2;
|
1293 |
+
|
1294 |
+
while ( !empty($operators) &&
|
1295 |
+
$this->opPrecedence[end($operators)->type] >= $this->opPrecedence[$tt]
|
1296 |
+
)
|
1297 |
+
$this->reduce($operators, $operands);
|
1298 |
+
|
1299 |
+
if ($tt == OP_DOT)
|
1300 |
+
{
|
1301 |
+
$this->t->mustMatch(TOKEN_IDENTIFIER);
|
1302 |
+
array_push($operands, new JSNode($this->t, OP_DOT, array_pop($operands), new JSNode($this->t)));
|
1303 |
+
}
|
1304 |
+
else
|
1305 |
+
{
|
1306 |
+
array_push($operators, new JSNode($this->t));
|
1307 |
+
$this->t->scanOperand = true;
|
1308 |
+
}
|
1309 |
+
break;
|
1310 |
+
|
1311 |
+
case KEYWORD_DELETE: case KEYWORD_VOID: case KEYWORD_TYPEOF:
|
1312 |
+
case OP_NOT: case OP_BITWISE_NOT: case OP_UNARY_PLUS: case OP_UNARY_MINUS:
|
1313 |
+
case KEYWORD_NEW:
|
1314 |
+
if (!$this->t->scanOperand)
|
1315 |
+
break 2;
|
1316 |
+
|
1317 |
+
array_push($operators, new JSNode($this->t));
|
1318 |
+
break;
|
1319 |
+
|
1320 |
+
case OP_INCREMENT: case OP_DECREMENT:
|
1321 |
+
if ($this->t->scanOperand)
|
1322 |
+
{
|
1323 |
+
array_push($operators, new JSNode($this->t)); // prefix increment or decrement
|
1324 |
+
}
|
1325 |
+
else
|
1326 |
+
{
|
1327 |
+
// Don't cross a line boundary for postfix {in,de}crement.
|
1328 |
+
$t = $this->t->tokens[($this->t->tokenIndex + $this->t->lookahead - 1) & 3];
|
1329 |
+
if ($t && $t->lineno != $this->t->lineno)
|
1330 |
+
break 2;
|
1331 |
+
|
1332 |
+
if (!empty($operators))
|
1333 |
+
{
|
1334 |
+
// Use >, not >=, so postfix has higher precedence than prefix.
|
1335 |
+
while ($this->opPrecedence[end($operators)->type] > $this->opPrecedence[$tt])
|
1336 |
+
$this->reduce($operators, $operands);
|
1337 |
+
}
|
1338 |
+
|
1339 |
+
$n = new JSNode($this->t, $tt, array_pop($operands));
|
1340 |
+
$n->postfix = true;
|
1341 |
+
array_push($operands, $n);
|
1342 |
+
}
|
1343 |
+
break;
|
1344 |
+
|
1345 |
+
case KEYWORD_FUNCTION:
|
1346 |
+
if (!$this->t->scanOperand)
|
1347 |
+
break 2;
|
1348 |
+
|
1349 |
+
array_push($operands, $this->FunctionDefinition($x, false, EXPRESSED_FORM));
|
1350 |
+
$this->t->scanOperand = false;
|
1351 |
+
break;
|
1352 |
+
|
1353 |
+
case KEYWORD_NULL: case KEYWORD_THIS: case KEYWORD_TRUE: case KEYWORD_FALSE:
|
1354 |
+
case TOKEN_IDENTIFIER: case TOKEN_NUMBER: case TOKEN_STRING: case TOKEN_REGEXP:
|
1355 |
+
if (!$this->t->scanOperand)
|
1356 |
+
break 2;
|
1357 |
+
|
1358 |
+
array_push($operands, new JSNode($this->t));
|
1359 |
+
$this->t->scanOperand = false;
|
1360 |
+
break;
|
1361 |
+
|
1362 |
+
case TOKEN_CONDCOMMENT_START:
|
1363 |
+
case TOKEN_CONDCOMMENT_END:
|
1364 |
+
if ($this->t->scanOperand)
|
1365 |
+
array_push($operators, new JSNode($this->t));
|
1366 |
+
else
|
1367 |
+
array_push($operands, new JSNode($this->t));
|
1368 |
+
break;
|
1369 |
+
|
1370 |
+
case OP_LEFT_BRACKET:
|
1371 |
+
if ($this->t->scanOperand)
|
1372 |
+
{
|
1373 |
+
// Array initialiser. Parse using recursive descent, as the
|
1374 |
+
// sub-grammar here is not an operator grammar.
|
1375 |
+
$n = new JSNode($this->t, JS_ARRAY_INIT);
|
1376 |
+
while (($tt = $this->t->peek()) != OP_RIGHT_BRACKET)
|
1377 |
+
{
|
1378 |
+
if ($tt == OP_COMMA)
|
1379 |
+
{
|
1380 |
+
$this->t->get();
|
1381 |
+
$n->addNode(null);
|
1382 |
+
continue;
|
1383 |
+
}
|
1384 |
+
|
1385 |
+
$n->addNode($this->Expression($x, OP_COMMA));
|
1386 |
+
if (!$this->t->match(OP_COMMA))
|
1387 |
+
break;
|
1388 |
+
}
|
1389 |
+
|
1390 |
+
$this->t->mustMatch(OP_RIGHT_BRACKET);
|
1391 |
+
array_push($operands, $n);
|
1392 |
+
$this->t->scanOperand = false;
|
1393 |
+
}
|
1394 |
+
else
|
1395 |
+
{
|
1396 |
+
// Property indexing operator.
|
1397 |
+
array_push($operators, new JSNode($this->t, JS_INDEX));
|
1398 |
+
$this->t->scanOperand = true;
|
1399 |
+
++$x->bracketLevel;
|
1400 |
+
}
|
1401 |
+
break;
|
1402 |
+
|
1403 |
+
case OP_RIGHT_BRACKET:
|
1404 |
+
if ($this->t->scanOperand || $x->bracketLevel == $bl)
|
1405 |
+
break 2;
|
1406 |
+
|
1407 |
+
while ($this->reduce($operators, $operands)->type != JS_INDEX)
|
1408 |
+
continue;
|
1409 |
+
|
1410 |
+
--$x->bracketLevel;
|
1411 |
+
break;
|
1412 |
+
|
1413 |
+
case OP_LEFT_CURLY:
|
1414 |
+
if (!$this->t->scanOperand)
|
1415 |
+
break 2;
|
1416 |
+
|
1417 |
+
// Object initialiser. As for array initialisers (see above),
|
1418 |
+
// parse using recursive descent.
|
1419 |
+
++$x->curlyLevel;
|
1420 |
+
$n = new JSNode($this->t, JS_OBJECT_INIT);
|
1421 |
+
while (!$this->t->match(OP_RIGHT_CURLY))
|
1422 |
+
{
|
1423 |
+
do
|
1424 |
+
{
|
1425 |
+
$tt = $this->t->get();
|
1426 |
+
$tv = $this->t->currentToken()->value;
|
1427 |
+
if (($tv == 'get' || $tv == 'set') && $this->t->peek() == TOKEN_IDENTIFIER)
|
1428 |
+
{
|
1429 |
+
if ($x->ecmaStrictMode)
|
1430 |
+
throw $this->t->newSyntaxError('Illegal property accessor');
|
1431 |
+
|
1432 |
+
$n->addNode($this->FunctionDefinition($x, true, EXPRESSED_FORM));
|
1433 |
+
}
|
1434 |
+
else
|
1435 |
+
{
|
1436 |
+
switch ($tt)
|
1437 |
+
{
|
1438 |
+
case TOKEN_IDENTIFIER:
|
1439 |
+
case TOKEN_NUMBER:
|
1440 |
+
case TOKEN_STRING:
|
1441 |
+
$id = new JSNode($this->t);
|
1442 |
+
break;
|
1443 |
+
|
1444 |
+
case OP_RIGHT_CURLY:
|
1445 |
+
if ($x->ecmaStrictMode)
|
1446 |
+
throw $this->t->newSyntaxError('Illegal trailing ,');
|
1447 |
+
break 3;
|
1448 |
+
|
1449 |
+
default:
|
1450 |
+
throw $this->t->newSyntaxError('Invalid property name');
|
1451 |
+
}
|
1452 |
+
|
1453 |
+
$this->t->mustMatch(OP_COLON);
|
1454 |
+
$n->addNode(new JSNode($this->t, JS_PROPERTY_INIT, $id, $this->Expression($x, OP_COMMA)));
|
1455 |
+
}
|
1456 |
+
}
|
1457 |
+
while ($this->t->match(OP_COMMA));
|
1458 |
+
|
1459 |
+
$this->t->mustMatch(OP_RIGHT_CURLY);
|
1460 |
+
break;
|
1461 |
+
}
|
1462 |
+
|
1463 |
+
array_push($operands, $n);
|
1464 |
+
$this->t->scanOperand = false;
|
1465 |
+
--$x->curlyLevel;
|
1466 |
+
break;
|
1467 |
+
|
1468 |
+
case OP_RIGHT_CURLY:
|
1469 |
+
if (!$this->t->scanOperand && $x->curlyLevel != $cl)
|
1470 |
+
throw new Exception('PANIC: right curly botch');
|
1471 |
+
break 2;
|
1472 |
+
|
1473 |
+
case OP_LEFT_PAREN:
|
1474 |
+
if ($this->t->scanOperand)
|
1475 |
+
{
|
1476 |
+
array_push($operators, new JSNode($this->t, JS_GROUP));
|
1477 |
+
}
|
1478 |
+
else
|
1479 |
+
{
|
1480 |
+
while ( !empty($operators) &&
|
1481 |
+
$this->opPrecedence[end($operators)->type] > $this->opPrecedence[KEYWORD_NEW]
|
1482 |
+
)
|
1483 |
+
$this->reduce($operators, $operands);
|
1484 |
+
|
1485 |
+
// Handle () now, to regularize the n-ary case for n > 0.
|
1486 |
+
// We must set scanOperand in case there are arguments and
|
1487 |
+
// the first one is a regexp or unary+/-.
|
1488 |
+
$n = end($operators);
|
1489 |
+
$this->t->scanOperand = true;
|
1490 |
+
if ($this->t->match(OP_RIGHT_PAREN))
|
1491 |
+
{
|
1492 |
+
if ($n && $n->type == KEYWORD_NEW)
|
1493 |
+
{
|
1494 |
+
array_pop($operators);
|
1495 |
+
$n->addNode(array_pop($operands));
|
1496 |
+
}
|
1497 |
+
else
|
1498 |
+
{
|
1499 |
+
$n = new JSNode($this->t, JS_CALL, array_pop($operands), new JSNode($this->t, JS_LIST));
|
1500 |
+
}
|
1501 |
+
|
1502 |
+
array_push($operands, $n);
|
1503 |
+
$this->t->scanOperand = false;
|
1504 |
+
break;
|
1505 |
+
}
|
1506 |
+
|
1507 |
+
if ($n && $n->type == KEYWORD_NEW)
|
1508 |
+
$n->type = JS_NEW_WITH_ARGS;
|
1509 |
+
else
|
1510 |
+
array_push($operators, new JSNode($this->t, JS_CALL));
|
1511 |
+
}
|
1512 |
+
|
1513 |
+
++$x->parenLevel;
|
1514 |
+
break;
|
1515 |
+
|
1516 |
+
case OP_RIGHT_PAREN:
|
1517 |
+
if ($this->t->scanOperand || $x->parenLevel == $pl)
|
1518 |
+
break 2;
|
1519 |
+
|
1520 |
+
while (($tt = $this->reduce($operators, $operands)->type) != JS_GROUP &&
|
1521 |
+
$tt != JS_CALL && $tt != JS_NEW_WITH_ARGS
|
1522 |
+
)
|
1523 |
+
{
|
1524 |
+
continue;
|
1525 |
+
}
|
1526 |
+
|
1527 |
+
if ($tt != JS_GROUP)
|
1528 |
+
{
|
1529 |
+
$n = end($operands);
|
1530 |
+
if ($n->treeNodes[1]->type != OP_COMMA)
|
1531 |
+
$n->treeNodes[1] = new JSNode($this->t, JS_LIST, $n->treeNodes[1]);
|
1532 |
+
else
|
1533 |
+
$n->treeNodes[1]->type = JS_LIST;
|
1534 |
+
}
|
1535 |
+
|
1536 |
+
--$x->parenLevel;
|
1537 |
+
break;
|
1538 |
+
|
1539 |
+
// Automatic semicolon insertion means we may scan across a newline
|
1540 |
+
// and into the beginning of another statement. If so, break out of
|
1541 |
+
// the while loop and let the t.scanOperand logic handle errors.
|
1542 |
+
default:
|
1543 |
+
break 2;
|
1544 |
+
}
|
1545 |
+
}
|
1546 |
+
|
1547 |
+
if ($x->hookLevel != $hl)
|
1548 |
+
throw $this->t->newSyntaxError('Missing : in conditional expression');
|
1549 |
+
|
1550 |
+
if ($x->parenLevel != $pl)
|
1551 |
+
throw $this->t->newSyntaxError('Missing ) in parenthetical');
|
1552 |
+
|
1553 |
+
if ($x->bracketLevel != $bl)
|
1554 |
+
throw $this->t->newSyntaxError('Missing ] in index expression');
|
1555 |
+
|
1556 |
+
if ($this->t->scanOperand)
|
1557 |
+
throw $this->t->newSyntaxError('Missing operand');
|
1558 |
+
|
1559 |
+
// Resume default mode, scanning for operands, not operators.
|
1560 |
+
$this->t->scanOperand = true;
|
1561 |
+
$this->t->unget();
|
1562 |
+
|
1563 |
+
while (count($operators))
|
1564 |
+
$this->reduce($operators, $operands);
|
1565 |
+
|
1566 |
+
return array_pop($operands);
|
1567 |
+
}
|
1568 |
+
|
1569 |
+
private function ParenExpression($x)
|
1570 |
+
{
|
1571 |
+
$this->t->mustMatch(OP_LEFT_PAREN);
|
1572 |
+
$n = $this->Expression($x);
|
1573 |
+
$this->t->mustMatch(OP_RIGHT_PAREN);
|
1574 |
+
|
1575 |
+
return $n;
|
1576 |
+
}
|
1577 |
+
|
1578 |
+
// Statement stack and nested statement handler.
|
1579 |
+
private function nest($x, $node, $end = false)
|
1580 |
+
{
|
1581 |
+
array_push($x->stmtStack, $node);
|
1582 |
+
$n = $this->statement($x);
|
1583 |
+
array_pop($x->stmtStack);
|
1584 |
+
|
1585 |
+
if ($end)
|
1586 |
+
$this->t->mustMatch($end);
|
1587 |
+
|
1588 |
+
return $n;
|
1589 |
+
}
|
1590 |
+
|
1591 |
+
private function reduce(&$operators, &$operands)
|
1592 |
+
{
|
1593 |
+
$n = array_pop($operators);
|
1594 |
+
$op = $n->type;
|
1595 |
+
$arity = $this->opArity[$op];
|
1596 |
+
$c = count($operands);
|
1597 |
+
if ($arity == -2)
|
1598 |
+
{
|
1599 |
+
// Flatten left-associative trees
|
1600 |
+
if ($c >= 2)
|
1601 |
+
{
|
1602 |
+
$left = $operands[$c - 2];
|
1603 |
+
if ($left->type == $op)
|
1604 |
+
{
|
1605 |
+
$right = array_pop($operands);
|
1606 |
+
$left->addNode($right);
|
1607 |
+
return $left;
|
1608 |
+
}
|
1609 |
+
}
|
1610 |
+
$arity = 2;
|
1611 |
+
}
|
1612 |
+
|
1613 |
+
// Always use push to add operands to n, to update start and end
|
1614 |
+
$a = array_splice($operands, $c - $arity);
|
1615 |
+
for ($i = 0; $i < $arity; $i++)
|
1616 |
+
$n->addNode($a[$i]);
|
1617 |
+
|
1618 |
+
// Include closing bracket or postfix operator in [start,end]
|
1619 |
+
$te = $this->t->currentToken()->end;
|
1620 |
+
if ($n->end < $te)
|
1621 |
+
$n->end = $te;
|
1622 |
+
|
1623 |
+
array_push($operands, $n);
|
1624 |
+
|
1625 |
+
return $n;
|
1626 |
+
}
|
1627 |
+
}
|
1628 |
+
|
1629 |
+
class JSCompilerContext
|
1630 |
+
{
|
1631 |
+
public $inFunction = false;
|
1632 |
+
public $inForLoopInit = false;
|
1633 |
+
public $ecmaStrictMode = false;
|
1634 |
+
public $bracketLevel = 0;
|
1635 |
+
public $curlyLevel = 0;
|
1636 |
+
public $parenLevel = 0;
|
1637 |
+
public $hookLevel = 0;
|
1638 |
+
|
1639 |
+
public $stmtStack = array();
|
1640 |
+
public $funDecls = array();
|
1641 |
+
public $varDecls = array();
|
1642 |
+
|
1643 |
+
public function __construct($inFunction)
|
1644 |
+
{
|
1645 |
+
$this->inFunction = $inFunction;
|
1646 |
+
}
|
1647 |
+
}
|
1648 |
+
|
1649 |
+
class JSNode
|
1650 |
+
{
|
1651 |
+
private $type;
|
1652 |
+
private $value;
|
1653 |
+
private $lineno;
|
1654 |
+
private $start;
|
1655 |
+
private $end;
|
1656 |
+
|
1657 |
+
public $treeNodes = array();
|
1658 |
+
public $funDecls = array();
|
1659 |
+
public $varDecls = array();
|
1660 |
+
|
1661 |
+
public function __construct($t, $type=0)
|
1662 |
+
{
|
1663 |
+
if ($token = $t->currentToken())
|
1664 |
+
{
|
1665 |
+
$this->type = $type ? $type : $token->type;
|
1666 |
+
$this->value = $token->value;
|
1667 |
+
$this->lineno = $token->lineno;
|
1668 |
+
$this->start = $token->start;
|
1669 |
+
$this->end = $token->end;
|
1670 |
+
}
|
1671 |
+
else
|
1672 |
+
{
|
1673 |
+
$this->type = $type;
|
1674 |
+
$this->lineno = $t->lineno;
|
1675 |
+
}
|
1676 |
+
|
1677 |
+
if (($numargs = func_num_args()) > 2)
|
1678 |
+
{
|
1679 |
+
$args = func_get_args();
|
1680 |
+
for ($i = 2; $i < $numargs; $i++)
|
1681 |
+
$this->addNode($args[$i]);
|
1682 |
+
}
|
1683 |
+
}
|
1684 |
+
|
1685 |
+
// we don't want to bloat our object with all kind of specific properties, so we use overloading
|
1686 |
+
public function __set($name, $value)
|
1687 |
+
{
|
1688 |
+
$this->$name = $value;
|
1689 |
+
}
|
1690 |
+
|
1691 |
+
public function __get($name)
|
1692 |
+
{
|
1693 |
+
if (isset($this->$name))
|
1694 |
+
return $this->$name;
|
1695 |
+
|
1696 |
+
return null;
|
1697 |
+
}
|
1698 |
+
|
1699 |
+
public function addNode($node)
|
1700 |
+
{
|
1701 |
+
if ($node !== null)
|
1702 |
+
{
|
1703 |
+
if ($node->start < $this->start)
|
1704 |
+
$this->start = $node->start;
|
1705 |
+
if ($this->end < $node->end)
|
1706 |
+
$this->end = $node->end;
|
1707 |
+
}
|
1708 |
+
|
1709 |
+
$this->treeNodes[] = $node;
|
1710 |
+
}
|
1711 |
+
}
|
1712 |
+
|
1713 |
+
class JSTokenizer
|
1714 |
+
{
|
1715 |
+
private $cursor = 0;
|
1716 |
+
private $source;
|
1717 |
+
|
1718 |
+
public $tokens = array();
|
1719 |
+
public $tokenIndex = 0;
|
1720 |
+
public $lookahead = 0;
|
1721 |
+
public $scanNewlines = false;
|
1722 |
+
public $scanOperand = true;
|
1723 |
+
|
1724 |
+
public $filename;
|
1725 |
+
public $lineno;
|
1726 |
+
|
1727 |
+
private $keywords = array(
|
1728 |
+
'break',
|
1729 |
+
'case', 'catch', 'const', 'continue',
|
1730 |
+
'debugger', 'default', 'delete', 'do',
|
1731 |
+
'else', 'enum',
|
1732 |
+
'false', 'finally', 'for', 'function',
|
1733 |
+
'if', 'in', 'instanceof',
|
1734 |
+
'new', 'null',
|
1735 |
+
'return',
|
1736 |
+
'switch',
|
1737 |
+
'this', 'throw', 'true', 'try', 'typeof',
|
1738 |
+
'var', 'void',
|
1739 |
+
'while', 'with'
|
1740 |
+
);
|
1741 |
+
|
1742 |
+
private $opTypeNames = array(
|
1743 |
+
';', ',', '?', ':', '||', '&&', '|', '^',
|
1744 |
+
'&', '===', '==', '=', '!==', '!=', '<<', '<=',
|
1745 |
+
'<', '>>>', '>>', '>=', '>', '++', '--', '+',
|
1746 |
+
'-', '*', '/', '%', '!', '~', '.', '[',
|
1747 |
+
']', '{', '}', '(', ')', '@*/'
|
1748 |
+
);
|
1749 |
+
|
1750 |
+
private $assignOps = array('|', '^', '&', '<<', '>>', '>>>', '+', '-', '*', '/', '%');
|
1751 |
+
private $opRegExp;
|
1752 |
+
|
1753 |
+
public function __construct()
|
1754 |
+
{
|
1755 |
+
$this->opRegExp = '#^(' . implode('|', array_map('preg_quote', $this->opTypeNames)) . ')#';
|
1756 |
+
}
|
1757 |
+
|
1758 |
+
public function init($source, $filename = '', $lineno = 1)
|
1759 |
+
{
|
1760 |
+
$this->source = $source;
|
1761 |
+
$this->filename = $filename ? $filename : '[inline]';
|
1762 |
+
$this->lineno = $lineno;
|
1763 |
+
|
1764 |
+
$this->cursor = 0;
|
1765 |
+
$this->tokens = array();
|
1766 |
+
$this->tokenIndex = 0;
|
1767 |
+
$this->lookahead = 0;
|
1768 |
+
$this->scanNewlines = false;
|
1769 |
+
$this->scanOperand = true;
|
1770 |
+
}
|
1771 |
+
|
1772 |
+
public function getInput($chunksize)
|
1773 |
+
{
|
1774 |
+
if ($chunksize)
|
1775 |
+
return substr($this->source, $this->cursor, $chunksize);
|
1776 |
+
|
1777 |
+
return substr($this->source, $this->cursor);
|
1778 |
+
}
|
1779 |
+
|
1780 |
+
public function isDone()
|
1781 |
+
{
|
1782 |
+
return $this->peek() == TOKEN_END;
|
1783 |
+
}
|
1784 |
+
|
1785 |
+
public function match($tt)
|
1786 |
+
{
|
1787 |
+
return $this->get() == $tt || $this->unget();
|
1788 |
+
}
|
1789 |
+
|
1790 |
+
public function mustMatch($tt)
|
1791 |
+
{
|
1792 |
+
if (!$this->match($tt))
|
1793 |
+
throw $this->newSyntaxError('Unexpected token; token ' . $tt . ' expected');
|
1794 |
+
|
1795 |
+
return $this->currentToken();
|
1796 |
+
}
|
1797 |
+
|
1798 |
+
public function peek()
|
1799 |
+
{
|
1800 |
+
if ($this->lookahead)
|
1801 |
+
{
|
1802 |
+
$next = $this->tokens[($this->tokenIndex + $this->lookahead) & 3];
|
1803 |
+
if ($this->scanNewlines && $next->lineno != $this->lineno)
|
1804 |
+
$tt = TOKEN_NEWLINE;
|
1805 |
+
else
|
1806 |
+
$tt = $next->type;
|
1807 |
+
}
|
1808 |
+
else
|
1809 |
+
{
|
1810 |
+
$tt = $this->get();
|
1811 |
+
$this->unget();
|
1812 |
+
}
|
1813 |
+
|
1814 |
+
return $tt;
|
1815 |
+
}
|
1816 |
+
|
1817 |
+
public function peekOnSameLine()
|
1818 |
+
{
|
1819 |
+
$this->scanNewlines = true;
|
1820 |
+
$tt = $this->peek();
|
1821 |
+
$this->scanNewlines = false;
|
1822 |
+
|
1823 |
+
return $tt;
|
1824 |
+
}
|
1825 |
+
|
1826 |
+
public function currentToken()
|
1827 |
+
{
|
1828 |
+
if (!empty($this->tokens))
|
1829 |
+
return $this->tokens[$this->tokenIndex];
|
1830 |
+
}
|
1831 |
+
|
1832 |
+
public function get($chunksize = 1000)
|
1833 |
+
{
|
1834 |
+
while($this->lookahead)
|
1835 |
+
{
|
1836 |
+
$this->lookahead--;
|
1837 |
+
$this->tokenIndex = ($this->tokenIndex + 1) & 3;
|
1838 |
+
$token = $this->tokens[$this->tokenIndex];
|
1839 |
+
if ($token->type != TOKEN_NEWLINE || $this->scanNewlines)
|
1840 |
+
return $token->type;
|
1841 |
+
}
|
1842 |
+
|
1843 |
+
$conditional_comment = false;
|
1844 |
+
|
1845 |
+
// strip whitespace and comments
|
1846 |
+
while(true)
|
1847 |
+
{
|
1848 |
+
$input = $this->getInput($chunksize);
|
1849 |
+
|
1850 |
+
// whitespace handling; gobble up \r as well (effectively we don't have support for MAC newlines!)
|
1851 |
+
$re = $this->scanNewlines ? '/^[ \r\t]+/' : '/^\s+/';
|
1852 |
+
if (preg_match($re, $input, $match))
|
1853 |
+
{
|
1854 |
+
$spaces = $match[0];
|
1855 |
+
$spacelen = strlen($spaces);
|
1856 |
+
$this->cursor += $spacelen;
|
1857 |
+
if (!$this->scanNewlines)
|
1858 |
+
$this->lineno += substr_count($spaces, "\n");
|
1859 |
+
|
1860 |
+
if ($spacelen == $chunksize)
|
1861 |
+
continue; // complete chunk contained whitespace
|
1862 |
+
|
1863 |
+
$input = $this->getInput($chunksize);
|
1864 |
+
if ($input == '' || $input[0] != '/')
|
1865 |
+
break;
|
1866 |
+
}
|
1867 |
+
|
1868 |
+
// Comments
|
1869 |
+
if (!preg_match('/^\/(?:\*(@(?:cc_on|if|elif|else|end))?.*?\*\/|\/[^\n]*)/s', $input, $match))
|
1870 |
+
{
|
1871 |
+
if (!$chunksize)
|
1872 |
+
break;
|
1873 |
+
|
1874 |
+
// retry with a full chunk fetch; this also prevents breakage of long regular expressions (which will never match a comment)
|
1875 |
+
$chunksize = null;
|
1876 |
+
continue;
|
1877 |
+
}
|
1878 |
+
|
1879 |
+
// check if this is a conditional (JScript) comment
|
1880 |
+
if (!empty($match[1]))
|
1881 |
+
{
|
1882 |
+
$match[0] = '/*' . $match[1];
|
1883 |
+
$conditional_comment = true;
|
1884 |
+
break;
|
1885 |
+
}
|
1886 |
+
else
|
1887 |
+
{
|
1888 |
+
$this->cursor += strlen($match[0]);
|
1889 |
+
$this->lineno += substr_count($match[0], "\n");
|
1890 |
+
}
|
1891 |
+
}
|
1892 |
+
|
1893 |
+
if ($input == '')
|
1894 |
+
{
|
1895 |
+
$tt = TOKEN_END;
|
1896 |
+
$match = array('');
|
1897 |
+
}
|
1898 |
+
elseif ($conditional_comment)
|
1899 |
+
{
|
1900 |
+
$tt = TOKEN_CONDCOMMENT_START;
|
1901 |
+
}
|
1902 |
+
else
|
1903 |
+
{
|
1904 |
+
switch ($input[0])
|
1905 |
+
{
|
1906 |
+
case '0':
|
1907 |
+
// hexadecimal
|
1908 |
+
if (($input[1] == 'x' || $input[1] == 'X') && preg_match('/^0x[0-9a-f]+/i', $input, $match))
|
1909 |
+
{
|
1910 |
+
$tt = TOKEN_NUMBER;
|
1911 |
+
break;
|
1912 |
+
}
|
1913 |
+
// FALL THROUGH
|
1914 |
+
|
1915 |
+
case '1': case '2': case '3': case '4': case '5':
|
1916 |
+
case '6': case '7': case '8': case '9':
|
1917 |
+
// should always match
|
1918 |
+
preg_match('/^\d+(?:\.\d*)?(?:[eE][-+]?\d+)?/', $input, $match);
|
1919 |
+
$tt = TOKEN_NUMBER;
|
1920 |
+
break;
|
1921 |
+
|
1922 |
+
case "'":
|
1923 |
+
if (preg_match('/^\'(?:[^\\\\\'\r\n]++|\\\\(?:.|\r?\n))*\'/', $input, $match))
|
1924 |
+
{
|
1925 |
+
$tt = TOKEN_STRING;
|
1926 |
+
}
|
1927 |
+
else
|
1928 |
+
{
|
1929 |
+
if ($chunksize)
|
1930 |
+
return $this->get(null); // retry with a full chunk fetch
|
1931 |
+
|
1932 |
+
throw $this->newSyntaxError('Unterminated string literal');
|
1933 |
+
}
|
1934 |
+
break;
|
1935 |
+
|
1936 |
+
case '"':
|
1937 |
+
if (preg_match('/^"(?:[^\\\\"\r\n]++|\\\\(?:.|\r?\n))*"/', $input, $match))
|
1938 |
+
{
|
1939 |
+
$tt = TOKEN_STRING;
|
1940 |
+
}
|
1941 |
+
else
|
1942 |
+
{
|
1943 |
+
if ($chunksize)
|
1944 |
+
return $this->get(null); // retry with a full chunk fetch
|
1945 |
+
|
1946 |
+
throw $this->newSyntaxError('Unterminated string literal');
|
1947 |
+
}
|
1948 |
+
break;
|
1949 |
+
|
1950 |
+
case '/':
|
1951 |
+
if ($this->scanOperand && preg_match('/^\/((?:\\\\.|\[(?:\\\\.|[^\]])*\]|[^\/])+)\/([gimy]*)/', $input, $match))
|
1952 |
+
{
|
1953 |
+
$tt = TOKEN_REGEXP;
|
1954 |
+
break;
|
1955 |
+
}
|
1956 |
+
// FALL THROUGH
|
1957 |
+
|
1958 |
+
case '|':
|
1959 |
+
case '^':
|
1960 |
+
case '&':
|
1961 |
+
case '<':
|
1962 |
+
case '>':
|
1963 |
+
case '+':
|
1964 |
+
case '-':
|
1965 |
+
case '*':
|
1966 |
+
case '%':
|
1967 |
+
case '=':
|
1968 |
+
case '!':
|
1969 |
+
// should always match
|
1970 |
+
preg_match($this->opRegExp, $input, $match);
|
1971 |
+
$op = $match[0];
|
1972 |
+
if (in_array($op, $this->assignOps) && $input[strlen($op)] == '=')
|
1973 |
+
{
|
1974 |
+
$tt = OP_ASSIGN;
|
1975 |
+
$match[0] .= '=';
|
1976 |
+
}
|
1977 |
+
else
|
1978 |
+
{
|
1979 |
+
$tt = $op;
|
1980 |
+
if ($this->scanOperand)
|
1981 |
+
{
|
1982 |
+
if ($op == OP_PLUS)
|
1983 |
+
$tt = OP_UNARY_PLUS;
|
1984 |
+
elseif ($op == OP_MINUS)
|
1985 |
+
$tt = OP_UNARY_MINUS;
|
1986 |
+
}
|
1987 |
+
$op = null;
|
1988 |
+
}
|
1989 |
+
break;
|
1990 |
+
|
1991 |
+
case '.':
|
1992 |
+
if (preg_match('/^\.\d+(?:[eE][-+]?\d+)?/', $input, $match))
|
1993 |
+
{
|
1994 |
+
$tt = TOKEN_NUMBER;
|
1995 |
+
break;
|
1996 |
+
}
|
1997 |
+
// FALL THROUGH
|
1998 |
+
|
1999 |
+
case ';':
|
2000 |
+
case ',':
|
2001 |
+
case '?':
|
2002 |
+
case ':':
|
2003 |
+
case '~':
|
2004 |
+
case '[':
|
2005 |
+
case ']':
|
2006 |
+
case '{':
|
2007 |
+
case '}':
|
2008 |
+
case '(':
|
2009 |
+
case ')':
|
2010 |
+
// these are all single
|
2011 |
+
$match = array($input[0]);
|
2012 |
+
$tt = $input[0];
|
2013 |
+
break;
|
2014 |
+
|
2015 |
+
case '@':
|
2016 |
+
// check end of conditional comment
|
2017 |
+
if (substr($input, 0, 3) == '@*/')
|
2018 |
+
{
|
2019 |
+
$match = array('@*/');
|
2020 |
+
$tt = TOKEN_CONDCOMMENT_END;
|
2021 |
+
}
|
2022 |
+
else
|
2023 |
+
throw $this->newSyntaxError('Illegal token');
|
2024 |
+
break;
|
2025 |
+
|
2026 |
+
case "\n":
|
2027 |
+
if ($this->scanNewlines)
|
2028 |
+
{
|
2029 |
+
$match = array("\n");
|
2030 |
+
$tt = TOKEN_NEWLINE;
|
2031 |
+
}
|
2032 |
+
else
|
2033 |
+
throw $this->newSyntaxError('Illegal token');
|
2034 |
+
break;
|
2035 |
+
|
2036 |
+
default:
|
2037 |
+
// FIXME: add support for unicode and unicode escape sequence \uHHHH
|
2038 |
+
if (preg_match('/^[$\w]+/', $input, $match))
|
2039 |
+
{
|
2040 |
+
$tt = in_array($match[0], $this->keywords) ? $match[0] : TOKEN_IDENTIFIER;
|
2041 |
+
}
|
2042 |
+
else
|
2043 |
+
throw $this->newSyntaxError('Illegal token');
|
2044 |
+
}
|
2045 |
+
}
|
2046 |
+
|
2047 |
+
$this->tokenIndex = ($this->tokenIndex + 1) & 3;
|
2048 |
+
|
2049 |
+
if (!isset($this->tokens[$this->tokenIndex]))
|
2050 |
+
$this->tokens[$this->tokenIndex] = new JSToken();
|
2051 |
+
|
2052 |
+
$token = $this->tokens[$this->tokenIndex];
|
2053 |
+
$token->type = $tt;
|
2054 |
+
|
2055 |
+
if ($tt == OP_ASSIGN)
|
2056 |
+
$token->assignOp = $op;
|
2057 |
+
|
2058 |
+
$token->start = $this->cursor;
|
2059 |
+
|
2060 |
+
$token->value = $match[0];
|
2061 |
+
$this->cursor += strlen($match[0]);
|
2062 |
+
|
2063 |
+
$token->end = $this->cursor;
|
2064 |
+
$token->lineno = $this->lineno;
|
2065 |
+
|
2066 |
+
return $tt;
|
2067 |
+
}
|
2068 |
+
|
2069 |
+
public function unget()
|
2070 |
+
{
|
2071 |
+
if (++$this->lookahead == 4)
|
2072 |
+
throw $this->newSyntaxError('PANIC: too much lookahead!');
|
2073 |
+
|
2074 |
+
$this->tokenIndex = ($this->tokenIndex - 1) & 3;
|
2075 |
+
}
|
2076 |
+
|
2077 |
+
public function newSyntaxError($m)
|
2078 |
+
{
|
2079 |
+
return new Exception('Parse error: ' . $m . ' in file \'' . $this->filename . '\' on line ' . $this->lineno);
|
2080 |
+
}
|
2081 |
+
}
|
2082 |
+
|
2083 |
+
class JSToken
|
2084 |
+
{
|
2085 |
+
public $type;
|
2086 |
+
public $value;
|
2087 |
+
public $start;
|
2088 |
+
public $end;
|
2089 |
+
public $lineno;
|
2090 |
+
public $assignOp;
|
2091 |
+
}
|
lib/API/JSON/v1/Subscribers.php
CHANGED
@@ -200,14 +200,21 @@ class Subscribers extends APIEndpoint {
|
|
200 |
Â
|
201 |
Â
public function sendConfirmationEmail($data = []) {
|
202 |
Â
$id = (isset($data['id']) ? (int)$data['id'] : false);
|
203 |
-
$subscriber =
|
204 |
-
if ($subscriber instanceof
|
205 |
-
|
206 |
-
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
207 |
Â
}
|
208 |
-
return $this->errorResponse([
|
209 |
-
APIError::UNKNOWN => __('There was a problem with your sending method. Please check if your sending method is properly configured.', 'mailpoet'),
|
210 |
-
]);
|
211 |
Â
} else {
|
212 |
Â
return $this->errorResponse([
|
213 |
Â
APIError::NOT_FOUND => WPFunctions::get()->__('This subscriber does not exist.', 'mailpoet'),
|
200 |
Â
|
201 |
Â
public function sendConfirmationEmail($data = []) {
|
202 |
Â
$id = (isset($data['id']) ? (int)$data['id'] : false);
|
203 |
+
$subscriber = $this->subscribersRepository->findOneById($id);
|
204 |
+
if ($subscriber instanceof SubscriberEntity) {
|
205 |
+
try {
|
206 |
+
if ($this->confirmationEmailMailer->sendConfirmationEmail($subscriber)) {
|
207 |
+
return $this->successResponse();
|
208 |
+
} else {
|
209 |
+
return $this->errorResponse([
|
210 |
+
APIError::UNKNOWN => __('There was a problem with your sending method. Please check if your sending method is properly configured.', 'mailpoet'),
|
211 |
+
]);
|
212 |
+
}
|
213 |
+
} catch (\Exception $e) {
|
214 |
+
return $this->errorResponse([
|
215 |
+
APIError::UNKNOWN => __('There was a problem with your sending method. Please check if your sending method is properly configured.', 'mailpoet'),
|
216 |
+
]);
|
217 |
Â
}
|
Â
|
|
Â
|
|
Â
|
|
218 |
Â
} else {
|
219 |
Â
return $this->errorResponse([
|
220 |
Â
APIError::NOT_FOUND => WPFunctions::get()->__('This subscriber does not exist.', 'mailpoet'),
|
lib/API/MP/v1/API.php
CHANGED
@@ -5,6 +5,7 @@ namespace MailPoet\API\MP\v1;
|
|
5 |
Â
if (!defined('ABSPATH')) exit;
|
6 |
Â
|
7 |
Â
|
Â
|
|
8 |
Â
use MailPoet\Models\Segment;
|
9 |
Â
use MailPoet\Models\Subscriber;
|
10 |
Â
use MailPoet\Models\SubscriberSegment;
|
@@ -14,6 +15,7 @@ use MailPoet\Subscribers\ConfirmationEmailMailer;
|
|
14 |
Â
use MailPoet\Subscribers\NewSubscriberNotificationMailer;
|
15 |
Â
use MailPoet\Subscribers\RequiredCustomFieldValidator;
|
16 |
Â
use MailPoet\Subscribers\Source;
|
Â
|
|
17 |
Â
use MailPoet\Tasks\Sending;
|
18 |
Â
use MailPoet\Util\Helpers;
|
19 |
Â
use MailPoet\WP\Functions as WPFunctions;
|
@@ -38,13 +40,17 @@ class API {
|
|
38 |
Â
/** @var CustomFields */
|
39 |
Â
private $customFields;
|
40 |
Â
|
Â
|
|
Â
|
|
Â
|
|
41 |
Â
public function __construct(
|
42 |
Â
NewSubscriberNotificationMailer $newSubscriberNotificationMailer,
|
43 |
Â
ConfirmationEmailMailer $confirmationEmailMailer,
|
44 |
Â
RequiredCustomFieldValidator $requiredCustomFieldValidator,
|
45 |
Â
WelcomeScheduler $welcomeScheduler,
|
46 |
Â
CustomFields $customFields,
|
47 |
-
SettingsController $settings
|
Â
|
|
48 |
Â
) {
|
49 |
Â
$this->newSubscriberNotificationMailer = $newSubscriberNotificationMailer;
|
50 |
Â
$this->confirmationEmailMailer = $confirmationEmailMailer;
|
@@ -52,6 +58,7 @@ class API {
|
|
52 |
Â
$this->welcomeScheduler = $welcomeScheduler;
|
53 |
Â
$this->settings = $settings;
|
54 |
Â
$this->customFields = $customFields;
|
Â
|
|
55 |
Â
}
|
56 |
Â
|
57 |
Â
public function getSubscriberFields() {
|
@@ -144,11 +151,13 @@ class API {
|
|
144 |
Â
|
145 |
Â
// send confirmation email
|
146 |
Â
if ($sendConfirmationEmail) {
|
147 |
-
|
148 |
-
|
Â
|
|
149 |
Â
throw new APIException(
|
150 |
-
__(sprintf('Subscriber added to lists, but confirmation email failed to send: %s', strtolower(
|
151 |
-
|
Â
|
|
152 |
Â
}
|
153 |
Â
}
|
154 |
Â
|
@@ -327,7 +336,10 @@ class API {
|
|
327 |
Â
}
|
328 |
Â
|
329 |
Â
protected function _sendConfirmationEmail(Subscriber $subscriber) {
|
330 |
-
|
Â
|
|
Â
|
|
Â
|
|
331 |
Â
}
|
332 |
Â
|
333 |
Â
protected function _scheduleWelcomeNotification(Subscriber $subscriber, array $segments) {
|
5 |
Â
if (!defined('ABSPATH')) exit;
|
6 |
Â
|
7 |
Â
|
8 |
+
use MailPoet\Entities\SubscriberEntity;
|
9 |
Â
use MailPoet\Models\Segment;
|
10 |
Â
use MailPoet\Models\Subscriber;
|
11 |
Â
use MailPoet\Models\SubscriberSegment;
|
15 |
Â
use MailPoet\Subscribers\NewSubscriberNotificationMailer;
|
16 |
Â
use MailPoet\Subscribers\RequiredCustomFieldValidator;
|
17 |
Â
use MailPoet\Subscribers\Source;
|
18 |
+
use MailPoet\Subscribers\SubscribersRepository;
|
19 |
Â
use MailPoet\Tasks\Sending;
|
20 |
Â
use MailPoet\Util\Helpers;
|
21 |
Â
use MailPoet\WP\Functions as WPFunctions;
|
40 |
Â
/** @var CustomFields */
|
41 |
Â
private $customFields;
|
42 |
Â
|
43 |
+
/** @var SubscribersRepository */
|
44 |
+
private $subscribersRepository;
|
45 |
+
|
46 |
Â
public function __construct(
|
47 |
Â
NewSubscriberNotificationMailer $newSubscriberNotificationMailer,
|
48 |
Â
ConfirmationEmailMailer $confirmationEmailMailer,
|
49 |
Â
RequiredCustomFieldValidator $requiredCustomFieldValidator,
|
50 |
Â
WelcomeScheduler $welcomeScheduler,
|
51 |
Â
CustomFields $customFields,
|
52 |
+
SettingsController $settings,
|
53 |
+
SubscribersRepository $subscribersRepository
|
54 |
Â
) {
|
55 |
Â
$this->newSubscriberNotificationMailer = $newSubscriberNotificationMailer;
|
56 |
Â
$this->confirmationEmailMailer = $confirmationEmailMailer;
|
58 |
Â
$this->welcomeScheduler = $welcomeScheduler;
|
59 |
Â
$this->settings = $settings;
|
60 |
Â
$this->customFields = $customFields;
|
61 |
+
$this->subscribersRepository = $subscribersRepository;
|
62 |
Â
}
|
63 |
Â
|
64 |
Â
public function getSubscriberFields() {
|
151 |
Â
|
152 |
Â
// send confirmation email
|
153 |
Â
if ($sendConfirmationEmail) {
|
154 |
+
try {
|
155 |
+
$this->_sendConfirmationEmail($subscriber);
|
156 |
+
} catch (\Exception $e) {
|
157 |
Â
throw new APIException(
|
158 |
+
__(sprintf('Subscriber added to lists, but confirmation email failed to send: %s', strtolower($e->getMessage())), 'mailpoet'),
|
159 |
+
APIException::CONFIRMATION_FAILED_TO_SEND
|
160 |
+
);
|
161 |
Â
}
|
162 |
Â
}
|
163 |
Â
|
336 |
Â
}
|
337 |
Â
|
338 |
Â
protected function _sendConfirmationEmail(Subscriber $subscriber) {
|
339 |
+
$subscriberEntity = $this->subscribersRepository->findOneById($subscriber->id);
|
340 |
+
if ($subscriberEntity instanceof SubscriberEntity) {
|
341 |
+
return $this->confirmationEmailMailer->sendConfirmationEmailOnce($subscriberEntity);
|
342 |
+
}
|
343 |
Â
}
|
344 |
Â
|
345 |
Â
protected function _scheduleWelcomeNotification(Subscriber $subscriber, array $segments) {
|
lib/Config/RequirementsChecker.php
CHANGED
@@ -17,7 +17,6 @@ class RequirementsChecker {
|
|
17 |
Â
|
18 |
Â
public $displayErrorNotice;
|
19 |
Â
public $vendorClasses = [
|
20 |
-
'\pQuery',
|
21 |
Â
'\Cron\CronExpression',
|
22 |
Â
'\Html2Text\Html2Text',
|
23 |
Â
];
|
17 |
Â
|
18 |
Â
public $displayErrorNotice;
|
19 |
Â
public $vendorClasses = [
|
Â
|
|
20 |
Â
'\Cron\CronExpression',
|
21 |
Â
'\Html2Text\Html2Text',
|
22 |
Â
];
|
lib/Config/ServicesChecker.php
CHANGED
@@ -135,6 +135,19 @@ class ServicesChecker {
|
|
135 |
Â
return $mssActive && $mssKeyValid && $mssKeyPendingApproval;
|
136 |
Â
}
|
137 |
Â
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
138 |
Â
/**
|
139 |
Â
* Returns MSS or Premium valid key.
|
140 |
Â
*/
|
135 |
Â
return $mssActive && $mssKeyValid && $mssKeyPendingApproval;
|
136 |
Â
}
|
137 |
Â
|
138 |
+
public function isUserActivelyPaying(): bool {
|
139 |
+
$isPremiumKeyValid = $this->isPremiumKeyValid(false);
|
140 |
+
|
141 |
+
$mssActive = Bridge::isMPSendingServiceEnabled();
|
142 |
+
$isMssKeyValid = $this->isMailPoetAPIKeyValid(false);
|
143 |
+
|
144 |
+
if (!$mssActive || ($isPremiumKeyValid && !$isMssKeyValid)) {
|
145 |
+
return $this->subscribersFeature->hasPremiumSupport();
|
146 |
+
} else {
|
147 |
+
return $this->subscribersFeature->hasMssPremiumSupport();
|
148 |
+
}
|
149 |
+
}
|
150 |
+
|
151 |
Â
/**
|
152 |
Â
* Returns MSS or Premium valid key.
|
153 |
Â
*/
|
lib/DI/ContainerConfigurator.php
CHANGED
@@ -223,8 +223,6 @@ class ContainerConfigurator implements IContainerConfigurator {
|
|
223 |
Â
// Helpscout
|
224 |
Â
$container->autowire(\MailPoet\Helpscout\Beacon::class)->setPublic(true);
|
225 |
Â
// Listing
|
226 |
-
$container->autowire(\MailPoet\Listing\BulkActionController::class)->setPublic(true);
|
227 |
-
$container->autowire(\MailPoet\Listing\BulkActionFactory::class)->setPublic(true);
|
228 |
Â
$container->autowire(\MailPoet\Listing\Handler::class)->setPublic(true);
|
229 |
Â
$container->autowire(\MailPoet\Listing\PageLimit::class)->setPublic(true);
|
230 |
Â
// Logging
|
223 |
Â
// Helpscout
|
224 |
Â
$container->autowire(\MailPoet\Helpscout\Beacon::class)->setPublic(true);
|
225 |
Â
// Listing
|
Â
|
|
Â
|
|
226 |
Â
$container->autowire(\MailPoet\Listing\Handler::class)->setPublic(true);
|
227 |
Â
$container->autowire(\MailPoet\Listing\PageLimit::class)->setPublic(true);
|
228 |
Â
// Logging
|
lib/Form/Block/Date.php
CHANGED
@@ -131,11 +131,11 @@ class Date {
|
|
131 |
Â
if (!empty($block['params']['value'])) {
|
132 |
Â
$date = CarbonImmutable::createFromFormat('Y-m-d H:i:s', $block['params']['value']);
|
133 |
Â
if ($date instanceof CarbonImmutable) {
|
134 |
-
$defaults['selected'] = (int)
|
135 |
Â
}
|
136 |
Â
} elseif (!empty($block['params']['is_default_today'])) {
|
137 |
Â
// is default today
|
138 |
-
$defaults['selected'] = (int)
|
139 |
Â
}
|
140 |
Â
// merge block with defaults
|
141 |
Â
$block = array_merge($defaults, $block);
|
@@ -160,18 +160,18 @@ class Date {
|
|
160 |
Â
private function getYears(array $block = []): string {
|
161 |
Â
$defaults = [
|
162 |
Â
'selected' => null,
|
163 |
-
'from' => (int)
|
164 |
-
'to' => (int)
|
165 |
Â
];
|
166 |
Â
|
167 |
Â
if (!empty($block['params']['value'])) {
|
168 |
Â
$date = CarbonImmutable::createFromFormat('Y-m-d H:i:s', $block['params']['value']);
|
169 |
Â
if ($date instanceof CarbonImmutable) {
|
170 |
-
$defaults['selected'] = (int)
|
171 |
Â
}
|
172 |
Â
} elseif (!empty($block['params']['is_default_today'])) {
|
173 |
Â
// is default today
|
174 |
-
$defaults['selected'] = (int)
|
175 |
Â
}
|
176 |
Â
|
177 |
Â
// merge block with defaults
|
@@ -198,11 +198,11 @@ class Date {
|
|
198 |
Â
if (!empty($block['params']['value'])) {
|
199 |
Â
$date = CarbonImmutable::createFromFormat('Y-m-d H:i:s', $block['params']['value']);
|
200 |
Â
if ($date instanceof CarbonImmutable) {
|
201 |
-
$defaults['selected'] = (int)
|
202 |
Â
}
|
203 |
Â
} elseif (!empty($block['params']['is_default_today'])) {
|
204 |
Â
// is default today
|
205 |
-
$defaults['selected'] = (int)
|
206 |
Â
}
|
207 |
Â
|
208 |
Â
// merge block with defaults
|
131 |
Â
if (!empty($block['params']['value'])) {
|
132 |
Â
$date = CarbonImmutable::createFromFormat('Y-m-d H:i:s', $block['params']['value']);
|
133 |
Â
if ($date instanceof CarbonImmutable) {
|
134 |
+
$defaults['selected'] = (int)date('m', $date->getTimestamp());
|
135 |
Â
}
|
136 |
Â
} elseif (!empty($block['params']['is_default_today'])) {
|
137 |
Â
// is default today
|
138 |
+
$defaults['selected'] = (int)date('m');
|
139 |
Â
}
|
140 |
Â
// merge block with defaults
|
141 |
Â
$block = array_merge($defaults, $block);
|
160 |
Â
private function getYears(array $block = []): string {
|
161 |
Â
$defaults = [
|
162 |
Â
'selected' => null,
|
163 |
+
'from' => (int)date('Y') - 100,
|
164 |
+
'to' => (int)date('Y'),
|
165 |
Â
];
|
166 |
Â
|
167 |
Â
if (!empty($block['params']['value'])) {
|
168 |
Â
$date = CarbonImmutable::createFromFormat('Y-m-d H:i:s', $block['params']['value']);
|
169 |
Â
if ($date instanceof CarbonImmutable) {
|
170 |
+
$defaults['selected'] = (int)date('Y', $date->getTimestamp());
|
171 |
Â
}
|
172 |
Â
} elseif (!empty($block['params']['is_default_today'])) {
|
173 |
Â
// is default today
|
174 |
+
$defaults['selected'] = (int)date('Y');
|
175 |
Â
}
|
176 |
Â
|
177 |
Â
// merge block with defaults
|
198 |
Â
if (!empty($block['params']['value'])) {
|
199 |
Â
$date = CarbonImmutable::createFromFormat('Y-m-d H:i:s', $block['params']['value']);
|
200 |
Â
if ($date instanceof CarbonImmutable) {
|
201 |
+
$defaults['selected'] = (int)date('d', $date->getTimestamp());
|
202 |
Â
}
|
203 |
Â
} elseif (!empty($block['params']['is_default_today'])) {
|
204 |
Â
// is default today
|
205 |
+
$defaults['selected'] = (int)date('d');
|
206 |
Â
}
|
207 |
Â
|
208 |
Â
// merge block with defaults
|
lib/Listing/BulkActionController.php
DELETED
@@ -1,37 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace MailPoet\Listing;
|
4 |
-
|
5 |
-
if (!defined('ABSPATH')) exit;
|
6 |
-
|
7 |
-
|
8 |
-
class BulkActionController {
|
9 |
-
/** @var BulkActionFactory */
|
10 |
-
private $factory;
|
11 |
-
|
12 |
-
/** @var Handler */
|
13 |
-
private $handler;
|
14 |
-
|
15 |
-
public function __construct(
|
16 |
-
BulkActionFactory $factory,
|
17 |
-
Handler $handler
|
18 |
-
) {
|
19 |
-
$this->factory = $factory;
|
20 |
-
$this->handler = $handler;
|
21 |
-
}
|
22 |
-
|
23 |
-
public function apply($modelClass, array $data) {
|
24 |
-
$bulkActionMethod = 'bulk' . ucfirst($data['action']);
|
25 |
-
unset($data['action']);
|
26 |
-
|
27 |
-
$actionClass = $this->factory->getActionClass($modelClass, $bulkActionMethod);
|
28 |
-
$callback = [$actionClass, $bulkActionMethod];
|
29 |
-
|
30 |
-
if (is_callable($callback)) {
|
31 |
-
return call_user_func_array(
|
32 |
-
$callback,
|
33 |
-
[$this->handler->getSelection($modelClass, $data['listing']), $data]
|
34 |
-
);
|
35 |
-
}
|
36 |
-
}
|
37 |
-
}
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
lib/Listing/BulkActionFactory.php
DELETED
@@ -1,33 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace MailPoet\Listing;
|
4 |
-
|
5 |
-
if (!defined('ABSPATH')) exit;
|
6 |
-
|
7 |
-
|
8 |
-
class BulkActionFactory {
|
9 |
-
/** @var array */
|
10 |
-
private $actions = [];
|
11 |
-
|
12 |
-
public function registerAction($modelClass, $bulkActionMethod, $actionClass) {
|
13 |
-
$this->ensureMethodExists($actionClass, $bulkActionMethod);
|
14 |
-
$this->actions[$modelClass][$bulkActionMethod] = $actionClass;
|
15 |
-
}
|
16 |
-
|
17 |
-
public function getActionClass($modelClass, $bulkActionMethod) {
|
18 |
-
$resultingClass = $modelClass;
|
19 |
-
if (!empty($this->actions[$modelClass][$bulkActionMethod])) {
|
20 |
-
$resultingClass = $this->actions[$modelClass][$bulkActionMethod];
|
21 |
-
}
|
22 |
-
$this->ensureMethodExists($resultingClass, $bulkActionMethod);
|
23 |
-
return $resultingClass;
|
24 |
-
}
|
25 |
-
|
26 |
-
private function ensureMethodExists($actionClass, $bulkActionMethod) {
|
27 |
-
if (!method_exists($actionClass, $bulkActionMethod)) {
|
28 |
-
throw new \Exception(
|
29 |
-
(is_object($actionClass) ? get_class($actionClass) : $actionClass) . ' has no method "' . $bulkActionMethod . '"'
|
30 |
-
);
|
31 |
-
}
|
32 |
-
}
|
33 |
-
}
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
lib/Listing/Handler.php
CHANGED
@@ -11,33 +11,6 @@ use MailPoetVendor\Paris\ORMWrapper;
|
|
11 |
Â
class Handler {
|
12 |
Â
const DEFAULT_LIMIT_PER_PAGE = 20;
|
13 |
Â
|
14 |
-
public function getSelection($modelClass, array $data) {
|
15 |
-
$data = $this->processData($data);
|
16 |
-
$tableName = $modelClass::$_table;
|
17 |
-
$model = Model::factory($modelClass);
|
18 |
-
$callback = [$modelClass, 'listingQuery'];
|
19 |
-
|
20 |
-
if (method_exists($modelClass, 'listingQuery') && is_callable($callback)) {
|
21 |
-
$customQuery = call_user_func_array(
|
22 |
-
$callback,
|
23 |
-
[$data]
|
24 |
-
);
|
25 |
-
if (!empty($data['selection'])) {
|
26 |
-
$customQuery->whereIn($tableName . '.id', $data['selection']);
|
27 |
-
}
|
28 |
-
return $customQuery;
|
29 |
-
} else {
|
30 |
-
$model = $this->setFilter($model, $data);
|
31 |
-
$this->setGroup($model, $data);
|
32 |
-
$this->setSearch($model, $data);
|
33 |
-
|
34 |
-
if (!empty($data['selection'])) {
|
35 |
-
$model->whereIn($tableName . '.id', $data['selection']);
|
36 |
-
}
|
37 |
-
return $model;
|
38 |
-
}
|
39 |
-
}
|
40 |
-
|
41 |
Â
public function get($modelClass, array $data) {
|
42 |
Â
$data = $this->processData($data);
|
43 |
Â
$tableName = $modelClass::$_table;
|
@@ -143,6 +116,15 @@ class Handler {
|
|
143 |
Â
return $model->filter('filterBy', $data['filter']);
|
144 |
Â
}
|
145 |
Â
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
146 |
Â
private function processData(array $data) {
|
147 |
Â
// check if sort order was specified or default to "asc"
|
148 |
Â
$sortOrder = (!empty($data['sort_order'])) ? $data['sort_order'] : 'asc';
|
@@ -151,7 +133,7 @@ class Handler {
|
|
151 |
Â
|
152 |
Â
// sanitize sort by
|
153 |
Â
$sortBy = (!empty($data['sort_by']))
|
154 |
-
?
|
155 |
Â
: '';
|
156 |
Â
|
157 |
Â
if (empty($sortBy)) {
|
11 |
Â
class Handler {
|
12 |
Â
const DEFAULT_LIMIT_PER_PAGE = 20;
|
13 |
Â
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
14 |
Â
public function get($modelClass, array $data) {
|
15 |
Â
$data = $this->processData($data);
|
16 |
Â
$tableName = $modelClass::$_table;
|
116 |
Â
return $model->filter('filterBy', $data['filter']);
|
117 |
Â
}
|
118 |
Â
|
119 |
+
/**
|
120 |
+
* Polyfill for deprecated FILTER_SANITIZE_STRING which was used to sanitize
|
121 |
+
* $data['sort_by'].
|
122 |
+
*/
|
123 |
+
private function filterString(string $string): string {
|
124 |
+
$str = (string)preg_replace('/\x00|<[^>]*>?/', '', $string);
|
125 |
+
return str_replace(["'", '"'], [''', '"'], $str);
|
126 |
+
}
|
127 |
+
|
128 |
Â
private function processData(array $data) {
|
129 |
Â
// check if sort order was specified or default to "asc"
|
130 |
Â
$sortOrder = (!empty($data['sort_order'])) ? $data['sort_order'] : 'asc';
|
133 |
Â
|
134 |
Â
// sanitize sort by
|
135 |
Â
$sortBy = (!empty($data['sort_by']))
|
136 |
+
? $this->filterString($data['sort_by'])
|
137 |
Â
: '';
|
138 |
Â
|
139 |
Â
if (empty($sortBy)) {
|
lib/Mailer/Mailer.php
CHANGED
@@ -6,6 +6,7 @@ if (!defined('ABSPATH')) exit;
|
|
6 |
Â
|
7 |
Â
|
8 |
Â
use MailPoet\DI\ContainerWrapper;
|
Â
|
|
9 |
Â
use MailPoet\Mailer\Methods\AmazonSES;
|
10 |
Â
use MailPoet\Mailer\Methods\ErrorMappers\AmazonSESMapper;
|
11 |
Â
use MailPoet\Mailer\Methods\ErrorMappers\MailPoetMapper;
|
@@ -16,6 +17,7 @@ use MailPoet\Mailer\Methods\MailPoet;
|
|
16 |
Â
use MailPoet\Mailer\Methods\PHPMail;
|
17 |
Â
use MailPoet\Mailer\Methods\SendGrid;
|
18 |
Â
use MailPoet\Mailer\Methods\SMTP;
|
Â
|
|
19 |
Â
use MailPoet\Services\AuthorizedEmailsController;
|
20 |
Â
use MailPoet\Settings\SettingsController;
|
21 |
Â
use MailPoet\WP\Functions as WPFunctions;
|
@@ -63,6 +65,11 @@ class Mailer {
|
|
63 |
Â
}
|
64 |
Â
|
65 |
Â
public function send($newsletter, $subscriber, $extraParams = []) {
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
66 |
Â
if (!$this->mailerInstance) {
|
67 |
Â
$this->init();
|
68 |
Â
}
|
6 |
Â
|
7 |
Â
|
8 |
Â
use MailPoet\DI\ContainerWrapper;
|
9 |
+
use MailPoet\Entities\SubscriberEntity;
|
10 |
Â
use MailPoet\Mailer\Methods\AmazonSES;
|
11 |
Â
use MailPoet\Mailer\Methods\ErrorMappers\AmazonSESMapper;
|
12 |
Â
use MailPoet\Mailer\Methods\ErrorMappers\MailPoetMapper;
|
17 |
Â
use MailPoet\Mailer\Methods\PHPMail;
|
18 |
Â
use MailPoet\Mailer\Methods\SendGrid;
|
19 |
Â
use MailPoet\Mailer\Methods\SMTP;
|
20 |
+
use MailPoet\Models\Subscriber;
|
21 |
Â
use MailPoet\Services\AuthorizedEmailsController;
|
22 |
Â
use MailPoet\Settings\SettingsController;
|
23 |
Â
use MailPoet\WP\Functions as WPFunctions;
|
65 |
Â
}
|
66 |
Â
|
67 |
Â
public function send($newsletter, $subscriber, $extraParams = []) {
|
68 |
+
// This if adds support for code that calls this method to use SubscriberEntity while the Mailer class is still using the old model.
|
69 |
+
// Once we add support for SubscriberEntity in the Mailer class, this if can be removed.
|
70 |
+
if ($subscriber instanceof SubscriberEntity) {
|
71 |
+
$subscriber = Subscriber::findOne($subscriber->getId());
|
72 |
+
}
|
73 |
Â
if (!$this->mailerInstance) {
|
74 |
Â
$this->init();
|
75 |
Â
}
|
lib/Mailer/MetaInfo.php
CHANGED
@@ -30,8 +30,8 @@ class MetaInfo {
|
|
30 |
Â
);
|
31 |
Â
}
|
32 |
Â
|
33 |
-
public function getConfirmationMetaInfo(
|
34 |
-
return $this->makeMetaInfo('confirmation', $subscriber->
|
35 |
Â
}
|
36 |
Â
|
37 |
Â
public function getNewSubscriberNotificationMetaInfo() {
|
30 |
Â
);
|
31 |
Â
}
|
32 |
Â
|
33 |
+
public function getConfirmationMetaInfo(SubscriberEntity $subscriber) {
|
34 |
+
return $this->makeMetaInfo('confirmation', $subscriber->getStatus(), $subscriber->getSource());
|
35 |
Â
}
|
36 |
Â
|
37 |
Â
public function getNewSubscriberNotificationMetaInfo() {
|
lib/Newsletter/Editor/StructureTransformer.php
CHANGED
@@ -6,8 +6,8 @@ if (!defined('ABSPATH')) exit;
|
|
6 |
Â
|
7 |
Â
|
8 |
Â
use MailPoet\Util\DOM as DOMUtil;
|
9 |
-
use pQuery;
|
10 |
-
use pQuery\
|
11 |
Â
|
12 |
Â
class StructureTransformer {
|
13 |
Â
public function transform($content, $imageFullWidth) {
|
6 |
Â
|
7 |
Â
|
8 |
Â
use MailPoet\Util\DOM as DOMUtil;
|
9 |
+
use MailPoet\Util\pQuery\DomNode;
|
10 |
+
use MailPoet\Util\pQuery\pQuery;
|
11 |
Â
|
12 |
Â
class StructureTransformer {
|
13 |
Â
public function transform($content, $imageFullWidth) {
|
lib/Newsletter/Links/Links.php
CHANGED
@@ -235,9 +235,9 @@ class Links {
|
|
235 |
Â
$subscriberId, $subscriberLinkToken, $queueId, $linkHash, $preview
|
236 |
Â
) {
|
237 |
Â
return [
|
238 |
-
$subscriberId,
|
239 |
Â
$subscriberLinkToken,
|
240 |
-
$queueId,
|
241 |
Â
$linkHash,
|
242 |
Â
$preview,
|
243 |
Â
];
|
235 |
Â
$subscriberId, $subscriberLinkToken, $queueId, $linkHash, $preview
|
236 |
Â
) {
|
237 |
Â
return [
|
238 |
+
(string)$subscriberId,
|
239 |
Â
$subscriberLinkToken,
|
240 |
+
(string)$queueId,
|
241 |
Â
$linkHash,
|
242 |
Â
$preview,
|
243 |
Â
];
|
lib/Newsletter/Renderer/Renderer.php
CHANGED
@@ -6,15 +6,14 @@ if (!defined('ABSPATH')) exit;
|
|
6 |
Â
|
7 |
Â
|
8 |
Â
use MailPoet\Config\Env;
|
Â
|
|
9 |
Â
use MailPoet\Entities\NewsletterEntity;
|
10 |
Â
use MailPoet\InvalidStateException;
|
11 |
Â
use MailPoet\Models\Newsletter;
|
12 |
Â
use MailPoet\Newsletter\NewslettersRepository;
|
13 |
Â
use MailPoet\Newsletter\Renderer\EscapeHelper as EHelper;
|
14 |
Â
use MailPoet\RuntimeException;
|
15 |
-
use MailPoet\Services\Bridge;
|
16 |
Â
use MailPoet\Tasks\Sending as SendingTask;
|
17 |
-
use MailPoet\Util\License\License;
|
18 |
Â
use MailPoet\Util\pQuery\DomNode;
|
19 |
Â
use MailPoet\WP\Functions as WPFunctions;
|
20 |
Â
|
@@ -34,31 +33,26 @@ class Renderer {
|
|
34 |
Â
/** @var \MailPoetVendor\CSS */
|
35 |
Â
private $cSSInliner;
|
36 |
Â
|
37 |
-
/** @var Bridge */
|
38 |
-
private $bridge;
|
39 |
-
|
40 |
-
/** @var License */
|
41 |
-
private $license;
|
42 |
-
|
43 |
Â
/** @var NewslettersRepository */
|
44 |
Â
private $newslettersRepository;
|
45 |
Â
|
Â
|
|
Â
|
|
Â
|
|
46 |
Â
public function __construct(
|
47 |
Â
Blocks\Renderer $blocksRenderer,
|
48 |
Â
Columns\Renderer $columnsRenderer,
|
49 |
Â
Preprocessor $preprocessor,
|
50 |
Â
\MailPoetVendor\CSS $cSSInliner,
|
51 |
-
Bridge $bridge,
|
52 |
Â
NewslettersRepository $newslettersRepository,
|
53 |
-
|
54 |
Â
) {
|
55 |
Â
$this->blocksRenderer = $blocksRenderer;
|
56 |
Â
$this->columnsRenderer = $columnsRenderer;
|
57 |
Â
$this->preprocessor = $preprocessor;
|
58 |
Â
$this->cSSInliner = $cSSInliner;
|
59 |
-
$this->bridge = $bridge;
|
60 |
-
$this->license = $license;
|
61 |
Â
$this->newslettersRepository = $newslettersRepository;
|
Â
|
|
62 |
Â
}
|
63 |
Â
|
64 |
Â
/**
|
@@ -100,9 +94,7 @@ class Renderer {
|
|
100 |
Â
: [];
|
101 |
Â
|
102 |
Â
if (
|
103 |
-
!$this->
|
104 |
-
&& !$this->bridge->isMailpoetSendingServiceEnabled()
|
105 |
-
&& !$preview
|
106 |
Â
) {
|
107 |
Â
$content = $this->addMailpoetLogoContentBlock($content, $styles);
|
108 |
Â
}
|
@@ -267,7 +259,7 @@ class Renderer {
|
|
267 |
Â
'link' => 'http://www.mailpoet.com',
|
268 |
Â
'src' => Env::$assetsUrl . '/img/mailpoet_logo_newsletter.png',
|
269 |
Â
'fullWidth' => false,
|
270 |
-
'alt' => 'MailPoet',
|
271 |
Â
'width' => '108px',
|
272 |
Â
'height' => '65px',
|
273 |
Â
'styles' => [
|
6 |
Â
|
7 |
Â
|
8 |
Â
use MailPoet\Config\Env;
|
9 |
+
use MailPoet\Config\ServicesChecker;
|
10 |
Â
use MailPoet\Entities\NewsletterEntity;
|
11 |
Â
use MailPoet\InvalidStateException;
|
12 |
Â
use MailPoet\Models\Newsletter;
|
13 |
Â
use MailPoet\Newsletter\NewslettersRepository;
|
14 |
Â
use MailPoet\Newsletter\Renderer\EscapeHelper as EHelper;
|
15 |
Â
use MailPoet\RuntimeException;
|
Â
|
|
16 |
Â
use MailPoet\Tasks\Sending as SendingTask;
|
Â
|
|
17 |
Â
use MailPoet\Util\pQuery\DomNode;
|
18 |
Â
use MailPoet\WP\Functions as WPFunctions;
|
19 |
Â
|
33 |
Â
/** @var \MailPoetVendor\CSS */
|
34 |
Â
private $cSSInliner;
|
35 |
Â
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
36 |
Â
/** @var NewslettersRepository */
|
37 |
Â
private $newslettersRepository;
|
38 |
Â
|
39 |
+
/** @var ServicesChecker */
|
40 |
+
private $servicesChecker;
|
41 |
+
|
42 |
Â
public function __construct(
|
43 |
Â
Blocks\Renderer $blocksRenderer,
|
44 |
Â
Columns\Renderer $columnsRenderer,
|
45 |
Â
Preprocessor $preprocessor,
|
46 |
Â
\MailPoetVendor\CSS $cSSInliner,
|
Â
|
|
47 |
Â
NewslettersRepository $newslettersRepository,
|
48 |
+
ServicesChecker $servicesChecker
|
49 |
Â
) {
|
50 |
Â
$this->blocksRenderer = $blocksRenderer;
|
51 |
Â
$this->columnsRenderer = $columnsRenderer;
|
52 |
Â
$this->preprocessor = $preprocessor;
|
53 |
Â
$this->cSSInliner = $cSSInliner;
|
Â
|
|
Â
|
|
54 |
Â
$this->newslettersRepository = $newslettersRepository;
|
55 |
+
$this->servicesChecker = $servicesChecker;
|
56 |
Â
}
|
57 |
Â
|
58 |
Â
/**
|
94 |
Â
: [];
|
95 |
Â
|
96 |
Â
if (
|
97 |
+
!$this->servicesChecker->isUserActivelyPaying() && !$preview
|
Â
|
|
Â
|
|
98 |
Â
) {
|
99 |
Â
$content = $this->addMailpoetLogoContentBlock($content, $styles);
|
100 |
Â
}
|
259 |
Â
'link' => 'http://www.mailpoet.com',
|
260 |
Â
'src' => Env::$assetsUrl . '/img/mailpoet_logo_newsletter.png',
|
261 |
Â
'fullWidth' => false,
|
262 |
+
'alt' => 'Email Marketing Powered by MailPoet',
|
263 |
Â
'width' => '108px',
|
264 |
Â
'height' => '65px',
|
265 |
Â
'styles' => [
|
lib/Segments/DynamicSegments/FilterFactory.php
CHANGED
@@ -127,7 +127,8 @@ class FilterFactory {
|
|
127 |
Â
}
|
128 |
Â
|
129 |
Â
private function email($action) {
|
130 |
-
|
Â
|
|
131 |
Â
return $this->emailOpensAbsoluteCount;
|
132 |
Â
}
|
133 |
Â
return $this->emailAction;
|
127 |
Â
}
|
128 |
Â
|
129 |
Â
private function email($action) {
|
130 |
+
$countActions = [EmailOpensAbsoluteCountAction::TYPE, EmailOpensAbsoluteCountAction::MACHINE_TYPE];
|
131 |
+
if (in_array($action, $countActions)) {
|
132 |
Â
return $this->emailOpensAbsoluteCount;
|
133 |
Â
}
|
134 |
Â
return $this->emailAction;
|
lib/Segments/SegmentsSimpleListRepository.php
CHANGED
@@ -117,6 +117,8 @@ class SegmentsSimpleListRepository {
|
|
117 |
Â
|
118 |
Â
// Fetch subscribers counts for dynamic segments and correct data types
|
119 |
Â
foreach ($segments as $key => $segment) {
|
Â
|
|
Â
|
|
120 |
Â
if ($segment['type'] === SegmentEntity::TYPE_DYNAMIC) {
|
121 |
Â
$statisticsKey = $subscriberGlobalStatus ?: 'all';
|
122 |
Â
$segments[$key]['subscribers'] = (int)$this->subscribersCountsController->getSegmentStatisticsCountById($segment['id'])[$statisticsKey];
|
117 |
Â
|
118 |
Â
// Fetch subscribers counts for dynamic segments and correct data types
|
119 |
Â
foreach ($segments as $key => $segment) {
|
120 |
+
// BC compatibility fix. PHP8.1+ returns integer but JS apps expect string
|
121 |
+
$segments[$key]['id'] = (string)$segment['id'];
|
122 |
Â
if ($segment['type'] === SegmentEntity::TYPE_DYNAMIC) {
|
123 |
Â
$statisticsKey = $subscriberGlobalStatus ?: 'all';
|
124 |
Â
$segments[$key]['subscribers'] = (int)$this->subscribersCountsController->getSegmentStatisticsCountById($segment['id'])[$statisticsKey];
|
lib/Segments/WP.php
CHANGED
@@ -16,6 +16,7 @@ use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
|
|
16 |
Â
use MailPoet\Settings\SettingsController;
|
17 |
Â
use MailPoet\Subscribers\ConfirmationEmailMailer;
|
18 |
Â
use MailPoet\Subscribers\Source;
|
Â
|
|
19 |
Â
use MailPoet\WooCommerce\Helper as WooCommerceHelper;
|
20 |
Â
use MailPoet\WooCommerce\Subscription as WooCommerceSubscription;
|
21 |
Â
use MailPoet\WP\Functions as WPFunctions;
|
@@ -33,14 +34,19 @@ class WP {
|
|
33 |
Â
/** @var WooCommerceHelper */
|
34 |
Â
private $wooHelper;
|
35 |
Â
|
Â
|
|
Â
|
|
Â
|
|
36 |
Â
public function __construct(
|
37 |
Â
WPFunctions $wp,
|
38 |
Â
WelcomeScheduler $welcomeScheduler,
|
39 |
-
WooCommerceHelper $wooHelper
|
Â
|
|
40 |
Â
) {
|
41 |
Â
$this->wp = $wp;
|
42 |
Â
$this->welcomeScheduler = $welcomeScheduler;
|
43 |
Â
$this->wooHelper = $wooHelper;
|
Â
|
|
44 |
Â
}
|
45 |
Â
|
46 |
Â
public function synchronizeUser($wpUserId, $oldWpUserData = false) {
|
@@ -146,7 +152,14 @@ class WP {
|
|
146 |
Â
if ($sendConfirmationEmail && ($subscriber->status === Subscriber::STATUS_UNCONFIRMED)) {
|
147 |
Â
/** @var ConfirmationEmailMailer $confirmationEmailMailer */
|
148 |
Â
$confirmationEmailMailer = ContainerWrapper::getInstance()->get(ConfirmationEmailMailer::class);
|
149 |
-
$
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
150 |
Â
}
|
151 |
Â
|
152 |
Â
// welcome email
|
16 |
Â
use MailPoet\Settings\SettingsController;
|
17 |
Â
use MailPoet\Subscribers\ConfirmationEmailMailer;
|
18 |
Â
use MailPoet\Subscribers\Source;
|
19 |
+
use MailPoet\Subscribers\SubscribersRepository;
|
20 |
Â
use MailPoet\WooCommerce\Helper as WooCommerceHelper;
|
21 |
Â
use MailPoet\WooCommerce\Subscription as WooCommerceSubscription;
|
22 |
Â
use MailPoet\WP\Functions as WPFunctions;
|
34 |
Â
/** @var WooCommerceHelper */
|
35 |
Â
private $wooHelper;
|
36 |
Â
|
37 |
+
/** @var SubscribersRepository */
|
38 |
+
private $subscribersRepository;
|
39 |
+
|
40 |
Â
public function __construct(
|
41 |
Â
WPFunctions $wp,
|
42 |
Â
WelcomeScheduler $welcomeScheduler,
|
43 |
+
WooCommerceHelper $wooHelper,
|
44 |
+
SubscribersRepository $subscribersRepository
|
45 |
Â
) {
|
46 |
Â
$this->wp = $wp;
|
47 |
Â
$this->welcomeScheduler = $welcomeScheduler;
|
48 |
Â
$this->wooHelper = $wooHelper;
|
49 |
+
$this->subscribersRepository = $subscribersRepository;
|
50 |
Â
}
|
51 |
Â
|
52 |
Â
public function synchronizeUser($wpUserId, $oldWpUserData = false) {
|
152 |
Â
if ($sendConfirmationEmail && ($subscriber->status === Subscriber::STATUS_UNCONFIRMED)) {
|
153 |
Â
/** @var ConfirmationEmailMailer $confirmationEmailMailer */
|
154 |
Â
$confirmationEmailMailer = ContainerWrapper::getInstance()->get(ConfirmationEmailMailer::class);
|
155 |
+
$subscriberEntity = $this->subscribersRepository->findOneById($subscriber->id);
|
156 |
+
if ($subscriberEntity instanceof SubscriberEntity) {
|
157 |
+
try {
|
158 |
+
$confirmationEmailMailer->sendConfirmationEmailOnce($subscriberEntity);
|
159 |
+
} catch (\Exception $e) {
|
160 |
+
// ignore errors
|
161 |
+
}
|
162 |
+
}
|
163 |
Â
}
|
164 |
Â
|
165 |
Â
// welcome email
|
lib/Subscribers/ConfirmationEmailMailer.php
CHANGED
@@ -6,9 +6,10 @@ if (!defined('ABSPATH')) exit;
|
|
6 |
Â
|
7 |
Â
|
8 |
Â
use Html2Text\Html2Text;
|
Â
|
|
Â
|
|
9 |
Â
use MailPoet\Mailer\Mailer;
|
10 |
Â
use MailPoet\Mailer\MetaInfo;
|
11 |
-
use MailPoet\Models\Subscriber;
|
12 |
Â
use MailPoet\Services\AuthorizedEmailsController;
|
13 |
Â
use MailPoet\Services\Bridge;
|
14 |
Â
use MailPoet\Settings\SettingsController;
|
@@ -60,20 +61,24 @@ class ConfirmationEmailMailer {
|
|
60 |
Â
* Use this method if you want to make sure the confirmation email
|
61 |
Â
* is not sent multiple times within a single request
|
62 |
Â
* e.g. if sending confirmation emails from hooks
|
Â
|
|
63 |
Â
*/
|
64 |
-
public function sendConfirmationEmailOnce(
|
65 |
-
if (isset($this->sentEmails[$subscriber->
|
66 |
Â
return true;
|
67 |
Â
}
|
68 |
Â
return $this->sendConfirmationEmail($subscriber);
|
69 |
Â
}
|
70 |
Â
|
71 |
-
|
Â
|
|
Â
|
|
Â
|
|
72 |
Â
$signupConfirmation = $this->settings->get('signup_confirmation');
|
73 |
Â
if ((bool)$signupConfirmation['enabled'] === false) {
|
74 |
Â
return false;
|
75 |
Â
}
|
76 |
-
if (!$this->wp->isUserLoggedIn() && $subscriber->
|
77 |
Â
return false;
|
78 |
Â
}
|
79 |
Â
|
@@ -83,9 +88,9 @@ class ConfirmationEmailMailer {
|
|
83 |
Â
return false;
|
84 |
Â
}
|
85 |
Â
|
86 |
-
$segments = $subscriber->
|
87 |
-
$segmentNames = array_map(function($segment) {
|
88 |
-
return $segment->
|
89 |
Â
}, $segments);
|
90 |
Â
|
91 |
Â
$body = nl2br($signupConfirmation['body']);
|
@@ -98,10 +103,9 @@ class ConfirmationEmailMailer {
|
|
98 |
Â
);
|
99 |
Â
|
100 |
Â
// replace activation link
|
101 |
-
$subscriberEntity = $this->subscribersRepository->findOneById($subscriber->id);
|
102 |
Â
$body = Helpers::replaceLinkTags(
|
103 |
Â
$body,
|
104 |
-
$this->subscriptionUrlFactory->getConfirmationUrl($
|
105 |
Â
['target' => '_blank'],
|
106 |
Â
'activation_link'
|
107 |
Â
);
|
@@ -122,25 +126,26 @@ class ConfirmationEmailMailer {
|
|
122 |
Â
];
|
123 |
Â
|
124 |
Â
// send email
|
Â
|
|
Â
|
|
Â
|
|
125 |
Â
try {
|
126 |
-
$extraParams = [
|
127 |
-
'meta' => $this->mailerMetaInfo->getConfirmationMetaInfo($subscriber),
|
128 |
-
];
|
129 |
Â
$result = $this->mailer->send($email, $subscriber, $extraParams);
|
130 |
-
if ($result['response'] === false) {
|
131 |
-
$subscriber->setError(__('Something went wrong with your subscription. Please contact the website owner.', 'mailpoet'));
|
132 |
-
return false;
|
133 |
-
};
|
134 |
-
|
135 |
-
if (!$this->wp->isUserLoggedIn()) {
|
136 |
-
$subscriber->countConfirmations++;
|
137 |
-
$subscriber->save();
|
138 |
-
}
|
139 |
-
$this->sentEmails[$subscriber->id] = true;
|
140 |
-
return true;
|
141 |
Â
} catch (\Exception $e) {
|
142 |
-
|
143 |
-
return false;
|
144 |
Â
}
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
145 |
Â
}
|
146 |
Â
}
|
6 |
Â
|
7 |
Â
|
8 |
Â
use Html2Text\Html2Text;
|
9 |
+
use MailPoet\Entities\SegmentEntity;
|
10 |
+
use MailPoet\Entities\SubscriberEntity;
|
11 |
Â
use MailPoet\Mailer\Mailer;
|
12 |
Â
use MailPoet\Mailer\MetaInfo;
|
Â
|
|
13 |
Â
use MailPoet\Services\AuthorizedEmailsController;
|
14 |
Â
use MailPoet\Services\Bridge;
|
15 |
Â
use MailPoet\Settings\SettingsController;
|
61 |
Â
* Use this method if you want to make sure the confirmation email
|
62 |
Â
* is not sent multiple times within a single request
|
63 |
Â
* e.g. if sending confirmation emails from hooks
|
64 |
+
* @throws \Exception if unable to send the email.
|
65 |
Â
*/
|
66 |
+
public function sendConfirmationEmailOnce(SubscriberEntity $subscriber): bool {
|
67 |
+
if (isset($this->sentEmails[$subscriber->getId()])) {
|
68 |
Â
return true;
|
69 |
Â
}
|
70 |
Â
return $this->sendConfirmationEmail($subscriber);
|
71 |
Â
}
|
72 |
Â
|
73 |
+
/**
|
74 |
+
* @throws \Exception if unable to send the email.
|
75 |
+
*/
|
76 |
+
public function sendConfirmationEmail(SubscriberEntity $subscriber) {
|
77 |
Â
$signupConfirmation = $this->settings->get('signup_confirmation');
|
78 |
Â
if ((bool)$signupConfirmation['enabled'] === false) {
|
79 |
Â
return false;
|
80 |
Â
}
|
81 |
+
if (!$this->wp->isUserLoggedIn() && $subscriber->getConfirmationsCount() >= self::MAX_CONFIRMATION_EMAILS) {
|
82 |
Â
return false;
|
83 |
Â
}
|
84 |
Â
|
88 |
Â
return false;
|
89 |
Â
}
|
90 |
Â
|
91 |
+
$segments = $subscriber->getSegments()->toArray();
|
92 |
+
$segmentNames = array_map(function(SegmentEntity $segment) {
|
93 |
+
return $segment->getName();
|
94 |
Â
}, $segments);
|
95 |
Â
|
96 |
Â
$body = nl2br($signupConfirmation['body']);
|
103 |
Â
);
|
104 |
Â
|
105 |
Â
// replace activation link
|
Â
|
|
106 |
Â
$body = Helpers::replaceLinkTags(
|
107 |
Â
$body,
|
108 |
+
$this->subscriptionUrlFactory->getConfirmationUrl($subscriber),
|
109 |
Â
['target' => '_blank'],
|
110 |
Â
'activation_link'
|
111 |
Â
);
|
126 |
Â
];
|
127 |
Â
|
128 |
Â
// send email
|
129 |
+
$extraParams = [
|
130 |
+
'meta' => $this->mailerMetaInfo->getConfirmationMetaInfo($subscriber),
|
131 |
+
];
|
132 |
Â
try {
|
Â
|
|
Â
|
|
Â
|
|
133 |
Â
$result = $this->mailer->send($email, $subscriber, $extraParams);
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
134 |
Â
} catch (\Exception $e) {
|
135 |
+
throw new \Exception(__('Something went wrong with your subscription. Please contact the website owner.', 'mailpoet'));
|
Â
|
|
136 |
Â
}
|
137 |
+
|
138 |
+
if ($result['response'] === false) {
|
139 |
+
throw new \Exception(__('Something went wrong with your subscription. Please contact the website owner.', 'mailpoet'));
|
140 |
+
};
|
141 |
+
|
142 |
+
if (!$this->wp->isUserLoggedIn()) {
|
143 |
+
$subscriber->setConfirmationsCount($subscriber->getConfirmationsCount() + 1);
|
144 |
+
$this->subscribersRepository->persist($subscriber);
|
145 |
+
$this->subscribersRepository->flush();
|
146 |
+
}
|
147 |
+
$this->sentEmails[$subscriber->getId()] = true;
|
148 |
+
|
149 |
+
return true;
|
150 |
Â
}
|
151 |
Â
}
|
lib/Subscribers/SubscriberActions.php
CHANGED
@@ -107,11 +107,14 @@ class SubscriberActions {
|
|
107 |
Â
$segments = $this->segmentsRepository->findBy(['id' => $segmentIds]);
|
108 |
Â
$this->subscriberSegmentRepository->subscribeToSegments($subscriber, $segments);
|
109 |
Â
|
110 |
-
|
111 |
-
|
112 |
-
|
Â
|
|
113 |
Â
}
|
114 |
Â
|
Â
|
|
Â
|
|
115 |
Â
// We want to send the notification on subscribe only when signupConfirmation is disabled
|
116 |
Â
if ($signupConfirmationEnabled === false && $subscriber->getStatus() === SubscriberEntity::STATUS_SUBSCRIBED && $subscriberModel) {
|
117 |
Â
$this->newSubscriberNotificationMailer->send($subscriberModel, Segment::whereIn('id', $segmentIds)->findMany());
|
107 |
Â
$segments = $this->segmentsRepository->findBy(['id' => $segmentIds]);
|
108 |
Â
$this->subscriberSegmentRepository->subscribeToSegments($subscriber, $segments);
|
109 |
Â
|
110 |
+
try {
|
111 |
+
$this->confirmationEmailMailer->sendConfirmationEmailOnce($subscriber);
|
112 |
+
} catch (\Exception $e) {
|
113 |
+
// ignore errors
|
114 |
Â
}
|
115 |
Â
|
116 |
+
$subscriberModel = Subscriber::findOne($subscriber->getId());
|
117 |
+
|
118 |
Â
// We want to send the notification on subscribe only when signupConfirmation is disabled
|
119 |
Â
if ($signupConfirmationEnabled === false && $subscriber->getStatus() === SubscriberEntity::STATUS_SUBSCRIBED && $subscriberModel) {
|
120 |
Â
$this->newSubscriberNotificationMailer->send($subscriberModel, Segment::whereIn('id', $segmentIds)->findMany());
|
lib/Util/DOM.php
CHANGED
@@ -5,7 +5,7 @@ namespace MailPoet\Util;
|
|
5 |
Â
if (!defined('ABSPATH')) exit;
|
6 |
Â
|
7 |
Â
|
8 |
-
use pQuery\DomNode;
|
9 |
Â
|
10 |
Â
class DOM {
|
11 |
Â
/**
|
5 |
Â
if (!defined('ABSPATH')) exit;
|
6 |
Â
|
7 |
Â
|
8 |
+
use MailPoet\Util\pQuery\DomNode;
|
9 |
Â
|
10 |
Â
class DOM {
|
11 |
Â
/**
|
lib/Util/License/Features/Subscribers.php
CHANGED
@@ -15,6 +15,7 @@ class Subscribers {
|
|
15 |
Â
const NEW_LIMIT_DATE = '2019-11-00';
|
16 |
Â
const MSS_KEY_STATE = 'mta.mailpoet_api_key_state.state';
|
17 |
Â
const MSS_SUBSCRIBERS_LIMIT_SETTING_KEY = 'mta.mailpoet_api_key_state.data.site_active_subscriber_limit';
|
Â
|
|
18 |
Â
const PREMIUM_KEY_STATE = 'premium.premium_key_state.state';
|
19 |
Â
const PREMIUM_SUBSCRIBERS_LIMIT_SETTING_KEY = 'premium.premium_key_state.data.site_active_subscriber_limit';
|
20 |
Â
const PREMIUM_SUPPORT_SETTING_KEY = 'premium.premium_key_state.data.support_tier';
|
@@ -77,6 +78,10 @@ class Subscribers {
|
|
77 |
Â
return (int)$this->settings->get(self::MSS_SUBSCRIBERS_LIMIT_SETTING_KEY);
|
78 |
Â
}
|
79 |
Â
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
80 |
Â
private function hasValidPremiumKey() {
|
81 |
Â
$state = $this->settings->get(self::PREMIUM_KEY_STATE);
|
82 |
Â
return $state === Bridge::KEY_VALID || $state === Bridge::KEY_EXPIRING;
|
15 |
Â
const NEW_LIMIT_DATE = '2019-11-00';
|
16 |
Â
const MSS_KEY_STATE = 'mta.mailpoet_api_key_state.state';
|
17 |
Â
const MSS_SUBSCRIBERS_LIMIT_SETTING_KEY = 'mta.mailpoet_api_key_state.data.site_active_subscriber_limit';
|
18 |
+
const MSS_SUPPORT_SETTING_KEY = 'mta.mailpoet_api_key_state.data.support_tier';
|
19 |
Â
const PREMIUM_KEY_STATE = 'premium.premium_key_state.state';
|
20 |
Â
const PREMIUM_SUBSCRIBERS_LIMIT_SETTING_KEY = 'premium.premium_key_state.data.site_active_subscriber_limit';
|
21 |
Â
const PREMIUM_SUPPORT_SETTING_KEY = 'premium.premium_key_state.data.support_tier';
|
78 |
Â
return (int)$this->settings->get(self::MSS_SUBSCRIBERS_LIMIT_SETTING_KEY);
|
79 |
Â
}
|
80 |
Â
|
81 |
+
public function hasMssPremiumSupport() {
|
82 |
+
return $this->hasValidMssKey() && $this->settings->get(self::MSS_SUPPORT_SETTING_KEY) === 'premium';
|
83 |
+
}
|
84 |
+
|
85 |
Â
private function hasValidPremiumKey() {
|
86 |
Â
$state = $this->settings->get(self::PREMIUM_KEY_STATE);
|
87 |
Â
return $state === Bridge::KEY_VALID || $state === Bridge::KEY_EXPIRING;
|
lib/Util/pQuery/DomNode.php
CHANGED
@@ -5,8 +5,11 @@ namespace MailPoet\Util\pQuery;
|
|
5 |
Â
if (!defined('ABSPATH')) exit;
|
6 |
Â
|
7 |
Â
|
8 |
-
|
9 |
-
|
Â
|
|
Â
|
|
Â
|
|
10 |
Â
|
11 |
Â
public function getInnerText() {
|
12 |
Â
return html_entity_decode($this->toString(true, true, 1), ENT_NOQUOTES, 'UTF-8');
|
@@ -15,4 +18,10 @@ class DomNode extends \pQuery\DomNode {
|
|
15 |
Â
public function getOuterText() {
|
16 |
Â
return html_entity_decode($this->toString(), ENT_NOQUOTES, 'UTF-8');
|
17 |
Â
}
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
18 |
Â
}
|
5 |
Â
if (!defined('ABSPATH')) exit;
|
6 |
Â
|
7 |
Â
|
8 |
+
use MailPoetVendor\pQuery\DomNode as pQueryDomNode;
|
9 |
+
|
10 |
+
class DomNode extends pQueryDomNode {
|
11 |
+
public $childClass = DomNode::class;
|
12 |
+
public $parserClass = Html5Parser::class;
|
13 |
Â
|
14 |
Â
public function getInnerText() {
|
15 |
Â
return html_entity_decode($this->toString(true, true, 1), ENT_NOQUOTES, 'UTF-8');
|
18 |
Â
public function getOuterText() {
|
19 |
Â
return html_entity_decode($this->toString(), ENT_NOQUOTES, 'UTF-8');
|
20 |
Â
}
|
21 |
+
|
22 |
+
public function query($query = '*') {
|
23 |
+
$select = $this->select($query);
|
24 |
+
$result = new pQuery((array)$select);
|
25 |
+
return $result;
|
26 |
+
}
|
27 |
Â
}
|
lib/Util/pQuery/Html5Parser.php
CHANGED
@@ -5,7 +5,9 @@ namespace MailPoet\Util\pQuery;
|
|
5 |
Â
if (!defined('ABSPATH')) exit;
|
6 |
Â
|
7 |
Â
|
8 |
-
|
9 |
-
|
10 |
-
|
Â
|
|
Â
|
|
11 |
Â
}
|
5 |
Â
if (!defined('ABSPATH')) exit;
|
6 |
Â
|
7 |
Â
|
8 |
+
use MailPoetVendor\pQuery\HtmlParser;
|
9 |
+
|
10 |
+
class Html5Parser extends HtmlParser {
|
11 |
+
/** @var string|DomNode */
|
12 |
+
public $root = DomNode::class;
|
13 |
Â
}
|
lib/Util/pQuery/pQuery.php
CHANGED
@@ -5,13 +5,15 @@ namespace MailPoet\Util\pQuery;
|
|
5 |
Â
if (!defined('ABSPATH')) exit;
|
6 |
Â
|
7 |
Â
|
Â
|
|
Â
|
|
8 |
Â
// extend pQuery class to use UTF-8 encoding when getting elements' inner/outer text
|
9 |
Â
// phpcs:ignore Squiz.Classes.ValidClassName
|
10 |
-
class pQuery extends
|
11 |
-
public static function parseStr($html) {
|
12 |
Â
$parser = new Html5Parser($html);
|
13 |
Â
|
14 |
-
if (!$parser->root instanceof
|
15 |
Â
// this condition shouldn't happen it is here only for PHPStan
|
16 |
Â
throw new \Exception('Renderer is not configured correctly');
|
17 |
Â
}
|
5 |
Â
if (!defined('ABSPATH')) exit;
|
6 |
Â
|
7 |
Â
|
8 |
+
use MailPoetVendor\pQuery\pQuery as pQuerypQuery;
|
9 |
+
|
10 |
Â
// extend pQuery class to use UTF-8 encoding when getting elements' inner/outer text
|
11 |
Â
// phpcs:ignore Squiz.Classes.ValidClassName
|
12 |
+
class pQuery extends pQuerypQuery {
|
13 |
+
public static function parseStr($html): DomNode {
|
14 |
Â
$parser = new Html5Parser($html);
|
15 |
Â
|
16 |
+
if (!$parser->root instanceof DomNode) {
|
17 |
Â
// this condition shouldn't happen it is here only for PHPStan
|
18 |
Â
throw new \Exception('Renderer is not configured correctly');
|
19 |
Â
}
|
lib/WooCommerce/Subscription.php
CHANGED
@@ -218,10 +218,22 @@ class Subscription {
|
|
218 |
Â
}
|
219 |
Â
|
220 |
Â
private function requireSubscriptionConfirmation(Subscriber $subscriber) {
|
221 |
-
|
Â
|
|
222 |
Â
$subscriber->save();
|
Â
|
|
223 |
Â
|
224 |
-
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
225 |
Â
}
|
226 |
Â
|
227 |
Â
private function updateSubscriberStatus(Subscriber $subscriber) {
|
218 |
Â
}
|
219 |
Â
|
220 |
Â
private function requireSubscriptionConfirmation(Subscriber $subscriber) {
|
221 |
+
// we need to save the subscriber here since handleSubscriberOptin() sets the source but doesn't save the model.
|
222 |
+
// when we migrate this class to use Doctrine we can probably remove this call to save() as the call to persist() below should be enough.
|
223 |
Â
$subscriber->save();
|
224 |
+
$subscriberEntity = $this->subscribersRepository->findOneById($subscriber->id);
|
225 |
Â
|
226 |
+
if ($subscriberEntity instanceof SubscriberEntity) {
|
227 |
+
$subscriberEntity->setStatus(Subscriber::STATUS_UNCONFIRMED);
|
228 |
+
$this->subscribersRepository->persist($subscriberEntity);
|
229 |
+
$this->subscribersRepository->flush();
|
230 |
+
|
231 |
+
try {
|
232 |
+
$this->confirmationEmailMailer->sendConfirmationEmailOnce($subscriberEntity);
|
233 |
+
} catch (\Exception $e) {
|
234 |
+
// ignore errors
|
235 |
+
}
|
236 |
+
}
|
237 |
Â
}
|
238 |
Â
|
239 |
Â
private function updateSubscriberStatus(Subscriber $subscriber) {
|
mailpoet.php
CHANGED
@@ -5,7 +5,7 @@ if (!defined('ABSPATH')) exit;
|
|
5 |
Â
|
6 |
Â
/*
|
7 |
Â
* Plugin Name: MailPoet 3 (New)
|
8 |
-
* Version: 3.
|
9 |
Â
* Plugin URI: http://www.mailpoet.com
|
10 |
Â
* Description: Create and send newsletters, post notifications and welcome emails from your WordPress.
|
11 |
Â
* Author: MailPoet
|
@@ -18,7 +18,7 @@ if (!defined('ABSPATH')) exit;
|
|
18 |
Â
*/
|
19 |
Â
|
20 |
Â
$mailpoetPlugin = [
|
21 |
-
'version' => '3.
|
22 |
Â
'filename' => __FILE__,
|
23 |
Â
'path' => dirname(__FILE__),
|
24 |
Â
'autoloader' => dirname(__FILE__) . '/vendor/autoload.php',
|
5 |
Â
|
6 |
Â
/*
|
7 |
Â
* Plugin Name: MailPoet 3 (New)
|
8 |
+
* Version: 3.75.0
|
9 |
Â
* Plugin URI: http://www.mailpoet.com
|
10 |
Â
* Description: Create and send newsletters, post notifications and welcome emails from your WordPress.
|
11 |
Â
* Author: MailPoet
|
18 |
Â
*/
|
19 |
Â
|
20 |
Â
$mailpoetPlugin = [
|
21 |
+
'version' => '3.75.0',
|
22 |
Â
'filename' => __FILE__,
|
23 |
Â
'path' => dirname(__FILE__),
|
24 |
Â
'autoloader' => dirname(__FILE__) . '/vendor/autoload.php',
|
readme.txt
CHANGED
@@ -3,7 +3,7 @@ Contributors: mailpoet
|
|
3 |
Â
Tags: email, email marketing, post notification, woocommerce emails, email automation, newsletter, newsletter builder, newsletter subscribers
|
4 |
Â
Requires at least: 5.3
|
5 |
Â
Tested up to: 5.8
|
6 |
-
Stable tag: 3.
|
7 |
Â
Requires PHP: 7.1
|
8 |
Â
License: GPLv3
|
9 |
Â
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
@@ -45,7 +45,7 @@ Trusted by 300,000 WordPress websites since 2011.
|
|
45 |
Â
|
46 |
Â
= See it in action =
|
47 |
Â
|
48 |
-
[
|
49 |
Â
[vimeo https://vimeo.com/223581490]
|
50 |
Â
|
51 |
Â
= Before you install =
|
@@ -184,6 +184,10 @@ Check our [Knowledge Base](https://kb.mailpoet.com) or contact us through our [s
|
|
184 |
Â
|
185 |
Â
== Changelog ==
|
186 |
Â
|
Â
|
|
Â
|
|
Â
|
|
Â
|
|
187 |
Â
= 3.74.3 - 2021-12-07 =
|
188 |
Â
* Added: new segment "subscribed to list";
|
189 |
Â
* Improved: more options for "purchased product" segment;
|
3 |
Â
Tags: email, email marketing, post notification, woocommerce emails, email automation, newsletter, newsletter builder, newsletter subscribers
|
4 |
Â
Requires at least: 5.3
|
5 |
Â
Tested up to: 5.8
|
6 |
+
Stable tag: 3.75.0
|
7 |
Â
Requires PHP: 7.1
|
8 |
Â
License: GPLv3
|
9 |
Â
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
45 |
Â
|
46 |
Â
= See it in action =
|
47 |
Â
|
48 |
+
[See the 2 min. video](https://vimeo.com/223581490)
|
49 |
Â
[vimeo https://vimeo.com/223581490]
|
50 |
Â
|
51 |
Â
= Before you install =
|
184 |
Â
|
185 |
Â
== Changelog ==
|
186 |
Â
|
187 |
+
= 3.75.0 - 2021-12-13 =
|
188 |
+
* Changed: show MailPoet logo in emails when using free MailPoet plan;
|
189 |
+
* Fixed: "# of machine opens" segment not working properly.
|
190 |
+
|
191 |
Â
= 3.74.3 - 2021-12-07 =
|
192 |
Â
* Added: new segment "subscribed to list";
|
193 |
Â
* Improved: more options for "purchased product" segment;
|
vendor-prefixed/autoload.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
namespace MailPoetVendor; if (!defined('ABSPATH')) exit; require_once __DIR__ . '/composer/autoload_real.php'; return
|
1 |
Â
<?php
|
2 |
+
namespace MailPoetVendor; if (!defined('ABSPATH')) exit; require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInitd73dbd291a4e4d7bd5e8ca45bceaa799::getLoader();
|
vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Connection.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
namespace MailPoetVendor\Doctrine\DBAL; if (!defined('ABSPATH')) exit; use Closure; use MailPoetVendor\Doctrine\Common\EventManager; use MailPoetVendor\Doctrine\DBAL\Cache\ArrayStatement; use MailPoetVendor\Doctrine\DBAL\Cache\CacheException; use MailPoetVendor\Doctrine\DBAL\Cache\QueryCacheProfile; use MailPoetVendor\Doctrine\DBAL\Cache\ResultCacheStatement; use MailPoetVendor\Doctrine\DBAL\Driver\Connection as DriverConnection; use MailPoetVendor\Doctrine\DBAL\Driver\PDO\Statement as PDODriverStatement; use MailPoetVendor\Doctrine\DBAL\Driver\PingableConnection; use MailPoetVendor\Doctrine\DBAL\Driver\ResultStatement; use MailPoetVendor\Doctrine\DBAL\Driver\ServerInfoAwareConnection; use MailPoetVendor\Doctrine\DBAL\Exception\ConnectionLost; use MailPoetVendor\Doctrine\DBAL\Exception\InvalidArgumentException; use MailPoetVendor\Doctrine\DBAL\Exception\NoKeyValue; use MailPoetVendor\Doctrine\DBAL\Platforms\AbstractPlatform; use MailPoetVendor\Doctrine\DBAL\Query\Expression\ExpressionBuilder; use MailPoetVendor\Doctrine\DBAL\Query\QueryBuilder; use MailPoetVendor\Doctrine\DBAL\Schema\AbstractSchemaManager; use MailPoetVendor\Doctrine\DBAL\Types\Type; use MailPoetVendor\Doctrine\Deprecations\Deprecation; use PDO; use Throwable; use Traversable; use function array_key_exists; use function array_shift; use function assert; use function func_get_args; use function implode; use function is_int; use function is_string; use function key; class Connection implements DriverConnection { public const TRANSACTION_READ_UNCOMMITTED = TransactionIsolationLevel::READ_UNCOMMITTED; public const TRANSACTION_READ_COMMITTED = TransactionIsolationLevel::READ_COMMITTED; public const TRANSACTION_REPEATABLE_READ = TransactionIsolationLevel::REPEATABLE_READ; public const TRANSACTION_SERIALIZABLE = TransactionIsolationLevel::SERIALIZABLE; public const PARAM_INT_ARRAY = ParameterType::INTEGER + self::ARRAY_PARAM_OFFSET; public const PARAM_STR_ARRAY = ParameterType::STRING + self::ARRAY_PARAM_OFFSET; public const ARRAY_PARAM_OFFSET = 100; protected $_conn; protected $_config; protected $_eventManager; protected $_expr; private $autoCommit = \true; private $transactionNestingLevel = 0; private $transactionIsolationLevel; private $nestTransactionsWithSavepoints = \false; private $params; private $platform; protected $_schemaManager; protected $_driver; private $isRollbackOnly = \false; protected $defaultFetchMode = FetchMode::ASSOCIATIVE; public function __construct(array $params, Driver $driver, ?Configuration $config = null, ?EventManager $eventManager = null) { $this->_driver = $driver; $this->params = $params; if (isset($params['pdo'])) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/3554', 'Passing a user provided PDO instance directly to Doctrine is deprecated.'); if (!$params['pdo'] instanceof PDO) { throw Exception::invalidPdoInstance(); } $this->_conn = $params['pdo']; $this->_conn->setAttribute(PDO::ATTR_STATEMENT_CLASS, [PDODriverStatement::class, []]); unset($this->params['pdo']); } if (isset($params['platform'])) { if (!$params['platform'] instanceof Platforms\AbstractPlatform) { throw Exception::invalidPlatformType($params['platform']); } $this->platform = $params['platform']; } if (!$config) { $config = new Configuration(); } if (!$eventManager) { $eventManager = new EventManager(); } $this->_config = $config; $this->_eventManager = $eventManager; $this->_expr = new Query\Expression\ExpressionBuilder($this); $this->autoCommit = $config->getAutoCommit(); } public function getParams() { return $this->params; } public function getDatabase() { return $this->_driver->getDatabase($this); } public function getHost() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/issues/3580', 'Connection::getHost() is deprecated, get the database server host from application config ' . 'or as a last resort from internal Connection::getParams() API.'); return $this->params['host'] ?? null; } public function getPort() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/issues/3580', 'Connection::getPort() is deprecated, get the database server port from application config ' . 'or as a last resort from internal Connection::getParams() API.'); return $this->params['port'] ?? null; } public function getUsername() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/issues/3580', 'Connection::getUsername() is deprecated, get the username from application config ' . 'or as a last resort from internal Connection::getParams() API.'); return $this->params['user'] ?? null; } public function getPassword() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/issues/3580', 'Connection::getPassword() is deprecated, get the password from application config ' . 'or as a last resort from internal Connection::getParams() API.'); return $this->params['password'] ?? null; } public function getDriver() { return $this->_driver; } public function getConfiguration() { return $this->_config; } public function getEventManager() { return $this->_eventManager; } public function getDatabasePlatform() { if ($this->platform === null) { $this->platform = $this->detectDatabasePlatform(); $this->platform->setEventManager($this->_eventManager); } return $this->platform; } public function getExpressionBuilder() { return $this->_expr; } public function connect() { if ($this->_conn !== null) { return \false; } $driverOptions = $this->params['driverOptions'] ?? []; $user = $this->params['user'] ?? null; $password = $this->params['password'] ?? null; $this->_conn = $this->_driver->connect($this->params, $user, $password, $driverOptions); $this->transactionNestingLevel = 0; if ($this->autoCommit === \false) { $this->beginTransaction(); } if ($this->_eventManager->hasListeners(Events::postConnect)) { $eventArgs = new Event\ConnectionEventArgs($this); $this->_eventManager->dispatchEvent(Events::postConnect, $eventArgs); } return \true; } private function detectDatabasePlatform() : AbstractPlatform { $version = $this->getDatabasePlatformVersion(); if ($version !== null) { assert($this->_driver instanceof VersionAwarePlatformDriver); return $this->_driver->createDatabasePlatformForVersion($version); } return $this->_driver->getDatabasePlatform(); } private function getDatabasePlatformVersion() { if (!$this->_driver instanceof VersionAwarePlatformDriver) { return null; } if (isset($this->params['serverVersion'])) { return $this->params['serverVersion']; } if ($this->_conn === null) { try { $this->connect(); } catch (Throwable $originalException) { if (empty($this->params['dbname'])) { throw $originalException; } $params = $this->params; unset($this->params['dbname']); try { $this->connect(); } catch (Throwable $fallbackException) { throw $originalException; } finally { $this->params = $params; } $serverVersion = $this->getServerVersion(); $this->close(); return $serverVersion; } } return $this->getServerVersion(); } private function getServerVersion() { $connection = $this->getWrappedConnection(); if ($connection instanceof ServerInfoAwareConnection && !$connection->requiresQueryForServerVersion()) { return $connection->getServerVersion(); } return null; } public function isAutoCommit() { return $this->autoCommit === \true; } public function setAutoCommit($autoCommit) { $autoCommit = (bool) $autoCommit; if ($autoCommit === $this->autoCommit) { return; } $this->autoCommit = $autoCommit; if ($this->_conn === null || $this->transactionNestingLevel === 0) { return; } $this->commitAll(); } public function setFetchMode($fetchMode) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4019', 'Default Fetch Mode configuration is deprecated, use explicit Connection::fetch*() APIs instead.'); $this->defaultFetchMode = $fetchMode; } public function fetchAssoc($sql, array $params = [], array $types = []) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4019', 'Connection::fetchAssoc() is deprecated, use Connection::fetchAssociative() API instead.'); return $this->executeQuery($sql, $params, $types)->fetch(FetchMode::ASSOCIATIVE); } public function fetchArray($sql, array $params = [], array $types = []) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4019', 'Connection::fetchArray() is deprecated, use Connection::fetchNumeric() API instead.'); return $this->executeQuery($sql, $params, $types)->fetch(FetchMode::NUMERIC); } public function fetchColumn($sql, array $params = [], $column = 0, array $types = []) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4019', 'Connection::fetchColumn() is deprecated, use Connection::fetchOne() API instead.'); return $this->executeQuery($sql, $params, $types)->fetchColumn($column); } public function fetchAssociative(string $query, array $params = [], array $types = []) { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); return $stmt->fetchAssociative(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function fetchNumeric(string $query, array $params = [], array $types = []) { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); return $stmt->fetchNumeric(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function fetchOne(string $query, array $params = [], array $types = []) { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); return $stmt->fetchOne(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function isConnected() { return $this->_conn !== null; } public function isTransactionActive() { return $this->transactionNestingLevel > 0; } private function addCriteriaCondition(array $criteria, array &$columns, array &$values, array &$conditions) : void { $platform = $this->getDatabasePlatform(); foreach ($criteria as $columnName => $value) { if ($value === null) { $conditions[] = $platform->getIsNullExpression($columnName); continue; } $columns[] = $columnName; $values[] = $value; $conditions[] = $columnName . ' = ?'; } } public function delete($table, array $criteria, array $types = []) { if (empty($criteria)) { throw InvalidArgumentException::fromEmptyCriteria(); } $columns = $values = $conditions = []; $this->addCriteriaCondition($criteria, $columns, $values, $conditions); return $this->executeStatement('DELETE FROM ' . $table . ' WHERE ' . implode(' AND ', $conditions), $values, is_string(key($types)) ? $this->extractTypeValues($columns, $types) : $types); } public function close() { $this->_conn = null; } public function setTransactionIsolation($level) { $this->transactionIsolationLevel = $level; return $this->executeStatement($this->getDatabasePlatform()->getSetTransactionIsolationSQL($level)); } public function getTransactionIsolation() { if ($this->transactionIsolationLevel === null) { $this->transactionIsolationLevel = $this->getDatabasePlatform()->getDefaultTransactionIsolationLevel(); } return $this->transactionIsolationLevel; } public function update($table, array $data, array $criteria, array $types = []) { $columns = $values = $conditions = $set = []; foreach ($data as $columnName => $value) { $columns[] = $columnName; $values[] = $value; $set[] = $columnName . ' = ?'; } $this->addCriteriaCondition($criteria, $columns, $values, $conditions); if (is_string(key($types))) { $types = $this->extractTypeValues($columns, $types); } $sql = 'UPDATE ' . $table . ' SET ' . implode(', ', $set) . ' WHERE ' . implode(' AND ', $conditions); return $this->executeStatement($sql, $values, $types); } public function insert($table, array $data, array $types = []) { if (empty($data)) { return $this->executeStatement('INSERT INTO ' . $table . ' () VALUES ()'); } $columns = []; $values = []; $set = []; foreach ($data as $columnName => $value) { $columns[] = $columnName; $values[] = $value; $set[] = '?'; } return $this->executeStatement('INSERT INTO ' . $table . ' (' . implode(', ', $columns) . ')' . ' VALUES (' . implode(', ', $set) . ')', $values, is_string(key($types)) ? $this->extractTypeValues($columns, $types) : $types); } private function extractTypeValues(array $columnList, array $types) { $typeValues = []; foreach ($columnList as $columnIndex => $columnName) { $typeValues[] = $types[$columnName] ?? ParameterType::STRING; } return $typeValues; } public function quoteIdentifier($str) { return $this->getDatabasePlatform()->quoteIdentifier($str); } public function quote($value, $type = ParameterType::STRING) { $connection = $this->getWrappedConnection(); [$value, $bindingType] = $this->getBindingInfo($value, $type); return $connection->quote($value, $bindingType); } public function fetchAll($sql, array $params = [], $types = []) { return $this->executeQuery($sql, $params, $types)->fetchAll(); } public function fetchAllNumeric(string $query, array $params = [], array $types = []) : array { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); return $stmt->fetchAllNumeric(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function fetchAllAssociative(string $query, array $params = [], array $types = []) : array { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); return $stmt->fetchAllAssociative(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function fetchAllKeyValue(string $query, array $params = [], array $types = []) : array { $stmt = $this->executeQuery($query, $params, $types); $this->ensureHasKeyValue($stmt); $data = []; foreach ($stmt->fetchAll(FetchMode::NUMERIC) as [$key, $value]) { $data[$key] = $value; } return $data; } public function fetchAllAssociativeIndexed(string $query, array $params = [], array $types = []) : array { $stmt = $this->executeQuery($query, $params, $types); $data = []; foreach ($stmt->fetchAll(FetchMode::ASSOCIATIVE) as $row) { $data[array_shift($row)] = $row; } return $data; } public function fetchFirstColumn(string $query, array $params = [], array $types = []) : array { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); return $stmt->fetchFirstColumn(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function iterateNumeric(string $query, array $params = [], array $types = []) : Traversable { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); yield from $stmt->iterateNumeric(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function iterateAssociative(string $query, array $params = [], array $types = []) : Traversable { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); yield from $stmt->iterateAssociative(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function iterateKeyValue(string $query, array $params = [], array $types = []) : Traversable { $stmt = $this->executeQuery($query, $params, $types); $this->ensureHasKeyValue($stmt); while (($row = $stmt->fetch(FetchMode::NUMERIC)) !== \false) { (yield $row[0] => $row[1]); } } public function iterateAssociativeIndexed(string $query, array $params = [], array $types = []) : Traversable { $stmt = $this->executeQuery($query, $params, $types); while (($row = $stmt->fetch(FetchMode::ASSOCIATIVE)) !== \false) { (yield array_shift($row) => $row); } } public function iterateColumn(string $query, array $params = [], array $types = []) : Traversable { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); yield from $stmt->iterateColumn(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function prepare($sql) { try { $stmt = new Statement($sql, $this); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $sql); } $stmt->setFetchMode($this->defaultFetchMode); return $stmt; } public function executeQuery($sql, array $params = [], $types = [], ?QueryCacheProfile $qcp = null) { if ($qcp !== null) { return $this->executeCacheQuery($sql, $params, $types, $qcp); } $connection = $this->getWrappedConnection(); $logger = $this->_config->getSQLLogger(); if ($logger) { $logger->startQuery($sql, $params, $types); } try { if ($params) { [$sql, $params, $types] = SQLParserUtils::expandListParameters($sql, $params, $types); $stmt = $connection->prepare($sql); if ($types) { $this->_bindTypedValues($stmt, $params, $types); $stmt->execute(); } else { $stmt->execute($params); } } else { $stmt = $connection->query($sql); } } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $sql, $params, $types); } $stmt->setFetchMode($this->defaultFetchMode); if ($logger) { $logger->stopQuery(); } return $this->ensureForwardCompatibilityStatement($stmt); } public function executeCacheQuery($sql, $params, $types, QueryCacheProfile $qcp) { $resultCache = $qcp->getResultCacheDriver() ?? $this->_config->getResultCacheImpl(); if ($resultCache === null) { throw CacheException::noResultDriverConfigured(); } $connectionParams = $this->params; unset($connectionParams['platform']); [$cacheKey, $realKey] = $qcp->generateCacheKeys($sql, $params, $types, $connectionParams); $data = $resultCache->fetch($cacheKey); if ($data !== \false) { if (isset($data[$realKey])) { $stmt = new ArrayStatement($data[$realKey]); } elseif (array_key_exists($realKey, $data)) { $stmt = new ArrayStatement([]); } } if (!isset($stmt)) { $stmt = new ResultCacheStatement($this->executeQuery($sql, $params, $types), $resultCache, $cacheKey, $realKey, $qcp->getLifetime()); } $stmt->setFetchMode($this->defaultFetchMode); return $this->ensureForwardCompatibilityStatement($stmt); } private function ensureForwardCompatibilityStatement(ResultStatement $stmt) { return ForwardCompatibility\Result::ensure($stmt); } public function project($sql, array $params, Closure $function) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/3823', 'Connection::project() is deprecated without replacement, implement data projections in your own code.'); $result = []; $stmt = $this->executeQuery($sql, $params); while ($row = $stmt->fetch()) { $result[] = $function($row); } $stmt->closeCursor(); return $result; } public function query() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4163', 'Connection::query() is deprecated, use Connection::executeQuery() instead.'); $connection = $this->getWrappedConnection(); $args = func_get_args(); $logger = $this->_config->getSQLLogger(); if ($logger) { $logger->startQuery($args[0]); } try { $statement = $connection->query(...$args); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $args[0]); } $statement->setFetchMode($this->defaultFetchMode); if ($logger) { $logger->stopQuery(); } return $statement; } public function executeUpdate($sql, array $params = [], array $types = []) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4163', 'Connection::executeUpdate() is deprecated, use Connection::executeStatement() instead.'); return $this->executeStatement($sql, $params, $types); } public function executeStatement($sql, array $params = [], array $types = []) { $connection = $this->getWrappedConnection(); $logger = $this->_config->getSQLLogger(); if ($logger) { $logger->startQuery($sql, $params, $types); } try { if ($params) { [$sql, $params, $types] = SQLParserUtils::expandListParameters($sql, $params, $types); $stmt = $connection->prepare($sql); if ($types) { $this->_bindTypedValues($stmt, $params, $types); $stmt->execute(); } else { $stmt->execute($params); } $result = $stmt->rowCount(); } else { $result = $connection->exec($sql); } } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $sql, $params, $types); } if ($logger) { $logger->stopQuery(); } return $result; } public function exec($sql) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4163', 'Connection::exec() is deprecated, use Connection::executeStatement() instead.'); $connection = $this->getWrappedConnection(); $logger = $this->_config->getSQLLogger(); if ($logger) { $logger->startQuery($sql); } try { $result = $connection->exec($sql); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $sql); } if ($logger) { $logger->stopQuery(); } return $result; } public function getTransactionNestingLevel() { return $this->transactionNestingLevel; } public function errorCode() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/3507', 'Connection::errorCode() is deprecated, use getCode() or getSQLState() on Exception instead.'); return $this->getWrappedConnection()->errorCode(); } public function errorInfo() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/3507', 'Connection::errorInfo() is deprecated, use getCode() or getSQLState() on Exception instead.'); return $this->getWrappedConnection()->errorInfo(); } public function lastInsertId($name = null) { return $this->getWrappedConnection()->lastInsertId($name); } public function transactional(Closure $func) { $this->beginTransaction(); try { $res = $func($this); $this->commit(); return $res; } catch (Throwable $e) { $this->rollBack(); throw $e; } } public function setNestTransactionsWithSavepoints($nestTransactionsWithSavepoints) { if ($this->transactionNestingLevel > 0) { throw ConnectionException::mayNotAlterNestedTransactionWithSavepointsInTransaction(); } if (!$this->getDatabasePlatform()->supportsSavepoints()) { throw ConnectionException::savepointsNotSupported(); } $this->nestTransactionsWithSavepoints = (bool) $nestTransactionsWithSavepoints; } public function getNestTransactionsWithSavepoints() { return $this->nestTransactionsWithSavepoints; } protected function _getNestedTransactionSavePointName() { return 'DOCTRINE2_SAVEPOINT_' . $this->transactionNestingLevel; } public function beginTransaction() { $connection = $this->getWrappedConnection(); ++$this->transactionNestingLevel; $logger = $this->_config->getSQLLogger(); if ($this->transactionNestingLevel === 1) { if ($logger) { $logger->startQuery('"START TRANSACTION"'); } $connection->beginTransaction(); if ($logger) { $logger->stopQuery(); } } elseif ($this->nestTransactionsWithSavepoints) { if ($logger) { $logger->startQuery('"SAVEPOINT"'); } $this->createSavepoint($this->_getNestedTransactionSavePointName()); if ($logger) { $logger->stopQuery(); } } return \true; } public function commit() { if ($this->transactionNestingLevel === 0) { throw ConnectionException::noActiveTransaction(); } if ($this->isRollbackOnly) { throw ConnectionException::commitFailedRollbackOnly(); } $result = \true; $connection = $this->getWrappedConnection(); $logger = $this->_config->getSQLLogger(); if ($this->transactionNestingLevel === 1) { if ($logger) { $logger->startQuery('"COMMIT"'); } $result = $connection->commit(); if ($logger) { $logger->stopQuery(); } } elseif ($this->nestTransactionsWithSavepoints) { if ($logger) { $logger->startQuery('"RELEASE SAVEPOINT"'); } $this->releaseSavepoint($this->_getNestedTransactionSavePointName()); if ($logger) { $logger->stopQuery(); } } --$this->transactionNestingLevel; if ($this->autoCommit !== \false || $this->transactionNestingLevel !== 0) { return $result; } $this->beginTransaction(); return $result; } private function commitAll() : void { while ($this->transactionNestingLevel !== 0) { if ($this->autoCommit === \false && $this->transactionNestingLevel === 1) { $this->commit(); return; } $this->commit(); } } public function rollBack() { if ($this->transactionNestingLevel === 0) { throw ConnectionException::noActiveTransaction(); } $connection = $this->getWrappedConnection(); $logger = $this->_config->getSQLLogger(); if ($this->transactionNestingLevel === 1) { if ($logger) { $logger->startQuery('"ROLLBACK"'); } $this->transactionNestingLevel = 0; $connection->rollBack(); $this->isRollbackOnly = \false; if ($logger) { $logger->stopQuery(); } if ($this->autoCommit === \false) { $this->beginTransaction(); } } elseif ($this->nestTransactionsWithSavepoints) { if ($logger) { $logger->startQuery('"ROLLBACK TO SAVEPOINT"'); } $this->rollbackSavepoint($this->_getNestedTransactionSavePointName()); --$this->transactionNestingLevel; if ($logger) { $logger->stopQuery(); } } else { $this->isRollbackOnly = \true; --$this->transactionNestingLevel; } return \true; } public function createSavepoint($savepoint) { $platform = $this->getDatabasePlatform(); if (!$platform->supportsSavepoints()) { throw ConnectionException::savepointsNotSupported(); } $this->getWrappedConnection()->exec($platform->createSavePoint($savepoint)); } public function releaseSavepoint($savepoint) { $platform = $this->getDatabasePlatform(); if (!$platform->supportsSavepoints()) { throw ConnectionException::savepointsNotSupported(); } if (!$platform->supportsReleaseSavepoints()) { return; } $this->getWrappedConnection()->exec($platform->releaseSavePoint($savepoint)); } public function rollbackSavepoint($savepoint) { $platform = $this->getDatabasePlatform(); if (!$platform->supportsSavepoints()) { throw ConnectionException::savepointsNotSupported(); } $this->getWrappedConnection()->exec($platform->rollbackSavePoint($savepoint)); } public function getWrappedConnection() { $this->connect(); assert($this->_conn !== null); return $this->_conn; } public function getSchemaManager() { if ($this->_schemaManager === null) { $this->_schemaManager = $this->_driver->getSchemaManager($this); } return $this->_schemaManager; } public function setRollbackOnly() { if ($this->transactionNestingLevel === 0) { throw ConnectionException::noActiveTransaction(); } $this->isRollbackOnly = \true; } public function isRollbackOnly() { if ($this->transactionNestingLevel === 0) { throw ConnectionException::noActiveTransaction(); } return $this->isRollbackOnly; } public function convertToDatabaseValue($value, $type) { return Type::getType($type)->convertToDatabaseValue($value, $this->getDatabasePlatform()); } public function convertToPHPValue($value, $type) { return Type::getType($type)->convertToPHPValue($value, $this->getDatabasePlatform()); } private function _bindTypedValues($stmt, array $params, array $types) { if (is_int(key($params))) { $typeOffset = array_key_exists(0, $types) ? -1 : 0; $bindIndex = 1; foreach ($params as $value) { $typeIndex = $bindIndex + $typeOffset; if (isset($types[$typeIndex])) { $type = $types[$typeIndex]; [$value, $bindingType] = $this->getBindingInfo($value, $type); $stmt->bindValue($bindIndex, $value, $bindingType); } else { $stmt->bindValue($bindIndex, $value); } ++$bindIndex; } } else { foreach ($params as $name => $value) { if (isset($types[$name])) { $type = $types[$name]; [$value, $bindingType] = $this->getBindingInfo($value, $type); $stmt->bindValue($name, $value, $bindingType); } else { $stmt->bindValue($name, $value); } } } } private function getBindingInfo($value, $type) { if (is_string($type)) { $type = Type::getType($type); } if ($type instanceof Type) { $value = $type->convertToDatabaseValue($value, $this->getDatabasePlatform()); $bindingType = $type->getBindingType(); } else { $bindingType = $type; } return [$value, $bindingType]; } public function resolveParams(array $params, array $types) { $resolvedParams = []; if (is_int(key($params))) { $typeOffset = array_key_exists(0, $types) ? -1 : 0; $bindIndex = 1; foreach ($params as $value) { $typeIndex = $bindIndex + $typeOffset; if (isset($types[$typeIndex])) { $type = $types[$typeIndex]; [$value] = $this->getBindingInfo($value, $type); $resolvedParams[$bindIndex] = $value; } else { $resolvedParams[$bindIndex] = $value; } ++$bindIndex; } } else { foreach ($params as $name => $value) { if (isset($types[$name])) { $type = $types[$name]; [$value] = $this->getBindingInfo($value, $type); $resolvedParams[$name] = $value; } else { $resolvedParams[$name] = $value; } } } return $resolvedParams; } public function createQueryBuilder() { return new Query\QueryBuilder($this); } public function ping() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4119', 'Retry and reconnecting lost connections now happens automatically, ping() will be removed in DBAL 3.'); $connection = $this->getWrappedConnection(); if ($connection instanceof PingableConnection) { return $connection->ping(); } try { $this->query($this->getDatabasePlatform()->getDummySelectSQL()); return \true; } catch (DBALException $e) { return \false; } } public function handleExceptionDuringQuery(Throwable $e, string $sql, array $params = [], array $types = []) : void { $this->throw(Exception::driverExceptionDuringQuery($this->_driver, $e, $sql, $this->resolveParams($params, $types))); } public function handleDriverException(Throwable $e) : void { $this->throw(Exception::driverException($this->_driver, $e)); } private function throw(Exception $e) : void { if ($e instanceof ConnectionLost) { $this->close(); } throw $e; } private function ensureHasKeyValue(ResultStatement $stmt) : void { $columnCount = $stmt->columnCount(); if ($columnCount < 2) { throw NoKeyValue::fromColumnCount($columnCount); } } }
|
1 |
Â
<?php
|
2 |
+
namespace MailPoetVendor\Doctrine\DBAL; if (!defined('ABSPATH')) exit; use Closure; use MailPoetVendor\Doctrine\Common\EventManager; use MailPoetVendor\Doctrine\DBAL\Cache\ArrayStatement; use MailPoetVendor\Doctrine\DBAL\Cache\CacheException; use MailPoetVendor\Doctrine\DBAL\Cache\QueryCacheProfile; use MailPoetVendor\Doctrine\DBAL\Cache\ResultCacheStatement; use MailPoetVendor\Doctrine\DBAL\Driver\Connection as DriverConnection; use MailPoetVendor\Doctrine\DBAL\Driver\PDO\Statement as PDODriverStatement; use MailPoetVendor\Doctrine\DBAL\Driver\PingableConnection; use MailPoetVendor\Doctrine\DBAL\Driver\ResultStatement; use MailPoetVendor\Doctrine\DBAL\Driver\ServerInfoAwareConnection; use MailPoetVendor\Doctrine\DBAL\Exception\ConnectionLost; use MailPoetVendor\Doctrine\DBAL\Exception\InvalidArgumentException; use MailPoetVendor\Doctrine\DBAL\Exception\NoKeyValue; use MailPoetVendor\Doctrine\DBAL\Platforms\AbstractPlatform; use MailPoetVendor\Doctrine\DBAL\Query\Expression\ExpressionBuilder; use MailPoetVendor\Doctrine\DBAL\Query\QueryBuilder; use MailPoetVendor\Doctrine\DBAL\Schema\AbstractSchemaManager; use MailPoetVendor\Doctrine\DBAL\Types\Type; use MailPoetVendor\Doctrine\Deprecations\Deprecation; use PDO; use Throwable; use Traversable; use function array_key_exists; use function array_shift; use function assert; use function func_get_args; use function implode; use function is_int; use function is_string; use function key; class Connection implements DriverConnection { public const TRANSACTION_READ_UNCOMMITTED = TransactionIsolationLevel::READ_UNCOMMITTED; public const TRANSACTION_READ_COMMITTED = TransactionIsolationLevel::READ_COMMITTED; public const TRANSACTION_REPEATABLE_READ = TransactionIsolationLevel::REPEATABLE_READ; public const TRANSACTION_SERIALIZABLE = TransactionIsolationLevel::SERIALIZABLE; public const PARAM_INT_ARRAY = ParameterType::INTEGER + self::ARRAY_PARAM_OFFSET; public const PARAM_STR_ARRAY = ParameterType::STRING + self::ARRAY_PARAM_OFFSET; public const ARRAY_PARAM_OFFSET = 100; protected $_conn; protected $_config; protected $_eventManager; protected $_expr; private $autoCommit = \true; private $transactionNestingLevel = 0; private $transactionIsolationLevel; private $nestTransactionsWithSavepoints = \false; private $params; private $platform; protected $_schemaManager; protected $_driver; private $isRollbackOnly = \false; protected $defaultFetchMode = FetchMode::ASSOCIATIVE; public function __construct(array $params, Driver $driver, ?Configuration $config = null, ?EventManager $eventManager = null) { $this->_driver = $driver; $this->params = $params; if (isset($params['pdo'])) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/3554', 'Passing a user provided PDO instance directly to Doctrine is deprecated.'); if (!$params['pdo'] instanceof PDO) { throw Exception::invalidPdoInstance(); } $this->_conn = $params['pdo']; $this->_conn->setAttribute(PDO::ATTR_STATEMENT_CLASS, [PDODriverStatement::class, []]); unset($this->params['pdo']); } if (isset($params['platform'])) { if (!$params['platform'] instanceof Platforms\AbstractPlatform) { throw Exception::invalidPlatformType($params['platform']); } $this->platform = $params['platform']; } if (!$config) { $config = new Configuration(); } if (!$eventManager) { $eventManager = new EventManager(); } $this->_config = $config; $this->_eventManager = $eventManager; $this->_expr = new Query\Expression\ExpressionBuilder($this); $this->autoCommit = $config->getAutoCommit(); } public function getParams() { return $this->params; } public function getDatabase() { return $this->_driver->getDatabase($this); } public function getHost() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/issues/3580', 'Connection::getHost() is deprecated, get the database server host from application config ' . 'or as a last resort from internal Connection::getParams() API.'); return $this->params['host'] ?? null; } public function getPort() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/issues/3580', 'Connection::getPort() is deprecated, get the database server port from application config ' . 'or as a last resort from internal Connection::getParams() API.'); return $this->params['port'] ?? null; } public function getUsername() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/issues/3580', 'Connection::getUsername() is deprecated, get the username from application config ' . 'or as a last resort from internal Connection::getParams() API.'); return $this->params['user'] ?? null; } public function getPassword() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/issues/3580', 'Connection::getPassword() is deprecated, get the password from application config ' . 'or as a last resort from internal Connection::getParams() API.'); return $this->params['password'] ?? null; } public function getDriver() { return $this->_driver; } public function getConfiguration() { return $this->_config; } public function getEventManager() { return $this->_eventManager; } public function getDatabasePlatform() { if ($this->platform === null) { $this->platform = $this->detectDatabasePlatform(); $this->platform->setEventManager($this->_eventManager); } return $this->platform; } public function getExpressionBuilder() { return $this->_expr; } public function connect() { if ($this->_conn !== null) { return \false; } $driverOptions = $this->params['driverOptions'] ?? []; $user = $this->params['user'] ?? null; $password = $this->params['password'] ?? null; $this->_conn = $this->_driver->connect($this->params, $user, $password, $driverOptions); $this->transactionNestingLevel = 0; if ($this->autoCommit === \false) { $this->beginTransaction(); } if ($this->_eventManager->hasListeners(Events::postConnect)) { $eventArgs = new Event\ConnectionEventArgs($this); $this->_eventManager->dispatchEvent(Events::postConnect, $eventArgs); } return \true; } private function detectDatabasePlatform() : AbstractPlatform { $version = $this->getDatabasePlatformVersion(); if ($version !== null) { assert($this->_driver instanceof VersionAwarePlatformDriver); return $this->_driver->createDatabasePlatformForVersion($version); } return $this->_driver->getDatabasePlatform(); } private function getDatabasePlatformVersion() { if (!$this->_driver instanceof VersionAwarePlatformDriver) { return null; } if (isset($this->params['serverVersion'])) { return $this->params['serverVersion']; } if ($this->_conn === null) { try { $this->connect(); } catch (Throwable $originalException) { if (empty($this->params['dbname'])) { throw $originalException; } $params = $this->params; unset($this->params['dbname']); try { $this->connect(); } catch (Throwable $fallbackException) { throw $originalException; } finally { $this->params = $params; } $serverVersion = $this->getServerVersion(); $this->close(); return $serverVersion; } } return $this->getServerVersion(); } private function getServerVersion() { $connection = $this->getWrappedConnection(); if ($connection instanceof ServerInfoAwareConnection && !$connection->requiresQueryForServerVersion()) { return $connection->getServerVersion(); } return null; } public function isAutoCommit() { return $this->autoCommit === \true; } public function setAutoCommit($autoCommit) { $autoCommit = (bool) $autoCommit; if ($autoCommit === $this->autoCommit) { return; } $this->autoCommit = $autoCommit; if ($this->_conn === null || $this->transactionNestingLevel === 0) { return; } $this->commitAll(); } public function setFetchMode($fetchMode) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4019', 'Default Fetch Mode configuration is deprecated, use explicit Connection::fetch*() APIs instead.'); $this->defaultFetchMode = $fetchMode; } public function fetchAssoc($sql, array $params = [], array $types = []) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4019', 'Connection::fetchAssoc() is deprecated, use Connection::fetchAssociative() API instead.'); return $this->executeQuery($sql, $params, $types)->fetch(FetchMode::ASSOCIATIVE); } public function fetchArray($sql, array $params = [], array $types = []) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4019', 'Connection::fetchArray() is deprecated, use Connection::fetchNumeric() API instead.'); return $this->executeQuery($sql, $params, $types)->fetch(FetchMode::NUMERIC); } public function fetchColumn($sql, array $params = [], $column = 0, array $types = []) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4019', 'Connection::fetchColumn() is deprecated, use Connection::fetchOne() API instead.'); return $this->executeQuery($sql, $params, $types)->fetchColumn($column); } public function fetchAssociative(string $query, array $params = [], array $types = []) { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); return $stmt->fetchAssociative(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function fetchNumeric(string $query, array $params = [], array $types = []) { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); return $stmt->fetchNumeric(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function fetchOne(string $query, array $params = [], array $types = []) { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); return $stmt->fetchOne(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function isConnected() { return $this->_conn !== null; } public function isTransactionActive() { return $this->transactionNestingLevel > 0; } private function addCriteriaCondition(array $criteria, array &$columns, array &$values, array &$conditions) : void { $platform = $this->getDatabasePlatform(); foreach ($criteria as $columnName => $value) { if ($value === null) { $conditions[] = $platform->getIsNullExpression($columnName); continue; } $columns[] = $columnName; $values[] = $value; $conditions[] = $columnName . ' = ?'; } } public function delete($table, array $criteria, array $types = []) { if (empty($criteria)) { throw InvalidArgumentException::fromEmptyCriteria(); } $columns = $values = $conditions = []; $this->addCriteriaCondition($criteria, $columns, $values, $conditions); return $this->executeStatement('DELETE FROM ' . $table . ' WHERE ' . implode(' AND ', $conditions), $values, is_string(key($types)) ? $this->extractTypeValues($columns, $types) : $types); } public function close() { $this->_conn = null; } public function setTransactionIsolation($level) { $this->transactionIsolationLevel = $level; return $this->executeStatement($this->getDatabasePlatform()->getSetTransactionIsolationSQL($level)); } public function getTransactionIsolation() { if ($this->transactionIsolationLevel === null) { $this->transactionIsolationLevel = $this->getDatabasePlatform()->getDefaultTransactionIsolationLevel(); } return $this->transactionIsolationLevel; } public function update($table, array $data, array $criteria, array $types = []) { $columns = $values = $conditions = $set = []; foreach ($data as $columnName => $value) { $columns[] = $columnName; $values[] = $value; $set[] = $columnName . ' = ?'; } $this->addCriteriaCondition($criteria, $columns, $values, $conditions); if (is_string(key($types))) { $types = $this->extractTypeValues($columns, $types); } $sql = 'UPDATE ' . $table . ' SET ' . implode(', ', $set) . ' WHERE ' . implode(' AND ', $conditions); return $this->executeStatement($sql, $values, $types); } public function insert($table, array $data, array $types = []) { if (empty($data)) { return $this->executeStatement('INSERT INTO ' . $table . ' () VALUES ()'); } $columns = []; $values = []; $set = []; foreach ($data as $columnName => $value) { $columns[] = $columnName; $values[] = $value; $set[] = '?'; } return $this->executeStatement('INSERT INTO ' . $table . ' (' . implode(', ', $columns) . ')' . ' VALUES (' . implode(', ', $set) . ')', $values, is_string(key($types)) ? $this->extractTypeValues($columns, $types) : $types); } private function extractTypeValues(array $columnList, array $types) { $typeValues = []; foreach ($columnList as $columnIndex => $columnName) { $typeValues[] = $types[$columnName] ?? ParameterType::STRING; } return $typeValues; } public function quoteIdentifier($str) { return $this->getDatabasePlatform()->quoteIdentifier($str); } public function quote($value, $type = ParameterType::STRING) { $connection = $this->getWrappedConnection(); [$value, $bindingType] = $this->getBindingInfo($value, $type); return $connection->quote($value, $bindingType); } public function fetchAll($sql, array $params = [], $types = []) { return $this->executeQuery($sql, $params, $types)->fetchAll(); } public function fetchAllNumeric(string $query, array $params = [], array $types = []) : array { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); return $stmt->fetchAllNumeric(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function fetchAllAssociative(string $query, array $params = [], array $types = []) : array { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); return $stmt->fetchAllAssociative(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function fetchAllKeyValue(string $query, array $params = [], array $types = []) : array { $stmt = $this->executeQuery($query, $params, $types); $this->ensureHasKeyValue($stmt); $data = []; foreach ($stmt->fetchAll(FetchMode::NUMERIC) as [$key, $value]) { $data[$key] = $value; } return $data; } public function fetchAllAssociativeIndexed(string $query, array $params = [], array $types = []) : array { $stmt = $this->executeQuery($query, $params, $types); $data = []; foreach ($stmt->fetchAll(FetchMode::ASSOCIATIVE) as $row) { $data[array_shift($row)] = $row; } return $data; } public function fetchFirstColumn(string $query, array $params = [], array $types = []) : array { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); return $stmt->fetchFirstColumn(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function iterateNumeric(string $query, array $params = [], array $types = []) : Traversable { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); yield from $stmt->iterateNumeric(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function iterateAssociative(string $query, array $params = [], array $types = []) : Traversable { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); yield from $stmt->iterateAssociative(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function iterateKeyValue(string $query, array $params = [], array $types = []) : Traversable { $stmt = $this->executeQuery($query, $params, $types); $this->ensureHasKeyValue($stmt); while (($row = $stmt->fetch(FetchMode::NUMERIC)) !== \false) { (yield $row[0] => $row[1]); } } public function iterateAssociativeIndexed(string $query, array $params = [], array $types = []) : Traversable { $stmt = $this->executeQuery($query, $params, $types); while (($row = $stmt->fetch(FetchMode::ASSOCIATIVE)) !== \false) { (yield array_shift($row) => $row); } } public function iterateColumn(string $query, array $params = [], array $types = []) : Traversable { try { $stmt = $this->ensureForwardCompatibilityStatement($this->executeQuery($query, $params, $types)); yield from $stmt->iterateColumn(); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $query, $params, $types); } } public function prepare($sql) { try { $stmt = new Statement($sql, $this); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $sql); } $stmt->setFetchMode($this->defaultFetchMode); return $stmt; } public function executeQuery($sql, array $params = [], $types = [], ?QueryCacheProfile $qcp = null) { if ($qcp !== null) { return $this->executeCacheQuery($sql, $params, $types, $qcp); } $connection = $this->getWrappedConnection(); $logger = $this->_config->getSQLLogger(); if ($logger) { $logger->startQuery($sql, $params, $types); } try { if ($params) { [$sql, $params, $types] = SQLParserUtils::expandListParameters($sql, $params, $types); $stmt = $connection->prepare($sql); if ($types) { $this->_bindTypedValues($stmt, $params, $types); $stmt->execute(); } else { $stmt->execute($params); } } else { $stmt = $connection->query($sql); } } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $sql, $params, $types); } $stmt->setFetchMode($this->defaultFetchMode); if ($logger) { $logger->stopQuery(); } return $this->ensureForwardCompatibilityStatement($stmt); } public function executeCacheQuery($sql, $params, $types, QueryCacheProfile $qcp) { $resultCache = $qcp->getResultCacheDriver() ?? $this->_config->getResultCacheImpl(); if ($resultCache === null) { throw CacheException::noResultDriverConfigured(); } $connectionParams = $this->params; unset($connectionParams['platform']); [$cacheKey, $realKey] = $qcp->generateCacheKeys($sql, $params, $types, $connectionParams); $data = $resultCache->fetch($cacheKey); if ($data !== \false) { if (isset($data[$realKey])) { $stmt = new ArrayStatement($data[$realKey]); } elseif (array_key_exists($realKey, $data)) { $stmt = new ArrayStatement([]); } } if (!isset($stmt)) { $stmt = new ResultCacheStatement($this->executeQuery($sql, $params, $types), $resultCache, $cacheKey, $realKey, $qcp->getLifetime()); } $stmt->setFetchMode($this->defaultFetchMode); return $this->ensureForwardCompatibilityStatement($stmt); } private function ensureForwardCompatibilityStatement(ResultStatement $stmt) { return ForwardCompatibility\Result::ensure($stmt); } public function project($sql, array $params, Closure $function) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/3823', 'Connection::project() is deprecated without replacement, implement data projections in your own code.'); $result = []; $stmt = $this->executeQuery($sql, $params); while ($row = $stmt->fetch()) { $result[] = $function($row); } $stmt->closeCursor(); return $result; } public function query() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4163', 'Connection::query() is deprecated, use Connection::executeQuery() instead.'); $connection = $this->getWrappedConnection(); $args = func_get_args(); $logger = $this->_config->getSQLLogger(); if ($logger) { $logger->startQuery($args[0]); } try { $statement = $connection->query(...$args); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $args[0]); } $statement->setFetchMode($this->defaultFetchMode); if ($logger) { $logger->stopQuery(); } return $statement; } public function executeUpdate($sql, array $params = [], array $types = []) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4163', 'Connection::executeUpdate() is deprecated, use Connection::executeStatement() instead.'); return $this->executeStatement($sql, $params, $types); } public function executeStatement($sql, array $params = [], array $types = []) { $connection = $this->getWrappedConnection(); $logger = $this->_config->getSQLLogger(); if ($logger) { $logger->startQuery($sql, $params, $types); } try { if ($params) { [$sql, $params, $types] = SQLParserUtils::expandListParameters($sql, $params, $types); $stmt = $connection->prepare($sql); if ($types) { $this->_bindTypedValues($stmt, $params, $types); $stmt->execute(); } else { $stmt->execute($params); } $result = $stmt->rowCount(); } else { $result = $connection->exec($sql); } } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $sql, $params, $types); } if ($logger) { $logger->stopQuery(); } return $result; } public function exec($sql) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4163', 'Connection::exec() is deprecated, use Connection::executeStatement() instead.'); $connection = $this->getWrappedConnection(); $logger = $this->_config->getSQLLogger(); if ($logger) { $logger->startQuery($sql); } try { $result = $connection->exec($sql); } catch (Throwable $e) { $this->handleExceptionDuringQuery($e, $sql); } if ($logger) { $logger->stopQuery(); } return $result; } public function getTransactionNestingLevel() { return $this->transactionNestingLevel; } public function errorCode() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/3507', 'Connection::errorCode() is deprecated, use getCode() or getSQLState() on Exception instead.'); return $this->getWrappedConnection()->errorCode(); } public function errorInfo() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/3507', 'Connection::errorInfo() is deprecated, use getCode() or getSQLState() on Exception instead.'); return $this->getWrappedConnection()->errorInfo(); } public function lastInsertId($name = null) { return $this->getWrappedConnection()->lastInsertId($name); } public function transactional(Closure $func) { $this->beginTransaction(); try { $res = $func($this); $this->commit(); return $res; } catch (Throwable $e) { $this->rollBack(); throw $e; } } public function setNestTransactionsWithSavepoints($nestTransactionsWithSavepoints) { if ($this->transactionNestingLevel > 0) { throw ConnectionException::mayNotAlterNestedTransactionWithSavepointsInTransaction(); } if (!$this->getDatabasePlatform()->supportsSavepoints()) { throw ConnectionException::savepointsNotSupported(); } $this->nestTransactionsWithSavepoints = (bool) $nestTransactionsWithSavepoints; } public function getNestTransactionsWithSavepoints() { return $this->nestTransactionsWithSavepoints; } protected function _getNestedTransactionSavePointName() { return 'DOCTRINE2_SAVEPOINT_' . $this->transactionNestingLevel; } public function beginTransaction() { $connection = $this->getWrappedConnection(); ++$this->transactionNestingLevel; $logger = $this->_config->getSQLLogger(); if ($this->transactionNestingLevel === 1) { if ($logger) { $logger->startQuery('"START TRANSACTION"'); } $connection->beginTransaction(); if ($logger) { $logger->stopQuery(); } } elseif ($this->nestTransactionsWithSavepoints) { if ($logger) { $logger->startQuery('"SAVEPOINT"'); } $this->createSavepoint($this->_getNestedTransactionSavePointName()); if ($logger) { $logger->stopQuery(); } } return \true; } public function commit() { if ($this->transactionNestingLevel === 0) { throw ConnectionException::noActiveTransaction(); } if ($this->isRollbackOnly) { throw ConnectionException::commitFailedRollbackOnly(); } $result = \true; $connection = $this->getWrappedConnection(); $logger = $this->_config->getSQLLogger(); if ($this->transactionNestingLevel === 1) { if ($logger) { $logger->startQuery('"COMMIT"'); } $result = $connection->commit(); if ($logger) { $logger->stopQuery(); } } elseif ($this->nestTransactionsWithSavepoints) { if ($logger) { $logger->startQuery('"RELEASE SAVEPOINT"'); } $this->releaseSavepoint($this->_getNestedTransactionSavePointName()); if ($logger) { $logger->stopQuery(); } } --$this->transactionNestingLevel; if ($this->autoCommit !== \false || $this->transactionNestingLevel !== 0) { return $result; } $this->beginTransaction(); return $result; } private function commitAll() : void { while ($this->transactionNestingLevel !== 0) { if ($this->autoCommit === \false && $this->transactionNestingLevel === 1) { $this->commit(); return; } $this->commit(); } } public function rollBack() { if ($this->transactionNestingLevel === 0) { throw ConnectionException::noActiveTransaction(); } $connection = $this->getWrappedConnection(); $logger = $this->_config->getSQLLogger(); if ($this->transactionNestingLevel === 1) { if ($logger) { $logger->startQuery('"ROLLBACK"'); } $this->transactionNestingLevel = 0; $connection->rollBack(); $this->isRollbackOnly = \false; if ($logger) { $logger->stopQuery(); } if ($this->autoCommit === \false) { $this->beginTransaction(); } } elseif ($this->nestTransactionsWithSavepoints) { if ($logger) { $logger->startQuery('"ROLLBACK TO SAVEPOINT"'); } $this->rollbackSavepoint($this->_getNestedTransactionSavePointName()); --$this->transactionNestingLevel; if ($logger) { $logger->stopQuery(); } } else { $this->isRollbackOnly = \true; --$this->transactionNestingLevel; } return \true; } public function createSavepoint($savepoint) { $platform = $this->getDatabasePlatform(); if (!$platform->supportsSavepoints()) { throw ConnectionException::savepointsNotSupported(); } $this->getWrappedConnection()->exec($platform->createSavePoint($savepoint)); } public function releaseSavepoint($savepoint) { $platform = $this->getDatabasePlatform(); if (!$platform->supportsSavepoints()) { throw ConnectionException::savepointsNotSupported(); } if (!$platform->supportsReleaseSavepoints()) { return; } $this->getWrappedConnection()->exec($platform->releaseSavePoint($savepoint)); } public function rollbackSavepoint($savepoint) { $platform = $this->getDatabasePlatform(); if (!$platform->supportsSavepoints()) { throw ConnectionException::savepointsNotSupported(); } $this->getWrappedConnection()->exec($platform->rollbackSavePoint($savepoint)); } public function getWrappedConnection() { $this->connect(); assert($this->_conn !== null); return $this->_conn; } public function getSchemaManager() { if ($this->_schemaManager === null) { $this->_schemaManager = $this->_driver->getSchemaManager($this); } return $this->_schemaManager; } public function setRollbackOnly() { if ($this->transactionNestingLevel === 0) { throw ConnectionException::noActiveTransaction(); } $this->isRollbackOnly = \true; } public function isRollbackOnly() { if ($this->transactionNestingLevel === 0) { throw ConnectionException::noActiveTransaction(); } return $this->isRollbackOnly; } public function convertToDatabaseValue($value, $type) { return Type::getType($type)->convertToDatabaseValue($value, $this->getDatabasePlatform()); } public function convertToPHPValue($value, $type) { return Type::getType($type)->convertToPHPValue($value, $this->getDatabasePlatform()); } private function _bindTypedValues($stmt, array $params, array $types) { if (is_int(key($params))) { $typeOffset = array_key_exists(0, $types) ? -1 : 0; $bindIndex = 1; foreach ($params as $value) { $typeIndex = $bindIndex + $typeOffset; if (isset($types[$typeIndex])) { $type = $types[$typeIndex]; [$value, $bindingType] = $this->getBindingInfo($value, $type); $stmt->bindValue($bindIndex, $value, $bindingType); } else { $stmt->bindValue($bindIndex, $value); } ++$bindIndex; } } else { foreach ($params as $name => $value) { if (isset($types[$name])) { $type = $types[$name]; [$value, $bindingType] = $this->getBindingInfo($value, $type); $stmt->bindValue($name, $value, $bindingType); } else { $stmt->bindValue($name, $value); } } } } private function getBindingInfo($value, $type) : array { if (is_string($type)) { $type = Type::getType($type); } if ($type instanceof Type) { $value = $type->convertToDatabaseValue($value, $this->getDatabasePlatform()); $bindingType = $type->getBindingType(); } else { $bindingType = $type ?? ParameterType::STRING; } return [$value, $bindingType]; } public function resolveParams(array $params, array $types) { $resolvedParams = []; if (is_int(key($params))) { $typeOffset = array_key_exists(0, $types) ? -1 : 0; $bindIndex = 1; foreach ($params as $value) { $typeIndex = $bindIndex + $typeOffset; if (isset($types[$typeIndex])) { $type = $types[$typeIndex]; [$value] = $this->getBindingInfo($value, $type); $resolvedParams[$bindIndex] = $value; } else { $resolvedParams[$bindIndex] = $value; } ++$bindIndex; } } else { foreach ($params as $name => $value) { if (isset($types[$name])) { $type = $types[$name]; [$value] = $this->getBindingInfo($value, $type); $resolvedParams[$name] = $value; } else { $resolvedParams[$name] = $value; } } } return $resolvedParams; } public function createQueryBuilder() { return new Query\QueryBuilder($this); } public function ping() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4119', 'Retry and reconnecting lost connections now happens automatically, ping() will be removed in DBAL 3.'); $connection = $this->getWrappedConnection(); if ($connection instanceof PingableConnection) { return $connection->ping(); } try { $this->query($this->getDatabasePlatform()->getDummySelectSQL()); return \true; } catch (DBALException $e) { return \false; } } public function handleExceptionDuringQuery(Throwable $e, string $sql, array $params = [], array $types = []) : void { $this->throw(Exception::driverExceptionDuringQuery($this->_driver, $e, $sql, $this->resolveParams($params, $types))); } public function handleDriverException(Throwable $e) : void { $this->throw(Exception::driverException($this->_driver, $e)); } private function throw(Exception $e) : void { if ($e instanceof ConnectionLost) { $this->close(); } throw $e; } private function ensureHasKeyValue(ResultStatement $stmt) : void { $columnCount = $stmt->columnCount(); if ($columnCount < 2) { throw NoKeyValue::fromColumnCount($columnCount); } } }
|
vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
namespace MailPoetVendor\Doctrine\DBAL; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\DBAL\Driver\DriverException as DeprecatedDriverException; use MailPoetVendor\Doctrine\DBAL\Driver\ExceptionConverterDriver; use MailPoetVendor\Doctrine\DBAL\Exception\DriverException; use MailPoetVendor\Doctrine\DBAL\Platforms\AbstractPlatform; use MailPoetVendor\Doctrine\DBAL\Types\Type; use Throwable; use function array_map; use function bin2hex; use function get_class; use function gettype; use function implode; use function is_object; use function is_resource; use function is_string; use function json_encode; use function preg_replace; use function spl_object_hash; use function sprintf; class DBALException extends \Exception { public static function notSupported($method) { return new Exception(sprintf("Operation '%s' is not supported by platform.", $method)); } public static function invalidPlatformSpecified() : self { return new Exception("Invalid 'platform' option specified, need to give an instance of " . AbstractPlatform::class . '.'); } public static function invalidPlatformType($invalidPlatform) : self { if (is_object($invalidPlatform)) { return new Exception(sprintf("Option 'platform' must be a subtype of '%s', instance of '%s' given", AbstractPlatform::class, get_class($invalidPlatform))); } return new Exception(sprintf("Option 'platform' must be an object and subtype of '%s'. Got '%s'", AbstractPlatform::class, gettype($invalidPlatform))); } public static function invalidPlatformVersionSpecified($version, $expectedFormat) { return new Exception(sprintf('Invalid platform version "%s" specified. ' . 'The platform version has to be specified in the format: "%s".', $version, $expectedFormat)); } public static function invalidPdoInstance() { return new Exception("The 'pdo' option was used in DriverManager::getConnection() but no " . 'instance of PDO was given.'); } public static function driverRequired($url = null) { if ($url) { return new Exception(sprintf("The options 'driver' or 'driverClass' are mandatory if a connection URL without scheme " . 'is given to DriverManager::getConnection(). Given URL: %s', $url)); } return new Exception("The options 'driver' or 'driverClass' are mandatory if no PDO " . 'instance is given to DriverManager::getConnection().'); } public static function unknownDriver($unknownDriverName, array $knownDrivers) { return new Exception("The given 'driver' " . $unknownDriverName . ' is unknown, ' . 'Doctrine currently supports only the following drivers: ' . implode(', ', $knownDrivers)); } public static function driverExceptionDuringQuery(Driver $driver, Throwable $driverEx, $sql, array $params = []) { $msg = "An exception occurred while executing '" . $sql . "'"; if ($params) { $msg .= ' with params ' . self::formatParameters($params); } $msg .= ":\n\n" . $driverEx->getMessage(); return
|
1 |
Â
<?php
|
2 |
+
namespace MailPoetVendor\Doctrine\DBAL; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\DBAL\Driver\DriverException as DeprecatedDriverException; use MailPoetVendor\Doctrine\DBAL\Driver\ExceptionConverterDriver; use MailPoetVendor\Doctrine\DBAL\Exception\DriverException; use MailPoetVendor\Doctrine\DBAL\Platforms\AbstractPlatform; use MailPoetVendor\Doctrine\DBAL\Types\Type; use Throwable; use function array_map; use function bin2hex; use function get_class; use function gettype; use function implode; use function is_object; use function is_resource; use function is_string; use function json_encode; use function preg_replace; use function spl_object_hash; use function sprintf; class DBALException extends \Exception { public static function notSupported($method) { return new Exception(sprintf("Operation '%s' is not supported by platform.", $method)); } public static function invalidPlatformSpecified() : self { return new Exception("Invalid 'platform' option specified, need to give an instance of " . AbstractPlatform::class . '.'); } public static function invalidPlatformType($invalidPlatform) : self { if (is_object($invalidPlatform)) { return new Exception(sprintf("Option 'platform' must be a subtype of '%s', instance of '%s' given", AbstractPlatform::class, get_class($invalidPlatform))); } return new Exception(sprintf("Option 'platform' must be an object and subtype of '%s'. Got '%s'", AbstractPlatform::class, gettype($invalidPlatform))); } public static function invalidPlatformVersionSpecified($version, $expectedFormat) { return new Exception(sprintf('Invalid platform version "%s" specified. ' . 'The platform version has to be specified in the format: "%s".', $version, $expectedFormat)); } public static function invalidPdoInstance() { return new Exception("The 'pdo' option was used in DriverManager::getConnection() but no " . 'instance of PDO was given.'); } public static function driverRequired($url = null) { if ($url) { return new Exception(sprintf("The options 'driver' or 'driverClass' are mandatory if a connection URL without scheme " . 'is given to DriverManager::getConnection(). Given URL: %s', $url)); } return new Exception("The options 'driver' or 'driverClass' are mandatory if no PDO " . 'instance is given to DriverManager::getConnection().'); } public static function unknownDriver($unknownDriverName, array $knownDrivers) { return new Exception("The given 'driver' " . $unknownDriverName . ' is unknown, ' . 'Doctrine currently supports only the following drivers: ' . implode(', ', $knownDrivers)); } public static function driverExceptionDuringQuery(Driver $driver, Throwable $driverEx, $sql, array $params = []) { $msg = "An exception occurred while executing '" . $sql . "'"; if ($params) { $msg .= ' with params ' . self::formatParameters($params); } $msg .= ":\n\n" . $driverEx->getMessage(); return self::wrapException($driver, $driverEx, $msg); } public static function driverException(Driver $driver, Throwable $driverEx) { return self::wrapException($driver, $driverEx, 'An exception occurred in driver: ' . $driverEx->getMessage()); } private static function wrapException(Driver $driver, Throwable $driverEx, string $msg) { if ($driverEx instanceof DriverException) { return $driverEx; } if ($driver instanceof ExceptionConverterDriver && $driverEx instanceof DeprecatedDriverException) { return $driver->convertException($msg, $driverEx); } return new Exception($msg, 0, $driverEx); } private static function formatParameters(array $params) { return '[' . implode(', ', array_map(static function ($param) { if (is_resource($param)) { return (string) $param; } $json = @json_encode($param); if (!is_string($json) || $json === 'null' && is_string($param)) { return sprintf('"%s"', preg_replace('/.{2}/', '\\x$0', bin2hex($param))); } return $json; }, $params)) . ']'; } public static function invalidWrapperClass($wrapperClass) { return new Exception("The given 'wrapperClass' " . $wrapperClass . ' has to be a ' . 'subtype of \\Doctrine\\DBAL\\Connection.'); } public static function invalidDriverClass($driverClass) { return new Exception("The given 'driverClass' " . $driverClass . ' has to implement the ' . Driver::class . ' interface.'); } public static function invalidTableName($tableName) { return new Exception('Invalid table name specified: ' . $tableName); } public static function noColumnsSpecifiedForTable($tableName) { return new Exception('No columns specified for table ' . $tableName); } public static function limitOffsetInvalid() { return new Exception('Invalid Offset in Limit Query, it has to be larger than or equal to 0.'); } public static function typeExists($name) { return new Exception('Type ' . $name . ' already exists.'); } public static function unknownColumnType($name) { return new Exception('Unknown column type "' . $name . '" requested. Any Doctrine type that you use has ' . 'to be registered with \\Doctrine\\DBAL\\Types\\Type::addType(). You can get a list of all the ' . 'known types with \\Doctrine\\DBAL\\Types\\Type::getTypesMap(). If this error occurs during database ' . 'introspection then you might have forgotten to register all database types for a Doctrine Type. Use ' . 'AbstractPlatform#registerDoctrineTypeMapping() or have your custom types implement ' . 'Type#getMappedDatabaseTypes(). If the type name is empty you might ' . 'have a problem with the cache or forgot some mapping information.'); } public static function typeNotFound($name) { return new Exception('Type to be overwritten ' . $name . ' does not exist.'); } public static function typeNotRegistered(Type $type) : self { return new Exception(sprintf('Type of the class %s@%s is not registered.', get_class($type), spl_object_hash($type))); } public static function typeAlreadyRegistered(Type $type) : self { return new Exception(sprintf('Type of the class %s@%s is already registered.', get_class($type), spl_object_hash($type))); } }
|
vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractException.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
declare (strict_types=1); namespace MailPoetVendor\Doctrine\DBAL\Driver; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\Deprecations\Deprecation; use Exception as BaseException; abstract class AbstractException extends BaseException implements DriverException { private $errorCode; private $sqlState; public function __construct($message, $sqlState = null, $errorCode = null) { parent::__construct($message); $this->errorCode = $errorCode; $this->sqlState = $sqlState; } public function getErrorCode() { Deprecation::triggerIfCalledFromOutside('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4112', 'Driver\\AbstractException::getErrorCode() is deprecated, use getSQLState() or getCode() instead.'); return $this->errorCode; } public function getSQLState() { return $this->sqlState; } }
|
1 |
Â
<?php
|
2 |
+
declare (strict_types=1); namespace MailPoetVendor\Doctrine\DBAL\Driver; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\Deprecations\Deprecation; use Exception as BaseException; use Throwable; abstract class AbstractException extends BaseException implements DriverException { private $errorCode; private $sqlState; public function __construct($message, $sqlState = null, $errorCode = null, ?Throwable $previous = null) { parent::__construct($message, 0, $previous); $this->errorCode = $errorCode; $this->sqlState = $sqlState; } public function getErrorCode() { Deprecation::triggerIfCalledFromOutside('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4112', 'Driver\\AbstractException::getErrorCode() is deprecated, use getSQLState() or getCode() instead.'); return $this->errorCode; } public function getSQLState() { return $this->sqlState; } }
|
vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/DriverManager.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
namespace MailPoetVendor\Doctrine\DBAL; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\Common\EventManager; use MailPoetVendor\Doctrine\DBAL\Driver\DrizzlePDOMySql; use MailPoetVendor\Doctrine\DBAL\Driver\IBMDB2; use MailPoetVendor\Doctrine\DBAL\Driver\Mysqli; use MailPoetVendor\Doctrine\DBAL\Driver\OCI8; use MailPoetVendor\Doctrine\DBAL\Driver\PDO; use MailPoetVendor\Doctrine\DBAL\Driver\SQLAnywhere; use MailPoetVendor\Doctrine\DBAL\Driver\SQLSrv; use function array_keys; use function array_merge; use function
|
1 |
Â
<?php
|
2 |
+
namespace MailPoetVendor\Doctrine\DBAL; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\Common\EventManager; use MailPoetVendor\Doctrine\DBAL\Driver\DrizzlePDOMySql; use MailPoetVendor\Doctrine\DBAL\Driver\IBMDB2; use MailPoetVendor\Doctrine\DBAL\Driver\Mysqli; use MailPoetVendor\Doctrine\DBAL\Driver\OCI8; use MailPoetVendor\Doctrine\DBAL\Driver\PDO; use MailPoetVendor\Doctrine\DBAL\Driver\SQLAnywhere; use MailPoetVendor\Doctrine\DBAL\Driver\SQLSrv; use function array_keys; use function array_merge; use function class_implements; use function in_array; use function is_string; use function is_subclass_of; use function parse_str; use function parse_url; use function preg_replace; use function rawurldecode; use function str_replace; use function strpos; use function substr; final class DriverManager { private const DRIVER_MAP = ['pdo_mysql' => PDO\MySQL\Driver::class, 'pdo_sqlite' => PDO\SQLite\Driver::class, 'pdo_pgsql' => PDO\PgSQL\Driver::class, 'pdo_oci' => PDO\OCI\Driver::class, 'oci8' => OCI8\Driver::class, 'ibm_db2' => IBMDB2\Driver::class, 'pdo_sqlsrv' => PDO\SQLSrv\Driver::class, 'mysqli' => Mysqli\Driver::class, 'drizzle_pdo_mysql' => DrizzlePDOMySql\Driver::class, 'sqlanywhere' => SQLAnywhere\Driver::class, 'sqlsrv' => SQLSrv\Driver::class]; private static $driverSchemeAliases = [ 'db2' => 'ibm_db2', 'mssql' => 'pdo_sqlsrv', 'mysql' => 'pdo_mysql', 'mysql2' => 'pdo_mysql', 'postgres' => 'pdo_pgsql', 'postgresql' => 'pdo_pgsql', 'pgsql' => 'pdo_pgsql', 'sqlite' => 'pdo_sqlite', 'sqlite3' => 'pdo_sqlite', ]; private function __construct() { } public static function getConnection(array $params, ?Configuration $config = null, ?EventManager $eventManager = null) : Connection { if (!$config) { $config = new Configuration(); } if (!$eventManager) { $eventManager = new EventManager(); } $params = self::parseDatabaseUrl($params); if (isset($params['master'])) { $params['master'] = self::parseDatabaseUrl($params['master']); } if (isset($params['slaves'])) { foreach ($params['slaves'] as $key => $slaveParams) { $params['slaves'][$key] = self::parseDatabaseUrl($slaveParams); } } if (isset($params['primary'])) { $params['primary'] = self::parseDatabaseUrl($params['primary']); } if (isset($params['replica'])) { foreach ($params['replica'] as $key => $replicaParams) { $params['replica'][$key] = self::parseDatabaseUrl($replicaParams); } } if (isset($params['global'])) { $params['global'] = self::parseDatabaseUrl($params['global']); } if (isset($params['shards'])) { foreach ($params['shards'] as $key => $shardParams) { $params['shards'][$key] = self::parseDatabaseUrl($shardParams); } } if (isset($params['pdo']) && !$params['pdo'] instanceof \PDO) { throw Exception::invalidPdoInstance(); } if (isset($params['pdo'])) { $params['pdo']->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); $params['driver'] = 'pdo_' . $params['pdo']->getAttribute(\PDO::ATTR_DRIVER_NAME); } $driver = self::createDriver($params); $wrapperClass = Connection::class; if (isset($params['wrapperClass'])) { if (!is_subclass_of($params['wrapperClass'], $wrapperClass)) { throw Exception::invalidWrapperClass($params['wrapperClass']); } $wrapperClass = $params['wrapperClass']; } return new $wrapperClass($params, $driver, $config, $eventManager); } public static function getAvailableDrivers() : array { return array_keys(self::DRIVER_MAP); } private static function createDriver(array $params) : Driver { if (isset($params['driverClass'])) { $interfaces = class_implements($params['driverClass'], \true); if ($interfaces === \false || !in_array(Driver::class, $interfaces)) { throw Exception::invalidDriverClass($params['driverClass']); } return new $params['driverClass'](); } if (isset($params['driver'])) { if (!isset(self::DRIVER_MAP[$params['driver']])) { throw Exception::unknownDriver($params['driver'], array_keys(self::DRIVER_MAP)); } $class = self::DRIVER_MAP[$params['driver']]; return new $class(); } throw Exception::driverRequired(); } private static function normalizeDatabaseUrlPath(string $urlPath) : string { return substr($urlPath, 1); } private static function parseDatabaseUrl(array $params) : array { if (!isset($params['url'])) { return $params; } $url = preg_replace('#^((?:pdo_)?sqlite3?):///#', '$1://localhost/', $params['url']); $url = parse_url($url); if ($url === \false) { throw new Exception('Malformed parameter "url".'); } foreach ($url as $param => $value) { if (!is_string($value)) { continue; } $url[$param] = rawurldecode($value); } unset($params['pdo']); $params = self::parseDatabaseUrlScheme($url['scheme'] ?? null, $params); if (isset($url['host'])) { $params['host'] = $url['host']; } if (isset($url['port'])) { $params['port'] = $url['port']; } if (isset($url['user'])) { $params['user'] = $url['user']; } if (isset($url['pass'])) { $params['password'] = $url['pass']; } $params = self::parseDatabaseUrlPath($url, $params); $params = self::parseDatabaseUrlQuery($url, $params); return $params; } private static function parseDatabaseUrlPath(array $url, array $params) : array { if (!isset($url['path'])) { return $params; } $url['path'] = self::normalizeDatabaseUrlPath($url['path']); if (!isset($params['driver'])) { return self::parseRegularDatabaseUrlPath($url, $params); } if (strpos($params['driver'], 'sqlite') !== \false) { return self::parseSqliteDatabaseUrlPath($url, $params); } return self::parseRegularDatabaseUrlPath($url, $params); } private static function parseDatabaseUrlQuery(array $url, array $params) : array { if (!isset($url['query'])) { return $params; } $query = []; parse_str($url['query'], $query); return array_merge($params, $query); } private static function parseRegularDatabaseUrlPath(array $url, array $params) : array { $params['dbname'] = $url['path']; return $params; } private static function parseSqliteDatabaseUrlPath(array $url, array $params) : array { if ($url['path'] === ':memory:') { $params['memory'] = \true; return $params; } $params['path'] = $url['path']; return $params; } private static function parseDatabaseUrlScheme($scheme, array $params) : array { if ($scheme !== null) { unset($params['driverClass']); $driver = str_replace('-', '_', $scheme); $params['driver'] = self::$driverSchemeAliases[$driver] ?? $driver; return $params; } if (!isset($params['driverClass']) && !isset($params['driver'])) { throw Exception::driverRequired($params['url']); } return $params; } }
|
vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/AbstractPlatform.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
namespace MailPoetVendor\Doctrine\DBAL\Platforms; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\Common\EventManager; use MailPoetVendor\Doctrine\DBAL\Event\SchemaAlterTableAddColumnEventArgs; use MailPoetVendor\Doctrine\DBAL\Event\SchemaAlterTableChangeColumnEventArgs; use MailPoetVendor\Doctrine\DBAL\Event\SchemaAlterTableEventArgs; use MailPoetVendor\Doctrine\DBAL\Event\SchemaAlterTableRemoveColumnEventArgs; use MailPoetVendor\Doctrine\DBAL\Event\SchemaAlterTableRenameColumnEventArgs; use MailPoetVendor\Doctrine\DBAL\Event\SchemaCreateTableColumnEventArgs; use MailPoetVendor\Doctrine\DBAL\Event\SchemaCreateTableEventArgs; use MailPoetVendor\Doctrine\DBAL\Event\SchemaDropTableEventArgs; use MailPoetVendor\Doctrine\DBAL\Events; use MailPoetVendor\Doctrine\DBAL\Exception; use MailPoetVendor\Doctrine\DBAL\Platforms\Keywords\KeywordList; use MailPoetVendor\Doctrine\DBAL\Schema\Column; use MailPoetVendor\Doctrine\DBAL\Schema\ColumnDiff; use MailPoetVendor\Doctrine\DBAL\Schema\Constraint; use MailPoetVendor\Doctrine\DBAL\Schema\ForeignKeyConstraint; use MailPoetVendor\Doctrine\DBAL\Schema\Identifier; use MailPoetVendor\Doctrine\DBAL\Schema\Index; use MailPoetVendor\Doctrine\DBAL\Schema\Sequence; use MailPoetVendor\Doctrine\DBAL\Schema\Table; use MailPoetVendor\Doctrine\DBAL\Schema\TableDiff; use MailPoetVendor\Doctrine\DBAL\TransactionIsolationLevel; use MailPoetVendor\Doctrine\DBAL\Types; use MailPoetVendor\Doctrine\DBAL\Types\Type; use MailPoetVendor\Doctrine\Deprecations\Deprecation; use InvalidArgumentException; use UnexpectedValueException; use function addcslashes; use function array_map; use function array_merge; use function array_unique; use function array_values; use function assert; use function count; use function explode; use function func_get_arg; use function func_get_args; use function func_num_args; use function implode; use function in_array; use function is_array; use function is_bool; use function is_int; use function is_string; use function preg_quote; use function preg_replace; use function sprintf; use function str_replace; use function strlen; use function strpos; use function strtolower; use function strtoupper; abstract class AbstractPlatform { public const CREATE_INDEXES = 1; public const CREATE_FOREIGNKEYS = 2; public const DATE_INTERVAL_UNIT_SECOND = DateIntervalUnit::SECOND; public const DATE_INTERVAL_UNIT_MINUTE = DateIntervalUnit::MINUTE; public const DATE_INTERVAL_UNIT_HOUR = DateIntervalUnit::HOUR; public const DATE_INTERVAL_UNIT_DAY = DateIntervalUnit::DAY; public const DATE_INTERVAL_UNIT_WEEK = DateIntervalUnit::WEEK; public const DATE_INTERVAL_UNIT_MONTH = DateIntervalUnit::MONTH; public const DATE_INTERVAL_UNIT_QUARTER = DateIntervalUnit::QUARTER; public const DATE_INTERVAL_UNIT_YEAR = DateIntervalUnit::YEAR; public const TRIM_UNSPECIFIED = TrimMode::UNSPECIFIED; public const TRIM_LEADING = TrimMode::LEADING; public const TRIM_TRAILING = TrimMode::TRAILING; public const TRIM_BOTH = TrimMode::BOTH; protected $doctrineTypeMapping; protected $doctrineTypeComments; protected $_eventManager; protected $_keywords; public function __construct() { } public function setEventManager(EventManager $eventManager) { $this->_eventManager = $eventManager; } public function getEventManager() { return $this->_eventManager; } public abstract function getBooleanTypeDeclarationSQL(array $column); public abstract function getIntegerTypeDeclarationSQL(array $column); public abstract function getBigIntTypeDeclarationSQL(array $column); public abstract function getSmallIntTypeDeclarationSQL(array $column); protected abstract function _getCommonIntegerTypeDeclarationSQL(array $column); protected abstract function initializeDoctrineTypeMappings(); private function initializeAllDoctrineTypeMappings() { $this->initializeDoctrineTypeMappings(); foreach (Type::getTypesMap() as $typeName => $className) { foreach (Type::getType($typeName)->getMappedDatabaseTypes($this) as $dbType) { $this->doctrineTypeMapping[$dbType] = $typeName; } } } public function getAsciiStringTypeDeclarationSQL(array $column) : string { return $this->getVarcharTypeDeclarationSQL($column); } public function getVarcharTypeDeclarationSQL(array $column) { if (!isset($column['length'])) { $column['length'] = $this->getVarcharDefaultLength(); } $fixed = $column['fixed'] ?? \false; $maxLength = $fixed ? $this->getCharMaxLength() : $this->getVarcharMaxLength(); if ($column['length'] > $maxLength) { return $this->getClobTypeDeclarationSQL($column); } return $this->getVarcharTypeDeclarationSQLSnippet($column['length'], $fixed); } public function getBinaryTypeDeclarationSQL(array $column) { if (!isset($column['length'])) { $column['length'] = $this->getBinaryDefaultLength(); } $fixed = $column['fixed'] ?? \false; $maxLength = $this->getBinaryMaxLength(); if ($column['length'] > $maxLength) { if ($maxLength > 0) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/issues/3187', 'Binary column length %d is greater than supported by the platform (%d).' . ' Reduce the column length or use a BLOB column instead.', $column['length'], $maxLength); } return $this->getBlobTypeDeclarationSQL($column); } return $this->getBinaryTypeDeclarationSQLSnippet($column['length'], $fixed); } public function getGuidTypeDeclarationSQL(array $column) { $column['length'] = 36; $column['fixed'] = \true; return $this->getVarcharTypeDeclarationSQL($column); } public function getJsonTypeDeclarationSQL(array $column) { return $this->getClobTypeDeclarationSQL($column); } protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed) { throw Exception::notSupported('VARCHARs not supported by Platform.'); } protected function getBinaryTypeDeclarationSQLSnippet($length, $fixed) { throw Exception::notSupported('BINARY/VARBINARY column types are not supported by this platform.'); } public abstract function getClobTypeDeclarationSQL(array $column); public abstract function getBlobTypeDeclarationSQL(array $column); public abstract function getName(); public function registerDoctrineTypeMapping($dbType, $doctrineType) { if ($this->doctrineTypeMapping === null) { $this->initializeAllDoctrineTypeMappings(); } if (!Types\Type::hasType($doctrineType)) { throw Exception::typeNotFound($doctrineType); } $dbType = strtolower($dbType); $this->doctrineTypeMapping[$dbType] = $doctrineType; $doctrineType = Type::getType($doctrineType); if (!$doctrineType->requiresSQLCommentHint($this)) { return; } $this->markDoctrineTypeCommented($doctrineType); } public function getDoctrineTypeMapping($dbType) { if ($this->doctrineTypeMapping === null) { $this->initializeAllDoctrineTypeMappings(); } $dbType = strtolower($dbType); if (!isset($this->doctrineTypeMapping[$dbType])) { throw new Exception('Unknown database type ' . $dbType . ' requested, ' . static::class . ' may not support it.'); } return $this->doctrineTypeMapping[$dbType]; } public function hasDoctrineTypeMappingFor($dbType) { if ($this->doctrineTypeMapping === null) { $this->initializeAllDoctrineTypeMappings(); } $dbType = strtolower($dbType); return isset($this->doctrineTypeMapping[$dbType]); } protected function initializeCommentedDoctrineTypes() { $this->doctrineTypeComments = []; foreach (Type::getTypesMap() as $typeName => $className) { $type = Type::getType($typeName); if (!$type->requiresSQLCommentHint($this)) { continue; } $this->doctrineTypeComments[] = $typeName; } } public function isCommentedDoctrineType(Type $doctrineType) { if ($this->doctrineTypeComments === null) { $this->initializeCommentedDoctrineTypes(); } assert(is_array($this->doctrineTypeComments)); return in_array($doctrineType->getName(), $this->doctrineTypeComments); } public function markDoctrineTypeCommented($doctrineType) { if ($this->doctrineTypeComments === null) { $this->initializeCommentedDoctrineTypes(); } assert(is_array($this->doctrineTypeComments)); $this->doctrineTypeComments[] = $doctrineType instanceof Type ? $doctrineType->getName() : $doctrineType; } public function getDoctrineTypeComment(Type $doctrineType) { return '(DC2Type:' . $doctrineType->getName() . ')'; } protected function getColumnComment(Column $column) { $comment = $column->getComment(); if ($this->isCommentedDoctrineType($column->getType())) { $comment .= $this->getDoctrineTypeComment($column->getType()); } return $comment; } public function getIdentifierQuoteCharacter() { return '"'; } public function getSqlCommentStartString() { return '--'; } public function getSqlCommentEndString() { return "\n"; } public function getCharMaxLength() : int { return $this->getVarcharMaxLength(); } public function getVarcharMaxLength() { return 4000; } public function getVarcharDefaultLength() { return 255; } public function getBinaryMaxLength() { return 4000; } public function getBinaryDefaultLength() { return 255; } public function getWildcards() { return ['%', '_']; } public function getRegexpExpression() { throw Exception::notSupported(__METHOD__); } public function getGuidExpression() { throw Exception::notSupported(__METHOD__); } public function getAvgExpression($column) { return 'AVG(' . $column . ')'; } public function getCountExpression($column) { return 'COUNT(' . $column . ')'; } public function getMaxExpression($column) { return 'MAX(' . $column . ')'; } public function getMinExpression($column) { return 'MIN(' . $column . ')'; } public function getSumExpression($column) { return 'SUM(' . $column . ')'; } public function getMd5Expression($column) { return 'MD5(' . $column . ')'; } public function getLengthExpression($column) { return 'LENGTH(' . $column . ')'; } public function getSqrtExpression($column) { return 'SQRT(' . $column . ')'; } public function getRoundExpression($column, $decimals = 0) { return 'ROUND(' . $column . ', ' . $decimals . ')'; } public function getModExpression($expression1, $expression2) { return 'MOD(' . $expression1 . ', ' . $expression2 . ')'; } public function getTrimExpression($str, $mode = TrimMode::UNSPECIFIED, $char = \false) { $expression = ''; switch ($mode) { case TrimMode::LEADING: $expression = 'LEADING '; break; case TrimMode::TRAILING: $expression = 'TRAILING '; break; case TrimMode::BOTH: $expression = 'BOTH '; break; } if ($char !== \false) { $expression .= $char . ' '; } if ($mode || $char !== \false) { $expression .= 'FROM '; } return 'TRIM(' . $expression . $str . ')'; } public function getRtrimExpression($str) { return 'RTRIM(' . $str . ')'; } public function getLtrimExpression($str) { return 'LTRIM(' . $str . ')'; } public function getUpperExpression($str) { return 'UPPER(' . $str . ')'; } public function getLowerExpression($str) { return 'LOWER(' . $str . ')'; } public function getLocateExpression($str, $substr, $startPos = \false) { throw Exception::notSupported(__METHOD__); } public function getNowExpression() { return 'NOW()'; } public function getSubstringExpression($string, $start, $length = null) { if ($length === null) { return 'SUBSTRING(' . $string . ' FROM ' . $start . ')'; } return 'SUBSTRING(' . $string . ' FROM ' . $start . ' FOR ' . $length . ')'; } public function getConcatExpression() { return implode(' || ', func_get_args()); } public function getNotExpression($expression) { return 'NOT(' . $expression . ')'; } public function getIsNullExpression($expression) { return $expression . ' IS NULL'; } public function getIsNotNullExpression($expression) { return $expression . ' IS NOT NULL'; } public function getBetweenExpression($expression, $value1, $value2) { return $expression . ' BETWEEN ' . $value1 . ' AND ' . $value2; } public function getAcosExpression($value) { return 'ACOS(' . $value . ')'; } public function getSinExpression($value) { return 'SIN(' . $value . ')'; } public function getPiExpression() { return 'PI()'; } public function getCosExpression($value) { return 'COS(' . $value . ')'; } public function getDateDiffExpression($date1, $date2) { throw Exception::notSupported(__METHOD__); } public function getDateAddSecondsExpression($date, $seconds) { return $this->getDateArithmeticIntervalExpression($date, '+', $seconds, DateIntervalUnit::SECOND); } public function getDateSubSecondsExpression($date, $seconds) { return $this->getDateArithmeticIntervalExpression($date, '-', $seconds, DateIntervalUnit::SECOND); } public function getDateAddMinutesExpression($date, $minutes) { return $this->getDateArithmeticIntervalExpression($date, '+', $minutes, DateIntervalUnit::MINUTE); } public function getDateSubMinutesExpression($date, $minutes) { return $this->getDateArithmeticIntervalExpression($date, '-', $minutes, DateIntervalUnit::MINUTE); } public function getDateAddHourExpression($date, $hours) { return $this->getDateArithmeticIntervalExpression($date, '+', $hours, DateIntervalUnit::HOUR); } public function getDateSubHourExpression($date, $hours) { return $this->getDateArithmeticIntervalExpression($date, '-', $hours, DateIntervalUnit::HOUR); } public function getDateAddDaysExpression($date, $days) { return $this->getDateArithmeticIntervalExpression($date, '+', $days, DateIntervalUnit::DAY); } public function getDateSubDaysExpression($date, $days) { return $this->getDateArithmeticIntervalExpression($date, '-', $days, DateIntervalUnit::DAY); } public function getDateAddWeeksExpression($date, $weeks) { return $this->getDateArithmeticIntervalExpression($date, '+', $weeks, DateIntervalUnit::WEEK); } public function getDateSubWeeksExpression($date, $weeks) { return $this->getDateArithmeticIntervalExpression($date, '-', $weeks, DateIntervalUnit::WEEK); } public function getDateAddMonthExpression($date, $months) { return $this->getDateArithmeticIntervalExpression($date, '+', $months, DateIntervalUnit::MONTH); } public function getDateSubMonthExpression($date, $months) { return $this->getDateArithmeticIntervalExpression($date, '-', $months, DateIntervalUnit::MONTH); } public function getDateAddQuartersExpression($date, $quarters) { return $this->getDateArithmeticIntervalExpression($date, '+', $quarters, DateIntervalUnit::QUARTER); } public function getDateSubQuartersExpression($date, $quarters) { return $this->getDateArithmeticIntervalExpression($date, '-', $quarters, DateIntervalUnit::QUARTER); } public function getDateAddYearsExpression($date, $years) { return $this->getDateArithmeticIntervalExpression($date, '+', $years, DateIntervalUnit::YEAR); } public function getDateSubYearsExpression($date, $years) { return $this->getDateArithmeticIntervalExpression($date, '-', $years, DateIntervalUnit::YEAR); } protected function getDateArithmeticIntervalExpression($date, $operator, $interval, $unit) { throw Exception::notSupported(__METHOD__); } public function getBitAndComparisonExpression($value1, $value2) { return '(' . $value1 . ' & ' . $value2 . ')'; } public function getBitOrComparisonExpression($value1, $value2) { return '(' . $value1 . ' | ' . $value2 . ')'; } public function getForUpdateSQL() { return 'FOR UPDATE'; } public function appendLockHint($fromClause, $lockMode) { return $fromClause; } public function getReadLockSQL() { return $this->getForUpdateSQL(); } public function getWriteLockSQL() { return $this->getForUpdateSQL(); } public function getDropDatabaseSQL($name) { return 'DROP DATABASE ' . $name; } public function getDropTableSQL($table) { $tableArg = $table; if ($table instanceof Table) { $table = $table->getQuotedName($this); } if (!is_string($table)) { throw new InvalidArgumentException(__METHOD__ . '() expects $table parameter to be string or ' . Table::class . '.'); } if ($this->_eventManager !== null && $this->_eventManager->hasListeners(Events::onSchemaDropTable)) { $eventArgs = new SchemaDropTableEventArgs($tableArg, $this); $this->_eventManager->dispatchEvent(Events::onSchemaDropTable, $eventArgs); if ($eventArgs->isDefaultPrevented()) { $sql = $eventArgs->getSql(); if ($sql === null) { throw new UnexpectedValueException('Default implementation of DROP TABLE was overridden with NULL'); } return $sql; } } return 'DROP TABLE ' . $table; } public function getDropTemporaryTableSQL($table) { return $this->getDropTableSQL($table); } public function getDropIndexSQL($index, $table = null) { if ($index instanceof Index) { $index = $index->getQuotedName($this); } elseif (!is_string($index)) { throw new InvalidArgumentException(__METHOD__ . '() expects $index parameter to be string or ' . Index::class . '.'); } return 'DROP INDEX ' . $index; } public function getDropConstraintSQL($constraint, $table) { if (!$constraint instanceof Constraint) { $constraint = new Identifier($constraint); } if (!$table instanceof Table) { $table = new Identifier($table); } $constraint = $constraint->getQuotedName($this); $table = $table->getQuotedName($this); return 'ALTER TABLE ' . $table . ' DROP CONSTRAINT ' . $constraint; } public function getDropForeignKeySQL($foreignKey, $table) { if (!$foreignKey instanceof ForeignKeyConstraint) { $foreignKey = new Identifier($foreignKey); } if (!$table instanceof Table) { $table = new Identifier($table); } $foreignKey = $foreignKey->getQuotedName($this); $table = $table->getQuotedName($this); return 'ALTER TABLE ' . $table . ' DROP FOREIGN KEY ' . $foreignKey; } public function getCreateTableSQL(Table $table, $createFlags = self::CREATE_INDEXES) { if (!is_int($createFlags)) { throw new InvalidArgumentException('Second argument of AbstractPlatform::getCreateTableSQL() has to be integer.'); } if (count($table->getColumns()) === 0) { throw Exception::noColumnsSpecifiedForTable($table->getName()); } $tableName = $table->getQuotedName($this); $options = $table->getOptions(); $options['uniqueConstraints'] = []; $options['indexes'] = []; $options['primary'] = []; if (($createFlags & self::CREATE_INDEXES) > 0) { foreach ($table->getIndexes() as $index) { if ($index->isPrimary()) { $options['primary'] = $index->getQuotedColumns($this); $options['primary_index'] = $index; } else { $options['indexes'][$index->getQuotedName($this)] = $index; } } } $columnSql = []; $columns = []; foreach ($table->getColumns() as $column) { if ($this->_eventManager !== null && $this->_eventManager->hasListeners(Events::onSchemaCreateTableColumn)) { $eventArgs = new SchemaCreateTableColumnEventArgs($column, $table, $this); $this->_eventManager->dispatchEvent(Events::onSchemaCreateTableColumn, $eventArgs); $columnSql = array_merge($columnSql, $eventArgs->getSql()); if ($eventArgs->isDefaultPrevented()) { continue; } } $name = $column->getQuotedName($this); $columnData = array_merge($column->toArray(), ['name' => $name, 'version' => $column->hasPlatformOption('version') ? $column->getPlatformOption('version') : \false, 'comment' => $this->getColumnComment($column)]); if ($columnData['type'] instanceof Types\StringType && $columnData['length'] === null) { $columnData['length'] = 255; } if (in_array($column->getName(), $options['primary'])) { $columnData['primary'] = \true; } $columns[$name] = $columnData; } if (($createFlags & self::CREATE_FOREIGNKEYS) > 0) { $options['foreignKeys'] = []; foreach ($table->getForeignKeys() as $fkConstraint) { $options['foreignKeys'][] = $fkConstraint; } } if ($this->_eventManager !== null && $this->_eventManager->hasListeners(Events::onSchemaCreateTable)) { $eventArgs = new SchemaCreateTableEventArgs($table, $columns, $options, $this); $this->_eventManager->dispatchEvent(Events::onSchemaCreateTable, $eventArgs); if ($eventArgs->isDefaultPrevented()) { return array_merge($eventArgs->getSql(), $columnSql); } } $sql = $this->_getCreateTableSQL($tableName, $columns, $options); if ($this->supportsCommentOnStatement()) { if ($table->hasOption('comment')) { $sql[] = $this->getCommentOnTableSQL($tableName, $table->getOption('comment')); } foreach ($table->getColumns() as $column) { $comment = $this->getColumnComment($column); if ($comment === null || $comment === '') { continue; } $sql[] = $this->getCommentOnColumnSQL($tableName, $column->getQuotedName($this), $comment); } } return array_merge($sql, $columnSql); } protected function getCommentOnTableSQL(string $tableName, ?string $comment) : string { $tableName = new Identifier($tableName); return sprintf('COMMENT ON TABLE %s IS %s', $tableName->getQuotedName($this), $this->quoteStringLiteral((string) $comment)); } public function getCommentOnColumnSQL($tableName, $columnName, $comment) { $tableName = new Identifier($tableName); $columnName = new Identifier($columnName); return sprintf('COMMENT ON COLUMN %s.%s IS %s', $tableName->getQuotedName($this), $columnName->getQuotedName($this), $this->quoteStringLiteral((string) $comment)); } public function getInlineColumnCommentSQL($comment) { if (!$this->supportsInlineColumnComments()) { throw Exception::notSupported(__METHOD__); } return 'COMMENT ' . $this->quoteStringLiteral($comment); } protected function _getCreateTableSQL($name, array $columns, array $options = []) { $columnListSql = $this->getColumnDeclarationListSQL($columns); if (isset($options['uniqueConstraints']) && !empty($options['uniqueConstraints'])) { foreach ($options['uniqueConstraints'] as $index => $definition) { $columnListSql .= ', ' . $this->getUniqueConstraintDeclarationSQL($index, $definition); } } if (isset($options['primary']) && !empty($options['primary'])) { $columnListSql .= ', PRIMARY KEY(' . implode(', ', array_unique(array_values($options['primary']))) . ')'; } if (isset($options['indexes']) && !empty($options['indexes'])) { foreach ($options['indexes'] as $index => $definition) { $columnListSql .= ', ' . $this->getIndexDeclarationSQL($index, $definition); } } $query = 'CREATE TABLE ' . $name . ' (' . $columnListSql; $check = $this->getCheckDeclarationSQL($columns); if (!empty($check)) { $query .= ', ' . $check; } $query .= ')'; $sql = [$query]; if (isset($options['foreignKeys'])) { foreach ((array) $options['foreignKeys'] as $definition) { $sql[] = $this->getCreateForeignKeySQL($definition, $name); } } return $sql; } public function getCreateTemporaryTableSnippetSQL() { return 'CREATE TEMPORARY TABLE'; } public function getCreateSequenceSQL(Sequence $sequence) { throw Exception::notSupported(__METHOD__); } public function getAlterSequenceSQL(Sequence $sequence) { throw Exception::notSupported(__METHOD__); } public function getCreateConstraintSQL(Constraint $constraint, $table) { if ($table instanceof Table) { $table = $table->getQuotedName($this); } $query = 'ALTER TABLE ' . $table . ' ADD CONSTRAINT ' . $constraint->getQuotedName($this); $columnList = '(' . implode(', ', $constraint->getQuotedColumns($this)) . ')'; $referencesClause = ''; if ($constraint instanceof Index) { if ($constraint->isPrimary()) { $query .= ' PRIMARY KEY'; } elseif ($constraint->isUnique()) { $query .= ' UNIQUE'; } else { throw new InvalidArgumentException('Can only create primary or unique constraints, no common indexes with getCreateConstraintSQL().'); } } elseif ($constraint instanceof ForeignKeyConstraint) { $query .= ' FOREIGN KEY'; $referencesClause = ' REFERENCES ' . $constraint->getQuotedForeignTableName($this) . ' (' . implode(', ', $constraint->getQuotedForeignColumns($this)) . ')'; } $query .= ' ' . $columnList . $referencesClause; return $query; } public function getCreateIndexSQL(Index $index, $table) { if ($table instanceof Table) { $table = $table->getQuotedName($this); } $name = $index->getQuotedName($this); $columns = $index->getColumns(); if (count($columns) === 0) { throw new InvalidArgumentException("Incomplete definition. 'columns' required."); } if ($index->isPrimary()) { return $this->getCreatePrimaryKeySQL($index, $table); } $query = 'CREATE ' . $this->getCreateIndexSQLFlags($index) . 'INDEX ' . $name . ' ON ' . $table; $query .= ' (' . $this->getIndexFieldDeclarationListSQL($index) . ')' . $this->getPartialIndexSQL($index); return $query; } protected function getPartialIndexSQL(Index $index) { if ($this->supportsPartialIndexes() && $index->hasOption('where')) { return ' WHERE ' . $index->getOption('where'); } return ''; } protected function getCreateIndexSQLFlags(Index $index) { return $index->isUnique() ? 'UNIQUE ' : ''; } public function getCreatePrimaryKeySQL(Index $index, $table) { if ($table instanceof Table) { $table = $table->getQuotedName($this); } return 'ALTER TABLE ' . $table . ' ADD PRIMARY KEY (' . $this->getIndexFieldDeclarationListSQL($index) . ')'; } public function getCreateSchemaSQL($schemaName) { throw Exception::notSupported(__METHOD__); } public function quoteIdentifier($str) { if (strpos($str, '.') !== \false) { $parts = array_map([$this, 'quoteSingleIdentifier'], explode('.', $str)); return implode('.', $parts); } return $this->quoteSingleIdentifier($str); } public function quoteSingleIdentifier($str) { $c = $this->getIdentifierQuoteCharacter(); return $c . str_replace($c, $c . $c, $str) . $c; } public function getCreateForeignKeySQL(ForeignKeyConstraint $foreignKey, $table) { if ($table instanceof Table) { $table = $table->getQuotedName($this); } return 'ALTER TABLE ' . $table . ' ADD ' . $this->getForeignKeyDeclarationSQL($foreignKey); } public function getAlterTableSQL(TableDiff $diff) { throw Exception::notSupported(__METHOD__); } protected function onSchemaAlterTableAddColumn(Column $column, TableDiff $diff, &$columnSql) { if ($this->_eventManager === null) { return \false; } if (!$this->_eventManager->hasListeners(Events::onSchemaAlterTableAddColumn)) { return \false; } $eventArgs = new SchemaAlterTableAddColumnEventArgs($column, $diff, $this); $this->_eventManager->dispatchEvent(Events::onSchemaAlterTableAddColumn, $eventArgs); $columnSql = array_merge($columnSql, $eventArgs->getSql()); return $eventArgs->isDefaultPrevented(); } protected function onSchemaAlterTableRemoveColumn(Column $column, TableDiff $diff, &$columnSql) { if ($this->_eventManager === null) { return \false; } if (!$this->_eventManager->hasListeners(Events::onSchemaAlterTableRemoveColumn)) { return \false; } $eventArgs = new SchemaAlterTableRemoveColumnEventArgs($column, $diff, $this); $this->_eventManager->dispatchEvent(Events::onSchemaAlterTableRemoveColumn, $eventArgs); $columnSql = array_merge($columnSql, $eventArgs->getSql()); return $eventArgs->isDefaultPrevented(); } protected function onSchemaAlterTableChangeColumn(ColumnDiff $columnDiff, TableDiff $diff, &$columnSql) { if ($this->_eventManager === null) { return \false; } if (!$this->_eventManager->hasListeners(Events::onSchemaAlterTableChangeColumn)) { return \false; } $eventArgs = new SchemaAlterTableChangeColumnEventArgs($columnDiff, $diff, $this); $this->_eventManager->dispatchEvent(Events::onSchemaAlterTableChangeColumn, $eventArgs); $columnSql = array_merge($columnSql, $eventArgs->getSql()); return $eventArgs->isDefaultPrevented(); } protected function onSchemaAlterTableRenameColumn($oldColumnName, Column $column, TableDiff $diff, &$columnSql) { if ($this->_eventManager === null) { return \false; } if (!$this->_eventManager->hasListeners(Events::onSchemaAlterTableRenameColumn)) { return \false; } $eventArgs = new SchemaAlterTableRenameColumnEventArgs($oldColumnName, $column, $diff, $this); $this->_eventManager->dispatchEvent(Events::onSchemaAlterTableRenameColumn, $eventArgs); $columnSql = array_merge($columnSql, $eventArgs->getSql()); return $eventArgs->isDefaultPrevented(); } protected function onSchemaAlterTable(TableDiff $diff, &$sql) { if ($this->_eventManager === null) { return \false; } if (!$this->_eventManager->hasListeners(Events::onSchemaAlterTable)) { return \false; } $eventArgs = new SchemaAlterTableEventArgs($diff, $this); $this->_eventManager->dispatchEvent(Events::onSchemaAlterTable, $eventArgs); $sql = array_merge($sql, $eventArgs->getSql()); return $eventArgs->isDefaultPrevented(); } protected function getPreAlterTableIndexForeignKeySQL(TableDiff $diff) { $tableName = $diff->getName($this)->getQuotedName($this); $sql = []; if ($this->supportsForeignKeyConstraints()) { foreach ($diff->removedForeignKeys as $foreignKey) { $sql[] = $this->getDropForeignKeySQL($foreignKey, $tableName); } foreach ($diff->changedForeignKeys as $foreignKey) { $sql[] = $this->getDropForeignKeySQL($foreignKey, $tableName); } } foreach ($diff->removedIndexes as $index) { $sql[] = $this->getDropIndexSQL($index, $tableName); } foreach ($diff->changedIndexes as $index) { $sql[] = $this->getDropIndexSQL($index, $tableName); } return $sql; } protected function getPostAlterTableIndexForeignKeySQL(TableDiff $diff) { $sql = []; $newName = $diff->getNewName(); if ($newName !== \false) { $tableName = $newName->getQuotedName($this); } else { $tableName = $diff->getName($this)->getQuotedName($this); } if ($this->supportsForeignKeyConstraints()) { foreach ($diff->addedForeignKeys as $foreignKey) { $sql[] = $this->getCreateForeignKeySQL($foreignKey, $tableName); } foreach ($diff->changedForeignKeys as $foreignKey) { $sql[] = $this->getCreateForeignKeySQL($foreignKey, $tableName); } } foreach ($diff->addedIndexes as $index) { $sql[] = $this->getCreateIndexSQL($index, $tableName); } foreach ($diff->changedIndexes as $index) { $sql[] = $this->getCreateIndexSQL($index, $tableName); } foreach ($diff->renamedIndexes as $oldIndexName => $index) { $oldIndexName = new Identifier($oldIndexName); $sql = array_merge($sql, $this->getRenameIndexSQL($oldIndexName->getQuotedName($this), $index, $tableName)); } return $sql; } protected function getRenameIndexSQL($oldIndexName, Index $index, $tableName) { return [$this->getDropIndexSQL($oldIndexName, $tableName), $this->getCreateIndexSQL($index, $tableName)]; } protected function _getAlterTableIndexForeignKeySQL(TableDiff $diff) { return array_merge($this->getPreAlterTableIndexForeignKeySQL($diff), $this->getPostAlterTableIndexForeignKeySQL($diff)); } public function getColumnDeclarationListSQL(array $columns) { $declarations = []; foreach ($columns as $name => $column) { $declarations[] = $this->getColumnDeclarationSQL($name, $column); } return implode(', ', $declarations); } public function getColumnDeclarationSQL($name, array $column) { if (isset($column['columnDefinition'])) { $declaration = $this->getCustomTypeDeclarationSQL($column); } else { $default = $this->getDefaultValueDeclarationSQL($column); $charset = isset($column['charset']) && $column['charset'] ? ' ' . $this->getColumnCharsetDeclarationSQL($column['charset']) : ''; $collation = isset($column['collation']) && $column['collation'] ? ' ' . $this->getColumnCollationDeclarationSQL($column['collation']) : ''; $notnull = isset($column['notnull']) && $column['notnull'] ? ' NOT NULL' : ''; $unique = isset($column['unique']) && $column['unique'] ? ' ' . $this->getUniqueFieldDeclarationSQL() : ''; $check = isset($column['check']) && $column['check'] ? ' ' . $column['check'] : ''; $typeDecl = $column['type']->getSQLDeclaration($column, $this); $declaration = $typeDecl . $charset . $default . $notnull . $unique . $check . $collation; if ($this->supportsInlineColumnComments() && isset($column['comment']) && $column['comment'] !== '') { $declaration .= ' ' . $this->getInlineColumnCommentSQL($column['comment']); } } return $name . ' ' . $declaration; } public function getDecimalTypeDeclarationSQL(array $column) { $column['precision'] = !isset($column['precision']) || empty($column['precision']) ? 10 : $column['precision']; $column['scale'] = !isset($column['scale']) || empty($column['scale']) ? 0 : $column['scale']; return 'NUMERIC(' . $column['precision'] . ', ' . $column['scale'] . ')'; } public function getDefaultValueDeclarationSQL($column) { if (!isset($column['default'])) { return empty($column['notnull']) ? ' DEFAULT NULL' : ''; } $default = $column['default']; if (!isset($column['type'])) { return " DEFAULT '" . $default . "'"; } $type = $column['type']; if ($type instanceof Types\PhpIntegerMappingType) { return ' DEFAULT ' . $default; } if ($type instanceof Types\PhpDateTimeMappingType && $default === $this->getCurrentTimestampSQL()) { return ' DEFAULT ' . $this->getCurrentTimestampSQL(); } if ($type instanceof Types\TimeType && $default === $this->getCurrentTimeSQL()) { return ' DEFAULT ' . $this->getCurrentTimeSQL(); } if ($type instanceof Types\DateType && $default === $this->getCurrentDateSQL()) { return ' DEFAULT ' . $this->getCurrentDateSQL(); } if ($type instanceof Types\BooleanType) { return " DEFAULT '" . $this->convertBooleans($default) . "'"; } return ' DEFAULT ' . $this->quoteStringLiteral($default); } public function getCheckDeclarationSQL(array $definition) { $constraints = []; foreach ($definition as $column => $def) { if (is_string($def)) { $constraints[] = 'CHECK (' . $def . ')'; } else { if (isset($def['min'])) { $constraints[] = 'CHECK (' . $column . ' >= ' . $def['min'] . ')'; } if (isset($def['max'])) { $constraints[] = 'CHECK (' . $column . ' <= ' . $def['max'] . ')'; } } } return implode(', ', $constraints); } public function getUniqueConstraintDeclarationSQL($name, Index $index) { $columns = $index->getColumns(); $name = new Identifier($name); if (count($columns) === 0) { throw new InvalidArgumentException("Incomplete definition. 'columns' required."); } return 'CONSTRAINT ' . $name->getQuotedName($this) . ' UNIQUE (' . $this->getIndexFieldDeclarationListSQL($index) . ')' . $this->getPartialIndexSQL($index); } public function getIndexDeclarationSQL($name, Index $index) { $columns = $index->getColumns(); $name = new Identifier($name); if (count($columns) === 0) { throw new InvalidArgumentException("Incomplete definition. 'columns' required."); } return $this->getCreateIndexSQLFlags($index) . 'INDEX ' . $name->getQuotedName($this) . ' (' . $this->getIndexFieldDeclarationListSQL($index) . ')' . $this->getPartialIndexSQL($index); } public function getCustomTypeDeclarationSQL(array $column) { return $column['columnDefinition']; } public function getIndexFieldDeclarationListSQL($columnsOrIndex) : string { if ($columnsOrIndex instanceof Index) { return implode(', ', $columnsOrIndex->getQuotedColumns($this)); } if (!is_array($columnsOrIndex)) { throw new InvalidArgumentException('Fields argument should be an Index or array.'); } $ret = []; foreach ($columnsOrIndex as $column => $definition) { if (is_array($definition)) { $ret[] = $column; } else { $ret[] = $definition; } } return implode(', ', $ret); } public function getTemporaryTableSQL() { return 'TEMPORARY'; } public function getTemporaryTableName($tableName) { return $tableName; } public function getForeignKeyDeclarationSQL(ForeignKeyConstraint $foreignKey) { $sql = $this->getForeignKeyBaseDeclarationSQL($foreignKey); $sql .= $this->getAdvancedForeignKeyOptionsSQL($foreignKey); return $sql; } public function getAdvancedForeignKeyOptionsSQL(ForeignKeyConstraint $foreignKey) { $query = ''; if ($this->supportsForeignKeyOnUpdate() && $foreignKey->hasOption('onUpdate')) { $query .= ' ON UPDATE ' . $this->getForeignKeyReferentialActionSQL($foreignKey->getOption('onUpdate')); } if ($foreignKey->hasOption('onDelete')) { $query .= ' ON DELETE ' . $this->getForeignKeyReferentialActionSQL($foreignKey->getOption('onDelete')); } return $query; } public function getForeignKeyReferentialActionSQL($action) { $upper = strtoupper($action); switch ($upper) { case 'CASCADE': case 'SET NULL': case 'NO ACTION': case 'RESTRICT': case 'SET DEFAULT': return $upper; default: throw new InvalidArgumentException('Invalid foreign key action: ' . $upper); } } public function getForeignKeyBaseDeclarationSQL(ForeignKeyConstraint $foreignKey) { $sql = ''; if (strlen($foreignKey->getName())) { $sql .= 'CONSTRAINT ' . $foreignKey->getQuotedName($this) . ' '; } $sql .= 'FOREIGN KEY ('; if (count($foreignKey->getLocalColumns()) === 0) { throw new InvalidArgumentException("Incomplete definition. 'local' required."); } if (count($foreignKey->getForeignColumns()) === 0) { throw new InvalidArgumentException("Incomplete definition. 'foreign' required."); } if (strlen($foreignKey->getForeignTableName()) === 0) { throw new InvalidArgumentException("Incomplete definition. 'foreignTable' required."); } return $sql . implode(', ', $foreignKey->getQuotedLocalColumns($this)) . ') REFERENCES ' . $foreignKey->getQuotedForeignTableName($this) . ' (' . implode(', ', $foreignKey->getQuotedForeignColumns($this)) . ')'; } public function getUniqueFieldDeclarationSQL() { return 'UNIQUE'; } public function getColumnCharsetDeclarationSQL($charset) { return ''; } public function getColumnCollationDeclarationSQL($collation) { return $this->supportsColumnCollation() ? 'COLLATE ' . $collation : ''; } public function prefersSequences() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4229', 'AbstractPlatform::prefersSequences() is deprecated without replacement and removed in DBAL 3.0'); return \false; } public function prefersIdentityColumns() { return \false; } public function convertBooleans($item) { if (is_array($item)) { foreach ($item as $k => $value) { if (!is_bool($value)) { continue; } $item[$k] = (int) $value; } } elseif (is_bool($item)) { $item = (int) $item; } return $item; } public function convertFromBoolean($item) { return $item === null ? null : (bool) $item; } public function convertBooleansToDatabaseValue($item) { return $this->convertBooleans($item); } public function getCurrentDateSQL() { return 'CURRENT_DATE'; } public function getCurrentTimeSQL() { return 'CURRENT_TIME'; } public function getCurrentTimestampSQL() { return 'CURRENT_TIMESTAMP'; } protected function _getTransactionIsolationLevelSQL($level) { switch ($level) { case TransactionIsolationLevel::READ_UNCOMMITTED: return 'READ UNCOMMITTED'; case TransactionIsolationLevel::READ_COMMITTED: return 'READ COMMITTED'; case TransactionIsolationLevel::REPEATABLE_READ: return 'REPEATABLE READ'; case TransactionIsolationLevel::SERIALIZABLE: return 'SERIALIZABLE'; default: throw new InvalidArgumentException('Invalid isolation level:' . $level); } } public function getListDatabasesSQL() { throw Exception::notSupported(__METHOD__); } public function getListNamespacesSQL() { throw Exception::notSupported(__METHOD__); } public function getListSequencesSQL($database) { throw Exception::notSupported(__METHOD__); } public function getListTableConstraintsSQL($table) { throw Exception::notSupported(__METHOD__); } public function getListTableColumnsSQL($table, $database = null) { throw Exception::notSupported(__METHOD__); } public function getListTablesSQL() { throw Exception::notSupported(__METHOD__); } public function getListUsersSQL() { throw Exception::notSupported(__METHOD__); } public function getListViewsSQL($database) { throw Exception::notSupported(__METHOD__); } public function getListTableIndexesSQL($table, $database = null) { throw Exception::notSupported(__METHOD__); } public function getListTableForeignKeysSQL($table) { throw Exception::notSupported(__METHOD__); } public function getCreateViewSQL($name, $sql) { throw Exception::notSupported(__METHOD__); } public function getDropViewSQL($name) { throw Exception::notSupported(__METHOD__); } public function getDropSequenceSQL($sequence) { throw Exception::notSupported(__METHOD__); } public function getSequenceNextValSQL($sequence) { throw Exception::notSupported(__METHOD__); } public function getCreateDatabaseSQL($name) { throw Exception::notSupported(__METHOD__); } public function getSetTransactionIsolationSQL($level) { throw Exception::notSupported(__METHOD__); } public function getDateTimeTypeDeclarationSQL(array $column) { throw Exception::notSupported(__METHOD__); } public function getDateTimeTzTypeDeclarationSQL(array $column) { return $this->getDateTimeTypeDeclarationSQL($column); } public function getDateTypeDeclarationSQL(array $column) { throw Exception::notSupported(__METHOD__); } public function getTimeTypeDeclarationSQL(array $column) { throw Exception::notSupported(__METHOD__); } public function getFloatDeclarationSQL(array $column) { return 'DOUBLE PRECISION'; } public function getDefaultTransactionIsolationLevel() { return TransactionIsolationLevel::READ_COMMITTED; } public function supportsSequences() { return \false; } public function supportsIdentityColumns() { return \false; } public function usesSequenceEmulatedIdentityColumns() { return \false; } public function getIdentitySequenceName($tableName, $columnName) { throw Exception::notSupported(__METHOD__); } public function supportsIndexes() { return \true; } public function supportsPartialIndexes() { return \false; } public function supportsColumnLengthIndexes() : bool { return \false; } public function supportsAlterTable() { return \true; } public function supportsTransactions() { return \true; } public function supportsSavepoints() { return \true; } public function supportsReleaseSavepoints() { return $this->supportsSavepoints(); } public function supportsPrimaryConstraints() { return \true; } public function supportsForeignKeyConstraints() { return \true; } public function supportsForeignKeyOnUpdate() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4229', 'AbstractPlatform::supportsForeignKeyOnUpdate() is deprecated without replacement and removed in DBAL 3.0'); return $this->supportsForeignKeyConstraints(); } public function supportsSchemas() { return \false; } public function canEmulateSchemas() { return \false; } public function getDefaultSchemaName() { throw Exception::notSupported(__METHOD__); } public function supportsCreateDropDatabase() { return \true; } public function supportsGettingAffectedRows() { return \true; } public function supportsInlineColumnComments() { return \false; } public function supportsCommentOnStatement() { return \false; } public function hasNativeGuidType() { return \false; } public function hasNativeJsonType() { return \false; } public function getIdentityColumnNullInsertSQL() { return ''; } public function supportsViews() { return \true; } public function supportsColumnCollation() { return \false; } public function getDateTimeFormatString() { return 'Y-m-d H:i:s'; } public function getDateTimeTzFormatString() { return 'Y-m-d H:i:s'; } public function getDateFormatString() { return 'Y-m-d'; } public function getTimeFormatString() { return 'H:i:s'; } public final function modifyLimitQuery($query, $limit, $offset = null) { if ($limit !== null) { $limit = (int) $limit; } $offset = (int) $offset; if ($offset < 0) { throw new Exception(sprintf('Offset must be a positive integer or zero, %d given', $offset)); } if ($offset > 0 && !$this->supportsLimitOffset()) { throw new Exception(sprintf('Platform %s does not support offset values in limit queries.', $this->getName())); } return $this->doModifyLimitQuery($query, $limit, $offset); } protected function doModifyLimitQuery($query, $limit, $offset) { if ($limit !== null) { $query .= ' LIMIT ' . $limit; } if ($offset > 0) { $query .= ' OFFSET ' . $offset; } return $query; } public function supportsLimitOffset() { return \true; } public function getSQLResultCasing($column) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4229', 'AbstractPlatform::getSQLResultCasing is deprecated without replacement and removed in DBAL 3.' . 'Use Portability\\Connection with PORTABILITY_FIX_CASE to get portable result cases.'); return $column; } public function fixSchemaElementName($schemaElementName) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4132', 'AbstractPlatform::fixSchemaElementName is deprecated with no replacement and removed in DBAL 3.0'); return $schemaElementName; } public function getMaxIdentifierLength() { return 63; } public function getEmptyIdentityInsertSQL($quotedTableName, $quotedIdentifierColumnName) { return 'INSERT INTO ' . $quotedTableName . ' (' . $quotedIdentifierColumnName . ') VALUES (null)'; } public function getTruncateTableSQL($tableName, $cascade = \false) { $tableIdentifier = new Identifier($tableName); return 'TRUNCATE ' . $tableIdentifier->getQuotedName($this); } public function getDummySelectSQL() { $expression = func_num_args() > 0 ? func_get_arg(0) : '1'; return sprintf('SELECT %s', $expression); } public function createSavePoint($savepoint) { return 'SAVEPOINT ' . $savepoint; } public function releaseSavePoint($savepoint) { return 'RELEASE SAVEPOINT ' . $savepoint; } public function rollbackSavePoint($savepoint) { return 'ROLLBACK TO SAVEPOINT ' . $savepoint; } public final function getReservedKeywordsList() { if ($this->_keywords) { return $this->_keywords; } $class = $this->getReservedKeywordsClass(); $keywords = new $class(); if (!$keywords instanceof KeywordList) { throw Exception::notSupported(__METHOD__); } $this->_keywords = $keywords; return $keywords; } protected function getReservedKeywordsClass() { throw Exception::notSupported(__METHOD__); } public function quoteStringLiteral($str) { $c = $this->getStringLiteralQuoteCharacter(); return $c . str_replace($c, $c . $c, $str) . $c; } public function getStringLiteralQuoteCharacter() { return "'"; } public final function escapeStringForLike(string $inputString, string $escapeChar) : string { return preg_replace('~([' . preg_quote($this->getLikeWildcardCharacters() . $escapeChar, '~') . '])~u', addcslashes($escapeChar, '\\') . '$1', $inputString); } protected function getLikeWildcardCharacters() : string { return '%_'; } }
|
1 |
Â
<?php
|
2 |
+
namespace MailPoetVendor\Doctrine\DBAL\Platforms; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\Common\EventManager; use MailPoetVendor\Doctrine\DBAL\Event\SchemaAlterTableAddColumnEventArgs; use MailPoetVendor\Doctrine\DBAL\Event\SchemaAlterTableChangeColumnEventArgs; use MailPoetVendor\Doctrine\DBAL\Event\SchemaAlterTableEventArgs; use MailPoetVendor\Doctrine\DBAL\Event\SchemaAlterTableRemoveColumnEventArgs; use MailPoetVendor\Doctrine\DBAL\Event\SchemaAlterTableRenameColumnEventArgs; use MailPoetVendor\Doctrine\DBAL\Event\SchemaCreateTableColumnEventArgs; use MailPoetVendor\Doctrine\DBAL\Event\SchemaCreateTableEventArgs; use MailPoetVendor\Doctrine\DBAL\Event\SchemaDropTableEventArgs; use MailPoetVendor\Doctrine\DBAL\Events; use MailPoetVendor\Doctrine\DBAL\Exception; use MailPoetVendor\Doctrine\DBAL\Platforms\Keywords\KeywordList; use MailPoetVendor\Doctrine\DBAL\Schema\Column; use MailPoetVendor\Doctrine\DBAL\Schema\ColumnDiff; use MailPoetVendor\Doctrine\DBAL\Schema\Constraint; use MailPoetVendor\Doctrine\DBAL\Schema\ForeignKeyConstraint; use MailPoetVendor\Doctrine\DBAL\Schema\Identifier; use MailPoetVendor\Doctrine\DBAL\Schema\Index; use MailPoetVendor\Doctrine\DBAL\Schema\Sequence; use MailPoetVendor\Doctrine\DBAL\Schema\Table; use MailPoetVendor\Doctrine\DBAL\Schema\TableDiff; use MailPoetVendor\Doctrine\DBAL\TransactionIsolationLevel; use MailPoetVendor\Doctrine\DBAL\Types; use MailPoetVendor\Doctrine\DBAL\Types\Type; use MailPoetVendor\Doctrine\Deprecations\Deprecation; use InvalidArgumentException; use UnexpectedValueException; use function addcslashes; use function array_map; use function array_merge; use function array_unique; use function array_values; use function assert; use function count; use function explode; use function func_get_arg; use function func_get_args; use function func_num_args; use function implode; use function in_array; use function is_array; use function is_bool; use function is_int; use function is_string; use function preg_quote; use function preg_replace; use function sprintf; use function str_replace; use function strlen; use function strpos; use function strtolower; use function strtoupper; abstract class AbstractPlatform { public const CREATE_INDEXES = 1; public const CREATE_FOREIGNKEYS = 2; public const DATE_INTERVAL_UNIT_SECOND = DateIntervalUnit::SECOND; public const DATE_INTERVAL_UNIT_MINUTE = DateIntervalUnit::MINUTE; public const DATE_INTERVAL_UNIT_HOUR = DateIntervalUnit::HOUR; public const DATE_INTERVAL_UNIT_DAY = DateIntervalUnit::DAY; public const DATE_INTERVAL_UNIT_WEEK = DateIntervalUnit::WEEK; public const DATE_INTERVAL_UNIT_MONTH = DateIntervalUnit::MONTH; public const DATE_INTERVAL_UNIT_QUARTER = DateIntervalUnit::QUARTER; public const DATE_INTERVAL_UNIT_YEAR = DateIntervalUnit::YEAR; public const TRIM_UNSPECIFIED = TrimMode::UNSPECIFIED; public const TRIM_LEADING = TrimMode::LEADING; public const TRIM_TRAILING = TrimMode::TRAILING; public const TRIM_BOTH = TrimMode::BOTH; protected $doctrineTypeMapping; protected $doctrineTypeComments; protected $_eventManager; protected $_keywords; public function __construct() { } public function setEventManager(EventManager $eventManager) { $this->_eventManager = $eventManager; } public function getEventManager() { return $this->_eventManager; } public abstract function getBooleanTypeDeclarationSQL(array $column); public abstract function getIntegerTypeDeclarationSQL(array $column); public abstract function getBigIntTypeDeclarationSQL(array $column); public abstract function getSmallIntTypeDeclarationSQL(array $column); protected abstract function _getCommonIntegerTypeDeclarationSQL(array $column); protected abstract function initializeDoctrineTypeMappings(); private function initializeAllDoctrineTypeMappings() { $this->initializeDoctrineTypeMappings(); foreach (Type::getTypesMap() as $typeName => $className) { foreach (Type::getType($typeName)->getMappedDatabaseTypes($this) as $dbType) { $this->doctrineTypeMapping[$dbType] = $typeName; } } } public function getAsciiStringTypeDeclarationSQL(array $column) : string { return $this->getVarcharTypeDeclarationSQL($column); } public function getVarcharTypeDeclarationSQL(array $column) { if (!isset($column['length'])) { $column['length'] = $this->getVarcharDefaultLength(); } $fixed = $column['fixed'] ?? \false; $maxLength = $fixed ? $this->getCharMaxLength() : $this->getVarcharMaxLength(); if ($column['length'] > $maxLength) { return $this->getClobTypeDeclarationSQL($column); } return $this->getVarcharTypeDeclarationSQLSnippet($column['length'], $fixed); } public function getBinaryTypeDeclarationSQL(array $column) { if (!isset($column['length'])) { $column['length'] = $this->getBinaryDefaultLength(); } $fixed = $column['fixed'] ?? \false; $maxLength = $this->getBinaryMaxLength(); if ($column['length'] > $maxLength) { if ($maxLength > 0) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/issues/3187', 'Binary column length %d is greater than supported by the platform (%d).' . ' Reduce the column length or use a BLOB column instead.', $column['length'], $maxLength); } return $this->getBlobTypeDeclarationSQL($column); } return $this->getBinaryTypeDeclarationSQLSnippet($column['length'], $fixed); } public function getGuidTypeDeclarationSQL(array $column) { $column['length'] = 36; $column['fixed'] = \true; return $this->getVarcharTypeDeclarationSQL($column); } public function getJsonTypeDeclarationSQL(array $column) { return $this->getClobTypeDeclarationSQL($column); } protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed) { throw Exception::notSupported('VARCHARs not supported by Platform.'); } protected function getBinaryTypeDeclarationSQLSnippet($length, $fixed) { throw Exception::notSupported('BINARY/VARBINARY column types are not supported by this platform.'); } public abstract function getClobTypeDeclarationSQL(array $column); public abstract function getBlobTypeDeclarationSQL(array $column); public abstract function getName(); public function registerDoctrineTypeMapping($dbType, $doctrineType) { if ($this->doctrineTypeMapping === null) { $this->initializeAllDoctrineTypeMappings(); } if (!Types\Type::hasType($doctrineType)) { throw Exception::typeNotFound($doctrineType); } $dbType = strtolower($dbType); $this->doctrineTypeMapping[$dbType] = $doctrineType; $doctrineType = Type::getType($doctrineType); if (!$doctrineType->requiresSQLCommentHint($this)) { return; } $this->markDoctrineTypeCommented($doctrineType); } public function getDoctrineTypeMapping($dbType) { if ($this->doctrineTypeMapping === null) { $this->initializeAllDoctrineTypeMappings(); } $dbType = strtolower($dbType); if (!isset($this->doctrineTypeMapping[$dbType])) { throw new Exception('Unknown database type ' . $dbType . ' requested, ' . static::class . ' may not support it.'); } return $this->doctrineTypeMapping[$dbType]; } public function hasDoctrineTypeMappingFor($dbType) { if ($this->doctrineTypeMapping === null) { $this->initializeAllDoctrineTypeMappings(); } $dbType = strtolower($dbType); return isset($this->doctrineTypeMapping[$dbType]); } protected function initializeCommentedDoctrineTypes() { $this->doctrineTypeComments = []; foreach (Type::getTypesMap() as $typeName => $className) { $type = Type::getType($typeName); if (!$type->requiresSQLCommentHint($this)) { continue; } $this->doctrineTypeComments[] = $typeName; } } public function isCommentedDoctrineType(Type $doctrineType) { if ($this->doctrineTypeComments === null) { $this->initializeCommentedDoctrineTypes(); } assert(is_array($this->doctrineTypeComments)); return in_array($doctrineType->getName(), $this->doctrineTypeComments); } public function markDoctrineTypeCommented($doctrineType) { if ($this->doctrineTypeComments === null) { $this->initializeCommentedDoctrineTypes(); } assert(is_array($this->doctrineTypeComments)); $this->doctrineTypeComments[] = $doctrineType instanceof Type ? $doctrineType->getName() : $doctrineType; } public function getDoctrineTypeComment(Type $doctrineType) { return '(DC2Type:' . $doctrineType->getName() . ')'; } protected function getColumnComment(Column $column) { $comment = $column->getComment(); if ($this->isCommentedDoctrineType($column->getType())) { $comment .= $this->getDoctrineTypeComment($column->getType()); } return $comment; } public function getIdentifierQuoteCharacter() { return '"'; } public function getSqlCommentStartString() { return '--'; } public function getSqlCommentEndString() { return "\n"; } public function getCharMaxLength() : int { return $this->getVarcharMaxLength(); } public function getVarcharMaxLength() { return 4000; } public function getVarcharDefaultLength() { return 255; } public function getBinaryMaxLength() { return 4000; } public function getBinaryDefaultLength() { return 255; } public function getWildcards() { return ['%', '_']; } public function getRegexpExpression() { throw Exception::notSupported(__METHOD__); } public function getGuidExpression() { throw Exception::notSupported(__METHOD__); } public function getAvgExpression($column) { return 'AVG(' . $column . ')'; } public function getCountExpression($column) { return 'COUNT(' . $column . ')'; } public function getMaxExpression($column) { return 'MAX(' . $column . ')'; } public function getMinExpression($column) { return 'MIN(' . $column . ')'; } public function getSumExpression($column) { return 'SUM(' . $column . ')'; } public function getMd5Expression($column) { return 'MD5(' . $column . ')'; } public function getLengthExpression($column) { return 'LENGTH(' . $column . ')'; } public function getSqrtExpression($column) { return 'SQRT(' . $column . ')'; } public function getRoundExpression($column, $decimals = 0) { return 'ROUND(' . $column . ', ' . $decimals . ')'; } public function getModExpression($expression1, $expression2) { return 'MOD(' . $expression1 . ', ' . $expression2 . ')'; } public function getTrimExpression($str, $mode = TrimMode::UNSPECIFIED, $char = \false) { $expression = ''; switch ($mode) { case TrimMode::LEADING: $expression = 'LEADING '; break; case TrimMode::TRAILING: $expression = 'TRAILING '; break; case TrimMode::BOTH: $expression = 'BOTH '; break; } if ($char !== \false) { $expression .= $char . ' '; } if ($mode || $char !== \false) { $expression .= 'FROM '; } return 'TRIM(' . $expression . $str . ')'; } public function getRtrimExpression($str) { return 'RTRIM(' . $str . ')'; } public function getLtrimExpression($str) { return 'LTRIM(' . $str . ')'; } public function getUpperExpression($str) { return 'UPPER(' . $str . ')'; } public function getLowerExpression($str) { return 'LOWER(' . $str . ')'; } public function getLocateExpression($str, $substr, $startPos = \false) { throw Exception::notSupported(__METHOD__); } public function getNowExpression() { return 'NOW()'; } public function getSubstringExpression($string, $start, $length = null) { if ($length === null) { return 'SUBSTRING(' . $string . ' FROM ' . $start . ')'; } return 'SUBSTRING(' . $string . ' FROM ' . $start . ' FOR ' . $length . ')'; } public function getConcatExpression() { return implode(' || ', func_get_args()); } public function getNotExpression($expression) { return 'NOT(' . $expression . ')'; } public function getIsNullExpression($expression) { return $expression . ' IS NULL'; } public function getIsNotNullExpression($expression) { return $expression . ' IS NOT NULL'; } public function getBetweenExpression($expression, $value1, $value2) { return $expression . ' BETWEEN ' . $value1 . ' AND ' . $value2; } public function getAcosExpression($value) { return 'ACOS(' . $value . ')'; } public function getSinExpression($value) { return 'SIN(' . $value . ')'; } public function getPiExpression() { return 'PI()'; } public function getCosExpression($value) { return 'COS(' . $value . ')'; } public function getDateDiffExpression($date1, $date2) { throw Exception::notSupported(__METHOD__); } public function getDateAddSecondsExpression($date, $seconds) { return $this->getDateArithmeticIntervalExpression($date, '+', $seconds, DateIntervalUnit::SECOND); } public function getDateSubSecondsExpression($date, $seconds) { return $this->getDateArithmeticIntervalExpression($date, '-', $seconds, DateIntervalUnit::SECOND); } public function getDateAddMinutesExpression($date, $minutes) { return $this->getDateArithmeticIntervalExpression($date, '+', $minutes, DateIntervalUnit::MINUTE); } public function getDateSubMinutesExpression($date, $minutes) { return $this->getDateArithmeticIntervalExpression($date, '-', $minutes, DateIntervalUnit::MINUTE); } public function getDateAddHourExpression($date, $hours) { return $this->getDateArithmeticIntervalExpression($date, '+', $hours, DateIntervalUnit::HOUR); } public function getDateSubHourExpression($date, $hours) { return $this->getDateArithmeticIntervalExpression($date, '-', $hours, DateIntervalUnit::HOUR); } public function getDateAddDaysExpression($date, $days) { return $this->getDateArithmeticIntervalExpression($date, '+', $days, DateIntervalUnit::DAY); } public function getDateSubDaysExpression($date, $days) { return $this->getDateArithmeticIntervalExpression($date, '-', $days, DateIntervalUnit::DAY); } public function getDateAddWeeksExpression($date, $weeks) { return $this->getDateArithmeticIntervalExpression($date, '+', $weeks, DateIntervalUnit::WEEK); } public function getDateSubWeeksExpression($date, $weeks) { return $this->getDateArithmeticIntervalExpression($date, '-', $weeks, DateIntervalUnit::WEEK); } public function getDateAddMonthExpression($date, $months) { return $this->getDateArithmeticIntervalExpression($date, '+', $months, DateIntervalUnit::MONTH); } public function getDateSubMonthExpression($date, $months) { return $this->getDateArithmeticIntervalExpression($date, '-', $months, DateIntervalUnit::MONTH); } public function getDateAddQuartersExpression($date, $quarters) { return $this->getDateArithmeticIntervalExpression($date, '+', $quarters, DateIntervalUnit::QUARTER); } public function getDateSubQuartersExpression($date, $quarters) { return $this->getDateArithmeticIntervalExpression($date, '-', $quarters, DateIntervalUnit::QUARTER); } public function getDateAddYearsExpression($date, $years) { return $this->getDateArithmeticIntervalExpression($date, '+', $years, DateIntervalUnit::YEAR); } public function getDateSubYearsExpression($date, $years) { return $this->getDateArithmeticIntervalExpression($date, '-', $years, DateIntervalUnit::YEAR); } protected function getDateArithmeticIntervalExpression($date, $operator, $interval, $unit) { throw Exception::notSupported(__METHOD__); } public function getBitAndComparisonExpression($value1, $value2) { return '(' . $value1 . ' & ' . $value2 . ')'; } public function getBitOrComparisonExpression($value1, $value2) { return '(' . $value1 . ' | ' . $value2 . ')'; } public function getForUpdateSQL() { return 'FOR UPDATE'; } public function appendLockHint($fromClause, $lockMode) { return $fromClause; } public function getReadLockSQL() { return $this->getForUpdateSQL(); } public function getWriteLockSQL() { return $this->getForUpdateSQL(); } public function getDropDatabaseSQL($name) { return 'DROP DATABASE ' . $name; } public function getDropTableSQL($table) { $tableArg = $table; if ($table instanceof Table) { $table = $table->getQuotedName($this); } if (!is_string($table)) { throw new InvalidArgumentException(__METHOD__ . '() expects $table parameter to be string or ' . Table::class . '.'); } if ($this->_eventManager !== null && $this->_eventManager->hasListeners(Events::onSchemaDropTable)) { $eventArgs = new SchemaDropTableEventArgs($tableArg, $this); $this->_eventManager->dispatchEvent(Events::onSchemaDropTable, $eventArgs); if ($eventArgs->isDefaultPrevented()) { $sql = $eventArgs->getSql(); if ($sql === null) { throw new UnexpectedValueException('Default implementation of DROP TABLE was overridden with NULL'); } return $sql; } } return 'DROP TABLE ' . $table; } public function getDropTemporaryTableSQL($table) { return $this->getDropTableSQL($table); } public function getDropIndexSQL($index, $table = null) { if ($index instanceof Index) { $index = $index->getQuotedName($this); } elseif (!is_string($index)) { throw new InvalidArgumentException(__METHOD__ . '() expects $index parameter to be string or ' . Index::class . '.'); } return 'DROP INDEX ' . $index; } public function getDropConstraintSQL($constraint, $table) { if (!$constraint instanceof Constraint) { $constraint = new Identifier($constraint); } if (!$table instanceof Table) { $table = new Identifier($table); } $constraint = $constraint->getQuotedName($this); $table = $table->getQuotedName($this); return 'ALTER TABLE ' . $table . ' DROP CONSTRAINT ' . $constraint; } public function getDropForeignKeySQL($foreignKey, $table) { if (!$foreignKey instanceof ForeignKeyConstraint) { $foreignKey = new Identifier($foreignKey); } if (!$table instanceof Table) { $table = new Identifier($table); } $foreignKey = $foreignKey->getQuotedName($this); $table = $table->getQuotedName($this); return 'ALTER TABLE ' . $table . ' DROP FOREIGN KEY ' . $foreignKey; } public function getCreateTableSQL(Table $table, $createFlags = self::CREATE_INDEXES) { if (!is_int($createFlags)) { throw new InvalidArgumentException('Second argument of AbstractPlatform::getCreateTableSQL() has to be integer.'); } if (count($table->getColumns()) === 0) { throw Exception::noColumnsSpecifiedForTable($table->getName()); } $tableName = $table->getQuotedName($this); $options = $table->getOptions(); $options['uniqueConstraints'] = []; $options['indexes'] = []; $options['primary'] = []; if (($createFlags & self::CREATE_INDEXES) > 0) { foreach ($table->getIndexes() as $index) { if ($index->isPrimary()) { $options['primary'] = $index->getQuotedColumns($this); $options['primary_index'] = $index; } else { $options['indexes'][$index->getQuotedName($this)] = $index; } } } $columnSql = []; $columns = []; foreach ($table->getColumns() as $column) { if ($this->_eventManager !== null && $this->_eventManager->hasListeners(Events::onSchemaCreateTableColumn)) { $eventArgs = new SchemaCreateTableColumnEventArgs($column, $table, $this); $this->_eventManager->dispatchEvent(Events::onSchemaCreateTableColumn, $eventArgs); $columnSql = array_merge($columnSql, $eventArgs->getSql()); if ($eventArgs->isDefaultPrevented()) { continue; } } $name = $column->getQuotedName($this); $columnData = array_merge($column->toArray(), ['name' => $name, 'version' => $column->hasPlatformOption('version') ? $column->getPlatformOption('version') : \false, 'comment' => $this->getColumnComment($column)]); if ($columnData['type'] instanceof Types\StringType && $columnData['length'] === null) { $columnData['length'] = 255; } if (in_array($column->getName(), $options['primary'])) { $columnData['primary'] = \true; } $columns[$name] = $columnData; } if (($createFlags & self::CREATE_FOREIGNKEYS) > 0) { $options['foreignKeys'] = []; foreach ($table->getForeignKeys() as $fkConstraint) { $options['foreignKeys'][] = $fkConstraint; } } if ($this->_eventManager !== null && $this->_eventManager->hasListeners(Events::onSchemaCreateTable)) { $eventArgs = new SchemaCreateTableEventArgs($table, $columns, $options, $this); $this->_eventManager->dispatchEvent(Events::onSchemaCreateTable, $eventArgs); if ($eventArgs->isDefaultPrevented()) { return array_merge($eventArgs->getSql(), $columnSql); } } $sql = $this->_getCreateTableSQL($tableName, $columns, $options); if ($this->supportsCommentOnStatement()) { if ($table->hasOption('comment')) { $sql[] = $this->getCommentOnTableSQL($tableName, $table->getOption('comment')); } foreach ($table->getColumns() as $column) { $comment = $this->getColumnComment($column); if ($comment === null || $comment === '') { continue; } $sql[] = $this->getCommentOnColumnSQL($tableName, $column->getQuotedName($this), $comment); } } return array_merge($sql, $columnSql); } protected function getCommentOnTableSQL(string $tableName, ?string $comment) : string { $tableName = new Identifier($tableName); return sprintf('COMMENT ON TABLE %s IS %s', $tableName->getQuotedName($this), $this->quoteStringLiteral((string) $comment)); } public function getCommentOnColumnSQL($tableName, $columnName, $comment) { $tableName = new Identifier($tableName); $columnName = new Identifier($columnName); return sprintf('COMMENT ON COLUMN %s.%s IS %s', $tableName->getQuotedName($this), $columnName->getQuotedName($this), $this->quoteStringLiteral((string) $comment)); } public function getInlineColumnCommentSQL($comment) { if (!$this->supportsInlineColumnComments()) { throw Exception::notSupported(__METHOD__); } return 'COMMENT ' . $this->quoteStringLiteral($comment); } protected function _getCreateTableSQL($name, array $columns, array $options = []) { $columnListSql = $this->getColumnDeclarationListSQL($columns); if (isset($options['uniqueConstraints']) && !empty($options['uniqueConstraints'])) { foreach ($options['uniqueConstraints'] as $index => $definition) { $columnListSql .= ', ' . $this->getUniqueConstraintDeclarationSQL($index, $definition); } } if (isset($options['primary']) && !empty($options['primary'])) { $columnListSql .= ', PRIMARY KEY(' . implode(', ', array_unique(array_values($options['primary']))) . ')'; } if (isset($options['indexes']) && !empty($options['indexes'])) { foreach ($options['indexes'] as $index => $definition) { $columnListSql .= ', ' . $this->getIndexDeclarationSQL($index, $definition); } } $query = 'CREATE TABLE ' . $name . ' (' . $columnListSql; $check = $this->getCheckDeclarationSQL($columns); if (!empty($check)) { $query .= ', ' . $check; } $query .= ')'; $sql = [$query]; if (isset($options['foreignKeys'])) { foreach ((array) $options['foreignKeys'] as $definition) { $sql[] = $this->getCreateForeignKeySQL($definition, $name); } } return $sql; } public function getCreateTemporaryTableSnippetSQL() { return 'CREATE TEMPORARY TABLE'; } public function getCreateSequenceSQL(Sequence $sequence) { throw Exception::notSupported(__METHOD__); } public function getAlterSequenceSQL(Sequence $sequence) { throw Exception::notSupported(__METHOD__); } public function getCreateConstraintSQL(Constraint $constraint, $table) { if ($table instanceof Table) { $table = $table->getQuotedName($this); } $query = 'ALTER TABLE ' . $table . ' ADD CONSTRAINT ' . $constraint->getQuotedName($this); $columnList = '(' . implode(', ', $constraint->getQuotedColumns($this)) . ')'; $referencesClause = ''; if ($constraint instanceof Index) { if ($constraint->isPrimary()) { $query .= ' PRIMARY KEY'; } elseif ($constraint->isUnique()) { $query .= ' UNIQUE'; } else { throw new InvalidArgumentException('Can only create primary or unique constraints, no common indexes with getCreateConstraintSQL().'); } } elseif ($constraint instanceof ForeignKeyConstraint) { $query .= ' FOREIGN KEY'; $referencesClause = ' REFERENCES ' . $constraint->getQuotedForeignTableName($this) . ' (' . implode(', ', $constraint->getQuotedForeignColumns($this)) . ')'; } $query .= ' ' . $columnList . $referencesClause; return $query; } public function getCreateIndexSQL(Index $index, $table) { if ($table instanceof Table) { $table = $table->getQuotedName($this); } $name = $index->getQuotedName($this); $columns = $index->getColumns(); if (count($columns) === 0) { throw new InvalidArgumentException("Incomplete definition. 'columns' required."); } if ($index->isPrimary()) { return $this->getCreatePrimaryKeySQL($index, $table); } $query = 'CREATE ' . $this->getCreateIndexSQLFlags($index) . 'INDEX ' . $name . ' ON ' . $table; $query .= ' (' . $this->getIndexFieldDeclarationListSQL($index) . ')' . $this->getPartialIndexSQL($index); return $query; } protected function getPartialIndexSQL(Index $index) { if ($this->supportsPartialIndexes() && $index->hasOption('where')) { return ' WHERE ' . $index->getOption('where'); } return ''; } protected function getCreateIndexSQLFlags(Index $index) { return $index->isUnique() ? 'UNIQUE ' : ''; } public function getCreatePrimaryKeySQL(Index $index, $table) { if ($table instanceof Table) { $table = $table->getQuotedName($this); } return 'ALTER TABLE ' . $table . ' ADD PRIMARY KEY (' . $this->getIndexFieldDeclarationListSQL($index) . ')'; } public function getCreateSchemaSQL($schemaName) { throw Exception::notSupported(__METHOD__); } public function quoteIdentifier($str) { if (strpos($str, '.') !== \false) { $parts = array_map([$this, 'quoteSingleIdentifier'], explode('.', $str)); return implode('.', $parts); } return $this->quoteSingleIdentifier($str); } public function quoteSingleIdentifier($str) { $c = $this->getIdentifierQuoteCharacter(); return $c . str_replace($c, $c . $c, $str) . $c; } public function getCreateForeignKeySQL(ForeignKeyConstraint $foreignKey, $table) { if ($table instanceof Table) { $table = $table->getQuotedName($this); } return 'ALTER TABLE ' . $table . ' ADD ' . $this->getForeignKeyDeclarationSQL($foreignKey); } public function getAlterTableSQL(TableDiff $diff) { throw Exception::notSupported(__METHOD__); } protected function onSchemaAlterTableAddColumn(Column $column, TableDiff $diff, &$columnSql) { if ($this->_eventManager === null) { return \false; } if (!$this->_eventManager->hasListeners(Events::onSchemaAlterTableAddColumn)) { return \false; } $eventArgs = new SchemaAlterTableAddColumnEventArgs($column, $diff, $this); $this->_eventManager->dispatchEvent(Events::onSchemaAlterTableAddColumn, $eventArgs); $columnSql = array_merge($columnSql, $eventArgs->getSql()); return $eventArgs->isDefaultPrevented(); } protected function onSchemaAlterTableRemoveColumn(Column $column, TableDiff $diff, &$columnSql) { if ($this->_eventManager === null) { return \false; } if (!$this->_eventManager->hasListeners(Events::onSchemaAlterTableRemoveColumn)) { return \false; } $eventArgs = new SchemaAlterTableRemoveColumnEventArgs($column, $diff, $this); $this->_eventManager->dispatchEvent(Events::onSchemaAlterTableRemoveColumn, $eventArgs); $columnSql = array_merge($columnSql, $eventArgs->getSql()); return $eventArgs->isDefaultPrevented(); } protected function onSchemaAlterTableChangeColumn(ColumnDiff $columnDiff, TableDiff $diff, &$columnSql) { if ($this->_eventManager === null) { return \false; } if (!$this->_eventManager->hasListeners(Events::onSchemaAlterTableChangeColumn)) { return \false; } $eventArgs = new SchemaAlterTableChangeColumnEventArgs($columnDiff, $diff, $this); $this->_eventManager->dispatchEvent(Events::onSchemaAlterTableChangeColumn, $eventArgs); $columnSql = array_merge($columnSql, $eventArgs->getSql()); return $eventArgs->isDefaultPrevented(); } protected function onSchemaAlterTableRenameColumn($oldColumnName, Column $column, TableDiff $diff, &$columnSql) { if ($this->_eventManager === null) { return \false; } if (!$this->_eventManager->hasListeners(Events::onSchemaAlterTableRenameColumn)) { return \false; } $eventArgs = new SchemaAlterTableRenameColumnEventArgs($oldColumnName, $column, $diff, $this); $this->_eventManager->dispatchEvent(Events::onSchemaAlterTableRenameColumn, $eventArgs); $columnSql = array_merge($columnSql, $eventArgs->getSql()); return $eventArgs->isDefaultPrevented(); } protected function onSchemaAlterTable(TableDiff $diff, &$sql) { if ($this->_eventManager === null) { return \false; } if (!$this->_eventManager->hasListeners(Events::onSchemaAlterTable)) { return \false; } $eventArgs = new SchemaAlterTableEventArgs($diff, $this); $this->_eventManager->dispatchEvent(Events::onSchemaAlterTable, $eventArgs); $sql = array_merge($sql, $eventArgs->getSql()); return $eventArgs->isDefaultPrevented(); } protected function getPreAlterTableIndexForeignKeySQL(TableDiff $diff) { $tableName = $diff->getName($this)->getQuotedName($this); $sql = []; if ($this->supportsForeignKeyConstraints()) { foreach ($diff->removedForeignKeys as $foreignKey) { $sql[] = $this->getDropForeignKeySQL($foreignKey, $tableName); } foreach ($diff->changedForeignKeys as $foreignKey) { $sql[] = $this->getDropForeignKeySQL($foreignKey, $tableName); } } foreach ($diff->removedIndexes as $index) { $sql[] = $this->getDropIndexSQL($index, $tableName); } foreach ($diff->changedIndexes as $index) { $sql[] = $this->getDropIndexSQL($index, $tableName); } return $sql; } protected function getPostAlterTableIndexForeignKeySQL(TableDiff $diff) { $sql = []; $newName = $diff->getNewName(); if ($newName !== \false) { $tableName = $newName->getQuotedName($this); } else { $tableName = $diff->getName($this)->getQuotedName($this); } if ($this->supportsForeignKeyConstraints()) { foreach ($diff->addedForeignKeys as $foreignKey) { $sql[] = $this->getCreateForeignKeySQL($foreignKey, $tableName); } foreach ($diff->changedForeignKeys as $foreignKey) { $sql[] = $this->getCreateForeignKeySQL($foreignKey, $tableName); } } foreach ($diff->addedIndexes as $index) { $sql[] = $this->getCreateIndexSQL($index, $tableName); } foreach ($diff->changedIndexes as $index) { $sql[] = $this->getCreateIndexSQL($index, $tableName); } foreach ($diff->renamedIndexes as $oldIndexName => $index) { $oldIndexName = new Identifier($oldIndexName); $sql = array_merge($sql, $this->getRenameIndexSQL($oldIndexName->getQuotedName($this), $index, $tableName)); } return $sql; } protected function getRenameIndexSQL($oldIndexName, Index $index, $tableName) { return [$this->getDropIndexSQL($oldIndexName, $tableName), $this->getCreateIndexSQL($index, $tableName)]; } protected function _getAlterTableIndexForeignKeySQL(TableDiff $diff) { return array_merge($this->getPreAlterTableIndexForeignKeySQL($diff), $this->getPostAlterTableIndexForeignKeySQL($diff)); } public function getColumnDeclarationListSQL(array $columns) { $declarations = []; foreach ($columns as $name => $column) { $declarations[] = $this->getColumnDeclarationSQL($name, $column); } return implode(', ', $declarations); } public function getColumnDeclarationSQL($name, array $column) { if (isset($column['columnDefinition'])) { $declaration = $this->getCustomTypeDeclarationSQL($column); } else { $default = $this->getDefaultValueDeclarationSQL($column); $charset = isset($column['charset']) && $column['charset'] ? ' ' . $this->getColumnCharsetDeclarationSQL($column['charset']) : ''; $collation = isset($column['collation']) && $column['collation'] ? ' ' . $this->getColumnCollationDeclarationSQL($column['collation']) : ''; $notnull = isset($column['notnull']) && $column['notnull'] ? ' NOT NULL' : ''; $unique = isset($column['unique']) && $column['unique'] ? ' ' . $this->getUniqueFieldDeclarationSQL() : ''; $check = isset($column['check']) && $column['check'] ? ' ' . $column['check'] : ''; $typeDecl = $column['type']->getSQLDeclaration($column, $this); $declaration = $typeDecl . $charset . $default . $notnull . $unique . $check . $collation; if ($this->supportsInlineColumnComments() && isset($column['comment']) && $column['comment'] !== '') { $declaration .= ' ' . $this->getInlineColumnCommentSQL($column['comment']); } } return $name . ' ' . $declaration; } public function getDecimalTypeDeclarationSQL(array $column) { $column['precision'] = !isset($column['precision']) || empty($column['precision']) ? 10 : $column['precision']; $column['scale'] = !isset($column['scale']) || empty($column['scale']) ? 0 : $column['scale']; return 'NUMERIC(' . $column['precision'] . ', ' . $column['scale'] . ')'; } public function getDefaultValueDeclarationSQL($column) { if (!isset($column['default'])) { return empty($column['notnull']) ? ' DEFAULT NULL' : ''; } $default = $column['default']; if (!isset($column['type'])) { return " DEFAULT '" . $default . "'"; } $type = $column['type']; if ($type instanceof Types\PhpIntegerMappingType) { return ' DEFAULT ' . $default; } if ($type instanceof Types\PhpDateTimeMappingType && $default === $this->getCurrentTimestampSQL()) { return ' DEFAULT ' . $this->getCurrentTimestampSQL(); } if ($type instanceof Types\TimeType && $default === $this->getCurrentTimeSQL()) { return ' DEFAULT ' . $this->getCurrentTimeSQL(); } if ($type instanceof Types\DateType && $default === $this->getCurrentDateSQL()) { return ' DEFAULT ' . $this->getCurrentDateSQL(); } if ($type instanceof Types\BooleanType) { return " DEFAULT '" . $this->convertBooleans($default) . "'"; } return ' DEFAULT ' . $this->quoteStringLiteral($default); } public function getCheckDeclarationSQL(array $definition) { $constraints = []; foreach ($definition as $column => $def) { if (is_string($def)) { $constraints[] = 'CHECK (' . $def . ')'; } else { if (isset($def['min'])) { $constraints[] = 'CHECK (' . $column . ' >= ' . $def['min'] . ')'; } if (isset($def['max'])) { $constraints[] = 'CHECK (' . $column . ' <= ' . $def['max'] . ')'; } } } return implode(', ', $constraints); } public function getUniqueConstraintDeclarationSQL($name, Index $index) { $columns = $index->getColumns(); $name = new Identifier($name); if (count($columns) === 0) { throw new InvalidArgumentException("Incomplete definition. 'columns' required."); } return 'CONSTRAINT ' . $name->getQuotedName($this) . ' UNIQUE (' . $this->getIndexFieldDeclarationListSQL($index) . ')' . $this->getPartialIndexSQL($index); } public function getIndexDeclarationSQL($name, Index $index) { $columns = $index->getColumns(); $name = new Identifier($name); if (count($columns) === 0) { throw new InvalidArgumentException("Incomplete definition. 'columns' required."); } return $this->getCreateIndexSQLFlags($index) . 'INDEX ' . $name->getQuotedName($this) . ' (' . $this->getIndexFieldDeclarationListSQL($index) . ')' . $this->getPartialIndexSQL($index); } public function getCustomTypeDeclarationSQL(array $column) { return $column['columnDefinition']; } public function getIndexFieldDeclarationListSQL($columnsOrIndex) : string { if ($columnsOrIndex instanceof Index) { return implode(', ', $columnsOrIndex->getQuotedColumns($this)); } if (!is_array($columnsOrIndex)) { throw new InvalidArgumentException('Fields argument should be an Index or array.'); } $ret = []; foreach ($columnsOrIndex as $column => $definition) { if (is_array($definition)) { $ret[] = $column; } else { $ret[] = $definition; } } return implode(', ', $ret); } public function getTemporaryTableSQL() { return 'TEMPORARY'; } public function getTemporaryTableName($tableName) { return $tableName; } public function getForeignKeyDeclarationSQL(ForeignKeyConstraint $foreignKey) { $sql = $this->getForeignKeyBaseDeclarationSQL($foreignKey); $sql .= $this->getAdvancedForeignKeyOptionsSQL($foreignKey); return $sql; } public function getAdvancedForeignKeyOptionsSQL(ForeignKeyConstraint $foreignKey) { $query = ''; if ($this->supportsForeignKeyOnUpdate() && $foreignKey->hasOption('onUpdate')) { $query .= ' ON UPDATE ' . $this->getForeignKeyReferentialActionSQL($foreignKey->getOption('onUpdate')); } if ($foreignKey->hasOption('onDelete')) { $query .= ' ON DELETE ' . $this->getForeignKeyReferentialActionSQL($foreignKey->getOption('onDelete')); } return $query; } public function getForeignKeyReferentialActionSQL($action) { $upper = strtoupper($action); switch ($upper) { case 'CASCADE': case 'SET NULL': case 'NO ACTION': case 'RESTRICT': case 'SET DEFAULT': return $upper; default: throw new InvalidArgumentException('Invalid foreign key action: ' . $upper); } } public function getForeignKeyBaseDeclarationSQL(ForeignKeyConstraint $foreignKey) { $sql = ''; if (strlen($foreignKey->getName())) { $sql .= 'CONSTRAINT ' . $foreignKey->getQuotedName($this) . ' '; } $sql .= 'FOREIGN KEY ('; if (count($foreignKey->getLocalColumns()) === 0) { throw new InvalidArgumentException("Incomplete definition. 'local' required."); } if (count($foreignKey->getForeignColumns()) === 0) { throw new InvalidArgumentException("Incomplete definition. 'foreign' required."); } if (strlen($foreignKey->getForeignTableName()) === 0) { throw new InvalidArgumentException("Incomplete definition. 'foreignTable' required."); } return $sql . implode(', ', $foreignKey->getQuotedLocalColumns($this)) . ') REFERENCES ' . $foreignKey->getQuotedForeignTableName($this) . ' (' . implode(', ', $foreignKey->getQuotedForeignColumns($this)) . ')'; } public function getUniqueFieldDeclarationSQL() { return 'UNIQUE'; } public function getColumnCharsetDeclarationSQL($charset) { return ''; } public function getColumnCollationDeclarationSQL($collation) { return $this->supportsColumnCollation() ? 'COLLATE ' . $collation : ''; } public function prefersSequences() { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4229', 'AbstractPlatform::prefersSequences() is deprecated without replacement and removed in DBAL 3.0'); return \false; } public function prefersIdentityColumns() { return \false; } public function convertBooleans($item) { if (is_array($item)) { foreach ($item as $k => $value) { if (!is_bool($value)) { continue; } $item[$k] = (int) $value; } } elseif (is_bool($item)) { $item = (int) $item; } return $item; } public function convertFromBoolean($item) { return $item === null ? null : (bool) $item; } public function convertBooleansToDatabaseValue($item) { return $this->convertBooleans($item); } public function getCurrentDateSQL() { return 'CURRENT_DATE'; } public function getCurrentTimeSQL() { return 'CURRENT_TIME'; } public function getCurrentTimestampSQL() { return 'CURRENT_TIMESTAMP'; } protected function _getTransactionIsolationLevelSQL($level) { switch ($level) { case TransactionIsolationLevel::READ_UNCOMMITTED: return 'READ UNCOMMITTED'; case TransactionIsolationLevel::READ_COMMITTED: return 'READ COMMITTED'; case TransactionIsolationLevel::REPEATABLE_READ: return 'REPEATABLE READ'; case TransactionIsolationLevel::SERIALIZABLE: return 'SERIALIZABLE'; default: throw new InvalidArgumentException('Invalid isolation level:' . $level); } } public function getListDatabasesSQL() { throw Exception::notSupported(__METHOD__); } public function getListNamespacesSQL() { throw Exception::notSupported(__METHOD__); } public function getListSequencesSQL($database) { throw Exception::notSupported(__METHOD__); } public function getListTableConstraintsSQL($table) { throw Exception::notSupported(__METHOD__); } public function getListTableColumnsSQL($table, $database = null) { throw Exception::notSupported(__METHOD__); } public function getListTablesSQL() { throw Exception::notSupported(__METHOD__); } public function getListUsersSQL() { throw Exception::notSupported(__METHOD__); } public function getListViewsSQL($database) { throw Exception::notSupported(__METHOD__); } public function getListTableIndexesSQL($table, $database = null) { throw Exception::notSupported(__METHOD__); } public function getListTableForeignKeysSQL($table) { throw Exception::notSupported(__METHOD__); } public function getCreateViewSQL($name, $sql) { throw Exception::notSupported(__METHOD__); } public function getDropViewSQL($name) { throw Exception::notSupported(__METHOD__); } public function getDropSequenceSQL($sequence) { throw Exception::notSupported(__METHOD__); } public function getSequenceNextValSQL($sequence) { throw Exception::notSupported(__METHOD__); } public function getCreateDatabaseSQL($name) { throw Exception::notSupported(__METHOD__); } public function getSetTransactionIsolationSQL($level) { throw Exception::notSupported(__METHOD__); } public function getDateTimeTypeDeclarationSQL(array $column) { throw Exception::notSupported(__METHOD__); } public function getDateTimeTzTypeDeclarationSQL(array $column) { return $this->getDateTimeTypeDeclarationSQL($column); } public function getDateTypeDeclarationSQL(array $column) { throw Exception::notSupported(__METHOD__); } public function getTimeTypeDeclarationSQL(array $column) { throw Exception::notSupported(__METHOD__); } public function getFloatDeclarationSQL(array $column) { return 'DOUBLE PRECISION'; } public function getDefaultTransactionIsolationLevel() { return TransactionIsolationLevel::READ_COMMITTED; } public function supportsSequences() { return \false; } public function supportsIdentityColumns() { return \false; } public function usesSequenceEmulatedIdentityColumns() { return \false; } public function getIdentitySequenceName($tableName, $columnName) { throw Exception::notSupported(__METHOD__); } public function supportsIndexes() { return \true; } public function supportsPartialIndexes() { return \false; } public function supportsColumnLengthIndexes() : bool { return \false; } public function supportsAlterTable() { return \true; } public function supportsTransactions() { return \true; } public function supportsSavepoints() { return \true; } public function supportsReleaseSavepoints() { return $this->supportsSavepoints(); } public function supportsPrimaryConstraints() { return \true; } public function supportsForeignKeyConstraints() { return \true; } public function supportsForeignKeyOnUpdate() { Deprecation::triggerIfCalledFromOutside('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4229', 'AbstractPlatform::supportsForeignKeyOnUpdate() is deprecated without replacement and removed in DBAL 3.0'); return $this->supportsForeignKeyConstraints(); } public function supportsSchemas() { return \false; } public function canEmulateSchemas() { return \false; } public function getDefaultSchemaName() { throw Exception::notSupported(__METHOD__); } public function supportsCreateDropDatabase() { return \true; } public function supportsGettingAffectedRows() { return \true; } public function supportsInlineColumnComments() { return \false; } public function supportsCommentOnStatement() { return \false; } public function hasNativeGuidType() { return \false; } public function hasNativeJsonType() { return \false; } public function getIdentityColumnNullInsertSQL() { return ''; } public function supportsViews() { return \true; } public function supportsColumnCollation() { return \false; } public function getDateTimeFormatString() { return 'Y-m-d H:i:s'; } public function getDateTimeTzFormatString() { return 'Y-m-d H:i:s'; } public function getDateFormatString() { return 'Y-m-d'; } public function getTimeFormatString() { return 'H:i:s'; } public final function modifyLimitQuery($query, $limit, $offset = null) { if ($limit !== null) { $limit = (int) $limit; } $offset = (int) $offset; if ($offset < 0) { throw new Exception(sprintf('Offset must be a positive integer or zero, %d given', $offset)); } if ($offset > 0 && !$this->supportsLimitOffset()) { throw new Exception(sprintf('Platform %s does not support offset values in limit queries.', $this->getName())); } return $this->doModifyLimitQuery($query, $limit, $offset); } protected function doModifyLimitQuery($query, $limit, $offset) { if ($limit !== null) { $query .= ' LIMIT ' . $limit; } if ($offset > 0) { $query .= ' OFFSET ' . $offset; } return $query; } public function supportsLimitOffset() { return \true; } public function getSQLResultCasing($column) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4229', 'AbstractPlatform::getSQLResultCasing is deprecated without replacement and removed in DBAL 3.' . 'Use Portability\\Connection with PORTABILITY_FIX_CASE to get portable result cases.'); return $column; } public function fixSchemaElementName($schemaElementName) { Deprecation::trigger('doctrine/dbal', 'https://github.com/doctrine/dbal/pull/4132', 'AbstractPlatform::fixSchemaElementName is deprecated with no replacement and removed in DBAL 3.0'); return $schemaElementName; } public function getMaxIdentifierLength() { return 63; } public function getEmptyIdentityInsertSQL($quotedTableName, $quotedIdentifierColumnName) { return 'INSERT INTO ' . $quotedTableName . ' (' . $quotedIdentifierColumnName . ') VALUES (null)'; } public function getTruncateTableSQL($tableName, $cascade = \false) { $tableIdentifier = new Identifier($tableName); return 'TRUNCATE ' . $tableIdentifier->getQuotedName($this); } public function getDummySelectSQL() { $expression = func_num_args() > 0 ? func_get_arg(0) : '1'; return sprintf('SELECT %s', $expression); } public function createSavePoint($savepoint) { return 'SAVEPOINT ' . $savepoint; } public function releaseSavePoint($savepoint) { return 'RELEASE SAVEPOINT ' . $savepoint; } public function rollbackSavePoint($savepoint) { return 'ROLLBACK TO SAVEPOINT ' . $savepoint; } public final function getReservedKeywordsList() { if ($this->_keywords) { return $this->_keywords; } $class = $this->getReservedKeywordsClass(); $keywords = new $class(); if (!$keywords instanceof KeywordList) { throw Exception::notSupported(__METHOD__); } $this->_keywords = $keywords; return $keywords; } protected function getReservedKeywordsClass() { throw Exception::notSupported(__METHOD__); } public function quoteStringLiteral($str) { $c = $this->getStringLiteralQuoteCharacter(); return $c . str_replace($c, $c . $c, $str) . $c; } public function getStringLiteralQuoteCharacter() { return "'"; } public final function escapeStringForLike(string $inputString, string $escapeChar) : string { return preg_replace('~([' . preg_quote($this->getLikeWildcardCharacters() . $escapeChar, '~') . '])~u', addcslashes($escapeChar, '\\') . '$1', $inputString); } protected function getLikeWildcardCharacters() : string { return '%_'; } }
|
vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/MariaDb1027Platform.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
namespace MailPoetVendor\Doctrine\DBAL\Platforms; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\DBAL\Types\Types;
|
1 |
Â
<?php
|
2 |
+
namespace MailPoetVendor\Doctrine\DBAL\Platforms; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\DBAL\Types\Types; class MariaDb1027Platform extends MySqlPlatform { public function getJsonTypeDeclarationSQL(array $column) : string { return 'LONGTEXT'; } protected function getReservedKeywordsClass() : string { return Keywords\MariaDb102Keywords::class; } protected function initializeDoctrineTypeMappings() : void { parent::initializeDoctrineTypeMappings(); $this->doctrineTypeMapping['json'] = Types::JSON; } }
|
vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Portability/Statement.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
namespace MailPoetVendor\Doctrine\DBAL\Portability; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\DBAL\Driver\Result; use MailPoetVendor\Doctrine\DBAL\Driver\ResultStatement; use MailPoetVendor\Doctrine\DBAL\Driver\Statement as DriverStatement; use MailPoetVendor\Doctrine\DBAL\Driver\StatementIterator; use MailPoetVendor\Doctrine\DBAL\FetchMode; use MailPoetVendor\Doctrine\DBAL\ParameterType; use IteratorAggregate; use PDO; use MailPoetVendor\ReturnTypeWillChange; use function array_change_key_case; use function assert; use function is_string; use function rtrim; class Statement implements IteratorAggregate, DriverStatement, Result { private $portability; private $stmt; private $case; private $defaultFetchMode = FetchMode::MIXED; public function __construct($stmt, Connection $conn) { $this->stmt = $stmt; $this->portability = $conn->getPortability(); $this->case = $conn->getFetchCase(); } public function bindParam($param, &$variable, $type = ParameterType::STRING, $length = null) { assert($this->stmt instanceof DriverStatement); return $this->stmt->bindParam($param, $variable, $type, $length); } public function bindValue($param, $value, $type = ParameterType::STRING) { assert($this->stmt instanceof DriverStatement); return $this->stmt->bindValue($param, $value, $type); } public function closeCursor() { return $this->stmt->closeCursor(); } public function columnCount() { return $this->stmt->columnCount(); } public function errorCode() { assert($this->stmt instanceof DriverStatement); return $this->stmt->errorCode(); } public function errorInfo() { assert($this->stmt instanceof DriverStatement); return $this->stmt->errorInfo(); } public function execute($params = null) { assert($this->stmt instanceof DriverStatement); return $this->stmt->execute($params); } public function setFetchMode($fetchMode, $arg2 = null, $arg3 = null) { $this->defaultFetchMode = $fetchMode; return $this->stmt->setFetchMode($fetchMode, $arg2, $arg3); } public function getIterator() { return new StatementIterator($this); } public function fetch($fetchMode = null, $cursorOrientation = PDO::FETCH_ORI_NEXT, $cursorOffset = 0) { $fetchMode = $fetchMode ?: $this->defaultFetchMode; $row = $this->stmt->fetch($fetchMode); $iterateRow = ($this->portability & (Connection::PORTABILITY_EMPTY_TO_NULL | Connection::PORTABILITY_RTRIM)) !== 0; $fixCase = $this->case !== null && ($fetchMode === FetchMode::ASSOCIATIVE || $fetchMode === FetchMode::MIXED) && $this->portability & Connection::PORTABILITY_FIX_CASE; $row = $this->fixRow($row, $iterateRow, $fixCase); return $row; } public function fetchAll($fetchMode = null, $fetchArgument = null, $ctorArgs = null) { $fetchMode = $fetchMode ?: $this->defaultFetchMode; if ($fetchArgument) { $rows = $this->stmt->fetchAll($fetchMode, $fetchArgument); } else { $rows = $this->stmt->fetchAll($fetchMode); } $fixCase = $this->case !== null && ($fetchMode === FetchMode::ASSOCIATIVE || $fetchMode === FetchMode::MIXED) && $this->portability & Connection::PORTABILITY_FIX_CASE; return $this->fixResultSet($rows, $fixCase, $fetchMode !== FetchMode::COLUMN); } public function fetchNumeric() { if ($this->stmt instanceof Result) { $row = $this->stmt->fetchNumeric(); } else { $row = $this->stmt->fetch(FetchMode::NUMERIC); } return $this->fixResult($row, \false); } public function fetchAssociative() { if ($this->stmt instanceof Result) { $row = $this->stmt->fetchAssociative(); } else { $row = $this->stmt->fetch(FetchMode::ASSOCIATIVE); } return $this->fixResult($row, \true); } public function fetchOne() { if ($this->stmt instanceof Result) { $value = $this->stmt->fetchOne(); } else { $value = $this->stmt->fetch(FetchMode::COLUMN); } if (($this->portability & Connection::PORTABILITY_EMPTY_TO_NULL) !== 0 && $value === '') { $value = null; } elseif (($this->portability & Connection::PORTABILITY_RTRIM) !== 0 && is_string($value)) { $value = rtrim($value); } return $value; } public function fetchAllNumeric() : array { if ($this->stmt instanceof Result) { $data = $this->stmt->fetchAllNumeric(); } else { $data = $this->stmt->fetchAll(FetchMode::NUMERIC); } return $this->fixResultSet($data, \false, \true); } public function fetchAllAssociative() : array { if ($this->stmt instanceof Result) { $data = $this->stmt->fetchAllAssociative(); } else { $data = $this->stmt->fetchAll(FetchMode::ASSOCIATIVE); } return $this->fixResultSet($data, \true, \true); } public function fetchFirstColumn() : array { if ($this->stmt instanceof Result) { $data = $this->stmt->fetchFirstColumn(); } else { $data = $this->stmt->fetchAll(FetchMode::COLUMN); } return $this->fixResultSet($data, \true, \false); } public function free() : void { if ($this->stmt instanceof Result) { $this->stmt->free(); return; } $this->stmt->closeCursor(); } private function fixResult($result, bool $fixCase) { $iterateRow = ($this->portability & (Connection::PORTABILITY_EMPTY_TO_NULL | Connection::PORTABILITY_RTRIM)) !== 0; $fixCase = $fixCase && $this->case !== null && ($this->portability & Connection::PORTABILITY_FIX_CASE) !== 0; return $this->fixRow($result, $iterateRow, $fixCase); } private function fixResultSet(array $resultSet, bool $fixCase, bool $isArray) : array { $iterateRow = ($this->portability & (Connection::PORTABILITY_EMPTY_TO_NULL | Connection::PORTABILITY_RTRIM)) !== 0; $fixCase = $fixCase && $this->case !== null && ($this->portability & Connection::PORTABILITY_FIX_CASE) !== 0; if (!$iterateRow && !$fixCase) { return $resultSet; } if (!$isArray) { foreach ($resultSet as $num => $value) { $resultSet[$num] = [$value]; } } foreach ($resultSet as $num => $row) { $resultSet[$num] = $this->fixRow($row, $iterateRow, $fixCase); } if (!$isArray) { foreach ($resultSet as $num => $row) { $resultSet[$num] = $row[0]; } } return $resultSet; } protected function fixRow($row, $iterateRow, $fixCase) { if (!$row) { return $row; } if ($fixCase) { $row = array_change_key_case($row, $this->case); } if ($iterateRow) { foreach ($row as $k => $v) { if ($this->portability & Connection::PORTABILITY_EMPTY_TO_NULL && $v === '') { $row[$k] = null; } elseif ($this->portability & Connection::PORTABILITY_RTRIM && is_string($v)) { $row[$k] = rtrim($v); } } } return $row; } public function fetchColumn($columnIndex = 0) { $value = $this->stmt->fetchColumn($columnIndex); if ($this->portability & (Connection::PORTABILITY_EMPTY_TO_NULL | Connection::PORTABILITY_RTRIM)) { if ($this->portability & Connection::PORTABILITY_EMPTY_TO_NULL && $value === '') { $value = null; } elseif ($this->portability & Connection::PORTABILITY_RTRIM && is_string($value)) { $value = rtrim($value); } } return $value; } public function rowCount() { assert($this->stmt instanceof DriverStatement); return $this->stmt->rowCount(); } }
|
1 |
Â
<?php
|
2 |
+
namespace MailPoetVendor\Doctrine\DBAL\Portability; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\DBAL\Driver\Result; use MailPoetVendor\Doctrine\DBAL\Driver\ResultStatement; use MailPoetVendor\Doctrine\DBAL\Driver\Statement as DriverStatement; use MailPoetVendor\Doctrine\DBAL\Driver\StatementIterator; use MailPoetVendor\Doctrine\DBAL\FetchMode; use MailPoetVendor\Doctrine\DBAL\ParameterType; use IteratorAggregate; use PDO; use MailPoetVendor\ReturnTypeWillChange; use function array_change_key_case; use function assert; use function is_string; use function rtrim; class Statement implements IteratorAggregate, DriverStatement, Result { private $portability; private $stmt; private $case; private $defaultFetchMode = FetchMode::MIXED; public function __construct($stmt, Connection $conn) { $this->stmt = $stmt; $this->portability = $conn->getPortability(); $this->case = $conn->getFetchCase(); } public function bindParam($param, &$variable, $type = ParameterType::STRING, $length = null) { assert($this->stmt instanceof DriverStatement); return $this->stmt->bindParam($param, $variable, $type, $length); } public function bindValue($param, $value, $type = ParameterType::STRING) { assert($this->stmt instanceof DriverStatement); return $this->stmt->bindValue($param, $value, $type); } public function closeCursor() { return $this->stmt->closeCursor(); } public function columnCount() { return $this->stmt->columnCount(); } public function errorCode() { assert($this->stmt instanceof DriverStatement); return $this->stmt->errorCode(); } public function errorInfo() { assert($this->stmt instanceof DriverStatement); return $this->stmt->errorInfo(); } public function execute($params = null) { assert($this->stmt instanceof DriverStatement); return $this->stmt->execute($params); } public function setFetchMode($fetchMode, $arg2 = null, $arg3 = null) { $this->defaultFetchMode = $fetchMode; return $this->stmt->setFetchMode($fetchMode, $arg2, $arg3); } public function getIterator() { return new StatementIterator($this); } public function fetch($fetchMode = null, $cursorOrientation = PDO::FETCH_ORI_NEXT, $cursorOffset = 0) { $fetchMode = $fetchMode ?: $this->defaultFetchMode; $row = $this->stmt->fetch($fetchMode); $iterateRow = ($this->portability & (Connection::PORTABILITY_EMPTY_TO_NULL | Connection::PORTABILITY_RTRIM)) !== 0; $fixCase = $this->case !== null && ($fetchMode === FetchMode::ASSOCIATIVE || $fetchMode === FetchMode::MIXED) && $this->portability & Connection::PORTABILITY_FIX_CASE; $row = $this->fixRow($row, $iterateRow, $fixCase); return $row; } public function fetchAll($fetchMode = null, $fetchArgument = null, $ctorArgs = null) { $fetchMode = $fetchMode ?: $this->defaultFetchMode; if ($fetchArgument) { $rows = $this->stmt->fetchAll($fetchMode, $fetchArgument); } else { $rows = $this->stmt->fetchAll($fetchMode); } $fixCase = $this->case !== null && ($fetchMode === FetchMode::ASSOCIATIVE || $fetchMode === FetchMode::MIXED) && $this->portability & Connection::PORTABILITY_FIX_CASE; return $this->fixResultSet($rows, $fixCase, $fetchMode !== FetchMode::COLUMN); } public function fetchNumeric() { if ($this->stmt instanceof Result) { $row = $this->stmt->fetchNumeric(); } else { $row = $this->stmt->fetch(FetchMode::NUMERIC); } return $this->fixResult($row, \false); } public function fetchAssociative() { if ($this->stmt instanceof Result) { $row = $this->stmt->fetchAssociative(); } else { $row = $this->stmt->fetch(FetchMode::ASSOCIATIVE); } return $this->fixResult($row, \true); } public function fetchOne() { if ($this->stmt instanceof Result) { $value = $this->stmt->fetchOne(); } else { $value = $this->stmt->fetch(FetchMode::COLUMN); } if (($this->portability & Connection::PORTABILITY_EMPTY_TO_NULL) !== 0 && $value === '') { $value = null; } elseif (($this->portability & Connection::PORTABILITY_RTRIM) !== 0 && is_string($value)) { $value = rtrim($value); } return $value; } public function fetchAllNumeric() : array { if ($this->stmt instanceof Result) { $data = $this->stmt->fetchAllNumeric(); } else { $data = $this->stmt->fetchAll(FetchMode::NUMERIC); } return $this->fixResultSet($data, \false, \true); } public function fetchAllAssociative() : array { if ($this->stmt instanceof Result) { $data = $this->stmt->fetchAllAssociative(); } else { $data = $this->stmt->fetchAll(FetchMode::ASSOCIATIVE); } return $this->fixResultSet($data, \true, \true); } public function fetchFirstColumn() : array { if ($this->stmt instanceof Result) { $data = $this->stmt->fetchFirstColumn(); } else { $data = $this->stmt->fetchAll(FetchMode::COLUMN); } return $this->fixResultSet($data, \true, \false); } public function free() : void { if ($this->stmt instanceof Result) { $this->stmt->free(); return; } $this->stmt->closeCursor(); } private function fixResult($result, bool $fixCase) { $iterateRow = ($this->portability & (Connection::PORTABILITY_EMPTY_TO_NULL | Connection::PORTABILITY_RTRIM)) !== 0; $fixCase = $fixCase && $this->case !== null && ($this->portability & Connection::PORTABILITY_FIX_CASE) !== 0; return $this->fixRow($result, $iterateRow, $fixCase); } private function fixResultSet(array $resultSet, bool $fixCase, bool $isArray) : array { $iterateRow = ($this->portability & (Connection::PORTABILITY_EMPTY_TO_NULL | Connection::PORTABILITY_RTRIM)) !== 0; $fixCase = $fixCase && $this->case !== null && ($this->portability & Connection::PORTABILITY_FIX_CASE) !== 0; if (!$iterateRow && !$fixCase) { return $resultSet; } if (!$isArray) { foreach ($resultSet as $num => $value) { $resultSet[$num] = [$value]; } } foreach ($resultSet as $num => $row) { $resultSet[$num] = $this->fixRow($row, $iterateRow, $fixCase); } if (!$isArray) { foreach ($resultSet as $num => $row) { $resultSet[$num] = $row[0]; } } return $resultSet; } protected function fixRow($row, $iterateRow, $fixCase) { if (!$row) { return $row; } if ($fixCase) { assert($this->case !== null); $row = array_change_key_case($row, $this->case); } if ($iterateRow) { foreach ($row as $k => $v) { if ($this->portability & Connection::PORTABILITY_EMPTY_TO_NULL && $v === '') { $row[$k] = null; } elseif ($this->portability & Connection::PORTABILITY_RTRIM && is_string($v)) { $row[$k] = rtrim($v); } } } return $row; } public function fetchColumn($columnIndex = 0) { $value = $this->stmt->fetchColumn($columnIndex); if ($this->portability & (Connection::PORTABILITY_EMPTY_TO_NULL | Connection::PORTABILITY_RTRIM)) { if ($this->portability & Connection::PORTABILITY_EMPTY_TO_NULL && $value === '') { $value = null; } elseif ($this->portability & Connection::PORTABILITY_RTRIM && is_string($value)) { $value = rtrim($value); } } return $value; } public function rowCount() { assert($this->stmt instanceof DriverStatement); return $this->stmt->rowCount(); } }
|
vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/SQLParserUtils.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
namespace MailPoetVendor\Doctrine\DBAL; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\DBAL\Types\Type; use function array_fill; use function array_fill_keys; use function array_key_exists; use function array_keys; use function array_merge; use function array_slice; use function array_values; use function count; use function implode; use function is_int; use function key; use function ksort; use function preg_match_all; use function sprintf; use function strlen; use function strpos; use function substr; use const PREG_OFFSET_CAPTURE; class SQLParserUtils { public const POSITIONAL_TOKEN = '\\?'; public const NAMED_TOKEN = '(?<!:):[a-zA-Z_][a-zA-Z0-9_]*'; public const ESCAPED_SINGLE_QUOTED_TEXT = "(?:'(?:\\\\)+'|'(?:[^'\\\\]|\\\\'?|'')*')"; public const ESCAPED_DOUBLE_QUOTED_TEXT = '(?:"(?:\\\\)+"|"(?:[^"\\\\]|\\\\"?)*")'; public const ESCAPED_BACKTICK_QUOTED_TEXT = '(?:`(?:\\\\)+`|`(?:[^`\\\\]|\\\\`?)*`)'; private const ESCAPED_BRACKET_QUOTED_TEXT = '(?<!\\b(?i:ARRAY))\\[(?:[^\\]])*\\]'; public static function getPlaceholderPositions($statement, $isPositional = \true) { return $isPositional ? self::getPositionalPlaceholderPositions($statement) : self::getNamedPlaceholderPositions($statement); } private static function getPositionalPlaceholderPositions(string $statement) : array { return self::collectPlaceholders($statement, '?', self::POSITIONAL_TOKEN, static function (string $_, int $placeholderPosition, int $fragmentPosition, array &$carry) : void { $carry[] = $placeholderPosition + $fragmentPosition; }); } private static function getNamedPlaceholderPositions(string $statement) : array { return self::collectPlaceholders($statement, ':', self::NAMED_TOKEN, static function (string $placeholder, int $placeholderPosition, int $fragmentPosition, array &$carry) : void { $carry[$placeholderPosition + $fragmentPosition] = substr($placeholder, 1); }); } private static function collectPlaceholders(string $statement, string $match, string $token, callable $collector) : array { if (strpos($statement, $match) === \false) { return []; } $carry = []; foreach (self::getUnquotedStatementFragments($statement) as $fragment) { preg_match_all('/' . $token . '/', $fragment[0], $matches, \PREG_OFFSET_CAPTURE); foreach ($matches[0] as $placeholder) { $collector($placeholder[0], $placeholder[1], $fragment[1], $carry); } } return $carry; } public static function expandListParameters($query, $params, $types) { $isPositional = is_int(key($params)); $arrayPositions = []; $bindIndex = -1; if ($isPositional) { $types += array_fill_keys(array_keys($params), null); ksort($params); ksort($types); } foreach ($types as $name => $type) { ++$bindIndex; if ($type !== Connection::PARAM_INT_ARRAY && $type !== Connection::PARAM_STR_ARRAY) { continue; } if ($isPositional) { $name = $bindIndex; } $arrayPositions[$name] = \false; } if (!$arrayPositions && $isPositional) { return [$query, $params, $types]; } if ($isPositional) { $paramOffset = 0; $queryOffset = 0; $params = array_values($params); $types = array_values($types); $paramPos = self::getPositionalPlaceholderPositions($query); foreach ($paramPos as $needle => $needlePos) { if (!isset($arrayPositions[$needle])) { continue; } $needle += $paramOffset; $needlePos += $queryOffset; $count = count($params[$needle]); $params = array_merge(array_slice($params, 0, $needle), $params[$needle], array_slice($params, $needle + 1)); $types = array_merge(array_slice($types, 0, $needle), $count ? array_fill(0, $count, $types[$needle] - Connection::ARRAY_PARAM_OFFSET) : [], array_slice($types, $needle + 1)); $expandStr = $count ? implode(', ', array_fill(0, $count, '?')) : 'NULL'; $query = substr($query, 0, $needlePos) . $expandStr . substr($query, $needlePos + 1); $paramOffset += $count - 1; $queryOffset += strlen($expandStr) - 1; } return [$query, $params, $types]; } $queryOffset = 0; $typesOrd = []; $paramsOrd = []; $paramPos = self::getNamedPlaceholderPositions($query); foreach ($paramPos as $pos => $paramName) { $paramLen = strlen($paramName) + 1; $value =
|
1 |
Â
<?php
|
2 |
+
namespace MailPoetVendor\Doctrine\DBAL; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\DBAL\Types\Type; use function array_fill; use function array_fill_keys; use function array_key_exists; use function array_keys; use function array_merge; use function array_slice; use function array_values; use function count; use function implode; use function is_int; use function key; use function ksort; use function preg_match_all; use function sprintf; use function strlen; use function strpos; use function substr; use const PREG_OFFSET_CAPTURE; class SQLParserUtils { public const POSITIONAL_TOKEN = '\\?'; public const NAMED_TOKEN = '(?<!:):[a-zA-Z_][a-zA-Z0-9_]*'; public const ESCAPED_SINGLE_QUOTED_TEXT = "(?:'(?:\\\\)+'|'(?:[^'\\\\]|\\\\'?|'')*')"; public const ESCAPED_DOUBLE_QUOTED_TEXT = '(?:"(?:\\\\)+"|"(?:[^"\\\\]|\\\\"?)*")'; public const ESCAPED_BACKTICK_QUOTED_TEXT = '(?:`(?:\\\\)+`|`(?:[^`\\\\]|\\\\`?)*`)'; private const ESCAPED_BRACKET_QUOTED_TEXT = '(?<!\\b(?i:ARRAY))\\[(?:[^\\]])*\\]'; public static function getPlaceholderPositions($statement, $isPositional = \true) { return $isPositional ? self::getPositionalPlaceholderPositions($statement) : self::getNamedPlaceholderPositions($statement); } private static function getPositionalPlaceholderPositions(string $statement) : array { return self::collectPlaceholders($statement, '?', self::POSITIONAL_TOKEN, static function (string $_, int $placeholderPosition, int $fragmentPosition, array &$carry) : void { $carry[] = $placeholderPosition + $fragmentPosition; }); } private static function getNamedPlaceholderPositions(string $statement) : array { return self::collectPlaceholders($statement, ':', self::NAMED_TOKEN, static function (string $placeholder, int $placeholderPosition, int $fragmentPosition, array &$carry) : void { $carry[$placeholderPosition + $fragmentPosition] = substr($placeholder, 1); }); } private static function collectPlaceholders(string $statement, string $match, string $token, callable $collector) : array { if (strpos($statement, $match) === \false) { return []; } $carry = []; foreach (self::getUnquotedStatementFragments($statement) as $fragment) { preg_match_all('/' . $token . '/', $fragment[0], $matches, \PREG_OFFSET_CAPTURE); foreach ($matches[0] as $placeholder) { $collector($placeholder[0], $placeholder[1], $fragment[1], $carry); } } return $carry; } public static function expandListParameters($query, $params, $types) { $isPositional = is_int(key($params)); $arrayPositions = []; $bindIndex = -1; if ($isPositional) { $types += array_fill_keys(array_keys($params), null); ksort($params); ksort($types); } foreach ($types as $name => $type) { ++$bindIndex; if ($type !== Connection::PARAM_INT_ARRAY && $type !== Connection::PARAM_STR_ARRAY) { continue; } if ($isPositional) { $name = $bindIndex; } $arrayPositions[$name] = \false; } if (!$arrayPositions && $isPositional) { return [$query, $params, $types]; } if ($isPositional) { $paramOffset = 0; $queryOffset = 0; $params = array_values($params); $types = array_values($types); $paramPos = self::getPositionalPlaceholderPositions($query); foreach ($paramPos as $needle => $needlePos) { if (!isset($arrayPositions[$needle])) { continue; } $needle += $paramOffset; $needlePos += $queryOffset; $count = count($params[$needle]); $params = array_merge(array_slice($params, 0, $needle), $params[$needle], array_slice($params, $needle + 1)); $types = array_merge(array_slice($types, 0, $needle), $count ? array_fill(0, $count, $types[$needle] - Connection::ARRAY_PARAM_OFFSET) : [], array_slice($types, $needle + 1)); $expandStr = $count ? implode(', ', array_fill(0, $count, '?')) : 'NULL'; $query = substr($query, 0, $needlePos) . $expandStr . substr($query, $needlePos + 1); $paramOffset += $count - 1; $queryOffset += strlen($expandStr) - 1; } return [$query, $params, $types]; } $queryOffset = 0; $typesOrd = []; $paramsOrd = []; $paramPos = self::getNamedPlaceholderPositions($query); foreach ($paramPos as $pos => $paramName) { $paramLen = strlen($paramName) + 1; $value = self::extractParam($paramName, $params, \true); if (!isset($arrayPositions[$paramName]) && !isset($arrayPositions[':' . $paramName])) { $pos += $queryOffset; $queryOffset -= $paramLen - 1; $paramsOrd[] = $value; $typesOrd[] = self::extractParam($paramName, $types, \false, ParameterType::STRING); $query = substr($query, 0, $pos) . '?' . substr($query, $pos + $paramLen); continue; } $count = count($value); $expandStr = $count > 0 ? implode(', ', array_fill(0, $count, '?')) : 'NULL'; foreach ($value as $val) { $paramsOrd[] = $val; $typesOrd[] = self::extractParam($paramName, $types, \false) - Connection::ARRAY_PARAM_OFFSET; } $pos += $queryOffset; $queryOffset += strlen($expandStr) - $paramLen; $query = substr($query, 0, $pos) . $expandStr . substr($query, $pos + $paramLen); } return [$query, $paramsOrd, $typesOrd]; } private static function getUnquotedStatementFragments($statement) { $literal = self::ESCAPED_SINGLE_QUOTED_TEXT . '|' . self::ESCAPED_DOUBLE_QUOTED_TEXT . '|' . self::ESCAPED_BACKTICK_QUOTED_TEXT . '|' . self::ESCAPED_BRACKET_QUOTED_TEXT; $expression = sprintf('/((.+(?i:ARRAY)\\[.+\\])|([^\'"`\\[]+))(?:%s)?/s', $literal); preg_match_all($expression, $statement, $fragments, \PREG_OFFSET_CAPTURE); return $fragments[1]; } private static function extractParam($paramName, $paramsOrTypes, $isParam, $defaultValue = null) { if (array_key_exists($paramName, $paramsOrTypes)) { return $paramsOrTypes[$paramName]; } if (array_key_exists(':' . $paramName, $paramsOrTypes)) { return $paramsOrTypes[':' . $paramName]; } if ($defaultValue !== null) { return $defaultValue; } if ($isParam) { throw SQLParserUtilsException::missingParam($paramName); } throw SQLParserUtilsException::missingType($paramName); } }
|
vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DecimalType.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
namespace MailPoetVendor\Doctrine\DBAL\Types; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\DBAL\Platforms\AbstractPlatform; use function is_float; use const PHP_VERSION_ID; class DecimalType extends Type { public function getName() { return Types::DECIMAL; } public function getSQLDeclaration(array $column, AbstractPlatform $platform) { return $platform->getDecimalTypeDeclarationSQL($column); } public function convertToPHPValue($value, AbstractPlatform $platform) { if (\PHP_VERSION_ID >= 80100 && is_float($value)) { return (string) $value; } return $value; } }
|
1 |
Â
<?php
|
2 |
+
namespace MailPoetVendor\Doctrine\DBAL\Types; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\DBAL\Platforms\AbstractPlatform; use function is_float; use function is_int; use const PHP_VERSION_ID; class DecimalType extends Type { public function getName() { return Types::DECIMAL; } public function getSQLDeclaration(array $column, AbstractPlatform $platform) { return $platform->getDecimalTypeDeclarationSQL($column); } public function convertToPHPValue($value, AbstractPlatform $platform) { if (\PHP_VERSION_ID >= 80100 && (is_float($value) || is_int($value))) { return (string) $value; } return $value; } }
|
vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Version.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
namespace MailPoetVendor\Doctrine\DBAL; if (!defined('ABSPATH')) exit; use function str_replace; use function strtoupper; use function version_compare; class Version { public const VERSION = '2.13.
|
1 |
Â
<?php
|
2 |
+
namespace MailPoetVendor\Doctrine\DBAL; if (!defined('ABSPATH')) exit; use function str_replace; use function strtoupper; use function version_compare; class Version { public const VERSION = '2.13.7-dev'; public static function compare($version) { $version = str_replace(' ', '', strtoupper($version)); return version_compare($version, self::VERSION); } }
|
vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Entity/AbstractEntityPersister.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
declare (strict_types=1); namespace MailPoetVendor\Doctrine\ORM\Cache\Persister\Entity; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\Common\Collections\Criteria; use MailPoetVendor\Doctrine\Common\Util\ClassUtils; use MailPoetVendor\Doctrine\ORM\Cache; use MailPoetVendor\Doctrine\ORM\Cache\CollectionCacheKey; use MailPoetVendor\Doctrine\ORM\Cache\EntityCacheKey; use MailPoetVendor\Doctrine\ORM\Cache\EntityHydrator; use MailPoetVendor\Doctrine\ORM\Cache\Logging\CacheLogger; use MailPoetVendor\Doctrine\ORM\Cache\Persister\CachedPersister; use MailPoetVendor\Doctrine\ORM\Cache\QueryCacheKey; use MailPoetVendor\Doctrine\ORM\Cache\Region; use MailPoetVendor\Doctrine\ORM\Cache\TimestampCacheKey; use MailPoetVendor\Doctrine\ORM\Cache\TimestampRegion; use MailPoetVendor\Doctrine\ORM\EntityManagerInterface; use MailPoetVendor\Doctrine\ORM\Mapping\ClassMetadata; use MailPoetVendor\Doctrine\ORM\Mapping\ClassMetadataFactory; use MailPoetVendor\Doctrine\ORM\PersistentCollection; use MailPoetVendor\Doctrine\ORM\Persisters\Entity\EntityPersister; use MailPoetVendor\Doctrine\ORM\UnitOfWork; use function assert; use function serialize; use function sha1; abstract class AbstractEntityPersister implements CachedEntityPersister { protected $uow; protected $metadataFactory; protected $persister; protected $class; protected $queuedCache = []; protected $region; protected $timestampRegion; protected $timestampKey; protected $hydrator; protected $cache; protected $cacheLogger; protected $regionName; protected $joinedAssociations; public function __construct(EntityPersister $persister, Region $region, EntityManagerInterface $em, ClassMetadata $class) { $configuration = $em->getConfiguration(); $cacheConfig = $configuration->getSecondLevelCacheConfiguration(); $cacheFactory = $cacheConfig->getCacheFactory(); $this->class = $class; $this->region = $region; $this->persister = $persister; $this->cache = $em->getCache(); $this->regionName = $region->getName(); $this->uow = $em->getUnitOfWork(); $this->metadataFactory = $em->getMetadataFactory(); $this->cacheLogger = $cacheConfig->getCacheLogger(); $this->timestampRegion = $cacheFactory->getTimestampRegion(); $this->hydrator = $cacheFactory->buildEntityHydrator($em, $class); $this->timestampKey = new TimestampCacheKey($this->class->rootEntityName); } public function addInsert($entity) { $this->persister->addInsert($entity); } public function getInserts() { return $this->persister->getInserts(); } public function getSelectSQL($criteria, $assoc = null, $lockMode = null, $limit = null, $offset = null, ?array $orderBy = null) { return $this->persister->getSelectSQL($criteria, $assoc, $lockMode, $limit, $offset, $orderBy); } public function getCountSQL($criteria = []) { return $this->persister->getCountSQL($criteria); } public function getInsertSQL() { return $this->persister->getInsertSQL(); } public function getResultSetMapping() { return $this->persister->getResultSetMapping(); } public function getSelectConditionStatementSQL($field, $value, $assoc = null, $comparison = null) { return $this->persister->getSelectConditionStatementSQL($field, $value, $assoc, $comparison); } public function exists($entity, ?Criteria $extraConditions = null) { if ($extraConditions === null) { $key = new EntityCacheKey($this->class->rootEntityName, $this->class->getIdentifierValues($entity)); if ($this->region->contains($key)) { return \true; } } return $this->persister->exists($entity, $extraConditions); } public function getCacheRegion() { return $this->region; } public function getEntityHydrator() { return $this->hydrator; } public function storeEntityCache($entity, EntityCacheKey $key) { $class = $this->class; $className = ClassUtils::getClass($entity); if ($className !== $this->class->name) { $class = $this->metadataFactory->getMetadataFor($className); } $entry = $this->hydrator->buildCacheEntry($class, $key, $entity); $cached = $this->region->put($key, $entry); if ($this->cacheLogger && $cached) { $this->cacheLogger->entityCachePut($this->regionName, $key); } return $cached; } private function storeJoinedAssociations($entity) : void { if ($this->joinedAssociations === null) { $associations = []; foreach ($this->class->associationMappings as $name => $assoc) { if (isset($assoc['cache']) && $assoc['type'] & ClassMetadata::TO_ONE && ($assoc['fetch'] === ClassMetadata::FETCH_EAGER || !$assoc['isOwningSide'])) { $associations[] = $name; } } $this->joinedAssociations = $associations; } foreach ($this->joinedAssociations as $name) { $assoc = $this->class->associationMappings[$name]; $assocEntity = $this->class->getFieldValue($entity, $name); if ($assocEntity === null) { continue; } $assocId = $this->uow->getEntityIdentifier($assocEntity); $assocMetadata = $this->metadataFactory->getMetadataFor($assoc['targetEntity']); $assocKey = new EntityCacheKey($assocMetadata->rootEntityName, $assocId); $assocPersister = $this->uow->getEntityPersister($assoc['targetEntity']); $assocPersister->storeEntityCache($assocEntity, $assocKey); } } protected function getHash($query, $criteria, ?array $orderBy = null, $limit = null, $offset = null) { [$params] = $criteria instanceof Criteria ? $this->persister->expandCriteriaParameters($criteria) : $this->persister->expandParameters($criteria); return sha1($query . serialize($params) . serialize($orderBy) . $limit . $offset); } public function expandParameters($criteria) { return $this->persister->expandParameters($criteria); } public function expandCriteriaParameters(Criteria $criteria) { return $this->persister->expandCriteriaParameters($criteria); } public function getClassMetadata() { return $this->persister->getClassMetadata(); } public function getManyToManyCollection(array $assoc, $sourceEntity, $offset = null, $limit = null) { return $this->persister->getManyToManyCollection($assoc, $sourceEntity, $offset, $limit); } public function getOneToManyCollection(array $assoc, $sourceEntity, $offset = null, $limit = null) { return $this->persister->getOneToManyCollection($assoc, $sourceEntity, $offset, $limit); } public function getOwningTable($fieldName) { return $this->persister->getOwningTable($fieldName); } public function executeInserts() { $this->queuedCache['insert'] = $this->persister->getInserts(); return $this->persister->executeInserts(); } public function load(array $criteria, $entity = null, $assoc = null, array $hints = [], $lockMode = null, $limit = null, ?array $orderBy = null) { if ($entity !== null || $assoc !== null || $hints !== [] || $lockMode !== null) { return $this->persister->load($criteria, $entity, $assoc, $hints, $lockMode, $limit, $orderBy); } $query = $this->persister->getSelectSQL($criteria, null, null, $limit, null, $orderBy); $hash = $this->getHash($query, $criteria, null, null, null); $rsm = $this->getResultSetMapping(); $queryKey = new QueryCacheKey($hash, 0, Cache::MODE_NORMAL, $this->timestampKey); $queryCache = $this->cache->getQueryCache($this->regionName); $result = $queryCache->get($queryKey, $rsm); if ($result !== null) { if ($this->cacheLogger) { $this->cacheLogger->queryCacheHit($this->regionName, $queryKey); } return $result[0]; } $result = $this->persister->load($criteria, $entity, $assoc, $hints, $lockMode, $limit, $orderBy); if ($result === null) { return null; } $cached = $queryCache->put($queryKey, $rsm, [$result]); if ($this->cacheLogger) { if ($result) { $this->cacheLogger->queryCacheMiss($this->regionName, $queryKey); } if ($cached) { $this->cacheLogger->queryCachePut($this->regionName, $queryKey); } } return $result; } public function loadAll(array $criteria = [], ?array $orderBy = null, $limit = null, $offset = null) { $query = $this->persister->getSelectSQL($criteria, null, null, $limit, $offset, $orderBy); $hash = $this->getHash($query, $criteria, null, null, null); $rsm = $this->getResultSetMapping(); $queryKey = new QueryCacheKey($hash, 0, Cache::MODE_NORMAL, $this->timestampKey); $queryCache = $this->cache->getQueryCache($this->regionName); $result = $queryCache->get($queryKey, $rsm); if ($result !== null) { if ($this->cacheLogger) { $this->cacheLogger->queryCacheHit($this->regionName, $queryKey); } return $result; } $result = $this->persister->loadAll($criteria, $orderBy, $limit, $offset); $cached = $queryCache->put($queryKey, $rsm, $result); if ($this->cacheLogger) { if ($result) { $this->cacheLogger->queryCacheMiss($this->regionName, $queryKey); } if ($cached) { $this->cacheLogger->queryCachePut($this->regionName, $queryKey); } } return $result; } public function loadById(array $identifier, $entity = null) { $cacheKey = new EntityCacheKey($this->class->rootEntityName, $identifier); $cacheEntry = $this->region->get($cacheKey); $class = $this->class; if ($cacheEntry !== null) { if ($cacheEntry->class !== $this->class->name) { $class = $this->metadataFactory->getMetadataFor($cacheEntry->class); } $cachedEntity = $this->hydrator->loadCacheEntry($class, $cacheKey, $cacheEntry, $entity); if ($cachedEntity !== null) { if ($this->cacheLogger) { $this->cacheLogger->entityCacheHit($this->regionName, $cacheKey); } return $cachedEntity; } } $entity = $this->persister->loadById($identifier, $entity); if ($entity === null) { return null; } $class = $this->class; $className = ClassUtils::getClass($entity); if ($className !== $this->class->name) { $class = $this->metadataFactory->getMetadataFor($className); } $cacheEntry = $this->hydrator->buildCacheEntry($class, $cacheKey, $entity); $cached = $this->region->put($cacheKey, $cacheEntry); if ($cached && ($this->joinedAssociations === null || $this->joinedAssociations)) { $this->storeJoinedAssociations($entity); } if ($this->cacheLogger) { if ($cached) { $this->cacheLogger->entityCachePut($this->regionName, $cacheKey); } $this->cacheLogger->entityCacheMiss($this->regionName, $cacheKey); } return $entity; } public function count($criteria = []) { return $this->persister->count($criteria); } public function loadCriteria(Criteria $criteria) { $orderBy = $criteria->getOrderings(); $limit = $criteria->getMaxResults(); $offset = $criteria->getFirstResult(); $query = $this->persister->getSelectSQL($criteria); $hash = $this->getHash($query, $criteria, $orderBy, $limit, $offset); $rsm = $this->getResultSetMapping(); $queryKey = new QueryCacheKey($hash, 0, Cache::MODE_NORMAL, $this->timestampKey); $queryCache = $this->cache->getQueryCache($this->regionName); $cacheResult = $queryCache->get($queryKey, $rsm); if ($cacheResult !== null) { if ($this->cacheLogger) { $this->cacheLogger->queryCacheHit($this->regionName, $queryKey); } return $cacheResult; } $result = $this->persister->loadCriteria($criteria); $cached = $queryCache->put($queryKey, $rsm, $result); if ($this->cacheLogger) { if ($result) { $this->cacheLogger->queryCacheMiss($this->regionName, $queryKey); } if ($cached) { $this->cacheLogger->queryCachePut($this->regionName, $queryKey); } } return $result; } public function loadManyToManyCollection(array $assoc, $sourceEntity, PersistentCollection $collection) { $persister = $this->uow->getCollectionPersister($assoc); $hasCache = $persister instanceof CachedPersister; if (!$hasCache) { return $this->persister->loadManyToManyCollection($assoc, $sourceEntity, $collection); } $ownerId = $this->uow->getEntityIdentifier($collection->getOwner()); $key = $this->buildCollectionCacheKey($assoc, $ownerId); $list = $persister->loadCollectionCache($collection, $key); if ($list !== null) { if ($this->cacheLogger) { $this->cacheLogger->collectionCacheHit($persister->getCacheRegion()->getName(), $key); } return $list; } $list = $this->persister->loadManyToManyCollection($assoc, $sourceEntity, $collection); $persister->storeCollectionCache($key, $list); if ($this->cacheLogger) { $this->cacheLogger->collectionCacheMiss($persister->getCacheRegion()->getName(), $key); } return $list; } public function loadOneToManyCollection(array $assoc, $sourceEntity, PersistentCollection $collection) { $persister = $this->uow->getCollectionPersister($assoc); $hasCache = $persister instanceof CachedPersister; if (!$hasCache) { return $this->persister->loadOneToManyCollection($assoc, $sourceEntity, $collection); } $ownerId = $this->uow->getEntityIdentifier($collection->getOwner()); $key = $this->buildCollectionCacheKey($assoc, $ownerId); $list = $persister->loadCollectionCache($collection, $key); if ($list !== null) { if ($this->cacheLogger) { $this->cacheLogger->collectionCacheHit($persister->getCacheRegion()->getName(), $key); } return $list; } $list = $this->persister->loadOneToManyCollection($assoc, $sourceEntity, $collection); $persister->storeCollectionCache($key, $list); if ($this->cacheLogger) { $this->cacheLogger->collectionCacheMiss($persister->getCacheRegion()->getName(), $key); } return $list; } public function loadOneToOneEntity(array $assoc, $sourceEntity, array $identifier = []) { return $this->persister->loadOneToOneEntity($assoc, $sourceEntity, $identifier); } public function lock(array $criteria, $lockMode) { $this->persister->lock($criteria, $lockMode); } public function refresh(array $id, $entity, $lockMode = null) { $this->persister->refresh($id, $entity, $lockMode); } protected function buildCollectionCacheKey(array $association, $ownerId) { $metadata = $this->metadataFactory->getMetadataFor($association['sourceEntity']); assert($metadata instanceof ClassMetadata); return new CollectionCacheKey($metadata->rootEntityName, $association['fieldName'], $ownerId); } }
|
1 |
Â
<?php
|
2 |
+
declare (strict_types=1); namespace MailPoetVendor\Doctrine\ORM\Cache\Persister\Entity; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\Common\Collections\Criteria; use MailPoetVendor\Doctrine\Common\Util\ClassUtils; use MailPoetVendor\Doctrine\ORM\Cache; use MailPoetVendor\Doctrine\ORM\Cache\CollectionCacheKey; use MailPoetVendor\Doctrine\ORM\Cache\EntityCacheKey; use MailPoetVendor\Doctrine\ORM\Cache\EntityHydrator; use MailPoetVendor\Doctrine\ORM\Cache\Logging\CacheLogger; use MailPoetVendor\Doctrine\ORM\Cache\Persister\CachedPersister; use MailPoetVendor\Doctrine\ORM\Cache\QueryCacheKey; use MailPoetVendor\Doctrine\ORM\Cache\Region; use MailPoetVendor\Doctrine\ORM\Cache\TimestampCacheKey; use MailPoetVendor\Doctrine\ORM\Cache\TimestampRegion; use MailPoetVendor\Doctrine\ORM\EntityManagerInterface; use MailPoetVendor\Doctrine\ORM\Mapping\ClassMetadata; use MailPoetVendor\Doctrine\ORM\Mapping\ClassMetadataFactory; use MailPoetVendor\Doctrine\ORM\PersistentCollection; use MailPoetVendor\Doctrine\ORM\Persisters\Entity\EntityPersister; use MailPoetVendor\Doctrine\ORM\UnitOfWork; use function assert; use function serialize; use function sha1; abstract class AbstractEntityPersister implements CachedEntityPersister { protected $uow; protected $metadataFactory; protected $persister; protected $class; protected $queuedCache = []; protected $region; protected $timestampRegion; protected $timestampKey; protected $hydrator; protected $cache; protected $cacheLogger; protected $regionName; protected $joinedAssociations; public function __construct(EntityPersister $persister, Region $region, EntityManagerInterface $em, ClassMetadata $class) { $configuration = $em->getConfiguration(); $cacheConfig = $configuration->getSecondLevelCacheConfiguration(); $cacheFactory = $cacheConfig->getCacheFactory(); $this->class = $class; $this->region = $region; $this->persister = $persister; $this->cache = $em->getCache(); $this->regionName = $region->getName(); $this->uow = $em->getUnitOfWork(); $this->metadataFactory = $em->getMetadataFactory(); $this->cacheLogger = $cacheConfig->getCacheLogger(); $this->timestampRegion = $cacheFactory->getTimestampRegion(); $this->hydrator = $cacheFactory->buildEntityHydrator($em, $class); $this->timestampKey = new TimestampCacheKey($this->class->rootEntityName); } public function addInsert($entity) { $this->persister->addInsert($entity); } public function getInserts() { return $this->persister->getInserts(); } public function getSelectSQL($criteria, $assoc = null, $lockMode = null, $limit = null, $offset = null, ?array $orderBy = null) { return $this->persister->getSelectSQL($criteria, $assoc, $lockMode, $limit, $offset, $orderBy); } public function getCountSQL($criteria = []) { return $this->persister->getCountSQL($criteria); } public function getInsertSQL() { return $this->persister->getInsertSQL(); } public function getResultSetMapping() { return $this->persister->getResultSetMapping(); } public function getSelectConditionStatementSQL($field, $value, $assoc = null, $comparison = null) { return $this->persister->getSelectConditionStatementSQL($field, $value, $assoc, $comparison); } public function exists($entity, ?Criteria $extraConditions = null) { if ($extraConditions === null) { $key = new EntityCacheKey($this->class->rootEntityName, $this->class->getIdentifierValues($entity)); if ($this->region->contains($key)) { return \true; } } return $this->persister->exists($entity, $extraConditions); } public function getCacheRegion() { return $this->region; } public function getEntityHydrator() { return $this->hydrator; } public function storeEntityCache($entity, EntityCacheKey $key) { $class = $this->class; $className = ClassUtils::getClass($entity); if ($className !== $this->class->name) { $class = $this->metadataFactory->getMetadataFor($className); } $entry = $this->hydrator->buildCacheEntry($class, $key, $entity); $cached = $this->region->put($key, $entry); if ($this->cacheLogger && $cached) { $this->cacheLogger->entityCachePut($this->regionName, $key); } return $cached; } private function storeJoinedAssociations($entity) : void { if ($this->joinedAssociations === null) { $associations = []; foreach ($this->class->associationMappings as $name => $assoc) { if (isset($assoc['cache']) && $assoc['type'] & ClassMetadata::TO_ONE && ($assoc['fetch'] === ClassMetadata::FETCH_EAGER || !$assoc['isOwningSide'])) { $associations[] = $name; } } $this->joinedAssociations = $associations; } foreach ($this->joinedAssociations as $name) { $assoc = $this->class->associationMappings[$name]; $assocEntity = $this->class->getFieldValue($entity, $name); if ($assocEntity === null) { continue; } $assocId = $this->uow->getEntityIdentifier($assocEntity); $assocMetadata = $this->metadataFactory->getMetadataFor($assoc['targetEntity']); $assocKey = new EntityCacheKey($assocMetadata->rootEntityName, $assocId); $assocPersister = $this->uow->getEntityPersister($assoc['targetEntity']); $assocPersister->storeEntityCache($assocEntity, $assocKey); } } protected function getHash($query, $criteria, ?array $orderBy = null, $limit = null, $offset = null) { [$params] = $criteria instanceof Criteria ? $this->persister->expandCriteriaParameters($criteria) : $this->persister->expandParameters($criteria); return sha1($query . serialize($params) . serialize($orderBy) . $limit . $offset); } public function expandParameters($criteria) { return $this->persister->expandParameters($criteria); } public function expandCriteriaParameters(Criteria $criteria) { return $this->persister->expandCriteriaParameters($criteria); } public function getClassMetadata() { return $this->persister->getClassMetadata(); } public function getManyToManyCollection(array $assoc, $sourceEntity, $offset = null, $limit = null) { return $this->persister->getManyToManyCollection($assoc, $sourceEntity, $offset, $limit); } public function getOneToManyCollection(array $assoc, $sourceEntity, $offset = null, $limit = null) { return $this->persister->getOneToManyCollection($assoc, $sourceEntity, $offset, $limit); } public function getOwningTable($fieldName) { return $this->persister->getOwningTable($fieldName); } public function executeInserts() { $this->queuedCache['insert'] = $this->persister->getInserts(); return $this->persister->executeInserts(); } public function load(array $criteria, $entity = null, $assoc = null, array $hints = [], $lockMode = null, $limit = null, ?array $orderBy = null) { if ($entity !== null || $assoc !== null || $hints !== [] || $lockMode !== null) { return $this->persister->load($criteria, $entity, $assoc, $hints, $lockMode, $limit, $orderBy); } $query = $this->persister->getSelectSQL($criteria, null, null, $limit, null, $orderBy); $hash = $this->getHash($query, $criteria, null, null, null); $rsm = $this->getResultSetMapping(); $queryKey = new QueryCacheKey($hash, 0, Cache::MODE_NORMAL, $this->timestampKey); $queryCache = $this->cache->getQueryCache($this->regionName); $result = $queryCache->get($queryKey, $rsm); if ($result !== null) { if ($this->cacheLogger) { $this->cacheLogger->queryCacheHit($this->regionName, $queryKey); } return $result[0]; } $result = $this->persister->load($criteria, $entity, $assoc, $hints, $lockMode, $limit, $orderBy); if ($result === null) { return null; } $cached = $queryCache->put($queryKey, $rsm, [$result]); if ($this->cacheLogger) { $this->cacheLogger->queryCacheMiss($this->regionName, $queryKey); if ($cached) { $this->cacheLogger->queryCachePut($this->regionName, $queryKey); } } return $result; } public function loadAll(array $criteria = [], ?array $orderBy = null, $limit = null, $offset = null) { $query = $this->persister->getSelectSQL($criteria, null, null, $limit, $offset, $orderBy); $hash = $this->getHash($query, $criteria, null, null, null); $rsm = $this->getResultSetMapping(); $queryKey = new QueryCacheKey($hash, 0, Cache::MODE_NORMAL, $this->timestampKey); $queryCache = $this->cache->getQueryCache($this->regionName); $result = $queryCache->get($queryKey, $rsm); if ($result !== null) { if ($this->cacheLogger) { $this->cacheLogger->queryCacheHit($this->regionName, $queryKey); } return $result; } $result = $this->persister->loadAll($criteria, $orderBy, $limit, $offset); $cached = $queryCache->put($queryKey, $rsm, $result); if ($this->cacheLogger) { if ($result) { $this->cacheLogger->queryCacheMiss($this->regionName, $queryKey); } if ($cached) { $this->cacheLogger->queryCachePut($this->regionName, $queryKey); } } return $result; } public function loadById(array $identifier, $entity = null) { $cacheKey = new EntityCacheKey($this->class->rootEntityName, $identifier); $cacheEntry = $this->region->get($cacheKey); $class = $this->class; if ($cacheEntry !== null) { if ($cacheEntry->class !== $this->class->name) { $class = $this->metadataFactory->getMetadataFor($cacheEntry->class); } $cachedEntity = $this->hydrator->loadCacheEntry($class, $cacheKey, $cacheEntry, $entity); if ($cachedEntity !== null) { if ($this->cacheLogger) { $this->cacheLogger->entityCacheHit($this->regionName, $cacheKey); } return $cachedEntity; } } $entity = $this->persister->loadById($identifier, $entity); if ($entity === null) { return null; } $class = $this->class; $className = ClassUtils::getClass($entity); if ($className !== $this->class->name) { $class = $this->metadataFactory->getMetadataFor($className); } $cacheEntry = $this->hydrator->buildCacheEntry($class, $cacheKey, $entity); $cached = $this->region->put($cacheKey, $cacheEntry); if ($cached && ($this->joinedAssociations === null || $this->joinedAssociations)) { $this->storeJoinedAssociations($entity); } if ($this->cacheLogger) { if ($cached) { $this->cacheLogger->entityCachePut($this->regionName, $cacheKey); } $this->cacheLogger->entityCacheMiss($this->regionName, $cacheKey); } return $entity; } public function count($criteria = []) { return $this->persister->count($criteria); } public function loadCriteria(Criteria $criteria) { $orderBy = $criteria->getOrderings(); $limit = $criteria->getMaxResults(); $offset = $criteria->getFirstResult(); $query = $this->persister->getSelectSQL($criteria); $hash = $this->getHash($query, $criteria, $orderBy, $limit, $offset); $rsm = $this->getResultSetMapping(); $queryKey = new QueryCacheKey($hash, 0, Cache::MODE_NORMAL, $this->timestampKey); $queryCache = $this->cache->getQueryCache($this->regionName); $cacheResult = $queryCache->get($queryKey, $rsm); if ($cacheResult !== null) { if ($this->cacheLogger) { $this->cacheLogger->queryCacheHit($this->regionName, $queryKey); } return $cacheResult; } $result = $this->persister->loadCriteria($criteria); $cached = $queryCache->put($queryKey, $rsm, $result); if ($this->cacheLogger) { if ($result) { $this->cacheLogger->queryCacheMiss($this->regionName, $queryKey); } if ($cached) { $this->cacheLogger->queryCachePut($this->regionName, $queryKey); } } return $result; } public function loadManyToManyCollection(array $assoc, $sourceEntity, PersistentCollection $collection) { $persister = $this->uow->getCollectionPersister($assoc); $hasCache = $persister instanceof CachedPersister; if (!$hasCache) { return $this->persister->loadManyToManyCollection($assoc, $sourceEntity, $collection); } $ownerId = $this->uow->getEntityIdentifier($collection->getOwner()); $key = $this->buildCollectionCacheKey($assoc, $ownerId); $list = $persister->loadCollectionCache($collection, $key); if ($list !== null) { if ($this->cacheLogger) { $this->cacheLogger->collectionCacheHit($persister->getCacheRegion()->getName(), $key); } return $list; } $list = $this->persister->loadManyToManyCollection($assoc, $sourceEntity, $collection); $persister->storeCollectionCache($key, $list); if ($this->cacheLogger) { $this->cacheLogger->collectionCacheMiss($persister->getCacheRegion()->getName(), $key); } return $list; } public function loadOneToManyCollection(array $assoc, $sourceEntity, PersistentCollection $collection) { $persister = $this->uow->getCollectionPersister($assoc); $hasCache = $persister instanceof CachedPersister; if (!$hasCache) { return $this->persister->loadOneToManyCollection($assoc, $sourceEntity, $collection); } $ownerId = $this->uow->getEntityIdentifier($collection->getOwner()); $key = $this->buildCollectionCacheKey($assoc, $ownerId); $list = $persister->loadCollectionCache($collection, $key); if ($list !== null) { if ($this->cacheLogger) { $this->cacheLogger->collectionCacheHit($persister->getCacheRegion()->getName(), $key); } return $list; } $list = $this->persister->loadOneToManyCollection($assoc, $sourceEntity, $collection); $persister->storeCollectionCache($key, $list); if ($this->cacheLogger) { $this->cacheLogger->collectionCacheMiss($persister->getCacheRegion()->getName(), $key); } return $list; } public function loadOneToOneEntity(array $assoc, $sourceEntity, array $identifier = []) { return $this->persister->loadOneToOneEntity($assoc, $sourceEntity, $identifier); } public function lock(array $criteria, $lockMode) { $this->persister->lock($criteria, $lockMode); } public function refresh(array $id, $entity, $lockMode = null) { $this->persister->refresh($id, $entity, $lockMode); } protected function buildCollectionCacheKey(array $association, $ownerId) { $metadata = $this->metadataFactory->getMetadataFor($association['sourceEntity']); assert($metadata instanceof ClassMetadata); return new CollectionCacheKey($metadata->rootEntityName, $association['fieldName'], $ownerId); } }
|
vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
declare (strict_types=1); namespace MailPoetVendor\Doctrine\ORM\Internal\Hydration; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\DBAL\Driver\ResultStatement; use MailPoetVendor\Doctrine\DBAL\ForwardCompatibility\Result as ForwardCompatibilityResult; use MailPoetVendor\Doctrine\DBAL\Platforms\AbstractPlatform; use MailPoetVendor\Doctrine\DBAL\Result; use MailPoetVendor\Doctrine\DBAL\Types\Type; use MailPoetVendor\Doctrine\Deprecations\Deprecation; use MailPoetVendor\Doctrine\ORM\EntityManagerInterface; use MailPoetVendor\Doctrine\ORM\Events; use MailPoetVendor\Doctrine\ORM\Mapping\ClassMetadata; use MailPoetVendor\Doctrine\ORM\Query\ResultSetMapping; use MailPoetVendor\Doctrine\ORM\Tools\Pagination\LimitSubqueryWalker; use MailPoetVendor\Doctrine\ORM\UnitOfWork; use Generator; use LogicException; use ReflectionClass; use TypeError; use function array_map; use function array_merge; use function count; use function end; use function get_debug_type; use function in_array; use function sprintf; abstract class AbstractHydrator { protected $_rsm; protected $_em; protected $_platform; protected $_uow; protected $_metadataCache = []; protected $_cache = []; protected $_stmt; protected $_hints = []; public function __construct(EntityManagerInterface $em) { $this->_em = $em; $this->_platform = $em->getConnection()->getDatabasePlatform(); $this->_uow = $em->getUnitOfWork(); } public function iterate($stmt, $resultSetMapping, array $hints = []) { Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/issues/8463', 'Method %s() is deprecated and will be removed in Doctrine ORM 3.0. Use toIterable() instead.', __METHOD__); $this->_stmt = $stmt instanceof ResultStatement ? ForwardCompatibilityResult::ensure($stmt) : $stmt; $this->_rsm = $resultSetMapping; $this->_hints = $hints; $evm = $this->_em->getEventManager(); $evm->addEventListener([Events::onClear], $this); $this->prepare(); return new IterableResult($this); } public function toIterable($stmt, ResultSetMapping $resultSetMapping, array $hints = []) : iterable { if (!$stmt instanceof Result) { if (!$stmt instanceof ResultStatement) { throw new TypeError(sprintf('%s: Expected parameter $stmt to be an instance of %s or %s, got %s', __METHOD__, Result::class, ResultStatement::class, get_debug_type($stmt))); } Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/pull/8796', '%s: Passing a result as $stmt that does not implement %s is deprecated and will cause a TypeError on 3.0', __METHOD__, Result::class); $stmt = ForwardCompatibilityResult::ensure($stmt); } $this->_stmt = $stmt; $this->_rsm = $resultSetMapping; $this->_hints = $hints; $evm = $this->_em->getEventManager(); $evm->addEventListener([Events::onClear], $this); $this->prepare(); while (\true) { $row = $this->statement()->fetchAssociative(); if ($row === \false) { $this->cleanup(); break; } $result = []; $this->hydrateRowData($row, $result); $this->cleanupAfterRowIteration(); if (count($result) === 1) { (yield end($result)); } else { (yield $result); } } } protected final function statement() : Result { if ($this->_stmt === null) { throw new LogicException('Uninitialized _stmt property'); } return $this->_stmt; } protected final function resultSetMapping() : ResultSetMapping { if ($this->_rsm === null) { throw new LogicException('Uninitialized _rsm property'); } return $this->_rsm; } public function hydrateAll($stmt, $resultSetMapping, array $hints = []) { if (!$stmt instanceof Result) { if (!$stmt instanceof ResultStatement) { throw new TypeError(sprintf('%s: Expected parameter $stmt to be an instance of %s or %s, got %s', __METHOD__, Result::class, ResultStatement::class, get_debug_type($stmt))); } Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/pull/8796', '%s: Passing a result as $stmt that does not implement %s is deprecated and will cause a TypeError on 3.0', __METHOD__, Result::class); $stmt = ForwardCompatibilityResult::ensure($stmt); } $this->_stmt = $stmt; $this->_rsm = $resultSetMapping; $this->_hints = $hints; $this->_em->getEventManager()->addEventListener([Events::onClear], $this); $this->prepare(); try { $result = $this->hydrateAllData(); } finally { $this->cleanup(); } return $result; } public function hydrateRow() { $row = $this->statement()->fetchAssociative(); if ($row === \false) { $this->cleanup(); return \false; } $result = []; $this->hydrateRowData($row, $result); return $result; } public function onClear($eventArgs) { } protected function prepare() { } protected function cleanup() { $this->statement()->free(); $this->_stmt = null; $this->_rsm = null; $this->_cache = []; $this->_metadataCache = []; $this->_em->getEventManager()->removeEventListener([Events::onClear], $this); } protected function cleanupAfterRowIteration() : void { } protected function hydrateRowData(array $row, array &$result) { throw new HydrationException('hydrateRowData() not implemented by this hydrator.'); } protected abstract function hydrateAllData(); protected function gatherRowData(array $data, array &$id, array &$nonemptyComponents) { $rowData = ['data' => []]; foreach ($data as $key => $value) { $cacheKeyInfo = $this->hydrateColumnInfo($key); if ($cacheKeyInfo === null) { continue; } $fieldName = $cacheKeyInfo['fieldName']; switch (\true) { case isset($cacheKeyInfo['isNewObjectParameter']): $argIndex = $cacheKeyInfo['argIndex']; $objIndex = $cacheKeyInfo['objIndex']; $type = $cacheKeyInfo['type']; $value = $type->convertToPHPValue($value, $this->_platform); $rowData['newObjects'][$objIndex]['class'] = $cacheKeyInfo['class']; $rowData['newObjects'][$objIndex]['args'][$argIndex] = $value; break; case isset($cacheKeyInfo['isScalar']): $type = $cacheKeyInfo['type']; $value = $type->convertToPHPValue($value, $this->_platform); $rowData['scalars'][$fieldName] = $value; break; default: $dqlAlias = $cacheKeyInfo['dqlAlias']; $type = $cacheKeyInfo['type']; if (isset($cacheKeyInfo['discriminatorColumn'], $data[$cacheKeyInfo['discriminatorColumn']]) && !in_array((string) $data[$cacheKeyInfo['discriminatorColumn']], $cacheKeyInfo['discriminatorValues'], \true)) { break; } if (isset($rowData['data'][$dqlAlias][$fieldName])) { break; } $rowData['data'][$dqlAlias][$fieldName] = $type ? $type->convertToPHPValue($value, $this->_platform) : $value; if ($cacheKeyInfo['isIdentifier'] && $value !== null) { $id[$dqlAlias] .= '|' . $value; $nonemptyComponents[$dqlAlias] = \true; } break; } } return $rowData; } protected function gatherScalarRowData(&$data) { $rowData = []; foreach ($data as $key => $value) { $cacheKeyInfo = $this->hydrateColumnInfo($key); if ($cacheKeyInfo === null) { continue; } $fieldName = $cacheKeyInfo['fieldName']; if (!isset($cacheKeyInfo['isScalar'])) { $type = $cacheKeyInfo['type']; $value = $type ? $type->convertToPHPValue($value, $this->_platform) : $value; $fieldName = $cacheKeyInfo['dqlAlias'] . '_' . $fieldName; } $rowData[$fieldName] = $value; } return $rowData; } protected function hydrateColumnInfo($key) { if (isset($this->_cache[$key])) { return $this->_cache[$key]; } switch (\true) { case isset($this->_rsm->fieldMappings[$key]): $classMetadata = $this->getClassMetadata($this->_rsm->declaringClasses[$key]); $fieldName = $this->_rsm->fieldMappings[$key]; $fieldMapping = $classMetadata->fieldMappings[$fieldName]; $ownerMap = $this->_rsm->columnOwnerMap[$key]; $columnInfo = ['isIdentifier' => in_array($fieldName, $classMetadata->identifier, \true), 'fieldName' => $fieldName, 'type' => Type::getType($fieldMapping['type']), 'dqlAlias' => $ownerMap]; if ($classMetadata->parentClasses && isset($this->_rsm->discriminatorColumns[$ownerMap])) { return $this->_cache[$key] = array_merge($columnInfo, ['discriminatorColumn' => $this->_rsm->discriminatorColumns[$ownerMap], 'discriminatorValue' => $classMetadata->discriminatorValue, 'discriminatorValues' => $this->getDiscriminatorValues($classMetadata)]); } return $this->_cache[$key] = $columnInfo; case isset($this->_rsm->newObjectMappings[$key]): $mapping = $this->_rsm->newObjectMappings[$key]; return $this->_cache[$key] = ['isScalar' => \true, 'isNewObjectParameter' => \true, 'fieldName' => $this->_rsm->scalarMappings[$key], 'type' => Type::getType($this->_rsm->typeMappings[$key]), 'argIndex' => $mapping['argIndex'], 'objIndex' => $mapping['objIndex'], 'class' => new ReflectionClass($mapping['className'])]; case isset($this->_rsm->scalarMappings[$key], $this->_hints[LimitSubqueryWalker::FORCE_DBAL_TYPE_CONVERSION]): return $this->_cache[$key] = ['fieldName' => $this->_rsm->scalarMappings[$key], 'type' => Type::getType($this->_rsm->typeMappings[$key]), 'dqlAlias' => '']; case isset($this->_rsm->scalarMappings[$key]): return $this->_cache[$key] = ['isScalar' => \true, 'fieldName' => $this->_rsm->scalarMappings[$key], 'type' => Type::getType($this->_rsm->typeMappings[$key])]; case isset($this->_rsm->metaMappings[$key]): $fieldName = $this->_rsm->metaMappings[$key]; $dqlAlias = $this->_rsm->columnOwnerMap[$key]; $type = isset($this->_rsm->typeMappings[$key]) ? Type::getType($this->_rsm->typeMappings[$key]) : null; $this->getClassMetadata($this->_rsm->aliasMap[$dqlAlias]); return $this->_cache[$key] = ['isIdentifier' => isset($this->_rsm->isIdentifierColumn[$dqlAlias][$key]), 'isMetaColumn' => \true, 'fieldName' => $fieldName, 'type' => $type, 'dqlAlias' => $dqlAlias]; } return null; } private function getDiscriminatorValues(ClassMetadata $classMetadata) : array { $values = array_map(function (string $subClass) : string { return (string) $this->getClassMetadata($subClass)->discriminatorValue; }, $classMetadata->subClasses); $values[] = (string) $classMetadata->discriminatorValue; return $values; } protected function getClassMetadata($className) { if (!isset($this->_metadataCache[$className])) { $this->_metadataCache[$className] = $this->_em->getClassMetadata($className); } return $this->_metadataCache[$className]; } protected function registerManaged(ClassMetadata $class, $entity, array $data) { if ($class->isIdentifierComposite) { $id = []; foreach ($class->identifier as $fieldName) { $id[$fieldName] = isset($class->associationMappings[$fieldName]) ? $data[$class->associationMappings[$fieldName]['joinColumns'][0]['name']] : $data[$fieldName]; } } else { $fieldName = $class->identifier[0]; $id = [$fieldName => isset($class->associationMappings[$fieldName]) ? $data[$class->associationMappings[$fieldName]['joinColumns'][0]['name']] : $data[$fieldName]]; } $this->_em->getUnitOfWork()->registerManaged($entity, $id, $data); } }
|
1 |
Â
<?php
|
2 |
+
declare (strict_types=1); namespace MailPoetVendor\Doctrine\ORM\Internal\Hydration; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\DBAL\Driver\ResultStatement; use MailPoetVendor\Doctrine\DBAL\ForwardCompatibility\Result as ForwardCompatibilityResult; use MailPoetVendor\Doctrine\DBAL\Platforms\AbstractPlatform; use MailPoetVendor\Doctrine\DBAL\Result; use MailPoetVendor\Doctrine\DBAL\Types\Type; use MailPoetVendor\Doctrine\Deprecations\Deprecation; use MailPoetVendor\Doctrine\ORM\EntityManagerInterface; use MailPoetVendor\Doctrine\ORM\Events; use MailPoetVendor\Doctrine\ORM\Mapping\ClassMetadata; use MailPoetVendor\Doctrine\ORM\Query\ResultSetMapping; use MailPoetVendor\Doctrine\ORM\Tools\Pagination\LimitSubqueryWalker; use MailPoetVendor\Doctrine\ORM\UnitOfWork; use Generator; use LogicException; use ReflectionClass; use TypeError; use function array_map; use function array_merge; use function count; use function end; use function get_debug_type; use function in_array; use function sprintf; abstract class AbstractHydrator { protected $_rsm; protected $_em; protected $_platform; protected $_uow; protected $_metadataCache = []; protected $_cache = []; protected $_stmt; protected $_hints = []; public function __construct(EntityManagerInterface $em) { $this->_em = $em; $this->_platform = $em->getConnection()->getDatabasePlatform(); $this->_uow = $em->getUnitOfWork(); } public function iterate($stmt, $resultSetMapping, array $hints = []) { Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/issues/8463', 'Method %s() is deprecated and will be removed in Doctrine ORM 3.0. Use toIterable() instead.', __METHOD__); $this->_stmt = $stmt instanceof ResultStatement ? ForwardCompatibilityResult::ensure($stmt) : $stmt; $this->_rsm = $resultSetMapping; $this->_hints = $hints; $evm = $this->_em->getEventManager(); $evm->addEventListener([Events::onClear], $this); $this->prepare(); return new IterableResult($this); } public function toIterable($stmt, ResultSetMapping $resultSetMapping, array $hints = []) : iterable { if (!$stmt instanceof Result) { if (!$stmt instanceof ResultStatement) { throw new TypeError(sprintf('%s: Expected parameter $stmt to be an instance of %s or %s, got %s', __METHOD__, Result::class, ResultStatement::class, get_debug_type($stmt))); } Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/pull/8796', '%s: Passing a result as $stmt that does not implement %s is deprecated and will cause a TypeError on 3.0', __METHOD__, Result::class); $stmt = ForwardCompatibilityResult::ensure($stmt); } $this->_stmt = $stmt; $this->_rsm = $resultSetMapping; $this->_hints = $hints; $evm = $this->_em->getEventManager(); $evm->addEventListener([Events::onClear], $this); $this->prepare(); while (\true) { $row = $this->statement()->fetchAssociative(); if ($row === \false) { $this->cleanup(); break; } $result = []; $this->hydrateRowData($row, $result); $this->cleanupAfterRowIteration(); if (count($result) === 1) { if (count($resultSetMapping->indexByMap) === 0) { (yield end($result)); } else { yield from $result; } } else { (yield $result); } } } protected final function statement() : Result { if ($this->_stmt === null) { throw new LogicException('Uninitialized _stmt property'); } return $this->_stmt; } protected final function resultSetMapping() : ResultSetMapping { if ($this->_rsm === null) { throw new LogicException('Uninitialized _rsm property'); } return $this->_rsm; } public function hydrateAll($stmt, $resultSetMapping, array $hints = []) { if (!$stmt instanceof Result) { if (!$stmt instanceof ResultStatement) { throw new TypeError(sprintf('%s: Expected parameter $stmt to be an instance of %s or %s, got %s', __METHOD__, Result::class, ResultStatement::class, get_debug_type($stmt))); } Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/pull/8796', '%s: Passing a result as $stmt that does not implement %s is deprecated and will cause a TypeError on 3.0', __METHOD__, Result::class); $stmt = ForwardCompatibilityResult::ensure($stmt); } $this->_stmt = $stmt; $this->_rsm = $resultSetMapping; $this->_hints = $hints; $this->_em->getEventManager()->addEventListener([Events::onClear], $this); $this->prepare(); try { $result = $this->hydrateAllData(); } finally { $this->cleanup(); } return $result; } public function hydrateRow() { $row = $this->statement()->fetchAssociative(); if ($row === \false) { $this->cleanup(); return \false; } $result = []; $this->hydrateRowData($row, $result); return $result; } public function onClear($eventArgs) { } protected function prepare() { } protected function cleanup() { $this->statement()->free(); $this->_stmt = null; $this->_rsm = null; $this->_cache = []; $this->_metadataCache = []; $this->_em->getEventManager()->removeEventListener([Events::onClear], $this); } protected function cleanupAfterRowIteration() : void { } protected function hydrateRowData(array $row, array &$result) { throw new HydrationException('hydrateRowData() not implemented by this hydrator.'); } protected abstract function hydrateAllData(); protected function gatherRowData(array $data, array &$id, array &$nonemptyComponents) { $rowData = ['data' => []]; foreach ($data as $key => $value) { $cacheKeyInfo = $this->hydrateColumnInfo($key); if ($cacheKeyInfo === null) { continue; } $fieldName = $cacheKeyInfo['fieldName']; switch (\true) { case isset($cacheKeyInfo['isNewObjectParameter']): $argIndex = $cacheKeyInfo['argIndex']; $objIndex = $cacheKeyInfo['objIndex']; $type = $cacheKeyInfo['type']; $value = $type->convertToPHPValue($value, $this->_platform); $rowData['newObjects'][$objIndex]['class'] = $cacheKeyInfo['class']; $rowData['newObjects'][$objIndex]['args'][$argIndex] = $value; break; case isset($cacheKeyInfo['isScalar']): $type = $cacheKeyInfo['type']; $value = $type->convertToPHPValue($value, $this->_platform); $rowData['scalars'][$fieldName] = $value; break; default: $dqlAlias = $cacheKeyInfo['dqlAlias']; $type = $cacheKeyInfo['type']; if (isset($cacheKeyInfo['discriminatorColumn'], $data[$cacheKeyInfo['discriminatorColumn']]) && !in_array((string) $data[$cacheKeyInfo['discriminatorColumn']], $cacheKeyInfo['discriminatorValues'], \true)) { break; } if (isset($rowData['data'][$dqlAlias][$fieldName])) { break; } $rowData['data'][$dqlAlias][$fieldName] = $type ? $type->convertToPHPValue($value, $this->_platform) : $value; if ($cacheKeyInfo['isIdentifier'] && $value !== null) { $id[$dqlAlias] .= '|' . $value; $nonemptyComponents[$dqlAlias] = \true; } break; } } return $rowData; } protected function gatherScalarRowData(&$data) { $rowData = []; foreach ($data as $key => $value) { $cacheKeyInfo = $this->hydrateColumnInfo($key); if ($cacheKeyInfo === null) { continue; } $fieldName = $cacheKeyInfo['fieldName']; if (!isset($cacheKeyInfo['isScalar'])) { $type = $cacheKeyInfo['type']; $value = $type ? $type->convertToPHPValue($value, $this->_platform) : $value; $fieldName = $cacheKeyInfo['dqlAlias'] . '_' . $fieldName; } $rowData[$fieldName] = $value; } return $rowData; } protected function hydrateColumnInfo($key) { if (isset($this->_cache[$key])) { return $this->_cache[$key]; } switch (\true) { case isset($this->_rsm->fieldMappings[$key]): $classMetadata = $this->getClassMetadata($this->_rsm->declaringClasses[$key]); $fieldName = $this->_rsm->fieldMappings[$key]; $fieldMapping = $classMetadata->fieldMappings[$fieldName]; $ownerMap = $this->_rsm->columnOwnerMap[$key]; $columnInfo = ['isIdentifier' => in_array($fieldName, $classMetadata->identifier, \true), 'fieldName' => $fieldName, 'type' => Type::getType($fieldMapping['type']), 'dqlAlias' => $ownerMap]; if ($classMetadata->parentClasses && isset($this->_rsm->discriminatorColumns[$ownerMap])) { return $this->_cache[$key] = array_merge($columnInfo, ['discriminatorColumn' => $this->_rsm->discriminatorColumns[$ownerMap], 'discriminatorValue' => $classMetadata->discriminatorValue, 'discriminatorValues' => $this->getDiscriminatorValues($classMetadata)]); } return $this->_cache[$key] = $columnInfo; case isset($this->_rsm->newObjectMappings[$key]): $mapping = $this->_rsm->newObjectMappings[$key]; return $this->_cache[$key] = ['isScalar' => \true, 'isNewObjectParameter' => \true, 'fieldName' => $this->_rsm->scalarMappings[$key], 'type' => Type::getType($this->_rsm->typeMappings[$key]), 'argIndex' => $mapping['argIndex'], 'objIndex' => $mapping['objIndex'], 'class' => new ReflectionClass($mapping['className'])]; case isset($this->_rsm->scalarMappings[$key], $this->_hints[LimitSubqueryWalker::FORCE_DBAL_TYPE_CONVERSION]): return $this->_cache[$key] = ['fieldName' => $this->_rsm->scalarMappings[$key], 'type' => Type::getType($this->_rsm->typeMappings[$key]), 'dqlAlias' => '']; case isset($this->_rsm->scalarMappings[$key]): return $this->_cache[$key] = ['isScalar' => \true, 'fieldName' => $this->_rsm->scalarMappings[$key], 'type' => Type::getType($this->_rsm->typeMappings[$key])]; case isset($this->_rsm->metaMappings[$key]): $fieldName = $this->_rsm->metaMappings[$key]; $dqlAlias = $this->_rsm->columnOwnerMap[$key]; $type = isset($this->_rsm->typeMappings[$key]) ? Type::getType($this->_rsm->typeMappings[$key]) : null; $this->getClassMetadata($this->_rsm->aliasMap[$dqlAlias]); return $this->_cache[$key] = ['isIdentifier' => isset($this->_rsm->isIdentifierColumn[$dqlAlias][$key]), 'isMetaColumn' => \true, 'fieldName' => $fieldName, 'type' => $type, 'dqlAlias' => $dqlAlias]; } return null; } private function getDiscriminatorValues(ClassMetadata $classMetadata) : array { $values = array_map(function (string $subClass) : string { return (string) $this->getClassMetadata($subClass)->discriminatorValue; }, $classMetadata->subClasses); $values[] = (string) $classMetadata->discriminatorValue; return $values; } protected function getClassMetadata($className) { if (!isset($this->_metadataCache[$className])) { $this->_metadataCache[$className] = $this->_em->getClassMetadata($className); } return $this->_metadataCache[$className]; } protected function registerManaged(ClassMetadata $class, $entity, array $data) { if ($class->isIdentifierComposite) { $id = []; foreach ($class->identifier as $fieldName) { $id[$fieldName] = isset($class->associationMappings[$fieldName]) ? $data[$class->associationMappings[$fieldName]['joinColumns'][0]['name']] : $data[$fieldName]; } } else { $fieldName = $class->identifier[0]; $id = [$fieldName => isset($class->associationMappings[$fieldName]) ? $data[$class->associationMappings[$fieldName]['joinColumns'][0]['name']] : $data[$fieldName]]; } $this->_em->getUnitOfWork()->registerManaged($entity, $id, $data); } }
|
vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
declare (strict_types=1); namespace MailPoetVendor\Doctrine\ORM\Mapping; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\Common\EventManager; use MailPoetVendor\Doctrine\DBAL\Platforms; use MailPoetVendor\Doctrine\DBAL\Platforms\AbstractPlatform; use MailPoetVendor\Doctrine\Deprecations\Deprecation; use MailPoetVendor\Doctrine\ORM\EntityManagerInterface; use MailPoetVendor\Doctrine\ORM\Event\LoadClassMetadataEventArgs; use MailPoetVendor\Doctrine\ORM\Event\OnClassMetadataNotFoundEventArgs; use MailPoetVendor\Doctrine\ORM\Events; use MailPoetVendor\Doctrine\ORM\Exception\ORMException; use MailPoetVendor\Doctrine\ORM\Id\AssignedGenerator; use MailPoetVendor\Doctrine\ORM\Id\BigIntegerIdentityGenerator; use MailPoetVendor\Doctrine\ORM\Id\IdentityGenerator; use MailPoetVendor\Doctrine\ORM\Id\SequenceGenerator; use MailPoetVendor\Doctrine\ORM\Id\UuidGenerator; use MailPoetVendor\Doctrine\ORM\Mapping\Exception\CannotGenerateIds; use MailPoetVendor\Doctrine\ORM\Mapping\Exception\InvalidCustomGenerator; use MailPoetVendor\Doctrine\ORM\Mapping\Exception\TableGeneratorNotImplementedYet; use MailPoetVendor\Doctrine\ORM\Mapping\Exception\UnknownGeneratorType; use MailPoetVendor\Doctrine\Persistence\Mapping\AbstractClassMetadataFactory; use MailPoetVendor\Doctrine\Persistence\Mapping\ClassMetadata as ClassMetadataInterface; use MailPoetVendor\Doctrine\Persistence\Mapping\Driver\MappingDriver; use MailPoetVendor\Doctrine\Persistence\Mapping\ReflectionService; use ReflectionClass; use ReflectionException; use function assert; use function class_exists; use function count; use function end; use function explode; use function in_array; use function is_subclass_of; use function strlen; use function strpos; use function strtolower; use function substr; class ClassMetadataFactory extends AbstractClassMetadataFactory { private $em; private $targetPlatform; private $driver; private $evm; private $embeddablesActiveNesting = []; public function setEntityManager(EntityManagerInterface $em) { $this->em = $em; } protected function initialize() { $this->driver = $this->em->getConfiguration()->getMetadataDriverImpl(); $this->evm = $this->em->getEventManager(); $this->initialized = \true; } protected function onNotFoundMetadata($className) { if (!$this->evm->hasListeners(Events::onClassMetadataNotFound)) { return; } $eventArgs = new OnClassMetadataNotFoundEventArgs($className, $this->em); $this->evm->dispatchEvent(Events::onClassMetadataNotFound, $eventArgs); return $eventArgs->getFoundMetadata(); } protected function doLoadMetadata($class, $parent, $rootEntityFound, array $nonSuperclassParents) { if ($parent) { $class->setInheritanceType($parent->inheritanceType); $class->setDiscriminatorColumn($parent->discriminatorColumn); $class->setIdGeneratorType($parent->generatorType); $this->addInheritedFields($class, $parent); $this->addInheritedRelations($class, $parent); $this->addInheritedEmbeddedClasses($class, $parent); $class->setIdentifier($parent->identifier); $class->setVersioned($parent->isVersioned); $class->setVersionField($parent->versionField); $class->setDiscriminatorMap($parent->discriminatorMap); $class->setLifecycleCallbacks($parent->lifecycleCallbacks); $class->setChangeTrackingPolicy($parent->changeTrackingPolicy); if (!empty($parent->customGeneratorDefinition)) { $class->setCustomGeneratorDefinition($parent->customGeneratorDefinition); } if ($parent->isMappedSuperclass) { $class->setCustomRepositoryClass($parent->customRepositoryClassName); } } try { $this->driver->loadMetadataForClass($class->getName(), $class); } catch (ReflectionException $e) { throw MappingException::reflectionFailure($class->getName(), $e); } if ($parent && $rootEntityFound) { $this->inheritIdGeneratorMapping($class, $parent); } else { $this->completeIdGeneratorMapping($class); } if (!$class->isMappedSuperclass) { foreach ($class->embeddedClasses as $property => $embeddableClass) { if (isset($embeddableClass['inherited'])) { continue; } if (!(isset($embeddableClass['class']) && $embeddableClass['class'])) { throw MappingException::missingEmbeddedClass($property); } if (isset($this->embeddablesActiveNesting[$embeddableClass['class']])) { throw MappingException::infiniteEmbeddableNesting($class->name, $property); } $this->embeddablesActiveNesting[$class->name] = \true; $embeddableMetadata = $this->getMetadataFor($embeddableClass['class']); if ($embeddableMetadata->isEmbeddedClass) { $this->addNestedEmbeddedClasses($embeddableMetadata, $class, $property); } $identifier = $embeddableMetadata->getIdentifier(); if (!empty($identifier)) { $this->inheritIdGeneratorMapping($class, $embeddableMetadata); } $class->inlineEmbeddable($property, $embeddableMetadata); unset($this->embeddablesActiveNesting[$class->name]); } } if ($parent) { if ($parent->isInheritanceTypeSingleTable()) { $class->setPrimaryTable($parent->table); } if ($parent) { $this->addInheritedIndexes($class, $parent); } if ($parent->cache) { $class->cache = $parent->cache; } if ($parent->containsForeignIdentifier) { $class->containsForeignIdentifier = \true; } if (!empty($parent->namedQueries)) { $this->addInheritedNamedQueries($class, $parent); } if (!empty($parent->namedNativeQueries)) { $this->addInheritedNamedNativeQueries($class, $parent); } if (!empty($parent->sqlResultSetMappings)) { $this->addInheritedSqlResultSetMappings($class, $parent); } if (!empty($parent->entityListeners) && empty($class->entityListeners)) { $class->entityListeners = $parent->entityListeners; } } $class->setParentClasses($nonSuperclassParents); if ($class->isRootEntity() && !$class->isInheritanceTypeNone() && !$class->discriminatorMap) { $this->addDefaultDiscriminatorMap($class); } if ($this->evm->hasListeners(Events::loadClassMetadata)) { $eventArgs = new LoadClassMetadataEventArgs($class, $this->em); $this->evm->dispatchEvent(Events::loadClassMetadata, $eventArgs); } if ($class->changeTrackingPolicy === ClassMetadataInfo::CHANGETRACKING_NOTIFY) { Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/issues/8383', 'NOTIFY Change Tracking policy used in "%s" is deprecated, use deferred explicit instead.', $class->name); } $this->validateRuntimeMetadata($class, $parent); } protected function validateRuntimeMetadata($class, $parent) { if (!$class->reflClass) { return; } $class->validateIdentifier(); $class->validateAssociations(); $class->validateLifecycleCallbacks($this->getReflectionService()); if (!$class->isMappedSuperclass && !$class->isInheritanceTypeNone()) { if (!$parent) { if (count($class->discriminatorMap) === 0) { throw MappingException::missingDiscriminatorMap($class->name); } if (!$class->discriminatorColumn) { throw MappingException::missingDiscriminatorColumn($class->name); } foreach ($class->subClasses as $subClass) { if ((new ReflectionClass($subClass))->name !== $subClass) { throw MappingException::invalidClassInDiscriminatorMap($subClass, $class->name); } } } else { assert($parent instanceof ClassMetadataInfo); if ((!$class->reflClass || !$class->reflClass->isAbstract()) && !in_array($class->name, $class->discriminatorMap, \true)) { throw MappingException::mappedClassNotPartOfDiscriminatorMap($class->name, $class->rootEntityName); } } } elseif ($class->isMappedSuperclass && $class->name === $class->rootEntityName && (count($class->discriminatorMap) || $class->discriminatorColumn)) { throw MappingException::noInheritanceOnMappedSuperClass($class->name); } } protected function newClassMetadataInstance($className) { return new ClassMetadata($className, $this->em->getConfiguration()->getNamingStrategy()); } private function addDefaultDiscriminatorMap(ClassMetadata $class) : void { $allClasses = $this->driver->getAllClassNames(); $fqcn = $class->getName(); $map = [$this->getShortName($class->name) => $fqcn]; $duplicates = []; foreach ($allClasses as $subClassCandidate) { if (is_subclass_of($subClassCandidate, $fqcn)) { $shortName = $this->getShortName($subClassCandidate); if (isset($map[$shortName])) { $duplicates[] = $shortName; } $map[$shortName] = $subClassCandidate; } } if ($duplicates) { throw MappingException::duplicateDiscriminatorEntry($class->name, $duplicates, $map); } $class->setDiscriminatorMap($map); } private function getShortName(string $className) : string { if (strpos($className, '\\') === \false) { return strtolower($className); } $parts = explode('\\', $className); return strtolower(end($parts)); } private function addInheritedFields(ClassMetadata $subClass, ClassMetadata $parentClass) : void { foreach ($parentClass->fieldMappings as $mapping) { if (!isset($mapping['inherited']) && !$parentClass->isMappedSuperclass) { $mapping['inherited'] = $parentClass->name; } if (!isset($mapping['declared'])) { $mapping['declared'] = $parentClass->name; } $subClass->addInheritedFieldMapping($mapping); } foreach ($parentClass->reflFields as $name => $field) { $subClass->reflFields[$name] = $field; } } private function addInheritedRelations(ClassMetadata $subClass, ClassMetadata $parentClass) : void { foreach ($parentClass->associationMappings as $field => $mapping) { if ($parentClass->isMappedSuperclass) { if ($mapping['type'] & ClassMetadata::TO_MANY && !$mapping['isOwningSide']) { throw MappingException::illegalToManyAssociationOnMappedSuperclass($parentClass->name, $field); } $mapping['sourceEntity'] = $subClass->name; } if (!isset($mapping['inherited']) && !$parentClass->isMappedSuperclass) { $mapping['inherited'] = $parentClass->name; } if (!isset($mapping['declared'])) { $mapping['declared'] = $parentClass->name; } $subClass->addInheritedAssociationMapping($mapping); } } private function addInheritedEmbeddedClasses(ClassMetadata $subClass, ClassMetadata $parentClass) : void { foreach ($parentClass->embeddedClasses as $field => $embeddedClass) { if (!isset($embeddedClass['inherited']) && !$parentClass->isMappedSuperclass) { $embeddedClass['inherited'] = $parentClass->name; } if (!isset($embeddedClass['declared'])) { $embeddedClass['declared'] = $parentClass->name; } $subClass->embeddedClasses[$field] = $embeddedClass; } } private function addNestedEmbeddedClasses(ClassMetadata $subClass, ClassMetadata $parentClass, string $prefix) : void { foreach ($subClass->embeddedClasses as $property => $embeddableClass) { if (isset($embeddableClass['inherited'])) { continue; } $embeddableMetadata = $this->getMetadataFor($embeddableClass['class']); $parentClass->mapEmbedded(['fieldName' => $prefix . '.' . $property, 'class' => $embeddableMetadata->name, 'columnPrefix' => $embeddableClass['columnPrefix'], 'declaredField' => $embeddableClass['declaredField'] ? $prefix . '.' . $embeddableClass['declaredField'] : $prefix, 'originalField' => $embeddableClass['originalField'] ?: $property]); } } private function addInheritedIndexes(ClassMetadata $subClass, ClassMetadata $parentClass) : void { if (!$parentClass->isMappedSuperclass) { return; } foreach (['uniqueConstraints', 'indexes'] as $indexType) { if (isset($parentClass->table[$indexType])) { foreach ($parentClass->table[$indexType] as $indexName => $index) { if (isset($subClass->table[$indexType][$indexName])) { continue; } $subClass->table[$indexType][$indexName] = $index; } } } } private function addInheritedNamedQueries(ClassMetadata $subClass, ClassMetadata $parentClass) : void { foreach ($parentClass->namedQueries as $name => $query) { if (!isset($subClass->namedQueries[$name])) { $subClass->addNamedQuery(['name' => $query['name'], 'query' => $query['query']]); } } } private function addInheritedNamedNativeQueries(ClassMetadata $subClass, ClassMetadata $parentClass) : void { foreach ($parentClass->namedNativeQueries as $name => $query) { if (!isset($subClass->namedNativeQueries[$name])) { $subClass->addNamedNativeQuery(['name' => $query['name'], 'query' => $query['query'], 'isSelfClass' => $query['isSelfClass'], 'resultSetMapping' => $query['resultSetMapping'], 'resultClass' => $query['isSelfClass'] ? $subClass->name : $query['resultClass']]); } } } private function addInheritedSqlResultSetMappings(ClassMetadata $subClass, ClassMetadata $parentClass) : void { foreach ($parentClass->sqlResultSetMappings as $name => $mapping) { if (!isset($subClass->sqlResultSetMappings[$name])) { $entities = []; foreach ($mapping['entities'] as $entity) { $entities[] = ['fields' => $entity['fields'], 'isSelfClass' => $entity['isSelfClass'], 'discriminatorColumn' => $entity['discriminatorColumn'], 'entityClass' => $entity['isSelfClass'] ? $subClass->name : $entity['entityClass']]; } $subClass->addSqlResultSetMapping(['name' => $mapping['name'], 'columns' => $mapping['columns'], 'entities' => $entities]); } } } private function completeIdGeneratorMapping(ClassMetadataInfo $class) : void { $idGenType = $class->generatorType; if ($idGenType === ClassMetadata::GENERATOR_TYPE_AUTO) { $class->setIdGeneratorType($this->determineIdGeneratorStrategy($this->getTargetPlatform())); } switch ($class->generatorType) { case ClassMetadata::GENERATOR_TYPE_IDENTITY: $sequenceName = null; $fieldName = $class->identifier ? $class->getSingleIdentifierFieldName() : null; if ($this->getTargetPlatform()->usesSequenceEmulatedIdentityColumns()) { $columnName = $class->getSingleIdentifierColumnName(); $quoted = isset($class->fieldMappings[$fieldName]['quoted']) || isset($class->table['quoted']); $sequencePrefix = $class->getSequencePrefix($this->getTargetPlatform()); $sequenceName = $this->getTargetPlatform()->getIdentitySequenceName($sequencePrefix, $columnName); $definition = ['sequenceName' => $this->truncateSequenceName($sequenceName)]; if ($quoted) { $definition['quoted'] = \true; } $sequenceName = $this->em->getConfiguration()->getQuoteStrategy()->getSequenceName($definition, $class, $this->getTargetPlatform()); } $generator = $fieldName && $class->fieldMappings[$fieldName]['type'] === 'bigint' ? new BigIntegerIdentityGenerator($sequenceName) : new IdentityGenerator($sequenceName); $class->setIdGenerator($generator); break; case ClassMetadata::GENERATOR_TYPE_SEQUENCE: $definition = $class->sequenceGeneratorDefinition; if (!$definition) { $fieldName = $class->getSingleIdentifierFieldName(); $sequenceName = $class->getSequenceName($this->getTargetPlatform()); $quoted = isset($class->fieldMappings[$fieldName]['quoted']) || isset($class->table['quoted']); $definition = ['sequenceName' => $this->truncateSequenceName($sequenceName), 'allocationSize' => 1, 'initialValue' => 1]; if ($quoted) { $definition['quoted'] = \true; } $class->setSequenceGeneratorDefinition($definition); } $sequenceGenerator = new SequenceGenerator($this->em->getConfiguration()->getQuoteStrategy()->getSequenceName($definition, $class, $this->getTargetPlatform()), (int) $definition['allocationSize']); $class->setIdGenerator($sequenceGenerator); break; case ClassMetadata::GENERATOR_TYPE_NONE: $class->setIdGenerator(new AssignedGenerator()); break; case ClassMetadata::GENERATOR_TYPE_UUID: Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/issues/7312', 'Mapping for %s: the "UUID" id generator strategy is deprecated with no replacement', $class->name); $class->setIdGenerator(new UuidGenerator()); break; case ClassMetadata::GENERATOR_TYPE_CUSTOM: $definition = $class->customGeneratorDefinition; if ($definition === null) { throw InvalidCustomGenerator::onClassNotConfigured(); } if (!class_exists($definition['class'])) { throw InvalidCustomGenerator::onMissingClass($definition); } $class->setIdGenerator(new $definition['class']()); break; default: throw UnknownGeneratorType::create($class->generatorType); } } private function determineIdGeneratorStrategy(AbstractPlatform $platform) : int { if ($platform instanceof Platforms\OraclePlatform || $platform instanceof Platforms\PostgreSQL94Platform || $platform instanceof Platforms\PostgreSQLPlatform) { return ClassMetadata::GENERATOR_TYPE_SEQUENCE; } if ($platform->supportsIdentityColumns()) { return ClassMetadata::GENERATOR_TYPE_IDENTITY; } if ($platform->supportsSequences()) { return ClassMetadata::GENERATOR_TYPE_SEQUENCE; } throw CannotGenerateIds::withPlatform($platform); } private function truncateSequenceName(string $schemaElementName) : string { $platform = $this->getTargetPlatform(); if (!in_array($platform->getName(), ['oracle', 'sqlanywhere'], \true)) { return $schemaElementName; } $maxIdentifierLength = $platform->getMaxIdentifierLength(); if (strlen($schemaElementName) > $maxIdentifierLength) { return substr($schemaElementName, 0, $maxIdentifierLength); } return $schemaElementName; } private function inheritIdGeneratorMapping(ClassMetadataInfo $class, ClassMetadataInfo $parent) : void { if ($parent->isIdGeneratorSequence()) { $class->setSequenceGeneratorDefinition($parent->sequenceGeneratorDefinition); } if ($parent->generatorType) { $class->setIdGeneratorType($parent->generatorType); } if ($parent->idGenerator) { $class->setIdGenerator($parent->idGenerator); } } protected function wakeupReflection(ClassMetadataInterface $class, ReflectionService $reflService) { assert($class instanceof ClassMetadata); $class->wakeupReflection($reflService); } protected function initializeReflection(ClassMetadataInterface $class, ReflectionService $reflService) { assert($class instanceof ClassMetadata); $class->initializeReflection($reflService); } protected function getFqcnFromAlias($namespaceAlias, $simpleClassName) { return $this->em->getConfiguration()->getEntityNamespace($namespaceAlias) . '\\' . $simpleClassName; } protected function getDriver() { return $this->driver; } protected function isEntity(ClassMetadataInterface $class) { return isset($class->isMappedSuperclass) && $class->isMappedSuperclass === \false; } private function getTargetPlatform() : Platforms\AbstractPlatform { if (!$this->targetPlatform) { $this->targetPlatform = $this->em->getConnection()->getDatabasePlatform(); } return $this->targetPlatform; } }
|
1 |
Â
<?php
|
2 |
+
declare (strict_types=1); namespace MailPoetVendor\Doctrine\ORM\Mapping; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\Common\EventManager; use MailPoetVendor\Doctrine\DBAL\Platforms; use MailPoetVendor\Doctrine\DBAL\Platforms\AbstractPlatform; use MailPoetVendor\Doctrine\Deprecations\Deprecation; use MailPoetVendor\Doctrine\ORM\EntityManagerInterface; use MailPoetVendor\Doctrine\ORM\Event\LoadClassMetadataEventArgs; use MailPoetVendor\Doctrine\ORM\Event\OnClassMetadataNotFoundEventArgs; use MailPoetVendor\Doctrine\ORM\Events; use MailPoetVendor\Doctrine\ORM\Exception\ORMException; use MailPoetVendor\Doctrine\ORM\Id\AssignedGenerator; use MailPoetVendor\Doctrine\ORM\Id\BigIntegerIdentityGenerator; use MailPoetVendor\Doctrine\ORM\Id\IdentityGenerator; use MailPoetVendor\Doctrine\ORM\Id\SequenceGenerator; use MailPoetVendor\Doctrine\ORM\Id\UuidGenerator; use MailPoetVendor\Doctrine\ORM\Mapping\Exception\CannotGenerateIds; use MailPoetVendor\Doctrine\ORM\Mapping\Exception\InvalidCustomGenerator; use MailPoetVendor\Doctrine\ORM\Mapping\Exception\TableGeneratorNotImplementedYet; use MailPoetVendor\Doctrine\ORM\Mapping\Exception\UnknownGeneratorType; use MailPoetVendor\Doctrine\Persistence\Mapping\AbstractClassMetadataFactory; use MailPoetVendor\Doctrine\Persistence\Mapping\ClassMetadata as ClassMetadataInterface; use MailPoetVendor\Doctrine\Persistence\Mapping\Driver\MappingDriver; use MailPoetVendor\Doctrine\Persistence\Mapping\ReflectionService; use ReflectionClass; use ReflectionException; use function assert; use function class_exists; use function count; use function end; use function explode; use function in_array; use function is_subclass_of; use function strlen; use function strpos; use function strtolower; use function substr; class ClassMetadataFactory extends AbstractClassMetadataFactory { private $em; private $targetPlatform; private $driver; private $evm; private $embeddablesActiveNesting = []; public function setEntityManager(EntityManagerInterface $em) { $this->em = $em; } protected function initialize() { $this->driver = $this->em->getConfiguration()->getMetadataDriverImpl(); $this->evm = $this->em->getEventManager(); $this->initialized = \true; } protected function onNotFoundMetadata($className) { if (!$this->evm->hasListeners(Events::onClassMetadataNotFound)) { return; } $eventArgs = new OnClassMetadataNotFoundEventArgs($className, $this->em); $this->evm->dispatchEvent(Events::onClassMetadataNotFound, $eventArgs); return $eventArgs->getFoundMetadata(); } protected function doLoadMetadata($class, $parent, $rootEntityFound, array $nonSuperclassParents) { if ($parent) { $class->setInheritanceType($parent->inheritanceType); $class->setDiscriminatorColumn($parent->discriminatorColumn); $class->setIdGeneratorType($parent->generatorType); $this->addInheritedFields($class, $parent); $this->addInheritedRelations($class, $parent); $this->addInheritedEmbeddedClasses($class, $parent); $class->setIdentifier($parent->identifier); $class->setVersioned($parent->isVersioned); $class->setVersionField($parent->versionField); $class->setDiscriminatorMap($parent->discriminatorMap); $class->setLifecycleCallbacks($parent->lifecycleCallbacks); $class->setChangeTrackingPolicy($parent->changeTrackingPolicy); if (!empty($parent->customGeneratorDefinition)) { $class->setCustomGeneratorDefinition($parent->customGeneratorDefinition); } if ($parent->isMappedSuperclass) { $class->setCustomRepositoryClass($parent->customRepositoryClassName); } } try { $this->driver->loadMetadataForClass($class->getName(), $class); } catch (ReflectionException $e) { throw MappingException::reflectionFailure($class->getName(), $e); } if ($parent && $rootEntityFound) { $this->inheritIdGeneratorMapping($class, $parent); } else { $this->completeIdGeneratorMapping($class); } if (!$class->isMappedSuperclass) { foreach ($class->embeddedClasses as $property => $embeddableClass) { if (isset($embeddableClass['inherited'])) { continue; } if (!(isset($embeddableClass['class']) && $embeddableClass['class'])) { throw MappingException::missingEmbeddedClass($property); } if (isset($this->embeddablesActiveNesting[$embeddableClass['class']])) { throw MappingException::infiniteEmbeddableNesting($class->name, $property); } $this->embeddablesActiveNesting[$class->name] = \true; $embeddableMetadata = $this->getMetadataFor($embeddableClass['class']); if ($embeddableMetadata->isEmbeddedClass) { $this->addNestedEmbeddedClasses($embeddableMetadata, $class, $property); } $identifier = $embeddableMetadata->getIdentifier(); if (!empty($identifier)) { $this->inheritIdGeneratorMapping($class, $embeddableMetadata); } $class->inlineEmbeddable($property, $embeddableMetadata); unset($this->embeddablesActiveNesting[$class->name]); } } if ($parent) { if ($parent->isInheritanceTypeSingleTable()) { $class->setPrimaryTable($parent->table); } $this->addInheritedIndexes($class, $parent); if ($parent->cache) { $class->cache = $parent->cache; } if ($parent->containsForeignIdentifier) { $class->containsForeignIdentifier = \true; } if (!empty($parent->namedQueries)) { $this->addInheritedNamedQueries($class, $parent); } if (!empty($parent->namedNativeQueries)) { $this->addInheritedNamedNativeQueries($class, $parent); } if (!empty($parent->sqlResultSetMappings)) { $this->addInheritedSqlResultSetMappings($class, $parent); } if (!empty($parent->entityListeners) && empty($class->entityListeners)) { $class->entityListeners = $parent->entityListeners; } } $class->setParentClasses($nonSuperclassParents); if ($class->isRootEntity() && !$class->isInheritanceTypeNone() && !$class->discriminatorMap) { $this->addDefaultDiscriminatorMap($class); } if ($this->evm->hasListeners(Events::loadClassMetadata)) { $eventArgs = new LoadClassMetadataEventArgs($class, $this->em); $this->evm->dispatchEvent(Events::loadClassMetadata, $eventArgs); } if ($class->changeTrackingPolicy === ClassMetadataInfo::CHANGETRACKING_NOTIFY) { Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/issues/8383', 'NOTIFY Change Tracking policy used in "%s" is deprecated, use deferred explicit instead.', $class->name); } $this->validateRuntimeMetadata($class, $parent); } protected function validateRuntimeMetadata($class, $parent) { if (!$class->reflClass) { return; } $class->validateIdentifier(); $class->validateAssociations(); $class->validateLifecycleCallbacks($this->getReflectionService()); if (!$class->isMappedSuperclass && !$class->isInheritanceTypeNone()) { if (!$parent) { if (count($class->discriminatorMap) === 0) { throw MappingException::missingDiscriminatorMap($class->name); } if (!$class->discriminatorColumn) { throw MappingException::missingDiscriminatorColumn($class->name); } foreach ($class->subClasses as $subClass) { if ((new ReflectionClass($subClass))->name !== $subClass) { throw MappingException::invalidClassInDiscriminatorMap($subClass, $class->name); } } } else { assert($parent instanceof ClassMetadataInfo); if (!$class->reflClass->isAbstract() && !in_array($class->name, $class->discriminatorMap, \true)) { throw MappingException::mappedClassNotPartOfDiscriminatorMap($class->name, $class->rootEntityName); } } } elseif ($class->isMappedSuperclass && $class->name === $class->rootEntityName && (count($class->discriminatorMap) || $class->discriminatorColumn)) { throw MappingException::noInheritanceOnMappedSuperClass($class->name); } } protected function newClassMetadataInstance($className) { return new ClassMetadata($className, $this->em->getConfiguration()->getNamingStrategy()); } private function addDefaultDiscriminatorMap(ClassMetadata $class) : void { $allClasses = $this->driver->getAllClassNames(); $fqcn = $class->getName(); $map = [$this->getShortName($class->name) => $fqcn]; $duplicates = []; foreach ($allClasses as $subClassCandidate) { if (is_subclass_of($subClassCandidate, $fqcn)) { $shortName = $this->getShortName($subClassCandidate); if (isset($map[$shortName])) { $duplicates[] = $shortName; } $map[$shortName] = $subClassCandidate; } } if ($duplicates) { throw MappingException::duplicateDiscriminatorEntry($class->name, $duplicates, $map); } $class->setDiscriminatorMap($map); } private function getShortName(string $className) : string { if (strpos($className, '\\') === \false) { return strtolower($className); } $parts = explode('\\', $className); return strtolower(end($parts)); } private function addInheritedFields(ClassMetadata $subClass, ClassMetadata $parentClass) : void { foreach ($parentClass->fieldMappings as $mapping) { if (!isset($mapping['inherited']) && !$parentClass->isMappedSuperclass) { $mapping['inherited'] = $parentClass->name; } if (!isset($mapping['declared'])) { $mapping['declared'] = $parentClass->name; } $subClass->addInheritedFieldMapping($mapping); } foreach ($parentClass->reflFields as $name => $field) { $subClass->reflFields[$name] = $field; } } private function addInheritedRelations(ClassMetadata $subClass, ClassMetadata $parentClass) : void { foreach ($parentClass->associationMappings as $field => $mapping) { if ($parentClass->isMappedSuperclass) { if ($mapping['type'] & ClassMetadata::TO_MANY && !$mapping['isOwningSide']) { throw MappingException::illegalToManyAssociationOnMappedSuperclass($parentClass->name, $field); } $mapping['sourceEntity'] = $subClass->name; } if (!isset($mapping['inherited']) && !$parentClass->isMappedSuperclass) { $mapping['inherited'] = $parentClass->name; } if (!isset($mapping['declared'])) { $mapping['declared'] = $parentClass->name; } $subClass->addInheritedAssociationMapping($mapping); } } private function addInheritedEmbeddedClasses(ClassMetadata $subClass, ClassMetadata $parentClass) : void { foreach ($parentClass->embeddedClasses as $field => $embeddedClass) { if (!isset($embeddedClass['inherited']) && !$parentClass->isMappedSuperclass) { $embeddedClass['inherited'] = $parentClass->name; } if (!isset($embeddedClass['declared'])) { $embeddedClass['declared'] = $parentClass->name; } $subClass->embeddedClasses[$field] = $embeddedClass; } } private function addNestedEmbeddedClasses(ClassMetadata $subClass, ClassMetadata $parentClass, string $prefix) : void { foreach ($subClass->embeddedClasses as $property => $embeddableClass) { if (isset($embeddableClass['inherited'])) { continue; } $embeddableMetadata = $this->getMetadataFor($embeddableClass['class']); $parentClass->mapEmbedded(['fieldName' => $prefix . '.' . $property, 'class' => $embeddableMetadata->name, 'columnPrefix' => $embeddableClass['columnPrefix'], 'declaredField' => $embeddableClass['declaredField'] ? $prefix . '.' . $embeddableClass['declaredField'] : $prefix, 'originalField' => $embeddableClass['originalField'] ?: $property]); } } private function addInheritedIndexes(ClassMetadata $subClass, ClassMetadata $parentClass) : void { if (!$parentClass->isMappedSuperclass) { return; } foreach (['uniqueConstraints', 'indexes'] as $indexType) { if (isset($parentClass->table[$indexType])) { foreach ($parentClass->table[$indexType] as $indexName => $index) { if (isset($subClass->table[$indexType][$indexName])) { continue; } $subClass->table[$indexType][$indexName] = $index; } } } } private function addInheritedNamedQueries(ClassMetadata $subClass, ClassMetadata $parentClass) : void { foreach ($parentClass->namedQueries as $name => $query) { if (!isset($subClass->namedQueries[$name])) { $subClass->addNamedQuery(['name' => $query['name'], 'query' => $query['query']]); } } } private function addInheritedNamedNativeQueries(ClassMetadata $subClass, ClassMetadata $parentClass) : void { foreach ($parentClass->namedNativeQueries as $name => $query) { if (!isset($subClass->namedNativeQueries[$name])) { $subClass->addNamedNativeQuery(['name' => $query['name'], 'query' => $query['query'], 'isSelfClass' => $query['isSelfClass'], 'resultSetMapping' => $query['resultSetMapping'], 'resultClass' => $query['isSelfClass'] ? $subClass->name : $query['resultClass']]); } } } private function addInheritedSqlResultSetMappings(ClassMetadata $subClass, ClassMetadata $parentClass) : void { foreach ($parentClass->sqlResultSetMappings as $name => $mapping) { if (!isset($subClass->sqlResultSetMappings[$name])) { $entities = []; foreach ($mapping['entities'] as $entity) { $entities[] = ['fields' => $entity['fields'], 'isSelfClass' => $entity['isSelfClass'], 'discriminatorColumn' => $entity['discriminatorColumn'], 'entityClass' => $entity['isSelfClass'] ? $subClass->name : $entity['entityClass']]; } $subClass->addSqlResultSetMapping(['name' => $mapping['name'], 'columns' => $mapping['columns'], 'entities' => $entities]); } } } private function completeIdGeneratorMapping(ClassMetadataInfo $class) : void { $idGenType = $class->generatorType; if ($idGenType === ClassMetadata::GENERATOR_TYPE_AUTO) { $class->setIdGeneratorType($this->determineIdGeneratorStrategy($this->getTargetPlatform())); } switch ($class->generatorType) { case ClassMetadata::GENERATOR_TYPE_IDENTITY: $sequenceName = null; $fieldName = $class->identifier ? $class->getSingleIdentifierFieldName() : null; if ($this->getTargetPlatform()->usesSequenceEmulatedIdentityColumns()) { $columnName = $class->getSingleIdentifierColumnName(); $quoted = isset($class->fieldMappings[$fieldName]['quoted']) || isset($class->table['quoted']); $sequencePrefix = $class->getSequencePrefix($this->getTargetPlatform()); $sequenceName = $this->getTargetPlatform()->getIdentitySequenceName($sequencePrefix, $columnName); $definition = ['sequenceName' => $this->truncateSequenceName($sequenceName)]; if ($quoted) { $definition['quoted'] = \true; } $sequenceName = $this->em->getConfiguration()->getQuoteStrategy()->getSequenceName($definition, $class, $this->getTargetPlatform()); } $generator = $fieldName && $class->fieldMappings[$fieldName]['type'] === 'bigint' ? new BigIntegerIdentityGenerator($sequenceName) : new IdentityGenerator($sequenceName); $class->setIdGenerator($generator); break; case ClassMetadata::GENERATOR_TYPE_SEQUENCE: $definition = $class->sequenceGeneratorDefinition; if (!$definition) { $fieldName = $class->getSingleIdentifierFieldName(); $sequenceName = $class->getSequenceName($this->getTargetPlatform()); $quoted = isset($class->fieldMappings[$fieldName]['quoted']) || isset($class->table['quoted']); $definition = ['sequenceName' => $this->truncateSequenceName($sequenceName), 'allocationSize' => 1, 'initialValue' => 1]; if ($quoted) { $definition['quoted'] = \true; } $class->setSequenceGeneratorDefinition($definition); } $sequenceGenerator = new SequenceGenerator($this->em->getConfiguration()->getQuoteStrategy()->getSequenceName($definition, $class, $this->getTargetPlatform()), (int) $definition['allocationSize']); $class->setIdGenerator($sequenceGenerator); break; case ClassMetadata::GENERATOR_TYPE_NONE: $class->setIdGenerator(new AssignedGenerator()); break; case ClassMetadata::GENERATOR_TYPE_UUID: Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/issues/7312', 'Mapping for %s: the "UUID" id generator strategy is deprecated with no replacement', $class->name); $class->setIdGenerator(new UuidGenerator()); break; case ClassMetadata::GENERATOR_TYPE_CUSTOM: $definition = $class->customGeneratorDefinition; if ($definition === null) { throw InvalidCustomGenerator::onClassNotConfigured(); } if (!class_exists($definition['class'])) { throw InvalidCustomGenerator::onMissingClass($definition); } $class->setIdGenerator(new $definition['class']()); break; default: throw UnknownGeneratorType::create($class->generatorType); } } private function determineIdGeneratorStrategy(AbstractPlatform $platform) : int { if ($platform instanceof Platforms\OraclePlatform || $platform instanceof Platforms\PostgreSQL94Platform || $platform instanceof Platforms\PostgreSQLPlatform) { return ClassMetadata::GENERATOR_TYPE_SEQUENCE; } if ($platform->supportsIdentityColumns()) { return ClassMetadata::GENERATOR_TYPE_IDENTITY; } if ($platform->supportsSequences()) { return ClassMetadata::GENERATOR_TYPE_SEQUENCE; } throw CannotGenerateIds::withPlatform($platform); } private function truncateSequenceName(string $schemaElementName) : string { $platform = $this->getTargetPlatform(); if (!in_array($platform->getName(), ['oracle', 'sqlanywhere'], \true)) { return $schemaElementName; } $maxIdentifierLength = $platform->getMaxIdentifierLength(); if (strlen($schemaElementName) > $maxIdentifierLength) { return substr($schemaElementName, 0, $maxIdentifierLength); } return $schemaElementName; } private function inheritIdGeneratorMapping(ClassMetadataInfo $class, ClassMetadataInfo $parent) : void { if ($parent->isIdGeneratorSequence()) { $class->setSequenceGeneratorDefinition($parent->sequenceGeneratorDefinition); } if ($parent->generatorType) { $class->setIdGeneratorType($parent->generatorType); } if ($parent->idGenerator) { $class->setIdGenerator($parent->idGenerator); } } protected function wakeupReflection(ClassMetadataInterface $class, ReflectionService $reflService) { assert($class instanceof ClassMetadata); $class->wakeupReflection($reflService); } protected function initializeReflection(ClassMetadataInterface $class, ReflectionService $reflService) { assert($class instanceof ClassMetadata); $class->initializeReflection($reflService); } protected function getFqcnFromAlias($namespaceAlias, $simpleClassName) { return $this->em->getConfiguration()->getEntityNamespace($namespaceAlias) . '\\' . $simpleClassName; } protected function getDriver() { return $this->driver; } protected function isEntity(ClassMetadataInterface $class) { return isset($class->isMappedSuperclass) && $class->isMappedSuperclass === \false; } private function getTargetPlatform() : Platforms\AbstractPlatform { if (!$this->targetPlatform) { $this->targetPlatform = $this->em->getConnection()->getDatabasePlatform(); } return $this->targetPlatform; } }
|
vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
declare (strict_types=1); namespace MailPoetVendor\Doctrine\ORM; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\Common\Cache\Cache; use MailPoetVendor\Doctrine\Common\Cache\Psr6\CacheAdapter; use MailPoetVendor\Doctrine\Common\Cache\Psr6\DoctrineProvider; use MailPoetVendor\Doctrine\Common\Collections\ArrayCollection; use MailPoetVendor\Doctrine\DBAL\Cache\QueryCacheProfile; use MailPoetVendor\Doctrine\DBAL\LockMode; use MailPoetVendor\Doctrine\DBAL\Types\Type; use MailPoetVendor\Doctrine\Deprecations\Deprecation; use MailPoetVendor\Doctrine\ORM\Internal\Hydration\IterableResult; use MailPoetVendor\Doctrine\ORM\Mapping\ClassMetadata; use MailPoetVendor\Doctrine\ORM\Query\AST\DeleteStatement; use MailPoetVendor\Doctrine\ORM\Query\AST\SelectStatement; use MailPoetVendor\Doctrine\ORM\Query\AST\UpdateStatement; use MailPoetVendor\Doctrine\ORM\Query\Exec\AbstractSqlExecutor; use MailPoetVendor\Doctrine\ORM\Query\Parameter; use MailPoetVendor\Doctrine\ORM\Query\ParameterTypeInferer; use MailPoetVendor\Doctrine\ORM\Query\Parser; use MailPoetVendor\Doctrine\ORM\Query\ParserResult; use MailPoetVendor\Doctrine\ORM\Query\QueryException; use MailPoetVendor\Doctrine\ORM\Utility\HierarchyDiscriminatorResolver; use MailPoetVendor\Psr\Cache\CacheItemPoolInterface; use function array_keys; use function array_values; use function assert; use function count; use function get_debug_type; use function in_array; use function ksort; use function md5; use function method_exists; use function reset; use function serialize; use function sha1; use function stripos; final class Query extends AbstractQuery { public const STATE_CLEAN = 1; public const STATE_DIRTY = 2; public const HINT_REFRESH = 'doctrine.refresh'; public const HINT_CACHE_ENABLED = 'doctrine.cache.enabled'; public const HINT_CACHE_EVICT = 'doctrine.cache.evict'; public const HINT_REFRESH_ENTITY = 'doctrine.refresh.entity'; public const HINT_FORCE_PARTIAL_LOAD = 'doctrine.forcePartialLoad'; public const HINT_INCLUDE_META_COLUMNS = 'doctrine.includeMetaColumns'; public const HINT_CUSTOM_TREE_WALKERS = 'doctrine.customTreeWalkers'; public const HINT_CUSTOM_OUTPUT_WALKER = 'doctrine.customOutputWalker'; public const HINT_READ_ONLY = 'doctrine.readOnly'; public const HINT_INTERNAL_ITERATION = 'doctrine.internal.iteration'; public const HINT_LOCK_MODE = 'doctrine.lockMode'; private $_state = self::STATE_DIRTY; private $parsedTypes = []; private $dql = null; private $parserResult; private $firstResult = null; private $maxResults = null; private $queryCache; private $expireQueryCache = \false; private $queryCacheTTL; private $useQueryCache = \true; public function getSQL() { return $this->parse()->getSqlExecutor()->getSqlStatements(); } public function getAST() { $parser = new Parser($this); return $parser->getAST(); } protected function getResultSetMapping() { if ($this->_resultSetMapping === null) { $this->_resultSetMapping = $this->parse()->getResultSetMapping(); } return $this->_resultSetMapping; } private function parse() : ParserResult { $types = []; foreach ($this->parameters as $parameter) { $types[$parameter->getName()] = $parameter->getType(); } if ($this->_state === self::STATE_CLEAN && $this->parsedTypes === $types && $this->_em->isFiltersStateClean()) { return $this->parserResult; } $this->_state = self::STATE_CLEAN; $this->parsedTypes = $types; $queryCache = $this->queryCache ?? $this->_em->getConfiguration()->getQueryCache(); if (!($this->useQueryCache && $queryCache)) { $parser = new Parser($this); $this->parserResult = $parser->parse(); return $this->parserResult; } $cacheItem = $queryCache->getItem($this->getQueryCacheId()); if (!$this->expireQueryCache && $cacheItem->isHit()) { $cached = $cacheItem->get(); if ($cached instanceof ParserResult) { $this->parserResult = $cached; return $this->parserResult; } } $parser = new Parser($this); $this->parserResult = $parser->parse(); $queryCache->save($cacheItem->set($this->parserResult)->expiresAfter($this->queryCacheTTL)); return $this->parserResult; } protected function _doExecute() { $executor = $this->parse()->getSqlExecutor(); if ($this->_queryCacheProfile) { $executor->setQueryCacheProfile($this->_queryCacheProfile); } else { $executor->removeQueryCacheProfile(); } if ($this->_resultSetMapping === null) { $this->_resultSetMapping = $this->parserResult->getResultSetMapping(); } $paramMappings = $this->parserResult->getParameterMappings(); $paramCount = count($this->parameters); $mappingCount = count($paramMappings); if ($paramCount > $mappingCount) { throw QueryException::tooManyParameters($mappingCount, $paramCount); } if ($paramCount < $mappingCount) { throw QueryException::tooFewParameters($mappingCount, $paramCount); } if ($this->hasCache && isset($this->_hints[self::HINT_CACHE_EVICT]) && $this->_hints[self::HINT_CACHE_EVICT]) { $this->evictEntityCacheRegion(); } [$sqlParams, $types] = $this->processParameterMappings($paramMappings); $this->evictResultSetCache($executor, $sqlParams, $types, $this->_em->getConnection()->getParams()); return $executor->execute($this->_em->getConnection(), $sqlParams, $types); } private function evictResultSetCache(AbstractSqlExecutor $executor, array $sqlParams, array $types, array $connectionParams) : void { if ($this->_queryCacheProfile === null || !$this->getExpireResultCache()) { return; } $cache = method_exists(QueryCacheProfile::class, 'getResultCache') ? $this->_queryCacheProfile->getResultCache() : $this->_queryCacheProfile->getResultCacheDriver(); assert($cache !== null); $statements = (array) $executor->getSqlStatements(); foreach ($statements as $statement) { $cacheKeys = $this->_queryCacheProfile->generateCacheKeys($statement, $sqlParams, $types, $connectionParams); $cache instanceof CacheItemPoolInterface ? $cache->deleteItem(reset($cacheKeys)) : $cache->delete(reset($cacheKeys)); } } private function evictEntityCacheRegion() : void { $AST = $this->getAST(); if ($AST instanceof SelectStatement) { throw new QueryException('The hint "HINT_CACHE_EVICT" is not valid for select statements.'); } $className = $AST instanceof DeleteStatement ? $AST->deleteClause->abstractSchemaName : $AST->updateClause->abstractSchemaName; $this->_em->getCache()->evictEntityRegion($className); } private function processParameterMappings(array $paramMappings) : array { $sqlParams = []; $types = []; foreach ($this->parameters as $parameter) { $key = $parameter->getName(); if (!isset($paramMappings[$key])) { throw QueryException::unknownParameter($key); } [$value, $type] = $this->resolveParameterValue($parameter); foreach ($paramMappings[$key] as $position) { $types[$position] = $type; } $sqlPositions = $paramMappings[$key]; $value = [$value]; $countValue = count($value); for ($i = 0, $l = count($sqlPositions); $i < $l; $i++) { $sqlParams[$sqlPositions[$i]] = $value[$i % $countValue]; } } if (count($sqlParams) !== count($types)) { throw QueryException::parameterTypeMismatch(); } if ($sqlParams) { ksort($sqlParams); $sqlParams = array_values($sqlParams); ksort($types); $types = array_values($types); } return [$sqlParams, $types]; } private function resolveParameterValue(Parameter $parameter) : array { if ($parameter->typeWasSpecified()) { return [$parameter->getValue(), $parameter->getType()]; } $key = $parameter->getName(); $originalValue = $parameter->getValue(); $value = $originalValue; $rsm = $this->getResultSetMapping(); assert($rsm !== null); if ($value instanceof ClassMetadata && isset($rsm->metadataParameterMapping[$key])) { $value = $value->getMetadataValue($rsm->metadataParameterMapping[$key]); } if ($value instanceof ClassMetadata && isset($rsm->discriminatorParameters[$key])) { $value = array_keys(HierarchyDiscriminatorResolver::resolveDiscriminatorsForClass($value, $this->_em)); } $processedValue = $this->processParameterValue($value); return [$processedValue, $originalValue === $processedValue ? $parameter->getType() : ParameterTypeInferer::inferType($processedValue)]; } public function setQueryCacheDriver($queryCache) : self { Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/pull/9004', '%s is deprecated and will be removed in Doctrine 3.0. Use setQueryCache() instead.', __METHOD__); $this->queryCache = $queryCache ? CacheAdapter::wrap($queryCache) : null; return $this; } public function setQueryCache(?CacheItemPoolInterface $queryCache) : self { $this->queryCache = $queryCache; return $this; } public function useQueryCache($bool) : self { $this->useQueryCache = $bool; return $this; } public function getQueryCacheDriver() : ?Cache { Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/pull/9004', '%s is deprecated and will be removed in Doctrine 3.0 without replacement.', __METHOD__); $queryCache = $this->queryCache ?? $this->_em->getConfiguration()->getQueryCache(); return $queryCache ? DoctrineProvider::wrap($queryCache) : null; } public function setQueryCacheLifetime($timeToLive) : self { if ($timeToLive !== null) { $timeToLive = (int) $timeToLive; } $this->queryCacheTTL = $timeToLive; return $this; } public function getQueryCacheLifetime() : ?int { return $this->queryCacheTTL; } public function expireQueryCache($expire = \true) : self { $this->expireQueryCache = $expire; return $this; } public function getExpireQueryCache() : bool { return $this->expireQueryCache; } public function free() : void { parent::free(); $this->dql = null; $this->_state = self::STATE_CLEAN; } public function setDQL($dqlQuery) : self { if ($dqlQuery !== null) { $this->dql = $dqlQuery; $this->_state = self::STATE_DIRTY; } return $this; } public function getDQL() : ?string { return $this->dql; } public function getState() : int { return $this->_state; } public function contains($dql) : bool { return stripos($this->getDQL(), $dql) !== \false; } public function setFirstResult($firstResult) : self { $this->firstResult = $firstResult; $this->_state = self::STATE_DIRTY; return $this; } public function getFirstResult() : ?int { return $this->firstResult; } public function setMaxResults($maxResults) : self { $this->maxResults = $maxResults; $this->_state = self::STATE_DIRTY; return $this; } public function getMaxResults() : ?int { return $this->maxResults; } public function iterate($parameters = null, $hydrationMode = self::HYDRATE_OBJECT) : IterableResult { $this->setHint(self::HINT_INTERNAL_ITERATION, \true); return parent::iterate($parameters, $hydrationMode); } public function toIterable(iterable $parameters = [], $hydrationMode = self::HYDRATE_OBJECT) : iterable { $this->setHint(self::HINT_INTERNAL_ITERATION, \true); return parent::toIterable($parameters, $hydrationMode); } public function setHint($name, $value) : self { $this->_state = self::STATE_DIRTY; return parent::setHint($name, $value); } public function setHydrationMode($hydrationMode) : self { $this->_state = self::STATE_DIRTY; return parent::setHydrationMode($hydrationMode); } public function setLockMode($lockMode) : self { if (in_array($lockMode, [LockMode::NONE, LockMode::PESSIMISTIC_READ, LockMode::PESSIMISTIC_WRITE], \true)) { if (!$this->_em->getConnection()->isTransactionActive()) { throw TransactionRequiredException::transactionRequired(); } } $this->setHint(self::HINT_LOCK_MODE, $lockMode); return $this; } public function getLockMode() : ?int { $lockMode = $this->getHint(self::HINT_LOCK_MODE); if ($lockMode === \false) { return null; } return $lockMode; } protected function getQueryCacheId() : string { ksort($this->_hints); return md5($this->getDQL() . serialize($this->_hints) . '&platform=' . get_debug_type($this->getEntityManager()->getConnection()->getDatabasePlatform()) . ($this->_em->hasFilters() ? $this->_em->getFilters()->getHash() : '') . '&firstResult=' . $this->firstResult . '&maxResult=' . $this->maxResults . '&hydrationMode=' . $this->_hydrationMode . '&types=' . serialize($this->parsedTypes) . 'DOCTRINE_QUERY_CACHE_SALT'); } protected function getHash() : string { return sha1(parent::getHash() . '-' . $this->firstResult . '-' . $this->maxResults); } public function __clone() { parent::__clone(); $this->_state = self::STATE_DIRTY; } }
|
1 |
Â
<?php
|
2 |
+
declare (strict_types=1); namespace MailPoetVendor\Doctrine\ORM; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\Common\Cache\Cache; use MailPoetVendor\Doctrine\Common\Cache\Psr6\CacheAdapter; use MailPoetVendor\Doctrine\Common\Cache\Psr6\DoctrineProvider; use MailPoetVendor\Doctrine\Common\Collections\ArrayCollection; use MailPoetVendor\Doctrine\DBAL\Cache\QueryCacheProfile; use MailPoetVendor\Doctrine\DBAL\LockMode; use MailPoetVendor\Doctrine\DBAL\Types\Type; use MailPoetVendor\Doctrine\Deprecations\Deprecation; use MailPoetVendor\Doctrine\ORM\Internal\Hydration\IterableResult; use MailPoetVendor\Doctrine\ORM\Mapping\ClassMetadata; use MailPoetVendor\Doctrine\ORM\Query\AST\DeleteStatement; use MailPoetVendor\Doctrine\ORM\Query\AST\SelectStatement; use MailPoetVendor\Doctrine\ORM\Query\AST\UpdateStatement; use MailPoetVendor\Doctrine\ORM\Query\Exec\AbstractSqlExecutor; use MailPoetVendor\Doctrine\ORM\Query\Parameter; use MailPoetVendor\Doctrine\ORM\Query\ParameterTypeInferer; use MailPoetVendor\Doctrine\ORM\Query\Parser; use MailPoetVendor\Doctrine\ORM\Query\ParserResult; use MailPoetVendor\Doctrine\ORM\Query\QueryException; use MailPoetVendor\Doctrine\ORM\Utility\HierarchyDiscriminatorResolver; use MailPoetVendor\Psr\Cache\CacheItemPoolInterface; use function array_keys; use function array_values; use function assert; use function count; use function get_debug_type; use function in_array; use function ksort; use function md5; use function method_exists; use function reset; use function serialize; use function sha1; use function stripos; final class Query extends AbstractQuery { public const STATE_CLEAN = 1; public const STATE_DIRTY = 2; public const HINT_REFRESH = 'doctrine.refresh'; public const HINT_CACHE_ENABLED = 'doctrine.cache.enabled'; public const HINT_CACHE_EVICT = 'doctrine.cache.evict'; public const HINT_REFRESH_ENTITY = 'doctrine.refresh.entity'; public const HINT_FORCE_PARTIAL_LOAD = 'doctrine.forcePartialLoad'; public const HINT_INCLUDE_META_COLUMNS = 'doctrine.includeMetaColumns'; public const HINT_CUSTOM_TREE_WALKERS = 'doctrine.customTreeWalkers'; public const HINT_CUSTOM_OUTPUT_WALKER = 'doctrine.customOutputWalker'; public const HINT_READ_ONLY = 'doctrine.readOnly'; public const HINT_INTERNAL_ITERATION = 'doctrine.internal.iteration'; public const HINT_LOCK_MODE = 'doctrine.lockMode'; private $_state = self::STATE_DIRTY; private $parsedTypes = []; private $dql = null; private $parserResult; private $firstResult = null; private $maxResults = null; private $queryCache; private $expireQueryCache = \false; private $queryCacheTTL; private $useQueryCache = \true; public function getSQL() { return $this->parse()->getSqlExecutor()->getSqlStatements(); } public function getAST() { $parser = new Parser($this); return $parser->getAST(); } protected function getResultSetMapping() { if ($this->_resultSetMapping === null) { $this->_resultSetMapping = $this->parse()->getResultSetMapping(); } return $this->_resultSetMapping; } private function parse() : ParserResult { $types = []; foreach ($this->parameters as $parameter) { $types[$parameter->getName()] = $parameter->getType(); } if ($this->_state === self::STATE_CLEAN && $this->parsedTypes === $types && $this->_em->isFiltersStateClean()) { return $this->parserResult; } $this->_state = self::STATE_CLEAN; $this->parsedTypes = $types; $queryCache = $this->queryCache ?? $this->_em->getConfiguration()->getQueryCache(); if (!($this->useQueryCache && $queryCache)) { $parser = new Parser($this); $this->parserResult = $parser->parse(); return $this->parserResult; } $cacheItem = $queryCache->getItem($this->getQueryCacheId()); if (!$this->expireQueryCache && $cacheItem->isHit()) { $cached = $cacheItem->get(); if ($cached instanceof ParserResult) { $this->parserResult = $cached; return $this->parserResult; } } $parser = new Parser($this); $this->parserResult = $parser->parse(); $queryCache->save($cacheItem->set($this->parserResult)->expiresAfter($this->queryCacheTTL)); return $this->parserResult; } protected function _doExecute() { $executor = $this->parse()->getSqlExecutor(); if ($this->_queryCacheProfile) { $executor->setQueryCacheProfile($this->_queryCacheProfile); } else { $executor->removeQueryCacheProfile(); } if ($this->_resultSetMapping === null) { $this->_resultSetMapping = $this->parserResult->getResultSetMapping(); } $paramMappings = $this->parserResult->getParameterMappings(); $paramCount = count($this->parameters); $mappingCount = count($paramMappings); if ($paramCount > $mappingCount) { throw QueryException::tooManyParameters($mappingCount, $paramCount); } if ($paramCount < $mappingCount) { throw QueryException::tooFewParameters($mappingCount, $paramCount); } if ($this->hasCache && isset($this->_hints[self::HINT_CACHE_EVICT]) && $this->_hints[self::HINT_CACHE_EVICT]) { $this->evictEntityCacheRegion(); } [$sqlParams, $types] = $this->processParameterMappings($paramMappings); $this->evictResultSetCache($executor, $sqlParams, $types, $this->_em->getConnection()->getParams()); return $executor->execute($this->_em->getConnection(), $sqlParams, $types); } private function evictResultSetCache(AbstractSqlExecutor $executor, array $sqlParams, array $types, array $connectionParams) : void { if ($this->_queryCacheProfile === null || !$this->getExpireResultCache()) { return; } $cache = method_exists(QueryCacheProfile::class, 'getResultCache') ? $this->_queryCacheProfile->getResultCache() : $this->_queryCacheProfile->getResultCacheDriver(); assert($cache !== null); $statements = (array) $executor->getSqlStatements(); foreach ($statements as $statement) { $cacheKeys = $this->_queryCacheProfile->generateCacheKeys($statement, $sqlParams, $types, $connectionParams); $cache instanceof CacheItemPoolInterface ? $cache->deleteItem(reset($cacheKeys)) : $cache->delete(reset($cacheKeys)); } } private function evictEntityCacheRegion() : void { $AST = $this->getAST(); if ($AST instanceof SelectStatement) { throw new QueryException('The hint "HINT_CACHE_EVICT" is not valid for select statements.'); } $className = $AST instanceof DeleteStatement ? $AST->deleteClause->abstractSchemaName : $AST->updateClause->abstractSchemaName; $this->_em->getCache()->evictEntityRegion($className); } private function processParameterMappings(array $paramMappings) : array { $sqlParams = []; $types = []; foreach ($this->parameters as $parameter) { $key = $parameter->getName(); if (!isset($paramMappings[$key])) { throw QueryException::unknownParameter($key); } [$value, $type] = $this->resolveParameterValue($parameter); foreach ($paramMappings[$key] as $position) { $types[$position] = $type; } $sqlPositions = $paramMappings[$key]; $value = [$value]; $countValue = count($value); for ($i = 0, $l = count($sqlPositions); $i < $l; $i++) { $sqlParams[$sqlPositions[$i]] = $value[$i % $countValue]; } } if (count($sqlParams) !== count($types)) { throw QueryException::parameterTypeMismatch(); } if ($sqlParams) { ksort($sqlParams); $sqlParams = array_values($sqlParams); ksort($types); $types = array_values($types); } return [$sqlParams, $types]; } private function resolveParameterValue(Parameter $parameter) : array { if ($parameter->typeWasSpecified()) { return [$parameter->getValue(), $parameter->getType()]; } $key = $parameter->getName(); $originalValue = $parameter->getValue(); $value = $originalValue; $rsm = $this->getResultSetMapping(); assert($rsm !== null); if ($value instanceof ClassMetadata && isset($rsm->metadataParameterMapping[$key])) { $value = $value->getMetadataValue($rsm->metadataParameterMapping[$key]); } if ($value instanceof ClassMetadata && isset($rsm->discriminatorParameters[$key])) { $value = array_keys(HierarchyDiscriminatorResolver::resolveDiscriminatorsForClass($value, $this->_em)); } $processedValue = $this->processParameterValue($value); return [$processedValue, $originalValue === $processedValue ? $parameter->getType() : ParameterTypeInferer::inferType($processedValue)]; } public function setQueryCacheDriver($queryCache) : self { Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/pull/9004', '%s is deprecated and will be removed in Doctrine 3.0. Use setQueryCache() instead.', __METHOD__); $this->queryCache = $queryCache ? CacheAdapter::wrap($queryCache) : null; return $this; } public function setQueryCache(?CacheItemPoolInterface $queryCache) : self { $this->queryCache = $queryCache; return $this; } public function useQueryCache($bool) : self { $this->useQueryCache = $bool; return $this; } public function getQueryCacheDriver() : ?Cache { Deprecation::trigger('doctrine/orm', 'https://github.com/doctrine/orm/pull/9004', '%s is deprecated and will be removed in Doctrine 3.0 without replacement.', __METHOD__); $queryCache = $this->queryCache ?? $this->_em->getConfiguration()->getQueryCache(); return $queryCache ? DoctrineProvider::wrap($queryCache) : null; } public function setQueryCacheLifetime($timeToLive) : self { if ($timeToLive !== null) { $timeToLive = (int) $timeToLive; } $this->queryCacheTTL = $timeToLive; return $this; } public function getQueryCacheLifetime() : ?int { return $this->queryCacheTTL; } public function expireQueryCache($expire = \true) : self { $this->expireQueryCache = $expire; return $this; } public function getExpireQueryCache() : bool { return $this->expireQueryCache; } public function free() : void { parent::free(); $this->dql = null; $this->_state = self::STATE_CLEAN; } public function setDQL($dqlQuery) : self { if ($dqlQuery !== null) { $this->dql = $dqlQuery; $this->_state = self::STATE_DIRTY; } return $this; } public function getDQL() : ?string { return $this->dql; } public function getState() : int { return $this->_state; } public function contains($dql) : bool { return stripos($this->getDQL(), $dql) !== \false; } public function setFirstResult($firstResult) : self { if ($firstResult !== null) { $firstResult = (int) $firstResult; } $this->firstResult = $firstResult; $this->_state = self::STATE_DIRTY; return $this; } public function getFirstResult() : ?int { return $this->firstResult; } public function setMaxResults($maxResults) : self { if ($maxResults !== null) { $maxResults = (int) $maxResults; } $this->maxResults = $maxResults; $this->_state = self::STATE_DIRTY; return $this; } public function getMaxResults() : ?int { return $this->maxResults; } public function iterate($parameters = null, $hydrationMode = self::HYDRATE_OBJECT) : IterableResult { $this->setHint(self::HINT_INTERNAL_ITERATION, \true); return parent::iterate($parameters, $hydrationMode); } public function toIterable(iterable $parameters = [], $hydrationMode = self::HYDRATE_OBJECT) : iterable { $this->setHint(self::HINT_INTERNAL_ITERATION, \true); return parent::toIterable($parameters, $hydrationMode); } public function setHint($name, $value) : self { $this->_state = self::STATE_DIRTY; return parent::setHint($name, $value); } public function setHydrationMode($hydrationMode) : self { $this->_state = self::STATE_DIRTY; return parent::setHydrationMode($hydrationMode); } public function setLockMode($lockMode) : self { if (in_array($lockMode, [LockMode::NONE, LockMode::PESSIMISTIC_READ, LockMode::PESSIMISTIC_WRITE], \true)) { if (!$this->_em->getConnection()->isTransactionActive()) { throw TransactionRequiredException::transactionRequired(); } } $this->setHint(self::HINT_LOCK_MODE, $lockMode); return $this; } public function getLockMode() : ?int { $lockMode = $this->getHint(self::HINT_LOCK_MODE); if ($lockMode === \false) { return null; } return $lockMode; } protected function getQueryCacheId() : string { ksort($this->_hints); return md5($this->getDQL() . serialize($this->_hints) . '&platform=' . get_debug_type($this->getEntityManager()->getConnection()->getDatabasePlatform()) . ($this->_em->hasFilters() ? $this->_em->getFilters()->getHash() : '') . '&firstResult=' . $this->firstResult . '&maxResult=' . $this->maxResults . '&hydrationMode=' . $this->_hydrationMode . '&types=' . serialize($this->parsedTypes) . 'DOCTRINE_QUERY_CACHE_SALT'); } protected function getHash() : string { return sha1(parent::getHash() . '-' . $this->firstResult . '-' . $this->maxResults); } public function __clone() { parent::__clone(); $this->_state = self::STATE_DIRTY; } }
|
vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/QueryBuilder.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
declare (strict_types=1); namespace MailPoetVendor\Doctrine\ORM; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\Common\Collections\ArrayCollection; use MailPoetVendor\Doctrine\Common\Collections\Criteria; use MailPoetVendor\Doctrine\ORM\Query\Expr; use MailPoetVendor\Doctrine\ORM\Query\Parameter; use MailPoetVendor\Doctrine\ORM\Query\QueryExpressionVisitor; use InvalidArgumentException; use RuntimeException; use function array_keys; use function array_merge; use function array_unshift; use function assert; use function func_get_args; use function func_num_args; use function implode; use function in_array; use function is_array; use function is_numeric; use function is_object; use function is_string; use function key; use function reset; use function sprintf; use function strpos; use function strrpos; use function substr; class QueryBuilder { public const SELECT = 0; public const DELETE = 1; public const UPDATE = 2; public const STATE_DIRTY = 0; public const STATE_CLEAN = 1; private $_em; private $_dqlParts = ['distinct' => \false, 'select' => [], 'from' => [], 'join' => [], 'set' => [], 'where' => null, 'groupBy' => [], 'having' => null, 'orderBy' => []]; private $_type = self::SELECT; private $_state = self::STATE_CLEAN; private $_dql; private $parameters; private $_firstResult = null; private $_maxResults = null; private $joinRootAliases = []; protected $cacheable = \false; protected $cacheRegion; protected $cacheMode; protected $lifetime = 0; public function __construct(EntityManagerInterface $em) { $this->_em = $em; $this->parameters = new ArrayCollection(); } public function expr() { return $this->_em->getExpressionBuilder(); } public function setCacheable($cacheable) { $this->cacheable = (bool) $cacheable; return $this; } public function isCacheable() { return $this->cacheable; } public function setCacheRegion($cacheRegion) { $this->cacheRegion = (string) $cacheRegion; return $this; } public function getCacheRegion() { return $this->cacheRegion; } public function getLifetime() { return $this->lifetime; } public function setLifetime($lifetime) { $this->lifetime = (int) $lifetime; return $this; } public function getCacheMode() { return $this->cacheMode; } public function setCacheMode($cacheMode) { $this->cacheMode = (int) $cacheMode; return $this; } public function getType() { return $this->_type; } public function getEntityManager() { return $this->_em; } public function getState() { return $this->_state; } public function getDQL() { if ($this->_dql !== null && $this->_state === self::STATE_CLEAN) { return $this->_dql; } switch ($this->_type) { case self::DELETE: $dql = $this->getDQLForDelete(); break; case self::UPDATE: $dql = $this->getDQLForUpdate(); break; case self::SELECT: default: $dql = $this->getDQLForSelect(); break; } $this->_state = self::STATE_CLEAN; $this->_dql = $dql; return $dql; } public function getQuery() { $parameters = clone $this->parameters; $query = $this->_em->createQuery($this->getDQL())->setParameters($parameters)->setFirstResult($this->_firstResult)->setMaxResults($this->_maxResults); if ($this->lifetime) { $query->setLifetime($this->lifetime); } if ($this->cacheMode) { $query->setCacheMode($this->cacheMode); } if ($this->cacheable) { $query->setCacheable($this->cacheable); } if ($this->cacheRegion) { $query->setCacheRegion($this->cacheRegion); } return $query; } private function findRootAlias(string $alias, string $parentAlias) : string { if (in_array($parentAlias, $this->getRootAliases(), \true)) { $rootAlias = $parentAlias; } elseif (isset($this->joinRootAliases[$parentAlias])) { $rootAlias = $this->joinRootAliases[$parentAlias]; } else { $rootAlias = $this->getRootAlias(); } $this->joinRootAliases[$alias] = $rootAlias; return $rootAlias; } public function getRootAlias() { $aliases = $this->getRootAliases(); if (!isset($aliases[0])) { throw new RuntimeException('No alias was set before invoking getRootAlias().'); } return $aliases[0]; } public function getRootAliases() { $aliases = []; foreach ($this->_dqlParts['from'] as &$fromClause) { if (is_string($fromClause)) { $spacePos = strrpos($fromClause, ' '); $from = substr($fromClause, 0, $spacePos); $alias = substr($fromClause, $spacePos + 1); $fromClause = new Query\Expr\From($from, $alias); } $aliases[] = $fromClause->getAlias(); } return $aliases; } public function getAllAliases() { return array_merge($this->getRootAliases(), array_keys($this->joinRootAliases)); } public function getRootEntities() { $entities = []; foreach ($this->_dqlParts['from'] as &$fromClause) { if (is_string($fromClause)) { $spacePos = strrpos($fromClause, ' '); $from = substr($fromClause, 0, $spacePos); $alias = substr($fromClause, $spacePos + 1); $fromClause = new Query\Expr\From($from, $alias); } $entities[] = $fromClause->getFrom(); } return $entities; } public function setParameter($key, $value, $type = null) { $existingParameter = $this->getParameter($key); if ($existingParameter !== null) { $existingParameter->setValue($value, $type); return $this; } $this->parameters->add(new Parameter($key, $value, $type)); return $this; } public function setParameters($parameters) { if (is_array($parameters)) { $parameterCollection = new ArrayCollection(); foreach ($parameters as $key => $value) { $parameter = new Parameter($key, $value); $parameterCollection->add($parameter); } $parameters = $parameterCollection; } $this->parameters = $parameters; return $this; } public function getParameters() { return $this->parameters; } public function getParameter($key) { $key = Parameter::normalizeName($key); $filteredParameters = $this->parameters->filter(static function (Parameter $parameter) use($key) : bool { $parameterName = $parameter->getName(); return $key === $parameterName; }); return !$filteredParameters->isEmpty() ? $filteredParameters->first() : null; } public function setFirstResult($firstResult) { $this->_firstResult = $firstResult; return $this; } public function getFirstResult() { return $this->_firstResult; } public function setMaxResults($maxResults) { $this->_maxResults = $maxResults; return $this; } public function getMaxResults() { return $this->_maxResults; } public function add($dqlPartName, $dqlPart, $append = \false) { if ($append && ($dqlPartName === 'where' || $dqlPartName === 'having')) { throw new InvalidArgumentException("Using \$append = true does not have an effect with 'where' or 'having' " . 'parts. See QueryBuilder#andWhere() for an example for correct usage.'); } $isMultiple = is_array($this->_dqlParts[$dqlPartName]) && !($dqlPartName === 'join' && !$append); if (is_array($dqlPart) && $dqlPartName !== 'join') { $dqlPart = reset($dqlPart); } if ($dqlPartName === 'join') { $newDqlPart = []; foreach ($dqlPart as $k => $v) { $k = is_numeric($k) ? $this->getRootAlias() : $k; $newDqlPart[$k] = $v; } $dqlPart = $newDqlPart; } if ($append && $isMultiple) { if (is_array($dqlPart)) { $key = key($dqlPart); $this->_dqlParts[$dqlPartName][$key][] = $dqlPart[$key]; } else { $this->_dqlParts[$dqlPartName][] = $dqlPart; } } else { $this->_dqlParts[$dqlPartName] = $isMultiple ? [$dqlPart] : $dqlPart; } $this->_state = self::STATE_DIRTY; return $this; } public function select($select = null) { $this->_type = self::SELECT; if (empty($select)) { return $this; } $selects = is_array($select) ? $select : func_get_args(); return $this->add('select', new Expr\Select($selects), \false); } public function distinct($flag = \true) { $this->_dqlParts['distinct'] = (bool) $flag; return $this; } public function addSelect($select = null) { $this->_type = self::SELECT; if (empty($select)) { return $this; } $selects = is_array($select) ? $select : func_get_args(); return $this->add('select', new Expr\Select($selects), \true); } public function delete($delete = null, $alias = null) { $this->_type = self::DELETE; if (!$delete) { return $this; } return $this->add('from', new Expr\From($delete, $alias)); } public function update($update = null, $alias = null) { $this->_type = self::UPDATE; if (!$update) { return $this; } return $this->add('from', new Expr\From($update, $alias)); } public function from($from, $alias, $indexBy = null) { return $this->add('from', new Expr\From($from, $alias, $indexBy), \true); } public function indexBy($alias, $indexBy) { $rootAliases = $this->getRootAliases(); if (!in_array($alias, $rootAliases, \true)) { throw new Query\QueryException(sprintf('Specified root alias %s must be set before invoking indexBy().', $alias)); } foreach ($this->_dqlParts['from'] as &$fromClause) { assert($fromClause instanceof Expr\From); if ($fromClause->getAlias() !== $alias) { continue; } $fromClause = new Expr\From($fromClause->getFrom(), $fromClause->getAlias(), $indexBy); } return $this; } public function join($join, $alias, $conditionType = null, $condition = null, $indexBy = null) { return $this->innerJoin($join, $alias, $conditionType, $condition, $indexBy); } public function innerJoin($join, $alias, $conditionType = null, $condition = null, $indexBy = null) { $parentAlias = substr($join, 0, (int) strpos($join, '.')); $rootAlias = $this->findRootAlias($alias, $parentAlias); $join = new Expr\Join(Expr\Join::INNER_JOIN, $join, $alias, $conditionType, $condition, $indexBy); return $this->add('join', [$rootAlias => $join], \true); } public function leftJoin($join, $alias, $conditionType = null, $condition = null, $indexBy = null) { $parentAlias = substr($join, 0, (int) strpos($join, '.')); $rootAlias = $this->findRootAlias($alias, $parentAlias); $join = new Expr\Join(Expr\Join::LEFT_JOIN, $join, $alias, $conditionType, $condition, $indexBy); return $this->add('join', [$rootAlias => $join], \true); } public function set($key, $value) { return $this->add('set', new Expr\Comparison($key, Expr\Comparison::EQ, $value), \true); } public function where($predicates) { if (!(func_num_args() === 1 && $predicates instanceof Expr\Composite)) { $predicates = new Expr\Andx(func_get_args()); } return $this->add('where', $predicates); } public function andWhere() { $args = func_get_args(); $where = $this->getDQLPart('where'); if ($where instanceof Expr\Andx) { $where->addMultiple($args); } else { array_unshift($args, $where); $where = new Expr\Andx($args); } return $this->add('where', $where); } public function orWhere() { $args = func_get_args(); $where = $this->getDQLPart('where'); if ($where instanceof Expr\Orx) { $where->addMultiple($args); } else { array_unshift($args, $where); $where = new Expr\Orx($args); } return $this->add('where', $where); } public function groupBy($groupBy) { return $this->add('groupBy', new Expr\GroupBy(func_get_args())); } public function addGroupBy($groupBy) { return $this->add('groupBy', new Expr\GroupBy(func_get_args()), \true); } public function having($having) { if (!(func_num_args() === 1 && ($having instanceof Expr\Andx || $having instanceof Expr\Orx))) { $having = new Expr\Andx(func_get_args()); } return $this->add('having', $having); } public function andHaving($having) { $args = func_get_args(); $having = $this->getDQLPart('having'); if ($having instanceof Expr\Andx) { $having->addMultiple($args); } else { array_unshift($args, $having); $having = new Expr\Andx($args); } return $this->add('having', $having); } public function orHaving($having) { $args = func_get_args(); $having = $this->getDQLPart('having'); if ($having instanceof Expr\Orx) { $having->addMultiple($args); } else { array_unshift($args, $having); $having = new Expr\Orx($args); } return $this->add('having', $having); } public function orderBy($sort, $order = null) { $orderBy = $sort instanceof Expr\OrderBy ? $sort : new Expr\OrderBy($sort, $order); return $this->add('orderBy', $orderBy); } public function addOrderBy($sort, $order = null) { $orderBy = $sort instanceof Expr\OrderBy ? $sort : new Expr\OrderBy($sort, $order); return $this->add('orderBy', $orderBy, \true); } public function addCriteria(Criteria $criteria) { $allAliases = $this->getAllAliases(); if (!isset($allAliases[0])) { throw new Query\QueryException('No aliases are set before invoking addCriteria().'); } $visitor = new QueryExpressionVisitor($this->getAllAliases()); $whereExpression = $criteria->getWhereExpression(); if ($whereExpression) { $this->andWhere($visitor->dispatch($whereExpression)); foreach ($visitor->getParameters() as $parameter) { $this->parameters->add($parameter); } } if ($criteria->getOrderings()) { foreach ($criteria->getOrderings() as $sort => $order) { $hasValidAlias = \false; foreach ($allAliases as $alias) { if (strpos($sort . '.', $alias . '.') === 0) { $hasValidAlias = \true; break; } } if (!$hasValidAlias) { $sort = $allAliases[0] . '.' . $sort; } $this->addOrderBy($sort, $order); } } $firstResult = $criteria->getFirstResult(); if ($firstResult !== null) { $this->setFirstResult($firstResult); } $maxResults = $criteria->getMaxResults(); if ($maxResults !== null) { $this->setMaxResults($maxResults); } return $this; } public function getDQLPart($queryPartName) { return $this->_dqlParts[$queryPartName]; } public function getDQLParts() { return $this->_dqlParts; } private function getDQLForDelete() : string { return 'DELETE' . $this->getReducedDQLQueryPart('from', ['pre' => ' ', 'separator' => ', ']) . $this->getReducedDQLQueryPart('where', ['pre' => ' WHERE ']) . $this->getReducedDQLQueryPart('orderBy', ['pre' => ' ORDER BY ', 'separator' => ', ']); } private function getDQLForUpdate() : string { return 'UPDATE' . $this->getReducedDQLQueryPart('from', ['pre' => ' ', 'separator' => ', ']) . $this->getReducedDQLQueryPart('set', ['pre' => ' SET ', 'separator' => ', ']) . $this->getReducedDQLQueryPart('where', ['pre' => ' WHERE ']) . $this->getReducedDQLQueryPart('orderBy', ['pre' => ' ORDER BY ', 'separator' => ', ']); } private function getDQLForSelect() : string { $dql = 'SELECT' . ($this->_dqlParts['distinct'] === \true ? ' DISTINCT' : '') . $this->getReducedDQLQueryPart('select', ['pre' => ' ', 'separator' => ', ']); $fromParts = $this->getDQLPart('from'); $joinParts = $this->getDQLPart('join'); $fromClauses = []; if (!empty($fromParts)) { $dql .= ' FROM '; foreach ($fromParts as $from) { $fromClause = (string) $from; if ($from instanceof Expr\From && isset($joinParts[$from->getAlias()])) { foreach ($joinParts[$from->getAlias()] as $join) { $fromClause .= ' ' . (string) $join; } } $fromClauses[] = $fromClause; } } $dql .= implode(', ', $fromClauses) . $this->getReducedDQLQueryPart('where', ['pre' => ' WHERE ']) . $this->getReducedDQLQueryPart('groupBy', ['pre' => ' GROUP BY ', 'separator' => ', ']) . $this->getReducedDQLQueryPart('having', ['pre' => ' HAVING ']) . $this->getReducedDQLQueryPart('orderBy', ['pre' => ' ORDER BY ', 'separator' => ', ']); return $dql; } private function getReducedDQLQueryPart(string $queryPartName, array $options = []) : string { $queryPart = $this->getDQLPart($queryPartName); if (empty($queryPart)) { return $options['empty'] ?? ''; } return ($options['pre'] ?? '') . (is_array($queryPart) ? implode($options['separator'], $queryPart) : $queryPart) . ($options['post'] ?? ''); } public function resetDQLParts($parts = null) { if ($parts === null) { $parts = array_keys($this->_dqlParts); } foreach ($parts as $part) { $this->resetDQLPart($part); } return $this; } public function resetDQLPart($part) { $this->_dqlParts[$part] = is_array($this->_dqlParts[$part]) ? [] : null; $this->_state = self::STATE_DIRTY; return $this; } public function __toString() { return $this->getDQL(); } public function __clone() { foreach ($this->_dqlParts as $part => $elements) { if (is_array($this->_dqlParts[$part])) { foreach ($this->_dqlParts[$part] as $idx => $element) { if (is_object($element)) { $this->_dqlParts[$part][$idx] = clone $element; } } } elseif (is_object($elements)) { $this->_dqlParts[$part] = clone $elements; } } $parameters = []; foreach ($this->parameters as $parameter) { $parameters[] = clone $parameter; } $this->parameters = new ArrayCollection($parameters); } }
|
1 |
Â
<?php
|
2 |
+
declare (strict_types=1); namespace MailPoetVendor\Doctrine\ORM; if (!defined('ABSPATH')) exit; use MailPoetVendor\Doctrine\Common\Collections\ArrayCollection; use MailPoetVendor\Doctrine\Common\Collections\Criteria; use MailPoetVendor\Doctrine\ORM\Query\Expr; use MailPoetVendor\Doctrine\ORM\Query\Parameter; use MailPoetVendor\Doctrine\ORM\Query\QueryExpressionVisitor; use InvalidArgumentException; use RuntimeException; use function array_keys; use function array_merge; use function array_unshift; use function assert; use function func_get_args; use function func_num_args; use function implode; use function in_array; use function is_array; use function is_numeric; use function is_object; use function is_string; use function key; use function reset; use function sprintf; use function strpos; use function strrpos; use function substr; class QueryBuilder { public const SELECT = 0; public const DELETE = 1; public const UPDATE = 2; public const STATE_DIRTY = 0; public const STATE_CLEAN = 1; private $_em; private $_dqlParts = ['distinct' => \false, 'select' => [], 'from' => [], 'join' => [], 'set' => [], 'where' => null, 'groupBy' => [], 'having' => null, 'orderBy' => []]; private $_type = self::SELECT; private $_state = self::STATE_CLEAN; private $_dql; private $parameters; private $_firstResult = null; private $_maxResults = null; private $joinRootAliases = []; protected $cacheable = \false; protected $cacheRegion; protected $cacheMode; protected $lifetime = 0; public function __construct(EntityManagerInterface $em) { $this->_em = $em; $this->parameters = new ArrayCollection(); } public function expr() { return $this->_em->getExpressionBuilder(); } public function setCacheable($cacheable) { $this->cacheable = (bool) $cacheable; return $this; } public function isCacheable() { return $this->cacheable; } public function setCacheRegion($cacheRegion) { $this->cacheRegion = (string) $cacheRegion; return $this; } public function getCacheRegion() { return $this->cacheRegion; } public function getLifetime() { return $this->lifetime; } public function setLifetime($lifetime) { $this->lifetime = (int) $lifetime; return $this; } public function getCacheMode() { return $this->cacheMode; } public function setCacheMode($cacheMode) { $this->cacheMode = (int) $cacheMode; return $this; } public function getType() { return $this->_type; } public function getEntityManager() { return $this->_em; } public function getState() { return $this->_state; } public function getDQL() { if ($this->_dql !== null && $this->_state === self::STATE_CLEAN) { return $this->_dql; } switch ($this->_type) { case self::DELETE: $dql = $this->getDQLForDelete(); break; case self::UPDATE: $dql = $this->getDQLForUpdate(); break; case self::SELECT: default: $dql = $this->getDQLForSelect(); break; } $this->_state = self::STATE_CLEAN; $this->_dql = $dql; return $dql; } public function getQuery() { $parameters = clone $this->parameters; $query = $this->_em->createQuery($this->getDQL())->setParameters($parameters)->setFirstResult($this->_firstResult)->setMaxResults($this->_maxResults); if ($this->lifetime) { $query->setLifetime($this->lifetime); } if ($this->cacheMode) { $query->setCacheMode($this->cacheMode); } if ($this->cacheable) { $query->setCacheable($this->cacheable); } if ($this->cacheRegion) { $query->setCacheRegion($this->cacheRegion); } return $query; } private function findRootAlias(string $alias, string $parentAlias) : string { if (in_array($parentAlias, $this->getRootAliases(), \true)) { $rootAlias = $parentAlias; } elseif (isset($this->joinRootAliases[$parentAlias])) { $rootAlias = $this->joinRootAliases[$parentAlias]; } else { $rootAlias = $this->getRootAlias(); } $this->joinRootAliases[$alias] = $rootAlias; return $rootAlias; } public function getRootAlias() { $aliases = $this->getRootAliases(); if (!isset($aliases[0])) { throw new RuntimeException('No alias was set before invoking getRootAlias().'); } return $aliases[0]; } public function getRootAliases() { $aliases = []; foreach ($this->_dqlParts['from'] as &$fromClause) { if (is_string($fromClause)) { $spacePos = strrpos($fromClause, ' '); $from = substr($fromClause, 0, $spacePos); $alias = substr($fromClause, $spacePos + 1); $fromClause = new Query\Expr\From($from, $alias); } $aliases[] = $fromClause->getAlias(); } return $aliases; } public function getAllAliases() { return array_merge($this->getRootAliases(), array_keys($this->joinRootAliases)); } public function getRootEntities() { $entities = []; foreach ($this->_dqlParts['from'] as &$fromClause) { if (is_string($fromClause)) { $spacePos = strrpos($fromClause, ' '); $from = substr($fromClause, 0, $spacePos); $alias = substr($fromClause, $spacePos + 1); $fromClause = new Query\Expr\From($from, $alias); } $entities[] = $fromClause->getFrom(); } return $entities; } public function setParameter($key, $value, $type = null) { $existingParameter = $this->getParameter($key); if ($existingParameter !== null) { $existingParameter->setValue($value, $type); return $this; } $this->parameters->add(new Parameter($key, $value, $type)); return $this; } public function setParameters($parameters) { if (is_array($parameters)) { $parameterCollection = new ArrayCollection(); foreach ($parameters as $key => $value) { $parameter = new Parameter($key, $value); $parameterCollection->add($parameter); } $parameters = $parameterCollection; } $this->parameters = $parameters; return $this; } public function getParameters() { return $this->parameters; } public function getParameter($key) { $key = Parameter::normalizeName($key); $filteredParameters = $this->parameters->filter(static function (Parameter $parameter) use($key) : bool { $parameterName = $parameter->getName(); return $key === $parameterName; }); return !$filteredParameters->isEmpty() ? $filteredParameters->first() : null; } public function setFirstResult($firstResult) { if ($firstResult !== null) { $firstResult = (int) $firstResult; } $this->_firstResult = $firstResult; return $this; } public function getFirstResult() { return $this->_firstResult; } public function setMaxResults($maxResults) { if ($maxResults !== null) { $maxResults = (int) $maxResults; } $this->_maxResults = $maxResults; return $this; } public function getMaxResults() { return $this->_maxResults; } public function add($dqlPartName, $dqlPart, $append = \false) { if ($append && ($dqlPartName === 'where' || $dqlPartName === 'having')) { throw new InvalidArgumentException("Using \$append = true does not have an effect with 'where' or 'having' " . 'parts. See QueryBuilder#andWhere() for an example for correct usage.'); } $isMultiple = is_array($this->_dqlParts[$dqlPartName]) && !($dqlPartName === 'join' && !$append); if (is_array($dqlPart) && $dqlPartName !== 'join') { $dqlPart = reset($dqlPart); } if ($dqlPartName === 'join') { $newDqlPart = []; foreach ($dqlPart as $k => $v) { $k = is_numeric($k) ? $this->getRootAlias() : $k; $newDqlPart[$k] = $v; } $dqlPart = $newDqlPart; } if ($append && $isMultiple) { if (is_array($dqlPart)) { $key = key($dqlPart); $this->_dqlParts[$dqlPartName][$key][] = $dqlPart[$key]; } else { $this->_dqlParts[$dqlPartName][] = $dqlPart; } } else { $this->_dqlParts[$dqlPartName] = $isMultiple ? [$dqlPart] : $dqlPart; } $this->_state = self::STATE_DIRTY; return $this; } public function select($select = null) { $this->_type = self::SELECT; if (empty($select)) { return $this; } $selects = is_array($select) ? $select : func_get_args(); return $this->add('select', new Expr\Select($selects), \false); } public function distinct($flag = \true) { $this->_dqlParts['distinct'] = (bool) $flag; return $this; } public function addSelect($select = null) { $this->_type = self::SELECT; if (empty($select)) { return $this; } $selects = is_array($select) ? $select : func_get_args(); return $this->add('select', new Expr\Select($selects), \true); } public function delete($delete = null, $alias = null) { $this->_type = self::DELETE; if (!$delete) { return $this; } return $this->add('from', new Expr\From($delete, $alias)); } public function update($update = null, $alias = null) { $this->_type = self::UPDATE; if (!$update) { return $this; } return $this->add('from', new Expr\From($update, $alias)); } public function from($from, $alias, $indexBy = null) { return $this->add('from', new Expr\From($from, $alias, $indexBy), \true); } public function indexBy($alias, $indexBy) { $rootAliases = $this->getRootAliases(); if (!in_array($alias, $rootAliases, \true)) { throw new Query\QueryException(sprintf('Specified root alias %s must be set before invoking indexBy().', $alias)); } foreach ($this->_dqlParts['from'] as &$fromClause) { assert($fromClause instanceof Expr\From); if ($fromClause->getAlias() !== $alias) { continue; } $fromClause = new Expr\From($fromClause->getFrom(), $fromClause->getAlias(), $indexBy); } return $this; } public function join($join, $alias, $conditionType = null, $condition = null, $indexBy = null) { return $this->innerJoin($join, $alias, $conditionType, $condition, $indexBy); } public function innerJoin($join, $alias, $conditionType = null, $condition = null, $indexBy = null) { $parentAlias = substr($join, 0, (int) strpos($join, '.')); $rootAlias = $this->findRootAlias($alias, $parentAlias); $join = new Expr\Join(Expr\Join::INNER_JOIN, $join, $alias, $conditionType, $condition, $indexBy); return $this->add('join', [$rootAlias => $join], \true); } public function leftJoin($join, $alias, $conditionType = null, $condition = null, $indexBy = null) { $parentAlias = substr($join, 0, (int) strpos($join, '.')); $rootAlias = $this->findRootAlias($alias, $parentAlias); $join = new Expr\Join(Expr\Join::LEFT_JOIN, $join, $alias, $conditionType, $condition, $indexBy); return $this->add('join', [$rootAlias => $join], \true); } public function set($key, $value) { return $this->add('set', new Expr\Comparison($key, Expr\Comparison::EQ, $value), \true); } public function where($predicates) { if (!(func_num_args() === 1 && $predicates instanceof Expr\Composite)) { $predicates = new Expr\Andx(func_get_args()); } return $this->add('where', $predicates); } public function andWhere() { $args = func_get_args(); $where = $this->getDQLPart('where'); if ($where instanceof Expr\Andx) { $where->addMultiple($args); } else { array_unshift($args, $where); $where = new Expr\Andx($args); } return $this->add('where', $where); } public function orWhere() { $args = func_get_args(); $where = $this->getDQLPart('where'); if ($where instanceof Expr\Orx) { $where->addMultiple($args); } else { array_unshift($args, $where); $where = new Expr\Orx($args); } return $this->add('where', $where); } public function groupBy($groupBy) { return $this->add('groupBy', new Expr\GroupBy(func_get_args())); } public function addGroupBy($groupBy) { return $this->add('groupBy', new Expr\GroupBy(func_get_args()), \true); } public function having($having) { if (!(func_num_args() === 1 && ($having instanceof Expr\Andx || $having instanceof Expr\Orx))) { $having = new Expr\Andx(func_get_args()); } return $this->add('having', $having); } public function andHaving($having) { $args = func_get_args(); $having = $this->getDQLPart('having'); if ($having instanceof Expr\Andx) { $having->addMultiple($args); } else { array_unshift($args, $having); $having = new Expr\Andx($args); } return $this->add('having', $having); } public function orHaving($having) { $args = func_get_args(); $having = $this->getDQLPart('having'); if ($having instanceof Expr\Orx) { $having->addMultiple($args); } else { array_unshift($args, $having); $having = new Expr\Orx($args); } return $this->add('having', $having); } public function orderBy($sort, $order = null) { $orderBy = $sort instanceof Expr\OrderBy ? $sort : new Expr\OrderBy($sort, $order); return $this->add('orderBy', $orderBy); } public function addOrderBy($sort, $order = null) { $orderBy = $sort instanceof Expr\OrderBy ? $sort : new Expr\OrderBy($sort, $order); return $this->add('orderBy', $orderBy, \true); } public function addCriteria(Criteria $criteria) { $allAliases = $this->getAllAliases(); if (!isset($allAliases[0])) { throw new Query\QueryException('No aliases are set before invoking addCriteria().'); } $visitor = new QueryExpressionVisitor($this->getAllAliases()); $whereExpression = $criteria->getWhereExpression(); if ($whereExpression) { $this->andWhere($visitor->dispatch($whereExpression)); foreach ($visitor->getParameters() as $parameter) { $this->parameters->add($parameter); } } if ($criteria->getOrderings()) { foreach ($criteria->getOrderings() as $sort => $order) { $hasValidAlias = \false; foreach ($allAliases as $alias) { if (strpos($sort . '.', $alias . '.') === 0) { $hasValidAlias = \true; break; } } if (!$hasValidAlias) { $sort = $allAliases[0] . '.' . $sort; } $this->addOrderBy($sort, $order); } } $firstResult = $criteria->getFirstResult(); if ($firstResult !== null) { $this->setFirstResult($firstResult); } $maxResults = $criteria->getMaxResults(); if ($maxResults !== null) { $this->setMaxResults($maxResults); } return $this; } public function getDQLPart($queryPartName) { return $this->_dqlParts[$queryPartName]; } public function getDQLParts() { return $this->_dqlParts; } private function getDQLForDelete() : string { return 'DELETE' . $this->getReducedDQLQueryPart('from', ['pre' => ' ', 'separator' => ', ']) . $this->getReducedDQLQueryPart('where', ['pre' => ' WHERE ']) . $this->getReducedDQLQueryPart('orderBy', ['pre' => ' ORDER BY ', 'separator' => ', ']); } private function getDQLForUpdate() : string { return 'UPDATE' . $this->getReducedDQLQueryPart('from', ['pre' => ' ', 'separator' => ', ']) . $this->getReducedDQLQueryPart('set', ['pre' => ' SET ', 'separator' => ', ']) . $this->getReducedDQLQueryPart('where', ['pre' => ' WHERE ']) . $this->getReducedDQLQueryPart('orderBy', ['pre' => ' ORDER BY ', 'separator' => ', ']); } private function getDQLForSelect() : string { $dql = 'SELECT' . ($this->_dqlParts['distinct'] === \true ? ' DISTINCT' : '') . $this->getReducedDQLQueryPart('select', ['pre' => ' ', 'separator' => ', ']); $fromParts = $this->getDQLPart('from'); $joinParts = $this->getDQLPart('join'); $fromClauses = []; if (!empty($fromParts)) { $dql .= ' FROM '; foreach ($fromParts as $from) { $fromClause = (string) $from; if ($from instanceof Expr\From && isset($joinParts[$from->getAlias()])) { foreach ($joinParts[$from->getAlias()] as $join) { $fromClause .= ' ' . (string) $join; } } $fromClauses[] = $fromClause; } } $dql .= implode(', ', $fromClauses) . $this->getReducedDQLQueryPart('where', ['pre' => ' WHERE ']) . $this->getReducedDQLQueryPart('groupBy', ['pre' => ' GROUP BY ', 'separator' => ', ']) . $this->getReducedDQLQueryPart('having', ['pre' => ' HAVING ']) . $this->getReducedDQLQueryPart('orderBy', ['pre' => ' ORDER BY ', 'separator' => ', ']); return $dql; } private function getReducedDQLQueryPart(string $queryPartName, array $options = []) : string { $queryPart = $this->getDQLPart($queryPartName); if (empty($queryPart)) { return $options['empty'] ?? ''; } return ($options['pre'] ?? '') . (is_array($queryPart) ? implode($options['separator'], $queryPart) : $queryPart) . ($options['post'] ?? ''); } public function resetDQLParts($parts = null) { if ($parts === null) { $parts = array_keys($this->_dqlParts); } foreach ($parts as $part) { $this->resetDQLPart($part); } return $this; } public function resetDQLPart($part) { $this->_dqlParts[$part] = is_array($this->_dqlParts[$part]) ? [] : null; $this->_state = self::STATE_DIRTY; return $this; } public function __toString() { return $this->getDQL(); } public function __clone() { foreach ($this->_dqlParts as $part => $elements) { if (is_array($this->_dqlParts[$part])) { foreach ($this->_dqlParts[$part] as $idx => $element) { if (is_object($element)) { $this->_dqlParts[$part][$idx] = clone $element; } } } elseif (is_object($elements)) { $this->_dqlParts[$part] = clone $elements; } } $parameters = []; foreach ($this->parameters as $parameter) { $parameters[] = clone $parameter; } $this->parameters = new ArrayCollection($parameters); } }
|
vendor-prefixed/symfony/service-contracts/ServiceSubscriberTrait.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
namespace MailPoetVendor\Symfony\Contracts\Service; if (!defined('ABSPATH')) exit; use MailPoetVendor\Psr\Container\ContainerInterface; trait ServiceSubscriberTrait { protected $container; public static function getSubscribedServices() : array { static $services; if (null !== $services) { return $services; } $services = \is_callable(['parent', __FUNCTION__]) ? parent::getSubscribedServices() : []; foreach ((new \ReflectionClass(self::class))->getMethods() as $method) { if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) { continue; } if (self::class
|
1 |
Â
<?php
|
2 |
+
namespace MailPoetVendor\Symfony\Contracts\Service; if (!defined('ABSPATH')) exit; use MailPoetVendor\Psr\Container\ContainerInterface; trait ServiceSubscriberTrait { protected $container; public static function getSubscribedServices() : array { static $services; if (null !== $services) { return $services; } $services = \is_callable(['parent', __FUNCTION__]) ? parent::getSubscribedServices() : []; foreach ((new \ReflectionClass(self::class))->getMethods() as $method) { if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) { continue; } if (self::class !== $method->getDeclaringClass()->name) { continue; } if (!($returnType = $method->getReturnType()) instanceof \ReflectionNamedType) { continue; } if ($returnType->isBuiltin()) { continue; } $services[self::class . '::' . $method->name] = '?' . $returnType->getName(); } return $services; } public function setContainer(ContainerInterface $container) { $this->container = $container; if (\is_callable(['parent', __FUNCTION__])) { return parent::setContainer($container); } return null; } }
|
vendor-prefixed/symfony/service-contracts/Test/ServiceLocatorTest.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
namespace MailPoetVendor\Symfony\Contracts\Service\Test; if (!defined('ABSPATH')) exit; use MailPoetVendor\PHPUnit\Framework\TestCase; use MailPoetVendor\Psr\Container\ContainerInterface; use MailPoetVendor\Symfony\Contracts\Service\ServiceLocatorTrait; abstract class ServiceLocatorTest extends TestCase { protected function getServiceLocator(array $factories) { return new class($factories) implements ContainerInterface { use ServiceLocatorTrait; }; } public function testHas() { $locator = $this->getServiceLocator(['foo' => function () { return 'bar'; }, 'bar' => function () { return 'baz'; }, function () { return 'dummy'; }]); $this->assertTrue($locator->has('foo')); $this->assertTrue($locator->has('bar')); $this->assertFalse($locator->has('dummy')); } public function testGet() { $locator = $this->getServiceLocator(['foo' => function () { return 'bar'; }, 'bar' => function () { return 'baz'; }]); $this->assertSame('bar', $locator->get('foo')); $this->assertSame('baz', $locator->get('bar')); } public function testGetDoesNotMemoize() { $i = 0; $locator = $this->getServiceLocator(['foo' => function () use(&$i) { ++$i; return 'bar'; }]); $this->assertSame('bar', $locator->get('foo')); $this->assertSame('bar', $locator->get('foo')); $this->assertSame(2, $i); } public function testThrowsOnUndefinedInternalService() { if (!$this->getExpectedException()) { $this->expectException(
|
1 |
Â
<?php
|
2 |
+
namespace MailPoetVendor\Symfony\Contracts\Service\Test; if (!defined('ABSPATH')) exit; use MailPoetVendor\PHPUnit\Framework\TestCase; use MailPoetVendor\Psr\Container\ContainerInterface; use MailPoetVendor\Symfony\Contracts\Service\ServiceLocatorTrait; abstract class ServiceLocatorTest extends TestCase { protected function getServiceLocator(array $factories) { return new class($factories) implements ContainerInterface { use ServiceLocatorTrait; }; } public function testHas() { $locator = $this->getServiceLocator(['foo' => function () { return 'bar'; }, 'bar' => function () { return 'baz'; }, function () { return 'dummy'; }]); $this->assertTrue($locator->has('foo')); $this->assertTrue($locator->has('bar')); $this->assertFalse($locator->has('dummy')); } public function testGet() { $locator = $this->getServiceLocator(['foo' => function () { return 'bar'; }, 'bar' => function () { return 'baz'; }]); $this->assertSame('bar', $locator->get('foo')); $this->assertSame('baz', $locator->get('bar')); } public function testGetDoesNotMemoize() { $i = 0; $locator = $this->getServiceLocator(['foo' => function () use(&$i) { ++$i; return 'bar'; }]); $this->assertSame('bar', $locator->get('foo')); $this->assertSame('bar', $locator->get('foo')); $this->assertSame(2, $i); } public function testThrowsOnUndefinedInternalService() { if (!$this->getExpectedException()) { $this->expectException(\MailPoetVendor\Psr\Container\NotFoundExceptionInterface::class); $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.'); } $locator = $this->getServiceLocator(['foo' => function () use(&$locator) { return $locator->get('bar'); }]); $locator->get('foo'); } public function testThrowsOnCircularReference() { $this->expectException(\MailPoetVendor\Psr\Container\ContainerExceptionInterface::class); $this->expectExceptionMessage('Circular reference detected for service "bar", path: "bar -> baz -> bar".'); $locator = $this->getServiceLocator(['foo' => function () use(&$locator) { return $locator->get('bar'); }, 'bar' => function () use(&$locator) { return $locator->get('baz'); }, 'baz' => function () use(&$locator) { return $locator->get('bar'); }]); $locator->get('foo'); } }
|
vendor-prefixed/symfony/translation-contracts/Test/TranslatorTest.php
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
Â
<?php
|
2 |
-
namespace MailPoetVendor\Symfony\Contracts\Translation\Test; if (!defined('ABSPATH')) exit; use MailPoetVendor\PHPUnit\Framework\TestCase; use MailPoetVendor\Symfony\Contracts\Translation\TranslatorInterface; use MailPoetVendor\Symfony\Contracts\Translation\TranslatorTrait; class TranslatorTest extends TestCase { public function getTranslator() { return new class implements TranslatorInterface { use TranslatorTrait; }; } public function testTrans($expected, $id, $parameters) { $translator = $this->getTranslator(); $this->assertEquals($expected, $translator->trans($id, $parameters)); } public function testTransChoiceWithExplicitLocale($expected, $id, $number) { $translator = $this->getTranslator(); $
|
3 |
Â
new-line in it. Selector = 0.|{1}This is a text with a
|
4 |
Â
new-line in it. Selector = 1.|[1,Inf]This is a text with a
|
5 |
Â
new-line in it. Selector > 1.', 0], ["This is a text with a\n new-line in it. Selector = 1.", '{0}This is a text with a
|
@@ -16,4 +16,4 @@
|
|
16 |
Â
new-line in it. Selector > 1.', '{0}This is a text with a
|
17 |
Â
new-line in it. Selector = 0.|{1}This is a text with a
|
18 |
Â
new-line in it. Selector = 1.|[1,Inf]This is a text with a
|
19 |
-
new-line in it. Selector > 1.', 5], ['This is a text with a\\nnew-line in it. Selector = 0.', '{0}This is a text with a\\nnew-line in it. Selector = 0.|{1}This is a text with a\\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\\nnew-line in it. Selector > 1.', 0], ["This is a text with a\nnew-line in it. Selector = 1.", "{0}This is a text with a\nnew-line in it. Selector = 0.|{1}This is a text with a\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\nnew-line in it. Selector > 1.", 1], ['This is a text with | in it. Selector = 0.', '{0}This is a text with || in it. Selector = 0.|{1}This is a text with || in it. Selector = 1.', 0], ['', '|', 1], ['', '||', 1], ]; } public function testFailedLangcodes($nplural, $langCodes) { $matrix = $this->generateTestData($langCodes); $this->validateMatrix($nplural, $matrix, \false); } public function testLangcodes($nplural, $langCodes) { $matrix = $this->generateTestData($langCodes); $this->validateMatrix($nplural, $matrix); } public function successLangcodes() { return [['1', ['ay', 'bo', 'cgg', 'dz', 'id', 'ja', 'jbo', 'ka', 'kk', 'km', 'ko', 'ky']], ['2', ['nl', 'fr', 'en', 'de', 'de_GE', 'hy', 'hy_AM']], ['3', ['be', 'bs', 'cs', 'hr']], ['4', ['cy', 'mt', 'sl']], ['6', ['ar']]]; } public function failingLangcodes() { return [['1', ['fa']], ['2', ['jbo']], ['3', ['cbs']], ['4', ['gd', 'kw']], ['5', ['ga']]]; } protected function validateMatrix($nplural, $matrix, $expectSuccess = \true) { foreach ($matrix as $langCode => $data) { $indexes = \array_flip($data); if ($expectSuccess) { $this->assertEquals($nplural, \count($indexes), "Langcode '{$langCode}' has '{$nplural}' plural forms."); } else { $this->assertNotEquals((int) $nplural, \count($indexes), "Langcode '{$langCode}' has '{$nplural}' plural forms."); } } } protected function generateTestData($langCodes) { $translator = new class { use TranslatorTrait { getPluralizationRule as public; } }; $matrix = []; foreach ($langCodes as $langCode) { for ($count = 0; $count < 200; ++$count) { $plural = $translator->getPluralizationRule($count, $langCode); $matrix[$langCode][$count] = $plural; } } return $matrix; } }
|
1 |
Â
<?php
|
2 |
+
namespace MailPoetVendor\Symfony\Contracts\Translation\Test; if (!defined('ABSPATH')) exit; use MailPoetVendor\PHPUnit\Framework\TestCase; use MailPoetVendor\Symfony\Contracts\Translation\TranslatorInterface; use MailPoetVendor\Symfony\Contracts\Translation\TranslatorTrait; class TranslatorTest extends TestCase { private $defaultLocale; protected function setUp() : void { $this->defaultLocale = \Locale::getDefault(); \Locale::setDefault('en'); } protected function tearDown() : void { \Locale::setDefault($this->defaultLocale); } public function getTranslator() { return new class implements TranslatorInterface { use TranslatorTrait; }; } public function testTrans($expected, $id, $parameters) { $translator = $this->getTranslator(); $this->assertEquals($expected, $translator->trans($id, $parameters)); } public function testTransChoiceWithExplicitLocale($expected, $id, $number) { $translator = $this->getTranslator(); $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number])); } public function testTransChoiceWithDefaultLocale($expected, $id, $number) { $translator = $this->getTranslator(); $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number])); } public function testTransChoiceWithEnUsPosix($expected, $id, $number) { $translator = $this->getTranslator(); $translator->setLocale('en_US_POSIX'); $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number])); } public function testGetSetLocale() { $translator = $this->getTranslator(); $this->assertEquals('en', $translator->getLocale()); } public function testGetLocaleReturnsDefaultLocaleIfNotSet() { $translator = $this->getTranslator(); \Locale::setDefault('pt_BR'); $this->assertEquals('pt_BR', $translator->getLocale()); \Locale::setDefault('en'); $this->assertEquals('en', $translator->getLocale()); } public function getTransTests() { return [['Symfony is great!', 'Symfony is great!', []], ['Symfony is awesome!', 'Symfony is %what%!', ['%what%' => 'awesome']]]; } public function getTransChoiceTests() { return [ ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], ['There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1], ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10], ['There are 0 apples', 'There is 1 apple|There are %count% apples', 0], ['There is 1 apple', 'There is 1 apple|There are %count% apples', 1], ['There are 10 apples', 'There is 1 apple|There are %count% apples', 10], ['There are 2 apples', 'There are 2 apples', 2], ]; } public function testInterval($expected, $number, $interval) { $translator = $this->getTranslator(); $this->assertEquals($expected, $translator->trans($interval . ' foo|[1,Inf[ bar', ['%count%' => $number])); } public function getInternal() { return [['foo', 3, '{1,2, 3 ,4}'], ['bar', 10, '{1,2, 3 ,4}'], ['bar', 3, '[1,2]'], ['foo', 1, '[1,2]'], ['foo', 2, '[1,2]'], ['bar', 1, ']1,2['], ['bar', 2, ']1,2['], ['foo', \log(0), '[-Inf,2['], ['foo', -\log(0), '[-2,+Inf]']]; } public function testChoose($expected, $id, $number) { $translator = $this->getTranslator(); $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number])); } public function testReturnMessageIfExactlyOneStandardRuleIsGiven() { $translator = $this->getTranslator(); $this->assertEquals('There are two apples', $translator->trans('There are two apples', ['%count%' => 2])); } public function testThrowExceptionIfMatchingMessageCannotBeFound($id, $number) { $this->expectException(\InvalidArgumentException::class); $translator = $this->getTranslator(); $translator->trans($id, ['%count%' => $number]); } public function getNonMatchingMessages() { return [['{0} There are no apples|{1} There is one apple', 2], ['{1} There is one apple|]1,Inf] There are %count% apples', 0], ['{1} There is one apple|]2,Inf] There are %count% apples', 2], ['{0} There are no apples|There is one apple', 2]]; } public function getChooseTests() { return [ ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], ['There are no apples', '{0}There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], ['There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1], ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10], ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf]There are %count% apples', 10], ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10], ['There are 0 apples', 'There is one apple|There are %count% apples', 0], ['There is one apple', 'There is one apple|There are %count% apples', 1], ['There are 10 apples', 'There is one apple|There are %count% apples', 10], ['There are 0 apples', 'one: There is one apple|more: There are %count% apples', 0], ['There is one apple', 'one: There is one apple|more: There are %count% apples', 1], ['There are 10 apples', 'one: There is one apple|more: There are %count% apples', 10], ['There are no apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 0], ['There is one apple', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 1], ['There are 10 apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 10], ['', '{0}|{1} There is one apple|]1,Inf] There are %count% apples', 0], ['', '{0} There are no apples|{1}|]1,Inf] There are %count% apples', 1], ['There are 0 apples', 'There is one apple|There are %count% apples', 0], ['There is one apple', 'There is one apple|There are %count% apples', 1], ['There are 2 apples', 'There is one apple|There are %count% apples', 2], ['There is almost one apple', '{0} There are no apples|]0,1[ There is almost one apple|{1} There is one apple|[1,Inf] There is more than one apple', 0.7], ['There is one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1], ['There is more than one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1.7], ['There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0], ['There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0.0], ['There are no apples', '{0.0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0], ["This is a text with a\n new-line in it. Selector = 0.", '{0}This is a text with a
|
3 |
Â
new-line in it. Selector = 0.|{1}This is a text with a
|
4 |
Â
new-line in it. Selector = 1.|[1,Inf]This is a text with a
|
5 |
Â
new-line in it. Selector > 1.', 0], ["This is a text with a\n new-line in it. Selector = 1.", '{0}This is a text with a
|
16 |
Â
new-line in it. Selector > 1.', '{0}This is a text with a
|
17 |
Â
new-line in it. Selector = 0.|{1}This is a text with a
|
18 |
Â
new-line in it. Selector = 1.|[1,Inf]This is a text with a
|
19 |
+
new-line in it. Selector > 1.', 5], ['This is a text with a\\nnew-line in it. Selector = 0.', '{0}This is a text with a\\nnew-line in it. Selector = 0.|{1}This is a text with a\\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\\nnew-line in it. Selector > 1.', 0], ["This is a text with a\nnew-line in it. Selector = 1.", "{0}This is a text with a\nnew-line in it. Selector = 0.|{1}This is a text with a\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\nnew-line in it. Selector > 1.", 1], ['This is a text with | in it. Selector = 0.', '{0}This is a text with || in it. Selector = 0.|{1}This is a text with || in it. Selector = 1.', 0], ['', '|', 1], ['', '||', 1], ]; } public function testFailedLangcodes($nplural, $langCodes) { $matrix = $this->generateTestData($langCodes); $this->validateMatrix($nplural, $matrix, \false); } public function testLangcodes($nplural, $langCodes) { $matrix = $this->generateTestData($langCodes); $this->validateMatrix($nplural, $matrix); } public function successLangcodes() { return [['1', ['ay', 'bo', 'cgg', 'dz', 'id', 'ja', 'jbo', 'ka', 'kk', 'km', 'ko', 'ky']], ['2', ['nl', 'fr', 'en', 'de', 'de_GE', 'hy', 'hy_AM', 'en_US_POSIX']], ['3', ['be', 'bs', 'cs', 'hr']], ['4', ['cy', 'mt', 'sl']], ['6', ['ar']]]; } public function failingLangcodes() { return [['1', ['fa']], ['2', ['jbo']], ['3', ['cbs']], ['4', ['gd', 'kw']], ['5', ['ga']]]; } protected function validateMatrix($nplural, $matrix, $expectSuccess = \true) { foreach ($matrix as $langCode => $data) { $indexes = \array_flip($data); if ($expectSuccess) { $this->assertEquals($nplural, \count($indexes), "Langcode '{$langCode}' has '{$nplural}' plural forms."); } else { $this->assertNotEquals((int) $nplural, \count($indexes), "Langcode '{$langCode}' has '{$nplural}' plural forms."); } } } protected function generateTestData($langCodes) { $translator = new class { use TranslatorTrait { getPluralizationRule as public; } }; $matrix = []; foreach ($langCodes as $langCode) { for ($count = 0; $count < 200; ++$count) { $plural = $translator->getPluralizationRule($count, $langCode); $matrix[$langCode][$count] = $plural; } } return $matrix; } }
|
vendor-prefixed/symfony/translation-contracts/TranslatorTrait.php
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
Â
<?php
|
2 |
-
namespace MailPoetVendor\Symfony\Contracts\Translation; if (!defined('ABSPATH')) exit; use MailPoetVendor\Symfony\Component\Translation\Exception\InvalidArgumentException; trait TranslatorTrait { private $locale; public function setLocale($locale) { $this->locale = (string) $locale; } public function getLocale() { return $this->locale ?: \Locale::getDefault(); } public function trans($id, array $parameters = [], $domain = null, $locale = null) { if ('' === ($id = (string) $id)) { return ''; } if (!isset($parameters['%count%']) || !\is_numeric($parameters['%count%'])) { return \strtr($id, $parameters); } $number = (float) $parameters['%count%']; $locale = (string) $locale ?: $this->getLocale(); $parts = []; if (\preg_match('/^\\|++$/', $id)) { $parts = \explode('|', $id); } elseif (\preg_match_all('/(?:\\|\\||[^\\|])++/', $id, $matches)) { $parts = $matches[0]; } $intervalRegexp = <<<'EOF'
|
3 |
Â
/^(?P<interval>
|
4 |
Â
({\s*
|
5 |
Â
(\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*)
|
@@ -16,4 +16,4 @@
|
|
16 |
Â
(?P<right_delimiter>[\[\]])
|
17 |
Â
)\s*(?P<message>.*?)$/xs
|
18 |
Â
EOF;
|
19 |
-
$standardRules = []; foreach ($parts as $part) { $part = \trim(\str_replace('||', '|', $part)); if (\preg_match($intervalRegexp, $part, $matches)) { if ($matches[2]) { foreach (\explode(',', $matches[3]) as $n) { if ($number == $n) { return \strtr($matches['message'], $parameters); } } } else { $leftNumber = '-Inf' === $matches['left'] ? -\INF : (float) $matches['left']; $rightNumber = \is_numeric($matches['right']) ? (float) $matches['right'] : \INF; if (('[' === $matches['left_delimiter'] ? $number >= $leftNumber : $number > $leftNumber) && (']' === $matches['right_delimiter'] ? $number <= $rightNumber : $number < $rightNumber)) { return \strtr($matches['message'], $parameters); } } } elseif (\preg_match('/^\\w+\\:\\s*(.*?)$/', $part, $matches)) { $standardRules[] = $matches[1]; } else { $standardRules[] = $part; } } $position = $this->getPluralizationRule($number, $locale); if (!isset($standardRules[$position])) { if (1 === \count($parts) && isset($standardRules[0])) { return \strtr($standardRules[0], $parameters); } $message = \sprintf('Unable to choose a translation for "%s" with locale "%s" for value "%d". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $id, $locale, $number); if (\class_exists(InvalidArgumentException::class)) { throw new InvalidArgumentException($message); } throw new \InvalidArgumentException($message); } return \strtr($standardRules[$position], $parameters); } private function getPluralizationRule(
|
1 |
Â
<?php
|
2 |
+
namespace MailPoetVendor\Symfony\Contracts\Translation; if (!defined('ABSPATH')) exit; use MailPoetVendor\Symfony\Component\Translation\Exception\InvalidArgumentException; trait TranslatorTrait { private $locale; public function setLocale($locale) { $this->locale = (string) $locale; } public function getLocale() { return $this->locale ?: (\class_exists(\Locale::class) ? \Locale::getDefault() : 'en'); } public function trans($id, array $parameters = [], $domain = null, $locale = null) { if ('' === ($id = (string) $id)) { return ''; } if (!isset($parameters['%count%']) || !\is_numeric($parameters['%count%'])) { return \strtr($id, $parameters); } $number = (float) $parameters['%count%']; $locale = (string) $locale ?: $this->getLocale(); $parts = []; if (\preg_match('/^\\|++$/', $id)) { $parts = \explode('|', $id); } elseif (\preg_match_all('/(?:\\|\\||[^\\|])++/', $id, $matches)) { $parts = $matches[0]; } $intervalRegexp = <<<'EOF'
|
3 |
Â
/^(?P<interval>
|
4 |
Â
({\s*
|
5 |
Â
(\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*)
|
16 |
Â
(?P<right_delimiter>[\[\]])
|
17 |
Â
)\s*(?P<message>.*?)$/xs
|
18 |
Â
EOF;
|
19 |
+
$standardRules = []; foreach ($parts as $part) { $part = \trim(\str_replace('||', '|', $part)); if (\preg_match($intervalRegexp, $part, $matches)) { if ($matches[2]) { foreach (\explode(',', $matches[3]) as $n) { if ($number == $n) { return \strtr($matches['message'], $parameters); } } } else { $leftNumber = '-Inf' === $matches['left'] ? -\INF : (float) $matches['left']; $rightNumber = \is_numeric($matches['right']) ? (float) $matches['right'] : \INF; if (('[' === $matches['left_delimiter'] ? $number >= $leftNumber : $number > $leftNumber) && (']' === $matches['right_delimiter'] ? $number <= $rightNumber : $number < $rightNumber)) { return \strtr($matches['message'], $parameters); } } } elseif (\preg_match('/^\\w+\\:\\s*(.*?)$/', $part, $matches)) { $standardRules[] = $matches[1]; } else { $standardRules[] = $part; } } $position = $this->getPluralizationRule($number, $locale); if (!isset($standardRules[$position])) { if (1 === \count($parts) && isset($standardRules[0])) { return \strtr($standardRules[0], $parameters); } $message = \sprintf('Unable to choose a translation for "%s" with locale "%s" for value "%d". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $id, $locale, $number); if (\class_exists(InvalidArgumentException::class)) { throw new InvalidArgumentException($message); } throw new \InvalidArgumentException($message); } return \strtr($standardRules[$position], $parameters); } private function getPluralizationRule(float $number, string $locale) : int { $number = \abs($number); switch ('pt_BR' !== $locale && 'en_US_POSIX' !== $locale && \strlen($locale) > 3 ? \substr($locale, 0, \strrpos($locale, '_')) : $locale) { case 'af': case 'bn': case 'bg': case 'ca': case 'da': case 'de': case 'el': case 'en': case 'en_US_POSIX': case 'eo': case 'es': case 'et': case 'eu': case 'fa': case 'fi': case 'fo': case 'fur': case 'fy': case 'gl': case 'gu': case 'ha': case 'he': case 'hu': case 'is': case 'it': case 'ku': case 'lb': case 'ml': case 'mn': case 'mr': case 'nah': case 'nb': case 'ne': case 'nl': case 'nn': case 'no': case 'oc': case 'om': case 'or': case 'pa': case 'pap': case 'ps': case 'pt': case 'so': case 'sq': case 'sv': case 'sw': case 'ta': case 'te': case 'tk': case 'ur': case 'zu': return 1 == $number ? 0 : 1; case 'am': case 'bh': case 'fil': case 'fr': case 'gun': case 'hi': case 'hy': case 'ln': case 'mg': case 'nso': case 'pt_BR': case 'ti': case 'wa': return $number < 2 ? 0 : 1; case 'be': case 'bs': case 'hr': case 'ru': case 'sh': case 'sr': case 'uk': return 1 == $number % 10 && 11 != $number % 100 ? 0 : ($number % 10 >= 2 && $number % 10 <= 4 && ($number % 100 < 10 || $number % 100 >= 20) ? 1 : 2); case 'cs': case 'sk': return 1 == $number ? 0 : ($number >= 2 && $number <= 4 ? 1 : 2); case 'ga': return 1 == $number ? 0 : (2 == $number ? 1 : 2); case 'lt': return 1 == $number % 10 && 11 != $number % 100 ? 0 : ($number % 10 >= 2 && ($number % 100 < 10 || $number % 100 >= 20) ? 1 : 2); case 'sl': return 1 == $number % 100 ? 0 : (2 == $number % 100 ? 1 : (3 == $number % 100 || 4 == $number % 100 ? 2 : 3)); case 'mk': return 1 == $number % 10 ? 0 : 1; case 'mt': return 1 == $number ? 0 : (0 == $number || $number % 100 > 1 && $number % 100 < 11 ? 1 : ($number % 100 > 10 && $number % 100 < 20 ? 2 : 3)); case 'lv': return 0 == $number ? 0 : (1 == $number % 10 && 11 != $number % 100 ? 1 : 2); case 'pl': return 1 == $number ? 0 : ($number % 10 >= 2 && $number % 10 <= 4 && ($number % 100 < 12 || $number % 100 > 14) ? 1 : 2); case 'cy': return 1 == $number ? 0 : (2 == $number ? 1 : (8 == $number || 11 == $number ? 2 : 3)); case 'ro': return 1 == $number ? 0 : (0 == $number || $number % 100 > 0 && $number % 100 < 20 ? 1 : 2); case 'ar': return 0 == $number ? 0 : (1 == $number ? 1 : (2 == $number ? 2 : ($number % 100 >= 3 && $number % 100 <= 10 ? 3 : ($number % 100 >= 11 && $number % 100 <= 99 ? 4 : 5)))); default: return 0; } } }
|
vendor/autoload.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
if (!defined('ABSPATH')) exit; require_once __DIR__ . '/composer/autoload_real.php'; return
|
1 |
Â
<?php
|
2 |
+
if (!defined('ABSPATH')) exit; require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInit6595bb8f461ac0d65b82f65d86ce3054::getLoader();
|
vendor/composer/autoload_classmap.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
Â
<?php
|
2 |
-
if (!defined('ABSPATH')) exit; $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'MailPoetVendor\\Attribute' => $baseDir . '/vendor-prefixed/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'MailPoetVendor\\CSS' => $baseDir . '/lib-3rd-party/CSS.php', 'MailPoetVendor\\Carbon\\Carbon' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Carbon.php', 'MailPoetVendor\\Carbon\\CarbonConverterInterface' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/CarbonConverterInterface.php', 'MailPoetVendor\\Carbon\\CarbonImmutable' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/CarbonImmutable.php', 'MailPoetVendor\\Carbon\\CarbonInterface' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/CarbonInterface.php', 'MailPoetVendor\\Carbon\\CarbonInterval' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/CarbonInterval.php', 'MailPoetVendor\\Carbon\\CarbonPeriod' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/CarbonPeriod.php', 'MailPoetVendor\\Carbon\\CarbonTimeZone' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/CarbonTimeZone.php', 'MailPoetVendor\\Carbon\\Exceptions\\BadComparisonUnitException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php', 'MailPoetVendor\\Carbon\\Exceptions\\BadFluentConstructorException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php', 'MailPoetVendor\\Carbon\\Exceptions\\BadFluentSetterException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php', 'MailPoetVendor\\Carbon\\Exceptions\\BadMethodCallException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php', 'MailPoetVendor\\Carbon\\Exceptions\\Exception' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/Exception.php', 'MailPoetVendor\\Carbon\\Exceptions\\ImmutableException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidCastException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidDateException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidFormatException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidIntervalException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidPeriodDateException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidPeriodParameterException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidTimeZoneException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidTypeException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php', 'MailPoetVendor\\Carbon\\Exceptions\\NotACarbonClassException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php', 'MailPoetVendor\\Carbon\\Exceptions\\NotAPeriodException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php', 'MailPoetVendor\\Carbon\\Exceptions\\NotLocaleAwareException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php', 'MailPoetVendor\\Carbon\\Exceptions\\OutOfRangeException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php', 'MailPoetVendor\\Carbon\\Exceptions\\ParseErrorException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php', 'MailPoetVendor\\Carbon\\Exceptions\\RuntimeException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php', 'MailPoetVendor\\Carbon\\Exceptions\\UnitException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/UnitException.php', 'MailPoetVendor\\Carbon\\Exceptions\\UnitNotConfiguredException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php', 'MailPoetVendor\\Carbon\\Exceptions\\UnknownGetterException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php', 'MailPoetVendor\\Carbon\\Exceptions\\UnknownMethodException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php', 'MailPoetVendor\\Carbon\\Exceptions\\UnknownSetterException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php', 'MailPoetVendor\\Carbon\\Exceptions\\UnknownUnitException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php', 'MailPoetVendor\\Carbon\\Exceptions\\UnreachableException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php', 'MailPoetVendor\\Carbon\\Factory' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Factory.php', 'MailPoetVendor\\Carbon\\FactoryImmutable' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/FactoryImmutable.php', 'MailPoetVendor\\Carbon\\Language' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Language.php', 'MailPoetVendor\\Carbon\\Traits\\Boundaries' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Boundaries.php', 'MailPoetVendor\\Carbon\\Traits\\Cast' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Cast.php', 'MailPoetVendor\\Carbon\\Traits\\Comparison' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Comparison.php', 'MailPoetVendor\\Carbon\\Traits\\Converter' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Converter.php', 'MailPoetVendor\\Carbon\\Traits\\Creator' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Creator.php', 'MailPoetVendor\\Carbon\\Traits\\Date' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Date.php', 'MailPoetVendor\\Carbon\\Traits\\Difference' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Difference.php', 'MailPoetVendor\\Carbon\\Traits\\IntervalRounding' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php', 'MailPoetVendor\\Carbon\\Traits\\IntervalStep' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/IntervalStep.php', 'MailPoetVendor\\Carbon\\Traits\\Localization' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Localization.php', 'MailPoetVendor\\Carbon\\Traits\\Macro' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Macro.php', 'MailPoetVendor\\Carbon\\Traits\\Mixin' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Mixin.php', 'MailPoetVendor\\Carbon\\Traits\\Modifiers' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Modifiers.php', 'MailPoetVendor\\Carbon\\Traits\\Mutability' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Mutability.php', 'MailPoetVendor\\Carbon\\Traits\\ObjectInitialisation' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php', 'MailPoetVendor\\Carbon\\Traits\\Options' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Options.php', 'MailPoetVendor\\Carbon\\Traits\\Rounding' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Rounding.php', 'MailPoetVendor\\Carbon\\Traits\\Serialization' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Serialization.php', 'MailPoetVendor\\Carbon\\Traits\\Test' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Test.php', 'MailPoetVendor\\Carbon\\Traits\\Timestamp' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Timestamp.php', 'MailPoetVendor\\Carbon\\Traits\\Units' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Units.php', 'MailPoetVendor\\Carbon\\Traits\\Week' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Week.php', 'MailPoetVendor\\Carbon\\Translator' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Translator.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\Cache' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\CacheProvider' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\ClearableCache' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\FlushableCache' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\MultiDeleteCache' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/MultiDeleteCache.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\MultiGetCache' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\MultiOperationCache' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/MultiOperationCache.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\MultiPutCache' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/MultiPutCache.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\Psr6\\CacheAdapter' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/Psr6/CacheAdapter.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\Psr6\\CacheItem' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/Psr6/CacheItem.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\Psr6\\DoctrineProvider' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/Psr6/DoctrineProvider.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\Psr6\\InvalidArgument' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/Psr6/InvalidArgument.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\Psr6\\TypedCacheItem' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/Psr6/TypedCacheItem.php', 'MailPoetVendor\\Doctrine\\Common\\ClassLoader' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/ClassLoader.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\AbstractLazyCollection' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/AbstractLazyCollection.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\ArrayCollection' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/ArrayCollection.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Collection' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Collection.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Criteria' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Criteria.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Expr\\ClosureExpressionVisitor' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Expr/ClosureExpressionVisitor.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Expr\\Comparison' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Comparison.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Expr\\CompositeExpression' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Expr/CompositeExpression.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Expr\\Expression' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Expression.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Expr\\ExpressionVisitor' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Expr/ExpressionVisitor.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Expr\\Value' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Value.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\ExpressionBuilder' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/ExpressionBuilder.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Selectable' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Selectable.php', 'MailPoetVendor\\Doctrine\\Common\\CommonException' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/CommonException.php', 'MailPoetVendor\\Doctrine\\Common\\Comparable' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Comparable.php', 'MailPoetVendor\\Doctrine\\Common\\EventArgs' => $baseDir . '/vendor-prefixed/doctrine/event-manager/lib/Doctrine/Common/EventArgs.php', 'MailPoetVendor\\Doctrine\\Common\\EventManager' => $baseDir . '/vendor-prefixed/doctrine/event-manager/lib/Doctrine/Common/EventManager.php', 'MailPoetVendor\\Doctrine\\Common\\EventSubscriber' => $baseDir . '/vendor-prefixed/doctrine/event-manager/lib/Doctrine/Common/EventSubscriber.php', 'MailPoetVendor\\Doctrine\\Common\\Lexer\\AbstractLexer' => $baseDir . '/vendor-prefixed/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php', 'MailPoetVendor\\Doctrine\\Common\\Persistence\\PersistentObject' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Common/Persistence/PersistentObject.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\AbstractProxyFactory' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\Autoloader' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/Autoloader.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\Exception\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/Exception/InvalidArgumentException.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\Exception\\OutOfBoundsException' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/Exception/OutOfBoundsException.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\Exception\\ProxyException' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/Exception/ProxyException.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\Exception\\UnexpectedValueException' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/Exception/UnexpectedValueException.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\Proxy' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/Proxy.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\ProxyDefinition' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/ProxyDefinition.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\ProxyGenerator' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/ProxyGenerator.php', 'MailPoetVendor\\Doctrine\\Common\\Util\\ClassUtils' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php', 'MailPoetVendor\\Doctrine\\Common\\Util\\Debug' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Util/Debug.php', 'MailPoetVendor\\Doctrine\\DBAL\\Abstraction\\Result' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Abstraction/Result.php', 'MailPoetVendor\\Doctrine\\DBAL\\Cache\\ArrayStatement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Cache/ArrayStatement.php', 'MailPoetVendor\\Doctrine\\DBAL\\Cache\\CacheException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Cache/CacheException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Cache\\QueryCacheProfile' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Cache/QueryCacheProfile.php', 'MailPoetVendor\\Doctrine\\DBAL\\Cache\\ResultCacheStatement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Cache/ResultCacheStatement.php', 'MailPoetVendor\\Doctrine\\DBAL\\ColumnCase' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/ColumnCase.php', 'MailPoetVendor\\Doctrine\\DBAL\\Configuration' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Configuration.php', 'MailPoetVendor\\Doctrine\\DBAL\\Connection' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Connection.php', 'MailPoetVendor\\Doctrine\\DBAL\\ConnectionException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/ConnectionException.php', 'MailPoetVendor\\Doctrine\\DBAL\\DBALException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver.php', 'MailPoetVendor\\Doctrine\\DBAL\\DriverManager' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/DriverManager.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\AbstractDriverException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractDriverException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\AbstractException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\AbstractMySQLDriver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\AbstractSQLServerDriver\\Exception\\PortWithoutHost' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractSQLServerDriver/Exception/PortWithoutHost.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\Connection' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/Connection.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\DriverException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/DriverException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\Exception' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/Exception.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\ExceptionConverterDriver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/ExceptionConverterDriver.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\FetchUtils' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/FetchUtils.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDOConnection' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDOException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDOMySql\\Driver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOMySql/Driver.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDOQueryImplementation' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOQueryImplementation.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDOStatement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDOStatementImplementations' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatementImplementations.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\Connection' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/Connection.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\Exception' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/Exception.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\MySQL\\Driver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/MySQL/Driver.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\OCI\\Driver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/OCI/Driver.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\PgSQL\\Driver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/PgSQL/Driver.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\SQLSrv\\Connection' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/SQLSrv/Connection.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\SQLSrv\\Driver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/SQLSrv/Driver.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\SQLSrv\\Statement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/SQLSrv/Statement.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\SQLite\\Driver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/SQLite/Driver.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\Statement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/Statement.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PingableConnection' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PingableConnection.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\Result' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/Result.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\ResultStatement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/ResultStatement.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\ServerInfoAwareConnection' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/ServerInfoAwareConnection.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\Statement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/Statement.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\StatementIterator' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/StatementIterator.php', 'MailPoetVendor\\Doctrine\\DBAL\\Event\\Listeners\\SQLSessionInit' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Event/Listeners/SQLSessionInit.php', 'MailPoetVendor\\Doctrine\\DBAL\\Events' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Events.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\ConnectionException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/ConnectionException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\ConnectionLost' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/ConnectionLost.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\ConstraintViolationException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/ConstraintViolationException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\DatabaseObjectExistsException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/DatabaseObjectExistsException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\DatabaseObjectNotFoundException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/DatabaseObjectNotFoundException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\DeadlockException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/DeadlockException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\DriverException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/DriverException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\ForeignKeyConstraintViolationException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/ForeignKeyConstraintViolationException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/InvalidArgumentException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\InvalidFieldNameException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/InvalidFieldNameException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\LockWaitTimeoutException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/LockWaitTimeoutException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\NoKeyValue' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/NoKeyValue.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\NonUniqueFieldNameException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/NonUniqueFieldNameException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\NotNullConstraintViolationException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/NotNullConstraintViolationException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\ReadOnlyException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/ReadOnlyException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\RetryableException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/RetryableException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\ServerException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/ServerException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\SyntaxErrorException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/SyntaxErrorException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\TableExistsException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/TableExistsException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\TableNotFoundException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/TableNotFoundException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\UniqueConstraintViolationException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/UniqueConstraintViolationException.php', 'MailPoetVendor\\Doctrine\\DBAL\\FetchMode' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/FetchMode.php', 'MailPoetVendor\\Doctrine\\DBAL\\ForwardCompatibility\\DriverResultStatement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/ForwardCompatibility/DriverResultStatement.php', 'MailPoetVendor\\Doctrine\\DBAL\\ForwardCompatibility\\DriverStatement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/ForwardCompatibility/DriverStatement.php', 'MailPoetVendor\\Doctrine\\DBAL\\ForwardCompatibility\\Result' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/ForwardCompatibility/Result.php', 'MailPoetVendor\\Doctrine\\DBAL\\Id\\TableGenerator' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Id/TableGenerator.php', 'MailPoetVendor\\Doctrine\\DBAL\\Id\\TableGeneratorSchemaVisitor' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Id/TableGeneratorSchemaVisitor.php', 'MailPoetVendor\\Doctrine\\DBAL\\LockMode' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/LockMode.php', 'MailPoetVendor\\Doctrine\\DBAL\\Logging\\DebugStack' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Logging/DebugStack.php', 'MailPoetVendor\\Doctrine\\DBAL\\Logging\\EchoSQLLogger' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Logging/EchoSQLLogger.php', 'MailPoetVendor\\Doctrine\\DBAL\\Logging\\LoggerChain' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Logging/LoggerChain.php', 'MailPoetVendor\\Doctrine\\DBAL\\Logging\\SQLLogger' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Logging/SQLLogger.php', 'MailPoetVendor\\Doctrine\\DBAL\\ParameterType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/ParameterType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\AbstractPlatform' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/AbstractPlatform.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\DateIntervalUnit' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/DateIntervalUnit.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\Keywords\\KeywordList' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/KeywordList.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\Keywords\\MariaDb102Keywords' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/MariaDb102Keywords.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\Keywords\\MsSQLKeywords' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/MsSQLKeywords.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\Keywords\\MySQL57Keywords' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/MySQL57Keywords.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\Keywords\\MySQL80Keywords' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/MySQL80Keywords.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\Keywords\\MySQLKeywords' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/MySQLKeywords.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\Keywords\\ReservedKeywordsValidator' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/ReservedKeywordsValidator.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\MariaDb1027Platform' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/MariaDb1027Platform.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\MySQL57Platform' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/MySQL57Platform.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\MySQL80Platform' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/MySQL80Platform.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\MySqlPlatform' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\TrimMode' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/TrimMode.php', 'MailPoetVendor\\Doctrine\\DBAL\\Portability\\Connection' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Portability/Connection.php', 'MailPoetVendor\\Doctrine\\DBAL\\Portability\\OptimizeFlags' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Portability/OptimizeFlags.php', 'MailPoetVendor\\Doctrine\\DBAL\\Portability\\Statement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Portability/Statement.php', 'MailPoetVendor\\Doctrine\\DBAL\\Query\\Expression\\CompositeExpression' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Query/Expression/CompositeExpression.php', 'MailPoetVendor\\Doctrine\\DBAL\\Query\\Expression\\ExpressionBuilder' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Query/Expression/ExpressionBuilder.php', 'MailPoetVendor\\Doctrine\\DBAL\\Query\\QueryBuilder' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Query/QueryBuilder.php', 'MailPoetVendor\\Doctrine\\DBAL\\Query\\QueryException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Query/QueryException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Result' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Result.php', 'MailPoetVendor\\Doctrine\\DBAL\\SQLParserUtils' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/SQLParserUtils.php', 'MailPoetVendor\\Doctrine\\DBAL\\SQLParserUtilsException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/SQLParserUtilsException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Statement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Statement.php', 'MailPoetVendor\\Doctrine\\DBAL\\TransactionIsolationLevel' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/TransactionIsolationLevel.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\ArrayType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/ArrayType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\AsciiStringType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/AsciiStringType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\BigIntType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/BigIntType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\BinaryType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/BinaryType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\BlobType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/BlobType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\BooleanType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/BooleanType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\ConversionException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/ConversionException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\DateImmutableType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DateImmutableType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\DateIntervalType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DateIntervalType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\DateTimeImmutableType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeImmutableType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\DateTimeType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\DateTimeTzImmutableType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeTzImmutableType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\DateTimeTzType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeTzType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\DateType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DateType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\DecimalType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DecimalType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\FloatType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/FloatType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\GuidType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/GuidType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\IntegerType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/IntegerType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\JsonArrayType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/JsonArrayType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\JsonType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/JsonType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\ObjectType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/ObjectType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\PhpDateTimeMappingType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/PhpDateTimeMappingType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\PhpIntegerMappingType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/PhpIntegerMappingType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\SimpleArrayType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/SimpleArrayType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\SmallIntType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/SmallIntType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\StringType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/StringType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\TextType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/TextType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\TimeImmutableType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/TimeImmutableType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\TimeType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/TimeType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\Type' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/Type.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\TypeRegistry' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/TypeRegistry.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\Types' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/Types.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\VarDateTimeImmutableType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/VarDateTimeImmutableType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\VarDateTimeType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/VarDateTimeType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Version' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Version.php', 'MailPoetVendor\\Doctrine\\DBAL\\VersionAwarePlatformDriver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/VersionAwarePlatformDriver.php', 'MailPoetVendor\\Doctrine\\Deprecations\\Deprecation' => $baseDir . '/vendor-prefixed/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php', 'MailPoetVendor\\Doctrine\\Instantiator\\Exception\\ExceptionInterface' => $baseDir . '/vendor-prefixed/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php', 'MailPoetVendor\\Doctrine\\Instantiator\\Exception\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php', 'MailPoetVendor\\Doctrine\\Instantiator\\Exception\\UnexpectedValueException' => $baseDir . '/vendor-prefixed/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php', 'MailPoetVendor\\Doctrine\\Instantiator\\Instantiator' => $baseDir . '/vendor-prefixed/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php', 'MailPoetVendor\\Doctrine\\Instantiator\\InstantiatorInterface' => $baseDir . '/vendor-prefixed/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php', 'MailPoetVendor\\Doctrine\\ORM\\AbstractQuery' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/AbstractQuery.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\AssociationCacheEntry' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/AssociationCacheEntry.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\CacheConfiguration' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/CacheConfiguration.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\CacheEntry' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/CacheEntry.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\CacheException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/CacheException.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\CacheFactory' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/CacheFactory.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\CacheKey' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/CacheKey.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\CollectionCacheEntry' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/CollectionCacheEntry.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\CollectionCacheKey' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/CollectionCacheKey.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\CollectionHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/CollectionHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\ConcurrentRegion' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/ConcurrentRegion.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\DefaultCache' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/DefaultCache.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\DefaultCacheFactory' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/DefaultCacheFactory.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\DefaultCollectionHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/DefaultCollectionHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\DefaultEntityHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/DefaultEntityHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\DefaultQueryCache' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/DefaultQueryCache.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\EntityCacheEntry' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/EntityCacheEntry.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\EntityCacheKey' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/EntityCacheKey.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\EntityHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/EntityHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\CacheException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/CacheException.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\CannotUpdateReadOnlyCollection' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/CannotUpdateReadOnlyCollection.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\CannotUpdateReadOnlyEntity' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/CannotUpdateReadOnlyEntity.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\FeatureNotImplemented' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/FeatureNotImplemented.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\InvalidResultCacheDriver' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/InvalidResultCacheDriver.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\MetadataCacheNotConfigured' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/MetadataCacheNotConfigured.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\MetadataCacheUsesNonPersistentCache' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/MetadataCacheUsesNonPersistentCache.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\NonCacheableEntity' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/NonCacheableEntity.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\NonCacheableEntityAssociation' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/NonCacheableEntityAssociation.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\QueryCacheNotConfigured' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/QueryCacheNotConfigured.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\QueryCacheUsesNonPersistentCache' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/QueryCacheUsesNonPersistentCache.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Lock' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Lock.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\LockException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/LockException.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Logging\\CacheLogger' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Logging/CacheLogger.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Logging\\CacheLoggerChain' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Logging/CacheLoggerChain.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Logging\\StatisticsCacheLogger' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Logging/StatisticsCacheLogger.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\MultiGetRegion' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/MultiGetRegion.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\CachedPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/CachedPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Collection\\AbstractCollectionPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Collection/AbstractCollectionPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Collection\\CachedCollectionPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Collection/CachedCollectionPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Collection\\NonStrictReadWriteCachedCollectionPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Collection/NonStrictReadWriteCachedCollectionPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Collection\\ReadOnlyCachedCollectionPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Collection/ReadOnlyCachedCollectionPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Collection\\ReadWriteCachedCollectionPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Collection/ReadWriteCachedCollectionPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Entity\\AbstractEntityPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Entity/AbstractEntityPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Entity\\CachedEntityPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Entity/CachedEntityPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Entity\\NonStrictReadWriteCachedEntityPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Entity/NonStrictReadWriteCachedEntityPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Entity\\ReadOnlyCachedEntityPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Entity/ReadOnlyCachedEntityPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Entity\\ReadWriteCachedEntityPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Entity/ReadWriteCachedEntityPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\QueryCache' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/QueryCache.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\QueryCacheEntry' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/QueryCacheEntry.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\QueryCacheKey' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/QueryCacheKey.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\QueryCacheValidator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/QueryCacheValidator.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Region' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Region.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Region\\DefaultMultiGetRegion' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Region/DefaultMultiGetRegion.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Region\\DefaultRegion' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Region/DefaultRegion.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Region\\FileLockRegion' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Region/FileLockRegion.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Region\\UpdateTimestampCache' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Region/UpdateTimestampCache.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\RegionsConfiguration' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/RegionsConfiguration.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\TimestampCacheEntry' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/TimestampCacheEntry.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\TimestampCacheKey' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/TimestampCacheKey.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\TimestampQueryCacheValidator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/TimestampQueryCacheValidator.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\TimestampRegion' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/TimestampRegion.php', 'MailPoetVendor\\Doctrine\\ORM\\Configuration' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Configuration.php', 'MailPoetVendor\\Doctrine\\ORM\\Decorator\\EntityManagerDecorator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Decorator/EntityManagerDecorator.php', 'MailPoetVendor\\Doctrine\\ORM\\EntityManager' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/EntityManager.php', 'MailPoetVendor\\Doctrine\\ORM\\EntityManagerInterface' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/EntityManagerInterface.php', 'MailPoetVendor\\Doctrine\\ORM\\EntityNotFoundException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/EntityNotFoundException.php', 'MailPoetVendor\\Doctrine\\ORM\\EntityRepository' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\LifecycleEventArgs' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/LifecycleEventArgs.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\ListenersInvoker' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/ListenersInvoker.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\LoadClassMetadataEventArgs' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/LoadClassMetadataEventArgs.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\OnClassMetadataNotFoundEventArgs' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/OnClassMetadataNotFoundEventArgs.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\OnClearEventArgs' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/OnClearEventArgs.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\OnFlushEventArgs' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/OnFlushEventArgs.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\PostFlushEventArgs' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/PostFlushEventArgs.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\PreFlushEventArgs' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/PreFlushEventArgs.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\PreUpdateEventArgs' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/PreUpdateEventArgs.php', 'MailPoetVendor\\Doctrine\\ORM\\Events' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Events.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\ConfigurationException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/ConfigurationException.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\EntityManagerClosed' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/EntityManagerClosed.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\EntityMissingAssignedId' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/EntityMissingAssignedId.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\InvalidEntityRepository' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/InvalidEntityRepository.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\InvalidHydrationMode' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/InvalidHydrationMode.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\ManagerException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/ManagerException.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\MismatchedEventManager' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/MismatchedEventManager.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\MissingIdentifierField' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/MissingIdentifierField.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\MissingMappingDriverImplementation' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/MissingMappingDriverImplementation.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\MultipleSelectorsFoundException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/MultipleSelectorsFoundException.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\NamedNativeQueryNotFound' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/NamedNativeQueryNotFound.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\NamedQueryNotFound' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/NamedQueryNotFound.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\NotSupported' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/NotSupported.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\ORMException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/ORMException.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\PersisterException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/PersisterException.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\ProxyClassesAlwaysRegenerating' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/ProxyClassesAlwaysRegenerating.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\RepositoryException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/RepositoryException.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\SchemaToolException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/SchemaToolException.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\UnexpectedAssociationValue' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/UnexpectedAssociationValue.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\UnknownEntityNamespace' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/UnknownEntityNamespace.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\UnrecognizedIdentifierFields' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/UnrecognizedIdentifierFields.php', 'MailPoetVendor\\Doctrine\\ORM\\Id\\AbstractIdGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Id/AbstractIdGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Id\\AssignedGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Id/AssignedGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Id\\BigIntegerIdentityGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Id/BigIntegerIdentityGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Id\\IdentityGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Id/IdentityGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Id\\SequenceGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Id/SequenceGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Id\\TableGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Id/TableGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Id\\UuidGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Id/UuidGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\CommitOrderCalculator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/CommitOrderCalculator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\HydrationCompleteHandler' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/HydrationCompleteHandler.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\AbstractHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\ArrayHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\HydrationException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/HydrationException.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\IterableResult' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/IterableResult.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\ObjectHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\ScalarColumnHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ScalarColumnHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\ScalarHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ScalarHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\SimpleObjectHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\SingleScalarHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/SingleScalarHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\SQLResultCasing' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/SQLResultCasing.php', 'MailPoetVendor\\Doctrine\\ORM\\LazyCriteriaCollection' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/LazyCriteriaCollection.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Annotation' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Annotation.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\AnsiQuoteStrategy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/AnsiQuoteStrategy.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\AssociationOverride' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/AssociationOverride.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\AssociationOverrides' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/AssociationOverrides.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\AttributeOverride' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/AttributeOverride.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\AttributeOverrides' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/AttributeOverrides.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Builder\\AssociationBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Builder/AssociationBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Builder\\ClassMetadataBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Builder/ClassMetadataBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Builder\\EmbeddedBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Builder/EmbeddedBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Builder\\EntityListenerBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Builder/EntityListenerBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Builder\\FieldBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Builder/FieldBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Builder\\ManyToManyAssociationBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Builder/ManyToManyAssociationBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Builder\\OneToManyAssociationBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Builder/OneToManyAssociationBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Cache' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Cache.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\ChangeTrackingPolicy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ChangeTrackingPolicy.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\ClassMetadata' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadata.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\ClassMetadataFactory' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\ClassMetadataInfo' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Column' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Column.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\ColumnResult' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ColumnResult.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\CustomIdGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/CustomIdGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\DefaultEntityListenerResolver' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/DefaultEntityListenerResolver.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\DefaultNamingStrategy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/DefaultNamingStrategy.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\DefaultQuoteStrategy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/DefaultQuoteStrategy.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\DiscriminatorColumn' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/DiscriminatorColumn.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\DiscriminatorMap' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/DiscriminatorMap.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Driver\\AnnotationDriver' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Driver\\AttributeDriver' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/AttributeDriver.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Driver\\AttributeReader' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/AttributeReader.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Driver\\DriverChain' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/DriverChain.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Driver\\PHPDriver' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/PHPDriver.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Driver\\RepeatableAttributeCollection' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/RepeatableAttributeCollection.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Driver\\StaticPHPDriver' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/StaticPHPDriver.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Embeddable' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Embeddable.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Embedded' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Embedded.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Entity' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Entity.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\EntityListenerResolver' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/EntityListenerResolver.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\EntityListeners' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/EntityListeners.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\EntityResult' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/EntityResult.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Exception\\CannotGenerateIds' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Exception/CannotGenerateIds.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Exception\\InvalidCustomGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Exception/InvalidCustomGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Exception\\UnknownGeneratorType' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Exception/UnknownGeneratorType.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\FieldResult' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/FieldResult.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\GeneratedValue' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/GeneratedValue.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\HasLifecycleCallbacks' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/HasLifecycleCallbacks.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Id' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Id.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Index' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Index.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\InheritanceType' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/InheritanceType.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\InverseJoinColumn' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/InverseJoinColumn.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\JoinColumn' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/JoinColumn.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\JoinColumns' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/JoinColumns.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\JoinTable' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/JoinTable.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\ManyToMany' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ManyToMany.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\ManyToOne' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ManyToOne.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\MappedSuperclass' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/MappedSuperclass.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\MappingException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/MappingException.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\NamedNativeQueries' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/NamedNativeQueries.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\NamedNativeQuery' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/NamedNativeQuery.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\NamedQueries' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/NamedQueries.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\NamedQuery' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/NamedQuery.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\NamingStrategy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/NamingStrategy.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\OneToMany' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/OneToMany.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\OneToOne' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/OneToOne.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\OrderBy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/OrderBy.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\PostLoad' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/PostLoad.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\PostPersist' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/PostPersist.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\PostRemove' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/PostRemove.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\PostUpdate' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/PostUpdate.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\PreFlush' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/PreFlush.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\PrePersist' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/PrePersist.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\PreRemove' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/PreRemove.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\PreUpdate' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/PreUpdate.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\QuoteStrategy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/QuoteStrategy.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\ReflectionEmbeddedProperty' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ReflectionEmbeddedProperty.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Reflection\\ReflectionPropertiesGetter' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Reflection/ReflectionPropertiesGetter.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\SequenceGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/SequenceGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\SqlResultSetMapping' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/SqlResultSetMapping.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\SqlResultSetMappings' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/SqlResultSetMappings.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Table' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Table.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\UnderscoreNamingStrategy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/UnderscoreNamingStrategy.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\UniqueConstraint' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/UniqueConstraint.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Version' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Version.php', 'MailPoetVendor\\Doctrine\\ORM\\NativeQuery' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/NativeQuery.php', 'MailPoetVendor\\Doctrine\\ORM\\NoResultException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/NoResultException.php', 'MailPoetVendor\\Doctrine\\ORM\\NonUniqueResultException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/NonUniqueResultException.php', 'MailPoetVendor\\Doctrine\\ORM\\ORMException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/ORMException.php', 'MailPoetVendor\\Doctrine\\ORM\\ORMInvalidArgumentException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/ORMInvalidArgumentException.php', 'MailPoetVendor\\Doctrine\\ORM\\OptimisticLockException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/OptimisticLockException.php', 'MailPoetVendor\\Doctrine\\ORM\\PersistentCollection' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/PersistentCollection.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Collection\\AbstractCollectionPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Collection/AbstractCollectionPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Collection\\CollectionPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Collection/CollectionPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Collection\\ManyToManyPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Collection/ManyToManyPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Collection\\OneToManyPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Collection/OneToManyPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Entity\\AbstractEntityInheritancePersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/AbstractEntityInheritancePersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Entity\\BasicEntityPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Entity\\CachedPersisterContext' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/CachedPersisterContext.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Entity\\EntityPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/EntityPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Entity\\JoinedSubclassPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/JoinedSubclassPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Entity\\SingleTablePersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/SingleTablePersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Exception\\CantUseInOperatorOnCompositeKeys' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Exception/CantUseInOperatorOnCompositeKeys.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Exception\\InvalidOrientation' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Exception/InvalidOrientation.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Exception\\UnrecognizedField' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Exception/UnrecognizedField.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\MatchingAssociationFieldRequiresObject' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/MatchingAssociationFieldRequiresObject.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\PersisterException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/PersisterException.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\SqlExpressionVisitor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/SqlExpressionVisitor.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\SqlValueVisitor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/SqlValueVisitor.php', 'MailPoetVendor\\Doctrine\\ORM\\PessimisticLockException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/PessimisticLockException.php', 'MailPoetVendor\\Doctrine\\ORM\\Proxy\\Autoloader' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Proxy/Autoloader.php', 'MailPoetVendor\\Doctrine\\ORM\\Proxy\\Proxy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Proxy/Proxy.php', 'MailPoetVendor\\Doctrine\\ORM\\Proxy\\ProxyFactory' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Proxy/ProxyFactory.php', 'MailPoetVendor\\Doctrine\\ORM\\Query' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query.php', 'MailPoetVendor\\Doctrine\\ORM\\QueryBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/QueryBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ASTException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ASTException.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\AggregateExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/AggregateExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ArithmeticExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ArithmeticExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ArithmeticFactor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ArithmeticFactor.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ArithmeticTerm' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ArithmeticTerm.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\BetweenExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/BetweenExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\CoalesceExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/CoalesceExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\CollectionMemberExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/CollectionMemberExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ComparisonExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ComparisonExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ConditionalExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ConditionalExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ConditionalFactor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ConditionalFactor.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ConditionalPrimary' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ConditionalPrimary.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ConditionalTerm' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ConditionalTerm.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\DeleteClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/DeleteClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\DeleteStatement' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/DeleteStatement.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\EmptyCollectionComparisonExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/EmptyCollectionComparisonExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ExistsExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ExistsExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\FromClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/FromClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\AbsFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/AbsFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\AvgFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/AvgFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\BitAndFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/BitAndFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\BitOrFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/BitOrFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\ConcatFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/ConcatFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\CountFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/CountFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\CurrentDateFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/CurrentDateFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\CurrentTimeFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/CurrentTimeFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\CurrentTimestampFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/CurrentTimestampFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\DateAddFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/DateAddFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\DateDiffFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/DateDiffFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\DateSubFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/DateSubFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\FunctionNode' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/FunctionNode.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\IdentityFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/IdentityFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\LengthFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/LengthFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\LocateFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/LocateFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\LowerFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/LowerFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\MaxFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/MaxFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\MinFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/MinFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\ModFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/ModFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\SizeFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/SizeFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\SqrtFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/SqrtFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\SubstringFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/SubstringFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\SumFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/SumFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\TrimFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/TrimFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\UpperFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/UpperFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\GeneralCaseExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/GeneralCaseExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\GroupByClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/GroupByClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\HavingClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/HavingClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\IdentificationVariableDeclaration' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/IdentificationVariableDeclaration.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\InExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/InExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\IndexBy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/IndexBy.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\InputParameter' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/InputParameter.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\InstanceOfExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/InstanceOfExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Join' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Join.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\JoinAssociationDeclaration' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/JoinAssociationDeclaration.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\JoinAssociationPathExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/JoinAssociationPathExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\JoinClassPathExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/JoinClassPathExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\JoinVariableDeclaration' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/JoinVariableDeclaration.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\LikeExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/LikeExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Literal' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Literal.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\NewObjectExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/NewObjectExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Node' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Node.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\NullComparisonExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/NullComparisonExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\NullIfExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/NullIfExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\OrderByClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/OrderByClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\OrderByItem' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/OrderByItem.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ParenthesisExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ParenthesisExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\PartialObjectExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/PartialObjectExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\PathExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/PathExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\QuantifiedExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/QuantifiedExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\RangeVariableDeclaration' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/RangeVariableDeclaration.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SelectClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SelectClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SelectExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SelectExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SelectStatement' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SelectStatement.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SimpleArithmeticExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SimpleArithmeticExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SimpleCaseExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SimpleCaseExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SimpleSelectClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SimpleSelectClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SimpleSelectExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SimpleSelectExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SimpleWhenClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SimpleWhenClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Subselect' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Subselect.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SubselectFromClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SubselectFromClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SubselectIdentificationVariableDeclaration' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SubselectIdentificationVariableDeclaration.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\TypedExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/TypedExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\UpdateClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/UpdateClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\UpdateItem' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/UpdateItem.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\UpdateStatement' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/UpdateStatement.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\WhenClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/WhenClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\WhereClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/WhereClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Exec\\AbstractSqlExecutor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Exec/AbstractSqlExecutor.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Exec\\MultiTableDeleteExecutor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Exec/MultiTableDeleteExecutor.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Exec\\MultiTableUpdateExecutor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Exec/MultiTableUpdateExecutor.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Exec\\SingleSelectExecutor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Exec/SingleSelectExecutor.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Exec\\SingleTableDeleteUpdateExecutor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Exec/SingleTableDeleteUpdateExecutor.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Andx' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Andx.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Base' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Base.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Comparison' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Comparison.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Composite' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Composite.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\From' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/From.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Func' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Func.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\GroupBy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/GroupBy.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Join' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Join.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Literal' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Literal.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Math' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Math.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\OrderBy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/OrderBy.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Orx' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Orx.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Select' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Select.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\FilterCollection' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/FilterCollection.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Filter\\FilterException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Filter/FilterException.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Filter\\SQLFilter' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Filter/SQLFilter.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Lexer' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Lexer.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Parameter' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Parameter.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\ParameterTypeInferer' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/ParameterTypeInferer.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Parser' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\ParserResult' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/ParserResult.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Printer' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Printer.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\QueryException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\QueryExpressionVisitor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/QueryExpressionVisitor.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\ResultSetMapping' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/ResultSetMapping.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\ResultSetMappingBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/ResultSetMappingBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\SqlWalker' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/SqlWalker.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\TreeWalker' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/TreeWalker.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\TreeWalkerAdapter' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/TreeWalkerAdapter.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\TreeWalkerChain' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/TreeWalkerChain.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\TreeWalkerChainIterator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/TreeWalkerChainIterator.php', 'MailPoetVendor\\Doctrine\\ORM\\Repository\\DefaultRepositoryFactory' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Repository/DefaultRepositoryFactory.php', 'MailPoetVendor\\Doctrine\\ORM\\Repository\\Exception\\InvalidFindByCall' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Repository/Exception/InvalidFindByCall.php', 'MailPoetVendor\\Doctrine\\ORM\\Repository\\Exception\\InvalidMagicMethodCall' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Repository/Exception/InvalidMagicMethodCall.php', 'MailPoetVendor\\Doctrine\\ORM\\Repository\\RepositoryFactory' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Repository/RepositoryFactory.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Exception\\MissingColumnException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Exception/MissingColumnException.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Exception\\NotSupported' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Exception/NotSupported.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Pagination\\CountOutputWalker' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Pagination/CountOutputWalker.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Pagination\\CountWalker' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Pagination/CountWalker.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Pagination\\Exception\\RowNumberOverFunctionNotEnabled' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Pagination/Exception/RowNumberOverFunctionNotEnabled.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Pagination\\LimitSubqueryOutputWalker' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Pagination/LimitSubqueryOutputWalker.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Pagination\\LimitSubqueryWalker' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Pagination/LimitSubqueryWalker.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Pagination\\Paginator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Pagination/Paginator.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Pagination\\RowNumberOverFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Pagination/RowNumberOverFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Pagination\\WhereInWalker' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Pagination/WhereInWalker.php', 'MailPoetVendor\\Doctrine\\ORM\\TransactionRequiredException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/TransactionRequiredException.php', 'MailPoetVendor\\Doctrine\\ORM\\UnexpectedResultException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/UnexpectedResultException.php', 'MailPoetVendor\\Doctrine\\ORM\\UnitOfWork' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php', 'MailPoetVendor\\Doctrine\\ORM\\Utility\\HierarchyDiscriminatorResolver' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Utility/HierarchyDiscriminatorResolver.php', 'MailPoetVendor\\Doctrine\\ORM\\Utility\\IdentifierFlattener' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Utility/IdentifierFlattener.php', 'MailPoetVendor\\Doctrine\\ORM\\Utility\\PersisterHelper' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Utility/PersisterHelper.php', 'MailPoetVendor\\Doctrine\\ORM\\Version' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Version.php', 'MailPoetVendor\\Doctrine\\Persistence\\AbstractManagerRegistry' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/AbstractManagerRegistry.php', 'MailPoetVendor\\Doctrine\\Persistence\\ConnectionRegistry' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/ConnectionRegistry.php', 'MailPoetVendor\\Doctrine\\Persistence\\Event\\LifecycleEventArgs' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Event/LifecycleEventArgs.php', 'MailPoetVendor\\Doctrine\\Persistence\\Event\\LoadClassMetadataEventArgs' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Event/LoadClassMetadataEventArgs.php', 'MailPoetVendor\\Doctrine\\Persistence\\Event\\ManagerEventArgs' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Event/ManagerEventArgs.php', 'MailPoetVendor\\Doctrine\\Persistence\\Event\\OnClearEventArgs' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Event/OnClearEventArgs.php', 'MailPoetVendor\\Doctrine\\Persistence\\Event\\PreUpdateEventArgs' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Event/PreUpdateEventArgs.php', 'MailPoetVendor\\Doctrine\\Persistence\\ManagerRegistry' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/ManagerRegistry.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\AbstractClassMetadataFactory' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/AbstractClassMetadataFactory.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\ClassMetadata' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/ClassMetadata.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\ClassMetadataFactory' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/ClassMetadataFactory.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\AnnotationDriver' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/AnnotationDriver.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\DefaultFileLocator' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/DefaultFileLocator.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\FileDriver' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/FileDriver.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\FileLocator' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/FileLocator.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\MappingDriver' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/MappingDriver.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\MappingDriverChain' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/MappingDriverChain.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\PHPDriver' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/PHPDriver.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\StaticPHPDriver' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/StaticPHPDriver.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\SymfonyFileLocator' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/SymfonyFileLocator.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\MappingException' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/MappingException.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\ProxyClassNameResolver' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/ProxyClassNameResolver.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\ReflectionService' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/ReflectionService.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\RuntimeReflectionService' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/RuntimeReflectionService.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\StaticReflectionService' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/StaticReflectionService.php', 'MailPoetVendor\\Doctrine\\Persistence\\NotifyPropertyChanged' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/NotifyPropertyChanged.php', 'MailPoetVendor\\Doctrine\\Persistence\\ObjectManager' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/ObjectManager.php', 'MailPoetVendor\\Doctrine\\Persistence\\ObjectManagerAware' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/ObjectManagerAware.php', 'MailPoetVendor\\Doctrine\\Persistence\\ObjectManagerDecorator' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/ObjectManagerDecorator.php', 'MailPoetVendor\\Doctrine\\Persistence\\ObjectRepository' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/ObjectRepository.php', 'MailPoetVendor\\Doctrine\\Persistence\\PropertyChangedListener' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/PropertyChangedListener.php', 'MailPoetVendor\\Doctrine\\Persistence\\Proxy' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Proxy.php', 'MailPoetVendor\\Doctrine\\Persistence\\Reflection\\RuntimePublicReflectionProperty' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Reflection/RuntimePublicReflectionProperty.php', 'MailPoetVendor\\Doctrine\\Persistence\\Reflection\\TypedNoDefaultReflectionProperty' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Reflection/TypedNoDefaultReflectionProperty.php', 'MailPoetVendor\\Doctrine\\Persistence\\Reflection\\TypedNoDefaultReflectionPropertyBase' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Reflection/TypedNoDefaultReflectionPropertyBase.php', 'MailPoetVendor\\Doctrine\\Persistence\\Reflection\\TypedNoDefaultRuntimePublicReflectionProperty' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Reflection/TypedNoDefaultRuntimePublicReflectionProperty.php', 'MailPoetVendor\\Egulias\\EmailValidator\\EmailLexer' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/EmailLexer.php', 'MailPoetVendor\\Egulias\\EmailValidator\\EmailParser' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/EmailParser.php', 'MailPoetVendor\\Egulias\\EmailValidator\\EmailValidator' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/EmailValidator.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\AtextAfterCFWS' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/AtextAfterCFWS.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\CRLFAtTheEnd' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/CRLFAtTheEnd.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\CRLFX2' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/CRLFX2.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\CRNoLF' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/CRNoLF.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\CharNotAllowed' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/CharNotAllowed.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\CommaInDomain' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/CommaInDomain.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\ConsecutiveAt' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/ConsecutiveAt.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\ConsecutiveDot' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/ConsecutiveDot.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\DomainAcceptsNoMail' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/DomainAcceptsNoMail.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\DomainHyphened' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/DomainHyphened.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\DotAtEnd' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/DotAtEnd.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\DotAtStart' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/DotAtStart.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\ExpectingAT' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/ExpectingAT.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\ExpectingATEXT' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/ExpectingATEXT.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\ExpectingCTEXT' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/ExpectingCTEXT.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\ExpectingDTEXT' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/ExpectingDTEXT.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\ExpectingDomainLiteralClose' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/ExpectingDomainLiteralClose.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\ExpectingQPair' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/ExpectingQPair.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\InvalidEmail' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/InvalidEmail.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\LocalOrReservedDomain' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/LocalOrReservedDomain.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\NoDNSRecord' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/NoDNSRecord.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\NoDomainPart' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/NoDomainPart.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\NoLocalPart' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/NoLocalPart.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\UnclosedComment' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/UnclosedComment.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\UnclosedQuotedString' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/UnclosedQuotedString.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\UnopenedComment' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/UnopenedComment.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Parser\\DomainPart' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Parser/DomainPart.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Parser\\LocalPart' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Parser/LocalPart.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Parser\\Parser' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Parser/Parser.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\DNSCheckValidation' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/DNSCheckValidation.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\EmailValidation' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/EmailValidation.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\Error\\RFCWarnings' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/Error/RFCWarnings.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\Error\\SpoofEmail' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/Error/SpoofEmail.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\Exception\\EmptyValidationList' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\MultipleErrors' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/MultipleErrors.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\MultipleValidationWithAnd' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\NoRFCWarningsValidation' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\RFCValidation' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/RFCValidation.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\SpoofCheckValidation' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/SpoofCheckValidation.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\AddressLiteral' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/AddressLiteral.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\CFWSNearAt' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/CFWSNearAt.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\CFWSWithFWS' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/CFWSWithFWS.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\Comment' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/Comment.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\DeprecatedComment' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/DeprecatedComment.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\DomainLiteral' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/DomainLiteral.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\DomainTooLong' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/DomainTooLong.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\EmailTooLong' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/EmailTooLong.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\IPV6BadChar' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/IPV6BadChar.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\IPV6ColonEnd' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/IPV6ColonEnd.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\IPV6ColonStart' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/IPV6ColonStart.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\IPV6Deprecated' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/IPV6Deprecated.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\IPV6DoubleColon' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/IPV6DoubleColon.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\IPV6GroupCount' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/IPV6GroupCount.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\IPV6MaxGroups' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/IPV6MaxGroups.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\LabelTooLong' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/LabelTooLong.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\LocalTooLong' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/LocalTooLong.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\NoDNSMXRecord' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/NoDNSMXRecord.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\ObsoleteDTEXT' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/ObsoleteDTEXT.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\QuotedPart' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/QuotedPart.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\QuotedString' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/QuotedString.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\TLD' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/TLD.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\Warning' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/Warning.php', 'MailPoetVendor\\Gregwar\\Captcha\\CaptchaBuilder' => $baseDir . '/vendor-prefixed/gregwar/captcha/src/Gregwar/Captcha/CaptchaBuilder.php', 'MailPoetVendor\\Gregwar\\Captcha\\CaptchaBuilderInterface' => $baseDir . '/vendor-prefixed/gregwar/captcha/src/Gregwar/Captcha/CaptchaBuilderInterface.php', 'MailPoetVendor\\Gregwar\\Captcha\\ImageFileHandler' => $baseDir . '/vendor-prefixed/gregwar/captcha/src/Gregwar/Captcha/ImageFileHandler.php', 'MailPoetVendor\\Gregwar\\Captcha\\PhraseBuilder' => $baseDir . '/vendor-prefixed/gregwar/captcha/src/Gregwar/Captcha/PhraseBuilder.php', 'MailPoetVendor\\Gregwar\\Captcha\\PhraseBuilderInterface' => $baseDir . '/vendor-prefixed/gregwar/captcha/src/Gregwar/Captcha/PhraseBuilderInterface.php', 'MailPoetVendor\\Idiorm\\IdiormMethodMissingException' => $baseDir . '/lib-3rd-party/Idiorm/idiorm.php', 'MailPoetVendor\\Idiorm\\IdiormResultSet' => $baseDir . '/lib-3rd-party/Idiorm/idiorm.php', 'MailPoetVendor\\Idiorm\\IdiormString' => $baseDir . '/lib-3rd-party/Idiorm/idiorm.php', 'MailPoetVendor\\Idiorm\\IdiormStringException' => $baseDir . '/lib-3rd-party/Idiorm/idiorm.php', 'MailPoetVendor\\Idiorm\\ORM' => $baseDir . '/lib-3rd-party/Idiorm/idiorm.php', 'MailPoetVendor\\Monolog\\ErrorHandler' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/ErrorHandler.php', 'MailPoetVendor\\Monolog\\Formatter\\FormatterInterface' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php', 'MailPoetVendor\\Monolog\\Formatter\\LineFormatter' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/LineFormatter.php', 'MailPoetVendor\\Monolog\\Formatter\\NormalizerFormatter' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php', 'MailPoetVendor\\Monolog\\Handler\\AbstractHandler' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Handler/AbstractHandler.php', 'MailPoetVendor\\Monolog\\Handler\\AbstractProcessingHandler' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php', 'MailPoetVendor\\Monolog\\Handler\\HandlerInterface' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Handler/HandlerInterface.php', 'MailPoetVendor\\Monolog\\Logger' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Logger.php', 'MailPoetVendor\\Monolog\\Processor\\IntrospectionProcessor' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php', 'MailPoetVendor\\Monolog\\Processor\\MemoryProcessor' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php', 'MailPoetVendor\\Monolog\\Processor\\MemoryUsageProcessor' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php', 'MailPoetVendor\\Monolog\\Processor\\ProcessorInterface' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php', 'MailPoetVendor\\Monolog\\Processor\\WebProcessor' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Processor/WebProcessor.php', 'MailPoetVendor\\Monolog\\Registry' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Registry.php', 'MailPoetVendor\\Monolog\\ResettableInterface' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/ResettableInterface.php', 'MailPoetVendor\\Monolog\\SignalHandler' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/SignalHandler.php', 'MailPoetVendor\\Monolog\\Utils' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Utils.php', 'MailPoetVendor\\Normalizer' => $baseDir . '/vendor-prefixed/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'MailPoetVendor\\Paris\\Model' => $baseDir . '/lib-3rd-party/Paris/paris.php', 'MailPoetVendor\\Paris\\ORMWrapper' => $baseDir . '/lib-3rd-party/Paris/paris.php', 'MailPoetVendor\\Paris\\ParisMethodMissingException' => $baseDir . '/lib-3rd-party/Paris/paris.php', 'MailPoetVendor\\Psr\\Cache\\CacheException' => $baseDir . '/vendor-prefixed/psr/cache/src/CacheException.php', 'MailPoetVendor\\Psr\\Cache\\CacheItemInterface' => $baseDir . '/vendor-prefixed/psr/cache/src/CacheItemInterface.php', 'MailPoetVendor\\Psr\\Cache\\CacheItemPoolInterface' => $baseDir . '/vendor-prefixed/psr/cache/src/CacheItemPoolInterface.php', 'MailPoetVendor\\Psr\\Cache\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/psr/cache/src/InvalidArgumentException.php', 'MailPoetVendor\\Psr\\Container\\ContainerExceptionInterface' => $baseDir . '/vendor-prefixed/psr/container/src/ContainerExceptionInterface.php', 'MailPoetVendor\\Psr\\Container\\ContainerInterface' => $baseDir . '/vendor-prefixed/psr/container/src/ContainerInterface.php', 'MailPoetVendor\\Psr\\Container\\NotFoundExceptionInterface' => $baseDir . '/vendor-prefixed/psr/container/src/NotFoundExceptionInterface.php', 'MailPoetVendor\\Psr\\Log\\AbstractLogger' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/AbstractLogger.php', 'MailPoetVendor\\Psr\\Log\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/InvalidArgumentException.php', 'MailPoetVendor\\Psr\\Log\\LogLevel' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/LogLevel.php', 'MailPoetVendor\\Psr\\Log\\LoggerAwareInterface' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/LoggerAwareInterface.php', 'MailPoetVendor\\Psr\\Log\\LoggerAwareTrait' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/LoggerAwareTrait.php', 'MailPoetVendor\\Psr\\Log\\LoggerInterface' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/LoggerInterface.php', 'MailPoetVendor\\Psr\\Log\\LoggerTrait' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/LoggerTrait.php', 'MailPoetVendor\\Psr\\Log\\NullLogger' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/NullLogger.php', 'MailPoetVendor\\Psr\\Log\\Test\\DummyTest' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/Test/DummyTest.php', 'MailPoetVendor\\Psr\\Log\\Test\\LoggerInterfaceTest' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', 'MailPoetVendor\\Psr\\Log\\Test\\TestLogger' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/Test/TestLogger.php', 'MailPoetVendor\\Sabberworm\\CSS\\CSSList\\AtRuleBlockList' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/AtRuleBlockList.php', 'MailPoetVendor\\Sabberworm\\CSS\\CSSList\\CSSBlockList' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/CSSBlockList.php', 'MailPoetVendor\\Sabberworm\\CSS\\CSSList\\CSSList' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/CSSList.php', 'MailPoetVendor\\Sabberworm\\CSS\\CSSList\\Document' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/Document.php', 'MailPoetVendor\\Sabberworm\\CSS\\CSSList\\KeyFrame' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/KeyFrame.php', 'MailPoetVendor\\Sabberworm\\CSS\\Comment\\Comment' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Comment/Comment.php', 'MailPoetVendor\\Sabberworm\\CSS\\Comment\\Commentable' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Comment/Commentable.php', 'MailPoetVendor\\Sabberworm\\CSS\\OutputFormat' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/OutputFormat.php', 'MailPoetVendor\\Sabberworm\\CSS\\OutputFormatter' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/OutputFormat.php', 'MailPoetVendor\\Sabberworm\\CSS\\Parser' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Parser.php', 'MailPoetVendor\\Sabberworm\\CSS\\Parsing\\OutputException' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Parsing/OutputException.php', 'MailPoetVendor\\Sabberworm\\CSS\\Parsing\\ParserState' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Parsing/ParserState.php', 'MailPoetVendor\\Sabberworm\\CSS\\Parsing\\SourceException' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Parsing/SourceException.php', 'MailPoetVendor\\Sabberworm\\CSS\\Parsing\\UnexpectedTokenException' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Parsing/UnexpectedTokenException.php', 'MailPoetVendor\\Sabberworm\\CSS\\Property\\AtRule' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Property/AtRule.php', 'MailPoetVendor\\Sabberworm\\CSS\\Property\\CSSNamespace' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Property/CSSNamespace.php', 'MailPoetVendor\\Sabberworm\\CSS\\Property\\Charset' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Property/Charset.php', 'MailPoetVendor\\Sabberworm\\CSS\\Property\\Import' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Property/Import.php', 'MailPoetVendor\\Sabberworm\\CSS\\Property\\Selector' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Property/Selector.php', 'MailPoetVendor\\Sabberworm\\CSS\\Renderable' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Renderable.php', 'MailPoetVendor\\Sabberworm\\CSS\\RuleSet\\AtRuleSet' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/RuleSet/AtRuleSet.php', 'MailPoetVendor\\Sabberworm\\CSS\\RuleSet\\DeclarationBlock' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/RuleSet/DeclarationBlock.php', 'MailPoetVendor\\Sabberworm\\CSS\\RuleSet\\RuleSet' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/RuleSet/RuleSet.php', 'MailPoetVendor\\Sabberworm\\CSS\\Rule\\Rule' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Rule/Rule.php', 'MailPoetVendor\\Sabberworm\\CSS\\Settings' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Settings.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\CSSFunction' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/CSSFunction.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\CSSString' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/CSSString.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\CalcFunction' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/CalcFunction.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\CalcRuleValueList' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/CalcRuleValueList.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\Color' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/Color.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\LineName' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/LineName.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\PrimitiveValue' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/PrimitiveValue.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\RuleValueList' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/RuleValueList.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\Size' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/Size.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\URL' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/URL.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\Value' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/Value.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\ValueList' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/ValueList.php', 'MailPoetVendor\\Stringable' => $baseDir . '/vendor-prefixed/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'MailPoetVendor\\Sudzy\\Engine' => $baseDir . '/lib-3rd-party/Sudzy/Engine.php', 'MailPoetVendor\\Sudzy\\ValidModel' => $baseDir . '/lib-3rd-party/Sudzy/ValidModel.php', 'MailPoetVendor\\Sudzy\\ValidationException' => $baseDir . '/lib-3rd-party/Sudzy/ValidationException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Alias' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Alias.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\ArgumentInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/ArgumentInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\BoundArgument' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/BoundArgument.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\IteratorArgument' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/IteratorArgument.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\ReferenceSetArgumentTrait' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/ReferenceSetArgumentTrait.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\RewindableGenerator' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/RewindableGenerator.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\ServiceClosureArgument' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/ServiceClosureArgument.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocator' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/ServiceLocator.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocatorArgument' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/ServiceLocatorArgument.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\TaggedIteratorArgument' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/TaggedIteratorArgument.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ChildDefinition' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ChildDefinition.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Container' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Container.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ContainerAwareInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ContainerAwareInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ContainerAwareTrait' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ContainerAwareTrait.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ContainerBuilder' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ContainerBuilder.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ContainerInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ContainerInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Definition' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Definition.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\EnvVarLoaderInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/EnvVarLoaderInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\EnvVarProcessor' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/EnvVarProcessor.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\EnvVarProcessorInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/EnvVarProcessorInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\AutowiringFailedException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/AutowiringFailedException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\BadMethodCallException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/BadMethodCallException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\EnvNotFoundException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/EnvNotFoundException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\EnvParameterException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/EnvParameterException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\ExceptionInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/ExceptionInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/InvalidArgumentException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\InvalidParameterTypeException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/InvalidParameterTypeException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\LogicException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/LogicException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\OutOfBoundsException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/OutOfBoundsException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\ParameterCircularReferenceException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\ParameterNotFoundException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/ParameterNotFoundException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\RuntimeException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/RuntimeException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\ServiceCircularReferenceException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\ServiceNotFoundException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/ServiceNotFoundException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ExpressionLanguage' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ExpressionLanguage.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ExpressionLanguageProvider' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ExpressionLanguageProvider.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Parameter' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Parameter.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBag' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ParameterBag/ContainerBag.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBagInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\EnvPlaceholderParameterBag' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\FrozenParameterBag' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ParameterBag/ParameterBag.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBagInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Reference' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Reference.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ResettableContainerInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ResettableContainerInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ReverseContainer' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ReverseContainer.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ServiceLocator' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ServiceLocator.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ServiceSubscriberInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ServiceSubscriberInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\TaggedContainerInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/TaggedContainerInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\TypedReference' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/TypedReference.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Variable' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Variable.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Comparator\\Comparator' => $baseDir . '/vendor-prefixed/symfony/finder/Comparator/Comparator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Comparator\\DateComparator' => $baseDir . '/vendor-prefixed/symfony/finder/Comparator/DateComparator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Comparator\\NumberComparator' => $baseDir . '/vendor-prefixed/symfony/finder/Comparator/NumberComparator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => $baseDir . '/vendor-prefixed/symfony/finder/Exception/AccessDeniedException.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => $baseDir . '/vendor-prefixed/symfony/finder/Exception/DirectoryNotFoundException.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Finder' => $baseDir . '/vendor-prefixed/symfony/finder/Finder.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Gitignore' => $baseDir . '/vendor-prefixed/symfony/finder/Gitignore.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Glob' => $baseDir . '/vendor-prefixed/symfony/finder/Glob.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/CustomFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/DateRangeFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/DepthRangeFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/FileTypeFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/FilecontentFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/FilenameFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\LazyIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/LazyIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/MultiplePcreFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/PathFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/RecursiveDirectoryIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/SizeRangeFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\SortableIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/SortableIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\SplFileInfo' => $baseDir . '/vendor-prefixed/symfony/finder/SplFileInfo.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\DataCollectorTranslator' => $baseDir . '/vendor-prefixed/symfony/translation/DataCollectorTranslator.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => $baseDir . '/vendor-prefixed/symfony/translation/Exception/ExceptionInterface.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Exception\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/symfony/translation/Exception/InvalidArgumentException.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => $baseDir . '/vendor-prefixed/symfony/translation/Exception/InvalidResourceException.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Exception\\LogicException' => $baseDir . '/vendor-prefixed/symfony/translation/Exception/LogicException.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => $baseDir . '/vendor-prefixed/symfony/translation/Exception/NotFoundResourceException.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Exception\\RuntimeException' => $baseDir . '/vendor-prefixed/symfony/translation/Exception/RuntimeException.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\IdentityTranslator' => $baseDir . '/vendor-prefixed/symfony/translation/IdentityTranslator.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Interval' => $baseDir . '/vendor-prefixed/symfony/translation/Interval.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\LoggingTranslator' => $baseDir . '/vendor-prefixed/symfony/translation/LoggingTranslator.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\MessageCatalogue' => $baseDir . '/vendor-prefixed/symfony/translation/MessageCatalogue.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\MessageCatalogueInterface' => $baseDir . '/vendor-prefixed/symfony/translation/MessageCatalogueInterface.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\MessageSelector' => $baseDir . '/vendor-prefixed/symfony/translation/MessageSelector.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\MetadataAwareInterface' => $baseDir . '/vendor-prefixed/symfony/translation/MetadataAwareInterface.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\PluralizationRules' => $baseDir . '/vendor-prefixed/symfony/translation/PluralizationRules.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Translator' => $baseDir . '/vendor-prefixed/symfony/translation/Translator.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\TranslatorBagInterface' => $baseDir . '/vendor-prefixed/symfony/translation/TranslatorBagInterface.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\TranslatorInterface' => $baseDir . '/vendor-prefixed/symfony/translation/TranslatorInterface.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Util\\ArrayConverter' => $baseDir . '/vendor-prefixed/symfony/translation/Util/ArrayConverter.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Util\\XliffUtils' => $baseDir . '/vendor-prefixed/symfony/translation/Util/XliffUtils.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraint' => $baseDir . '/vendor-prefixed/symfony/validator/Constraint.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ConstraintValidator' => $baseDir . '/vendor-prefixed/symfony/validator/ConstraintValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ConstraintValidatorFactory' => $baseDir . '/vendor-prefixed/symfony/validator/ConstraintValidatorFactory.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ConstraintValidatorFactoryInterface' => $baseDir . '/vendor-prefixed/symfony/validator/ConstraintValidatorFactoryInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ConstraintValidatorInterface' => $baseDir . '/vendor-prefixed/symfony/validator/ConstraintValidatorInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ConstraintViolation' => $baseDir . '/vendor-prefixed/symfony/validator/ConstraintViolation.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ConstraintViolationInterface' => $baseDir . '/vendor-prefixed/symfony/validator/ConstraintViolationInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ConstraintViolationList' => $baseDir . '/vendor-prefixed/symfony/validator/ConstraintViolationList.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ConstraintViolationListInterface' => $baseDir . '/vendor-prefixed/symfony/validator/ConstraintViolationListInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\AbstractComparison' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/AbstractComparison.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\AbstractComparisonValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/AbstractComparisonValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\All' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/All.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\AllValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/AllValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Bic' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Bic.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\BicValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/BicValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Blank' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Blank.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\BlankValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/BlankValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Callback' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Callback.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\CallbackValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/CallbackValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\CardScheme' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/CardScheme.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\CardSchemeValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/CardSchemeValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Choice' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Choice.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\ChoiceValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/ChoiceValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Collection' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Collection.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\CollectionValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/CollectionValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Composite' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Composite.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Count' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Count.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\CountValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/CountValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Country' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Country.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\CountryValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/CountryValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Currency' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Currency.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\CurrencyValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/CurrencyValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Date' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Date.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\DateTime' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/DateTime.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\DateTimeValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/DateTimeValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\DateValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/DateValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\DisableAutoMapping' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/DisableAutoMapping.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\DivisibleBy' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/DivisibleBy.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\DivisibleByValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/DivisibleByValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Email' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Email.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\EmailValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/EmailValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\EnableAutoMapping' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/EnableAutoMapping.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\EqualTo' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/EqualTo.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\EqualToValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/EqualToValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Existence' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Existence.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Expression' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Expression.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\ExpressionValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/ExpressionValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\File' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/File.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\FileValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/FileValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\GreaterThan' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/GreaterThan.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\GreaterThanOrEqual' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/GreaterThanOrEqual.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\GreaterThanOrEqualValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/GreaterThanOrEqualValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\GreaterThanValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/GreaterThanValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\GroupSequence' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/GroupSequence.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\GroupSequenceProvider' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/GroupSequenceProvider.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Iban' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Iban.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IbanValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IbanValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IdenticalTo' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IdenticalTo.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IdenticalToValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IdenticalToValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Image' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Image.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\ImageValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/ImageValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Ip' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Ip.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IpValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IpValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IsFalse' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IsFalse.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IsFalseValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IsFalseValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IsNull' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IsNull.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IsNullValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IsNullValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IsTrue' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IsTrue.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IsTrueValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IsTrueValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Isbn' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Isbn.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IsbnValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IsbnValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Issn' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Issn.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IssnValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IssnValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Json' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Json.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\JsonValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/JsonValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Language' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Language.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\LanguageValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/LanguageValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Length' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Length.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\LengthValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/LengthValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\LessThan' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/LessThan.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\LessThanOrEqual' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/LessThanOrEqual.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\LessThanOrEqualValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/LessThanOrEqualValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\LessThanValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/LessThanValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Locale' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Locale.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\LocaleValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/LocaleValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Luhn' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Luhn.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\LuhnValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/LuhnValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Negative' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Negative.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NegativeOrZero' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NegativeOrZero.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotBlank' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotBlank.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotBlankValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotBlankValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotCompromisedPassword' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotCompromisedPassword.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotCompromisedPasswordValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotCompromisedPasswordValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotEqualTo' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotEqualTo.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotEqualToValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotEqualToValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotIdenticalTo' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotIdenticalTo.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotIdenticalToValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotIdenticalToValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotNull' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotNull.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotNullValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotNullValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NumberConstraintTrait' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NumberConstraintTrait.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Optional' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Optional.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Positive' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Positive.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\PositiveOrZero' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/PositiveOrZero.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Range' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Range.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\RangeValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/RangeValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Regex' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Regex.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\RegexValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/RegexValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Required' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Required.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Time' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Time.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\TimeValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/TimeValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Timezone' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Timezone.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\TimezoneValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/TimezoneValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Traverse' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Traverse.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Type' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Type.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\TypeValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/TypeValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Unique' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Unique.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\UniqueValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/UniqueValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Url' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Url.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\UrlValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/UrlValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Uuid' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Uuid.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\UuidValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/UuidValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Valid' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Valid.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\ValidValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/ValidValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ContainerConstraintValidatorFactory' => $baseDir . '/vendor-prefixed/symfony/validator/ContainerConstraintValidatorFactory.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Context\\ExecutionContext' => $baseDir . '/vendor-prefixed/symfony/validator/Context/ExecutionContext.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Context\\ExecutionContextFactory' => $baseDir . '/vendor-prefixed/symfony/validator/Context/ExecutionContextFactory.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Context\\ExecutionContextFactoryInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Context/ExecutionContextFactoryInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Context\\ExecutionContextInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Context/ExecutionContextInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\BadMethodCallException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/BadMethodCallException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\ConstraintDefinitionException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/ConstraintDefinitionException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\ExceptionInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/ExceptionInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\GroupDefinitionException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/GroupDefinitionException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/InvalidArgumentException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\InvalidOptionsException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/InvalidOptionsException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\LogicException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/LogicException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\MappingException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/MappingException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\MissingOptionsException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/MissingOptionsException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\NoSuchMetadataException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/NoSuchMetadataException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\OutOfBoundsException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/OutOfBoundsException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\RuntimeException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/RuntimeException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\UnexpectedTypeException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/UnexpectedTypeException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\UnexpectedValueException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/UnexpectedValueException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\UnsupportedMetadataException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/UnsupportedMetadataException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\ValidatorException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/ValidatorException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\GroupSequenceProviderInterface' => $baseDir . '/vendor-prefixed/symfony/validator/GroupSequenceProviderInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\AutoMappingStrategy' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/AutoMappingStrategy.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Cache\\CacheInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Cache/CacheInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Cache\\DoctrineCache' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Cache/DoctrineCache.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Cache\\Psr6Cache' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Cache/Psr6Cache.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\CascadingStrategy' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/CascadingStrategy.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\ClassMetadata' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/ClassMetadata.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\ClassMetadataInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/ClassMetadataInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Factory\\BlackHoleMetadataFactory' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Factory/BlackHoleMetadataFactory.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Factory\\LazyLoadingMetadataFactory' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Factory/LazyLoadingMetadataFactory.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Factory\\MetadataFactoryInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Factory/MetadataFactoryInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\GenericMetadata' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/GenericMetadata.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\GetterMetadata' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/GetterMetadata.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\AbstractLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/AbstractLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\AnnotationLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/AnnotationLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\AutoMappingTrait' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/AutoMappingTrait.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\FileLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/FileLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\FilesLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/FilesLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\LoaderChain' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/LoaderChain.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\LoaderInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/LoaderInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\PropertyInfoLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/PropertyInfoLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\StaticMethodLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/StaticMethodLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\XmlFileLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/XmlFileLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\XmlFilesLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/XmlFilesLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\YamlFileLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/YamlFileLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\YamlFilesLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/YamlFilesLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\MemberMetadata' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/MemberMetadata.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\MetadataInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/MetadataInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\PropertyMetadata' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/PropertyMetadata.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\PropertyMetadataInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/PropertyMetadataInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\TraversalStrategy' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/TraversalStrategy.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ObjectInitializerInterface' => $baseDir . '/vendor-prefixed/symfony/validator/ObjectInitializerInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Util\\LegacyTranslatorProxy' => $baseDir . '/vendor-prefixed/symfony/validator/Util/LegacyTranslatorProxy.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Util\\PropertyPath' => $baseDir . '/vendor-prefixed/symfony/validator/Util/PropertyPath.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Validation' => $baseDir . '/vendor-prefixed/symfony/validator/Validation.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ValidatorBuilder' => $baseDir . '/vendor-prefixed/symfony/validator/ValidatorBuilder.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ValidatorBuilderInterface' => $baseDir . '/vendor-prefixed/symfony/validator/ValidatorBuilderInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Validator\\ContextualValidatorInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Validator/ContextualValidatorInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Validator\\LazyProperty' => $baseDir . '/vendor-prefixed/symfony/validator/Validator/LazyProperty.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Validator\\RecursiveContextualValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Validator/RecursiveContextualValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Validator\\RecursiveValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Validator/RecursiveValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Validator\\TraceableValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Validator/TraceableValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Validator\\ValidatorInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Validator/ValidatorInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Violation\\ConstraintViolationBuilder' => $baseDir . '/vendor-prefixed/symfony/validator/Violation/ConstraintViolationBuilder.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Violation\\ConstraintViolationBuilderInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Violation/ConstraintViolationBuilderInterface.php', 'MailPoetVendor\\Symfony\\Contracts\\Service\\ResetInterface' => $baseDir . '/vendor-prefixed/symfony/service-contracts/ResetInterface.php', 'MailPoetVendor\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => $baseDir . '/vendor-prefixed/symfony/service-contracts/ServiceLocatorTrait.php', 'MailPoetVendor\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => $baseDir . '/vendor-prefixed/symfony/service-contracts/ServiceProviderInterface.php', 'MailPoetVendor\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => $baseDir . '/vendor-prefixed/symfony/service-contracts/ServiceSubscriberInterface.php', 'MailPoetVendor\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => $baseDir . '/vendor-prefixed/symfony/service-contracts/ServiceSubscriberTrait.php', 'MailPoetVendor\\Symfony\\Contracts\\Service\\Test\\ServiceLocatorTest' => $baseDir . '/vendor-prefixed/symfony/service-contracts/Test/ServiceLocatorTest.php', 'MailPoetVendor\\Symfony\\Contracts\\Translation\\LocaleAwareInterface' => $baseDir . '/vendor-prefixed/symfony/translation-contracts/LocaleAwareInterface.php', 'MailPoetVendor\\Symfony\\Contracts\\Translation\\Test\\TranslatorTest' => $baseDir . '/vendor-prefixed/symfony/translation-contracts/Test/TranslatorTest.php', 'MailPoetVendor\\Symfony\\Contracts\\Translation\\TranslatorInterface' => $baseDir . '/vendor-prefixed/symfony/translation-contracts/TranslatorInterface.php', 'MailPoetVendor\\Symfony\\Contracts\\Translation\\TranslatorTrait' => $baseDir . '/vendor-prefixed/symfony/translation-contracts/TranslatorTrait.php', 'MailPoetVendor\\Symfony\\Polyfill\\Ctype\\Ctype' => $baseDir . '/vendor-prefixed/symfony/polyfill-ctype/Ctype.php', 'MailPoetVendor\\Symfony\\Polyfill\\Iconv\\Iconv' => $baseDir . '/vendor-prefixed/symfony/polyfill-iconv/Iconv.php', 'MailPoetVendor\\Symfony\\Polyfill\\Intl\\Idn\\Idn' => $baseDir . '/vendor-prefixed/symfony/polyfill-intl-idn/Idn.php', 'MailPoetVendor\\Symfony\\Polyfill\\Intl\\Idn\\Info' => $baseDir . '/vendor-prefixed/symfony/polyfill-intl-idn/Info.php', 'MailPoetVendor\\Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\DisallowedRanges' => $baseDir . '/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php', 'MailPoetVendor\\Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\Regex' => $baseDir . '/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/Regex.php', 'MailPoetVendor\\Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => $baseDir . '/vendor-prefixed/symfony/polyfill-intl-normalizer/Normalizer.php', 'MailPoetVendor\\Symfony\\Polyfill\\Mbstring\\Mbstring' => $baseDir . '/vendor-prefixed/symfony/polyfill-mbstring/Mbstring.php', 'MailPoetVendor\\Symfony\\Polyfill\\Php72\\Php72' => $baseDir . '/vendor-prefixed/symfony/polyfill-php72/Php72.php', 'MailPoetVendor\\Symfony\\Polyfill\\Php80\\Php80' => $baseDir . '/vendor-prefixed/symfony/polyfill-php80/Php80.php', 'MailPoetVendor\\Text_Diff_Renderer_parallel' => $baseDir . '/vendor-prefixed/cerdic/css-tidy/testing/unit-tests/class.Text_Diff_Renderer_parallel.php', 'MailPoetVendor\\Twig\\Cache\\CacheInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Cache/CacheInterface.php', 'MailPoetVendor\\Twig\\Cache\\FilesystemCache' => $baseDir . '/vendor-prefixed/twig/twig/src/Cache/FilesystemCache.php', 'MailPoetVendor\\Twig\\Cache\\NullCache' => $baseDir . '/vendor-prefixed/twig/twig/src/Cache/NullCache.php', 'MailPoetVendor\\Twig\\Compiler' => $baseDir . '/vendor-prefixed/twig/twig/src/Compiler.php', 'MailPoetVendor\\Twig\\Environment' => $baseDir . '/vendor-prefixed/twig/twig/src/Environment.php', 'MailPoetVendor\\Twig\\Error\\Error' => $baseDir . '/vendor-prefixed/twig/twig/src/Error/Error.php', 'MailPoetVendor\\Twig\\Error\\LoaderError' => $baseDir . '/vendor-prefixed/twig/twig/src/Error/LoaderError.php', 'MailPoetVendor\\Twig\\Error\\RuntimeError' => $baseDir . '/vendor-prefixed/twig/twig/src/Error/RuntimeError.php', 'MailPoetVendor\\Twig\\Error\\SyntaxError' => $baseDir . '/vendor-prefixed/twig/twig/src/Error/SyntaxError.php', 'MailPoetVendor\\Twig\\ExpressionParser' => $baseDir . '/vendor-prefixed/twig/twig/src/ExpressionParser.php', 'MailPoetVendor\\Twig\\ExtensionSet' => $baseDir . '/vendor-prefixed/twig/twig/src/ExtensionSet.php', 'MailPoetVendor\\Twig\\Extension\\AbstractExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/AbstractExtension.php', 'MailPoetVendor\\Twig\\Extension\\CoreExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/CoreExtension.php', 'MailPoetVendor\\Twig\\Extension\\DebugExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/DebugExtension.php', 'MailPoetVendor\\Twig\\Extension\\EscaperExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/EscaperExtension.php', 'MailPoetVendor\\Twig\\Extension\\ExtensionInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/ExtensionInterface.php', 'MailPoetVendor\\Twig\\Extension\\GlobalsInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/GlobalsInterface.php', 'MailPoetVendor\\Twig\\Extension\\InitRuntimeInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/InitRuntimeInterface.php', 'MailPoetVendor\\Twig\\Extension\\OptimizerExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/OptimizerExtension.php', 'MailPoetVendor\\Twig\\Extension\\ProfilerExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/ProfilerExtension.php', 'MailPoetVendor\\Twig\\Extension\\RuntimeExtensionInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/RuntimeExtensionInterface.php', 'MailPoetVendor\\Twig\\Extension\\SandboxExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/SandboxExtension.php', 'MailPoetVendor\\Twig\\Extension\\StagingExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/StagingExtension.php', 'MailPoetVendor\\Twig\\Extension\\StringLoaderExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/StringLoaderExtension.php', 'MailPoetVendor\\Twig\\FileExtensionEscapingStrategy' => $baseDir . '/vendor-prefixed/twig/twig/src/FileExtensionEscapingStrategy.php', 'MailPoetVendor\\Twig\\Lexer' => $baseDir . '/vendor-prefixed/twig/twig/src/Lexer.php', 'MailPoetVendor\\Twig\\Loader\\ArrayLoader' => $baseDir . '/vendor-prefixed/twig/twig/src/Loader/ArrayLoader.php', 'MailPoetVendor\\Twig\\Loader\\ChainLoader' => $baseDir . '/vendor-prefixed/twig/twig/src/Loader/ChainLoader.php', 'MailPoetVendor\\Twig\\Loader\\ExistsLoaderInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Loader/ExistsLoaderInterface.php', 'MailPoetVendor\\Twig\\Loader\\FilesystemLoader' => $baseDir . '/vendor-prefixed/twig/twig/src/Loader/FilesystemLoader.php', 'MailPoetVendor\\Twig\\Loader\\LoaderInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Loader/LoaderInterface.php', 'MailPoetVendor\\Twig\\Loader\\SourceContextLoaderInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Loader/SourceContextLoaderInterface.php', 'MailPoetVendor\\Twig\\Markup' => $baseDir . '/vendor-prefixed/twig/twig/src/Markup.php', 'MailPoetVendor\\Twig\\NodeTraverser' => $baseDir . '/vendor-prefixed/twig/twig/src/NodeTraverser.php', 'MailPoetVendor\\Twig\\NodeVisitor\\AbstractNodeVisitor' => $baseDir . '/vendor-prefixed/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php', 'MailPoetVendor\\Twig\\NodeVisitor\\EscaperNodeVisitor' => $baseDir . '/vendor-prefixed/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php', 'MailPoetVendor\\Twig\\NodeVisitor\\MacroAutoImportNodeVisitor' => $baseDir . '/vendor-prefixed/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.php', 'MailPoetVendor\\Twig\\NodeVisitor\\NodeVisitorInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/NodeVisitor/NodeVisitorInterface.php', 'MailPoetVendor\\Twig\\NodeVisitor\\OptimizerNodeVisitor' => $baseDir . '/vendor-prefixed/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php', 'MailPoetVendor\\Twig\\NodeVisitor\\SafeAnalysisNodeVisitor' => $baseDir . '/vendor-prefixed/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php', 'MailPoetVendor\\Twig\\NodeVisitor\\SandboxNodeVisitor' => $baseDir . '/vendor-prefixed/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php', 'MailPoetVendor\\Twig\\Node\\AutoEscapeNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/AutoEscapeNode.php', 'MailPoetVendor\\Twig\\Node\\BlockNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/BlockNode.php', 'MailPoetVendor\\Twig\\Node\\BlockReferenceNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/BlockReferenceNode.php', 'MailPoetVendor\\Twig\\Node\\BodyNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/BodyNode.php', 'MailPoetVendor\\Twig\\Node\\CheckSecurityNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/CheckSecurityNode.php', 'MailPoetVendor\\Twig\\Node\\CheckToStringNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/CheckToStringNode.php', 'MailPoetVendor\\Twig\\Node\\DeprecatedNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/DeprecatedNode.php', 'MailPoetVendor\\Twig\\Node\\DoNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/DoNode.php', 'MailPoetVendor\\Twig\\Node\\EmbedNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/EmbedNode.php', 'MailPoetVendor\\Twig\\Node\\Expression\\AbstractExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/AbstractExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\ArrayExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/ArrayExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\ArrowFunctionExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/ArrowFunctionExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\AssignNameExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/AssignNameExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\AbstractBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/AbstractBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\AddBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/AddBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\AndBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/AndBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\BitwiseAndBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\BitwiseOrBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\BitwiseXorBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\ConcatBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/ConcatBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\DivBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/DivBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\EndsWithBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\EqualBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/EqualBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\FloorDivBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\GreaterBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/GreaterBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\GreaterEqualBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\InBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/InBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\LessBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/LessBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\LessEqualBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\MatchesBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/MatchesBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\ModBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/ModBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\MulBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/MulBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\NotEqualBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\NotInBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/NotInBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\OrBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/OrBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\PowerBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/PowerBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\RangeBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/RangeBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\SpaceshipBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\StartsWithBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Binary\\SubBinary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Binary/SubBinary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\BlockReferenceExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/BlockReferenceExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\CallExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/CallExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\ConditionalExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/ConditionalExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\ConstantExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/ConstantExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\FilterExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/FilterExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Filter\\DefaultFilter' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Filter/DefaultFilter.php', 'MailPoetVendor\\Twig\\Node\\Expression\\FunctionExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/FunctionExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\GetAttrExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/GetAttrExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\InlinePrint' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/InlinePrint.php', 'MailPoetVendor\\Twig\\Node\\Expression\\MethodCallExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/MethodCallExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\NameExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/NameExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\NullCoalesceExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/NullCoalesceExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\ParentExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/ParentExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\TempNameExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/TempNameExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\TestExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/TestExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Test\\ConstantTest' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Test/ConstantTest.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Test\\DefinedTest' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Test/DefinedTest.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Test\\DivisiblebyTest' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Test\\EvenTest' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Test/EvenTest.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Test\\NullTest' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Test/NullTest.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Test\\OddTest' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Test/OddTest.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Test\\SameasTest' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Test/SameasTest.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Unary\\AbstractUnary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Unary/AbstractUnary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Unary\\NegUnary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Unary/NegUnary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Unary\\NotUnary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Unary/NotUnary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\Unary\\PosUnary' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/Unary/PosUnary.php', 'MailPoetVendor\\Twig\\Node\\Expression\\VariadicExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/VariadicExpression.php', 'MailPoetVendor\\Twig\\Node\\FlushNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/FlushNode.php', 'MailPoetVendor\\Twig\\Node\\ForLoopNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/ForLoopNode.php', 'MailPoetVendor\\Twig\\Node\\ForNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/ForNode.php', 'MailPoetVendor\\Twig\\Node\\IfNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/IfNode.php', 'MailPoetVendor\\Twig\\Node\\ImportNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/ImportNode.php', 'MailPoetVendor\\Twig\\Node\\IncludeNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/IncludeNode.php', 'MailPoetVendor\\Twig\\Node\\MacroNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/MacroNode.php', 'MailPoetVendor\\Twig\\Node\\ModuleNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/ModuleNode.php', 'MailPoetVendor\\Twig\\Node\\Node' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Node.php', 'MailPoetVendor\\Twig\\Node\\NodeCaptureInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/NodeCaptureInterface.php', 'MailPoetVendor\\Twig\\Node\\NodeOutputInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/NodeOutputInterface.php', 'MailPoetVendor\\Twig\\Node\\PrintNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/PrintNode.php', 'MailPoetVendor\\Twig\\Node\\SandboxNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/SandboxNode.php', 'MailPoetVendor\\Twig\\Node\\SandboxedPrintNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/SandboxedPrintNode.php', 'MailPoetVendor\\Twig\\Node\\SetNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/SetNode.php', 'MailPoetVendor\\Twig\\Node\\SpacelessNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/SpacelessNode.php', 'MailPoetVendor\\Twig\\Node\\TextNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/TextNode.php', 'MailPoetVendor\\Twig\\Node\\WithNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/WithNode.php', 'MailPoetVendor\\Twig\\Parser' => $baseDir . '/vendor-prefixed/twig/twig/src/Parser.php', 'MailPoetVendor\\Twig\\Profiler\\Dumper\\BaseDumper' => $baseDir . '/vendor-prefixed/twig/twig/src/Profiler/Dumper/BaseDumper.php', 'MailPoetVendor\\Twig\\Profiler\\Dumper\\BlackfireDumper' => $baseDir . '/vendor-prefixed/twig/twig/src/Profiler/Dumper/BlackfireDumper.php', 'MailPoetVendor\\Twig\\Profiler\\Dumper\\HtmlDumper' => $baseDir . '/vendor-prefixed/twig/twig/src/Profiler/Dumper/HtmlDumper.php', 'MailPoetVendor\\Twig\\Profiler\\Dumper\\TextDumper' => $baseDir . '/vendor-prefixed/twig/twig/src/Profiler/Dumper/TextDumper.php', 'MailPoetVendor\\Twig\\Profiler\\NodeVisitor\\ProfilerNodeVisitor' => $baseDir . '/vendor-prefixed/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php', 'MailPoetVendor\\Twig\\Profiler\\Node\\EnterProfileNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Profiler/Node/EnterProfileNode.php', 'MailPoetVendor\\Twig\\Profiler\\Node\\LeaveProfileNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Profiler/Node/LeaveProfileNode.php', 'MailPoetVendor\\Twig\\Profiler\\Profile' => $baseDir . '/vendor-prefixed/twig/twig/src/Profiler/Profile.php', 'MailPoetVendor\\Twig\\RuntimeLoader\\ContainerRuntimeLoader' => $baseDir . '/vendor-prefixed/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php', 'MailPoetVendor\\Twig\\RuntimeLoader\\FactoryRuntimeLoader' => $baseDir . '/vendor-prefixed/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php', 'MailPoetVendor\\Twig\\RuntimeLoader\\RuntimeLoaderInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php', 'MailPoetVendor\\Twig\\Sandbox\\SecurityError' => $baseDir . '/vendor-prefixed/twig/twig/src/Sandbox/SecurityError.php', 'MailPoetVendor\\Twig\\Sandbox\\SecurityNotAllowedFilterError' => $baseDir . '/vendor-prefixed/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php', 'MailPoetVendor\\Twig\\Sandbox\\SecurityNotAllowedFunctionError' => $baseDir . '/vendor-prefixed/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php', 'MailPoetVendor\\Twig\\Sandbox\\SecurityNotAllowedMethodError' => $baseDir . '/vendor-prefixed/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php', 'MailPoetVendor\\Twig\\Sandbox\\SecurityNotAllowedPropertyError' => $baseDir . '/vendor-prefixed/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php', 'MailPoetVendor\\Twig\\Sandbox\\SecurityNotAllowedTagError' => $baseDir . '/vendor-prefixed/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php', 'MailPoetVendor\\Twig\\Sandbox\\SecurityPolicy' => $baseDir . '/vendor-prefixed/twig/twig/src/Sandbox/SecurityPolicy.php', 'MailPoetVendor\\Twig\\Sandbox\\SecurityPolicyInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Sandbox/SecurityPolicyInterface.php', 'MailPoetVendor\\Twig\\Source' => $baseDir . '/vendor-prefixed/twig/twig/src/Source.php', 'MailPoetVendor\\Twig\\Template' => $baseDir . '/vendor-prefixed/twig/twig/src/Template.php', 'MailPoetVendor\\Twig\\TemplateWrapper' => $baseDir . '/vendor-prefixed/twig/twig/src/TemplateWrapper.php', 'MailPoetVendor\\Twig\\Token' => $baseDir . '/vendor-prefixed/twig/twig/src/Token.php', 'MailPoetVendor\\Twig\\TokenParser\\AbstractTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/AbstractTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\ApplyTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/ApplyTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\AutoEscapeTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/AutoEscapeTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\BlockTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/BlockTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\DeprecatedTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/DeprecatedTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\DoTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/DoTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\EmbedTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/EmbedTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\ExtendsTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/ExtendsTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\FilterTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/FilterTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\FlushTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/FlushTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\ForTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/ForTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\FromTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/FromTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\IfTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/IfTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\ImportTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/ImportTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\IncludeTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/IncludeTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\MacroTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/MacroTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\SandboxTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/SandboxTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\SetTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/SetTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\SpacelessTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/SpacelessTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\TokenParserInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/TokenParserInterface.php', 'MailPoetVendor\\Twig\\TokenParser\\UseTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/UseTokenParser.php', 'MailPoetVendor\\Twig\\TokenParser\\WithTokenParser' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenParser/WithTokenParser.php', 'MailPoetVendor\\Twig\\TokenStream' => $baseDir . '/vendor-prefixed/twig/twig/src/TokenStream.php', 'MailPoetVendor\\Twig\\TwigFilter' => $baseDir . '/vendor-prefixed/twig/twig/src/TwigFilter.php', 'MailPoetVendor\\Twig\\TwigFunction' => $baseDir . '/vendor-prefixed/twig/twig/src/TwigFunction.php', 'MailPoetVendor\\Twig\\TwigTest' => $baseDir . '/vendor-prefixed/twig/twig/src/TwigTest.php', 'MailPoetVendor\\Twig\\Util\\DeprecationCollector' => $baseDir . '/vendor-prefixed/twig/twig/src/Util/DeprecationCollector.php', 'MailPoetVendor\\Twig\\Util\\TemplateDirIterator' => $baseDir . '/vendor-prefixed/twig/twig/src/Util/TemplateDirIterator.php', 'MailPoetVendor\\UnhandledMatchError' => $baseDir . '/vendor-prefixed/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'MailPoetVendor\\ValueError' => $baseDir . '/vendor-prefixed/symfony/polyfill-php80/Resources/stubs/ValueError.php', 'MailPoetVendor\\XLSXWriter' => $baseDir . '/lib-3rd-party/XLSXWriter.php', 'MailPoetVendor\\XLSXWriter_BuffererWriter' => $baseDir . '/lib-3rd-party/XLSXWriter.php', 'MailPoetVendor\\csstidy' => $baseDir . '/vendor-prefixed/cerdic/css-tidy/class.csstidy.php', 'MailPoetVendor\\csstidy_csst' => $baseDir . '/vendor-prefixed/cerdic/css-tidy/testing/unit-tests/class.csstidy_csst.php', 'MailPoetVendor\\csstidy_harness' => $baseDir . '/vendor-prefixed/cerdic/css-tidy/testing/unit-tests/class.csstidy_harness.php', 'MailPoetVendor\\csstidy_optimise' => $baseDir . '/vendor-prefixed/cerdic/css-tidy/class.csstidy_optimise.php', 'MailPoetVendor\\csstidy_print' => $baseDir . '/vendor-prefixed/cerdic/css-tidy/class.csstidy_print.php', 'MailPoetVendor\\csstidy_reporter' => $baseDir . '/vendor-prefixed/cerdic/css-tidy/testing/unit-tests/class.csstidy_reporter.php', 'MailPoetVendor\\csstidy_test_csst' => $baseDir . '/vendor-prefixed/cerdic/css-tidy/testing/unit-tests/test.csst.php', 'pQuery' => $vendorDir . '/tburry/pquery/pQuery.php', 'pQuery\\AspEmbeddedNode' => $vendorDir . '/tburry/pquery/gan_node_html.php', 'pQuery\\CSSQueryTokenizer' => $vendorDir . '/tburry/pquery/gan_selector_html.php', 'pQuery\\CdataNode' => $vendorDir . '/tburry/pquery/gan_node_html.php', 'pQuery\\CommentNode' => $vendorDir . '/tburry/pquery/gan_node_html.php', 'pQuery\\ConditionalTagNode' => $vendorDir . '/tburry/pquery/gan_node_html.php', 'pQuery\\DoctypeNode' => $vendorDir . '/tburry/pquery/gan_node_html.php', 'pQuery\\DomNode' => $vendorDir . '/tburry/pquery/gan_node_html.php', 'pQuery\\EmbeddedNode' => $vendorDir . '/tburry/pquery/gan_node_html.php', 'pQuery\\Html5Parser' => $vendorDir . '/tburry/pquery/gan_parser_html.php', 'pQuery\\HtmlFormatter' => $vendorDir . '/tburry/pquery/gan_formatter.php', 'pQuery\\HtmlParser' => $vendorDir . '/tburry/pquery/gan_parser_html.php', 'pQuery\\HtmlParserBase' => $vendorDir . '/tburry/pquery/gan_parser_html.php', 'pQuery\\HtmlSelector' => $vendorDir . '/tburry/pquery/gan_selector_html.php', 'pQuery\\IQuery' => $vendorDir . '/tburry/pquery/IQuery.php', 'pQuery\\TextNode' => $vendorDir . '/tburry/pquery/gan_node_html.php', 'pQuery\\TokenizerBase' => $vendorDir . '/tburry/pquery/gan_tokenizer.php', 'pQuery\\XML2ArrayParser' => $vendorDir . '/tburry/pquery/gan_xml2array.php', 'pQuery\\XmlNode' => $vendorDir . '/tburry/pquery/gan_node_html.php', );
|
1 |
Â
<?php
|
2 |
+
if (!defined('ABSPATH')) exit; $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'MailPoetVendor\\Attribute' => $baseDir . '/vendor-prefixed/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'MailPoetVendor\\CSS' => $baseDir . '/lib-3rd-party/CSS.php', 'MailPoetVendor\\Carbon\\Carbon' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Carbon.php', 'MailPoetVendor\\Carbon\\CarbonConverterInterface' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/CarbonConverterInterface.php', 'MailPoetVendor\\Carbon\\CarbonImmutable' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/CarbonImmutable.php', 'MailPoetVendor\\Carbon\\CarbonInterface' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/CarbonInterface.php', 'MailPoetVendor\\Carbon\\CarbonInterval' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/CarbonInterval.php', 'MailPoetVendor\\Carbon\\CarbonPeriod' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/CarbonPeriod.php', 'MailPoetVendor\\Carbon\\CarbonTimeZone' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/CarbonTimeZone.php', 'MailPoetVendor\\Carbon\\Exceptions\\BadComparisonUnitException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php', 'MailPoetVendor\\Carbon\\Exceptions\\BadFluentConstructorException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php', 'MailPoetVendor\\Carbon\\Exceptions\\BadFluentSetterException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php', 'MailPoetVendor\\Carbon\\Exceptions\\BadMethodCallException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php', 'MailPoetVendor\\Carbon\\Exceptions\\Exception' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/Exception.php', 'MailPoetVendor\\Carbon\\Exceptions\\ImmutableException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidCastException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidDateException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidFormatException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidIntervalException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidPeriodDateException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidPeriodParameterException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidTimeZoneException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php', 'MailPoetVendor\\Carbon\\Exceptions\\InvalidTypeException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php', 'MailPoetVendor\\Carbon\\Exceptions\\NotACarbonClassException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php', 'MailPoetVendor\\Carbon\\Exceptions\\NotAPeriodException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php', 'MailPoetVendor\\Carbon\\Exceptions\\NotLocaleAwareException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php', 'MailPoetVendor\\Carbon\\Exceptions\\OutOfRangeException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php', 'MailPoetVendor\\Carbon\\Exceptions\\ParseErrorException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php', 'MailPoetVendor\\Carbon\\Exceptions\\RuntimeException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php', 'MailPoetVendor\\Carbon\\Exceptions\\UnitException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/UnitException.php', 'MailPoetVendor\\Carbon\\Exceptions\\UnitNotConfiguredException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php', 'MailPoetVendor\\Carbon\\Exceptions\\UnknownGetterException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php', 'MailPoetVendor\\Carbon\\Exceptions\\UnknownMethodException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php', 'MailPoetVendor\\Carbon\\Exceptions\\UnknownSetterException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php', 'MailPoetVendor\\Carbon\\Exceptions\\UnknownUnitException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php', 'MailPoetVendor\\Carbon\\Exceptions\\UnreachableException' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php', 'MailPoetVendor\\Carbon\\Factory' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Factory.php', 'MailPoetVendor\\Carbon\\FactoryImmutable' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/FactoryImmutable.php', 'MailPoetVendor\\Carbon\\Language' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Language.php', 'MailPoetVendor\\Carbon\\Traits\\Boundaries' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Boundaries.php', 'MailPoetVendor\\Carbon\\Traits\\Cast' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Cast.php', 'MailPoetVendor\\Carbon\\Traits\\Comparison' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Comparison.php', 'MailPoetVendor\\Carbon\\Traits\\Converter' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Converter.php', 'MailPoetVendor\\Carbon\\Traits\\Creator' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Creator.php', 'MailPoetVendor\\Carbon\\Traits\\Date' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Date.php', 'MailPoetVendor\\Carbon\\Traits\\Difference' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Difference.php', 'MailPoetVendor\\Carbon\\Traits\\IntervalRounding' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php', 'MailPoetVendor\\Carbon\\Traits\\IntervalStep' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/IntervalStep.php', 'MailPoetVendor\\Carbon\\Traits\\Localization' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Localization.php', 'MailPoetVendor\\Carbon\\Traits\\Macro' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Macro.php', 'MailPoetVendor\\Carbon\\Traits\\Mixin' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Mixin.php', 'MailPoetVendor\\Carbon\\Traits\\Modifiers' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Modifiers.php', 'MailPoetVendor\\Carbon\\Traits\\Mutability' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Mutability.php', 'MailPoetVendor\\Carbon\\Traits\\ObjectInitialisation' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php', 'MailPoetVendor\\Carbon\\Traits\\Options' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Options.php', 'MailPoetVendor\\Carbon\\Traits\\Rounding' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Rounding.php', 'MailPoetVendor\\Carbon\\Traits\\Serialization' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Serialization.php', 'MailPoetVendor\\Carbon\\Traits\\Test' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Test.php', 'MailPoetVendor\\Carbon\\Traits\\Timestamp' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Timestamp.php', 'MailPoetVendor\\Carbon\\Traits\\Units' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Units.php', 'MailPoetVendor\\Carbon\\Traits\\Week' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Traits/Week.php', 'MailPoetVendor\\Carbon\\Translator' => $baseDir . '/vendor-prefixed/nesbot/carbon/src/Carbon/Translator.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\Cache' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\CacheProvider' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\ClearableCache' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\FlushableCache' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\MultiDeleteCache' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/MultiDeleteCache.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\MultiGetCache' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\MultiOperationCache' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/MultiOperationCache.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\MultiPutCache' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/MultiPutCache.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\Psr6\\CacheAdapter' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/Psr6/CacheAdapter.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\Psr6\\CacheItem' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/Psr6/CacheItem.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\Psr6\\DoctrineProvider' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/Psr6/DoctrineProvider.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\Psr6\\InvalidArgument' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/Psr6/InvalidArgument.php', 'MailPoetVendor\\Doctrine\\Common\\Cache\\Psr6\\TypedCacheItem' => $baseDir . '/vendor-prefixed/doctrine/cache/lib/Doctrine/Common/Cache/Psr6/TypedCacheItem.php', 'MailPoetVendor\\Doctrine\\Common\\ClassLoader' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/ClassLoader.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\AbstractLazyCollection' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/AbstractLazyCollection.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\ArrayCollection' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/ArrayCollection.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Collection' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Collection.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Criteria' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Criteria.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Expr\\ClosureExpressionVisitor' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Expr/ClosureExpressionVisitor.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Expr\\Comparison' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Comparison.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Expr\\CompositeExpression' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Expr/CompositeExpression.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Expr\\Expression' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Expression.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Expr\\ExpressionVisitor' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Expr/ExpressionVisitor.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Expr\\Value' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Value.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\ExpressionBuilder' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/ExpressionBuilder.php', 'MailPoetVendor\\Doctrine\\Common\\Collections\\Selectable' => $baseDir . '/vendor-prefixed/doctrine/collections/lib/Doctrine/Common/Collections/Selectable.php', 'MailPoetVendor\\Doctrine\\Common\\CommonException' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/CommonException.php', 'MailPoetVendor\\Doctrine\\Common\\Comparable' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Comparable.php', 'MailPoetVendor\\Doctrine\\Common\\EventArgs' => $baseDir . '/vendor-prefixed/doctrine/event-manager/lib/Doctrine/Common/EventArgs.php', 'MailPoetVendor\\Doctrine\\Common\\EventManager' => $baseDir . '/vendor-prefixed/doctrine/event-manager/lib/Doctrine/Common/EventManager.php', 'MailPoetVendor\\Doctrine\\Common\\EventSubscriber' => $baseDir . '/vendor-prefixed/doctrine/event-manager/lib/Doctrine/Common/EventSubscriber.php', 'MailPoetVendor\\Doctrine\\Common\\Lexer\\AbstractLexer' => $baseDir . '/vendor-prefixed/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php', 'MailPoetVendor\\Doctrine\\Common\\Persistence\\PersistentObject' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Common/Persistence/PersistentObject.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\AbstractProxyFactory' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\Autoloader' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/Autoloader.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\Exception\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/Exception/InvalidArgumentException.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\Exception\\OutOfBoundsException' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/Exception/OutOfBoundsException.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\Exception\\ProxyException' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/Exception/ProxyException.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\Exception\\UnexpectedValueException' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/Exception/UnexpectedValueException.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\Proxy' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/Proxy.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\ProxyDefinition' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/ProxyDefinition.php', 'MailPoetVendor\\Doctrine\\Common\\Proxy\\ProxyGenerator' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Proxy/ProxyGenerator.php', 'MailPoetVendor\\Doctrine\\Common\\Util\\ClassUtils' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php', 'MailPoetVendor\\Doctrine\\Common\\Util\\Debug' => $baseDir . '/vendor-prefixed/doctrine/common/lib/Doctrine/Common/Util/Debug.php', 'MailPoetVendor\\Doctrine\\DBAL\\Abstraction\\Result' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Abstraction/Result.php', 'MailPoetVendor\\Doctrine\\DBAL\\Cache\\ArrayStatement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Cache/ArrayStatement.php', 'MailPoetVendor\\Doctrine\\DBAL\\Cache\\CacheException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Cache/CacheException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Cache\\QueryCacheProfile' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Cache/QueryCacheProfile.php', 'MailPoetVendor\\Doctrine\\DBAL\\Cache\\ResultCacheStatement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Cache/ResultCacheStatement.php', 'MailPoetVendor\\Doctrine\\DBAL\\ColumnCase' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/ColumnCase.php', 'MailPoetVendor\\Doctrine\\DBAL\\Configuration' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Configuration.php', 'MailPoetVendor\\Doctrine\\DBAL\\Connection' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Connection.php', 'MailPoetVendor\\Doctrine\\DBAL\\ConnectionException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/ConnectionException.php', 'MailPoetVendor\\Doctrine\\DBAL\\DBALException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver.php', 'MailPoetVendor\\Doctrine\\DBAL\\DriverManager' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/DriverManager.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\AbstractDriverException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractDriverException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\AbstractException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\AbstractMySQLDriver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\AbstractSQLServerDriver\\Exception\\PortWithoutHost' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractSQLServerDriver/Exception/PortWithoutHost.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\Connection' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/Connection.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\DriverException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/DriverException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\Exception' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/Exception.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\ExceptionConverterDriver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/ExceptionConverterDriver.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\FetchUtils' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/FetchUtils.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDOConnection' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDOException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDOMySql\\Driver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOMySql/Driver.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDOQueryImplementation' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOQueryImplementation.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDOStatement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDOStatementImplementations' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatementImplementations.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\Connection' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/Connection.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\Exception' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/Exception.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\MySQL\\Driver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/MySQL/Driver.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\OCI\\Driver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/OCI/Driver.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\PgSQL\\Driver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/PgSQL/Driver.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\SQLSrv\\Connection' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/SQLSrv/Connection.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\SQLSrv\\Driver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/SQLSrv/Driver.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\SQLSrv\\Statement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/SQLSrv/Statement.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\SQLite\\Driver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/SQLite/Driver.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PDO\\Statement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/Statement.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\PingableConnection' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/PingableConnection.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\Result' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/Result.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\ResultStatement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/ResultStatement.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\ServerInfoAwareConnection' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/ServerInfoAwareConnection.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\Statement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/Statement.php', 'MailPoetVendor\\Doctrine\\DBAL\\Driver\\StatementIterator' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Driver/StatementIterator.php', 'MailPoetVendor\\Doctrine\\DBAL\\Event\\Listeners\\SQLSessionInit' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Event/Listeners/SQLSessionInit.php', 'MailPoetVendor\\Doctrine\\DBAL\\Events' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Events.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\ConnectionException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/ConnectionException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\ConnectionLost' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/ConnectionLost.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\ConstraintViolationException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/ConstraintViolationException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\DatabaseObjectExistsException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/DatabaseObjectExistsException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\DatabaseObjectNotFoundException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/DatabaseObjectNotFoundException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\DeadlockException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/DeadlockException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\DriverException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/DriverException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\ForeignKeyConstraintViolationException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/ForeignKeyConstraintViolationException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/InvalidArgumentException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\InvalidFieldNameException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/InvalidFieldNameException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\LockWaitTimeoutException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/LockWaitTimeoutException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\NoKeyValue' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/NoKeyValue.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\NonUniqueFieldNameException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/NonUniqueFieldNameException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\NotNullConstraintViolationException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/NotNullConstraintViolationException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\ReadOnlyException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/ReadOnlyException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\RetryableException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/RetryableException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\ServerException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/ServerException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\SyntaxErrorException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/SyntaxErrorException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\TableExistsException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/TableExistsException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\TableNotFoundException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/TableNotFoundException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Exception\\UniqueConstraintViolationException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Exception/UniqueConstraintViolationException.php', 'MailPoetVendor\\Doctrine\\DBAL\\FetchMode' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/FetchMode.php', 'MailPoetVendor\\Doctrine\\DBAL\\ForwardCompatibility\\DriverResultStatement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/ForwardCompatibility/DriverResultStatement.php', 'MailPoetVendor\\Doctrine\\DBAL\\ForwardCompatibility\\DriverStatement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/ForwardCompatibility/DriverStatement.php', 'MailPoetVendor\\Doctrine\\DBAL\\ForwardCompatibility\\Result' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/ForwardCompatibility/Result.php', 'MailPoetVendor\\Doctrine\\DBAL\\Id\\TableGenerator' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Id/TableGenerator.php', 'MailPoetVendor\\Doctrine\\DBAL\\Id\\TableGeneratorSchemaVisitor' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Id/TableGeneratorSchemaVisitor.php', 'MailPoetVendor\\Doctrine\\DBAL\\LockMode' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/LockMode.php', 'MailPoetVendor\\Doctrine\\DBAL\\Logging\\DebugStack' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Logging/DebugStack.php', 'MailPoetVendor\\Doctrine\\DBAL\\Logging\\EchoSQLLogger' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Logging/EchoSQLLogger.php', 'MailPoetVendor\\Doctrine\\DBAL\\Logging\\LoggerChain' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Logging/LoggerChain.php', 'MailPoetVendor\\Doctrine\\DBAL\\Logging\\SQLLogger' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Logging/SQLLogger.php', 'MailPoetVendor\\Doctrine\\DBAL\\ParameterType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/ParameterType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\AbstractPlatform' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/AbstractPlatform.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\DateIntervalUnit' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/DateIntervalUnit.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\Keywords\\KeywordList' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/KeywordList.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\Keywords\\MariaDb102Keywords' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/MariaDb102Keywords.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\Keywords\\MsSQLKeywords' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/MsSQLKeywords.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\Keywords\\MySQL57Keywords' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/MySQL57Keywords.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\Keywords\\MySQL80Keywords' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/MySQL80Keywords.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\Keywords\\MySQLKeywords' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/MySQLKeywords.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\Keywords\\ReservedKeywordsValidator' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/ReservedKeywordsValidator.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\MariaDb1027Platform' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/MariaDb1027Platform.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\MySQL57Platform' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/MySQL57Platform.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\MySQL80Platform' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/MySQL80Platform.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\MySqlPlatform' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php', 'MailPoetVendor\\Doctrine\\DBAL\\Platforms\\TrimMode' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Platforms/TrimMode.php', 'MailPoetVendor\\Doctrine\\DBAL\\Portability\\Connection' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Portability/Connection.php', 'MailPoetVendor\\Doctrine\\DBAL\\Portability\\OptimizeFlags' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Portability/OptimizeFlags.php', 'MailPoetVendor\\Doctrine\\DBAL\\Portability\\Statement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Portability/Statement.php', 'MailPoetVendor\\Doctrine\\DBAL\\Query\\Expression\\CompositeExpression' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Query/Expression/CompositeExpression.php', 'MailPoetVendor\\Doctrine\\DBAL\\Query\\Expression\\ExpressionBuilder' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Query/Expression/ExpressionBuilder.php', 'MailPoetVendor\\Doctrine\\DBAL\\Query\\QueryBuilder' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Query/QueryBuilder.php', 'MailPoetVendor\\Doctrine\\DBAL\\Query\\QueryException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Query/QueryException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Result' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Result.php', 'MailPoetVendor\\Doctrine\\DBAL\\SQLParserUtils' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/SQLParserUtils.php', 'MailPoetVendor\\Doctrine\\DBAL\\SQLParserUtilsException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/SQLParserUtilsException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Statement' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Statement.php', 'MailPoetVendor\\Doctrine\\DBAL\\TransactionIsolationLevel' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/TransactionIsolationLevel.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\ArrayType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/ArrayType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\AsciiStringType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/AsciiStringType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\BigIntType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/BigIntType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\BinaryType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/BinaryType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\BlobType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/BlobType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\BooleanType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/BooleanType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\ConversionException' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/ConversionException.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\DateImmutableType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DateImmutableType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\DateIntervalType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DateIntervalType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\DateTimeImmutableType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeImmutableType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\DateTimeType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\DateTimeTzImmutableType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeTzImmutableType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\DateTimeTzType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeTzType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\DateType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DateType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\DecimalType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/DecimalType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\FloatType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/FloatType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\GuidType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/GuidType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\IntegerType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/IntegerType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\JsonArrayType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/JsonArrayType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\JsonType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/JsonType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\ObjectType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/ObjectType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\PhpDateTimeMappingType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/PhpDateTimeMappingType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\PhpIntegerMappingType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/PhpIntegerMappingType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\SimpleArrayType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/SimpleArrayType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\SmallIntType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/SmallIntType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\StringType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/StringType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\TextType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/TextType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\TimeImmutableType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/TimeImmutableType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\TimeType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/TimeType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\Type' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/Type.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\TypeRegistry' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/TypeRegistry.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\Types' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/Types.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\VarDateTimeImmutableType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/VarDateTimeImmutableType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Types\\VarDateTimeType' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Types/VarDateTimeType.php', 'MailPoetVendor\\Doctrine\\DBAL\\Version' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/Version.php', 'MailPoetVendor\\Doctrine\\DBAL\\VersionAwarePlatformDriver' => $baseDir . '/vendor-prefixed/doctrine/dbal/lib/Doctrine/DBAL/VersionAwarePlatformDriver.php', 'MailPoetVendor\\Doctrine\\Deprecations\\Deprecation' => $baseDir . '/vendor-prefixed/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php', 'MailPoetVendor\\Doctrine\\Instantiator\\Exception\\ExceptionInterface' => $baseDir . '/vendor-prefixed/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php', 'MailPoetVendor\\Doctrine\\Instantiator\\Exception\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php', 'MailPoetVendor\\Doctrine\\Instantiator\\Exception\\UnexpectedValueException' => $baseDir . '/vendor-prefixed/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php', 'MailPoetVendor\\Doctrine\\Instantiator\\Instantiator' => $baseDir . '/vendor-prefixed/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php', 'MailPoetVendor\\Doctrine\\Instantiator\\InstantiatorInterface' => $baseDir . '/vendor-prefixed/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php', 'MailPoetVendor\\Doctrine\\ORM\\AbstractQuery' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/AbstractQuery.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\AssociationCacheEntry' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/AssociationCacheEntry.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\CacheConfiguration' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/CacheConfiguration.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\CacheEntry' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/CacheEntry.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\CacheException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/CacheException.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\CacheFactory' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/CacheFactory.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\CacheKey' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/CacheKey.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\CollectionCacheEntry' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/CollectionCacheEntry.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\CollectionCacheKey' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/CollectionCacheKey.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\CollectionHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/CollectionHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\ConcurrentRegion' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/ConcurrentRegion.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\DefaultCache' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/DefaultCache.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\DefaultCacheFactory' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/DefaultCacheFactory.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\DefaultCollectionHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/DefaultCollectionHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\DefaultEntityHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/DefaultEntityHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\DefaultQueryCache' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/DefaultQueryCache.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\EntityCacheEntry' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/EntityCacheEntry.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\EntityCacheKey' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/EntityCacheKey.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\EntityHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/EntityHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\CacheException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/CacheException.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\CannotUpdateReadOnlyCollection' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/CannotUpdateReadOnlyCollection.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\CannotUpdateReadOnlyEntity' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/CannotUpdateReadOnlyEntity.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\FeatureNotImplemented' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/FeatureNotImplemented.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\InvalidResultCacheDriver' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/InvalidResultCacheDriver.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\MetadataCacheNotConfigured' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/MetadataCacheNotConfigured.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\MetadataCacheUsesNonPersistentCache' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/MetadataCacheUsesNonPersistentCache.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\NonCacheableEntity' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/NonCacheableEntity.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\NonCacheableEntityAssociation' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/NonCacheableEntityAssociation.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\QueryCacheNotConfigured' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/QueryCacheNotConfigured.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Exception\\QueryCacheUsesNonPersistentCache' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Exception/QueryCacheUsesNonPersistentCache.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Lock' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Lock.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\LockException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/LockException.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Logging\\CacheLogger' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Logging/CacheLogger.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Logging\\CacheLoggerChain' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Logging/CacheLoggerChain.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Logging\\StatisticsCacheLogger' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Logging/StatisticsCacheLogger.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\MultiGetRegion' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/MultiGetRegion.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\CachedPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/CachedPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Collection\\AbstractCollectionPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Collection/AbstractCollectionPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Collection\\CachedCollectionPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Collection/CachedCollectionPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Collection\\NonStrictReadWriteCachedCollectionPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Collection/NonStrictReadWriteCachedCollectionPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Collection\\ReadOnlyCachedCollectionPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Collection/ReadOnlyCachedCollectionPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Collection\\ReadWriteCachedCollectionPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Collection/ReadWriteCachedCollectionPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Entity\\AbstractEntityPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Entity/AbstractEntityPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Entity\\CachedEntityPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Entity/CachedEntityPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Entity\\NonStrictReadWriteCachedEntityPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Entity/NonStrictReadWriteCachedEntityPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Entity\\ReadOnlyCachedEntityPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Entity/ReadOnlyCachedEntityPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Persister\\Entity\\ReadWriteCachedEntityPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Persister/Entity/ReadWriteCachedEntityPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\QueryCache' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/QueryCache.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\QueryCacheEntry' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/QueryCacheEntry.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\QueryCacheKey' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/QueryCacheKey.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\QueryCacheValidator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/QueryCacheValidator.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Region' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Region.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Region\\DefaultMultiGetRegion' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Region/DefaultMultiGetRegion.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Region\\DefaultRegion' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Region/DefaultRegion.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Region\\FileLockRegion' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Region/FileLockRegion.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\Region\\UpdateTimestampCache' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/Region/UpdateTimestampCache.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\RegionsConfiguration' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/RegionsConfiguration.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\TimestampCacheEntry' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/TimestampCacheEntry.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\TimestampCacheKey' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/TimestampCacheKey.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\TimestampQueryCacheValidator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/TimestampQueryCacheValidator.php', 'MailPoetVendor\\Doctrine\\ORM\\Cache\\TimestampRegion' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Cache/TimestampRegion.php', 'MailPoetVendor\\Doctrine\\ORM\\Configuration' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Configuration.php', 'MailPoetVendor\\Doctrine\\ORM\\Decorator\\EntityManagerDecorator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Decorator/EntityManagerDecorator.php', 'MailPoetVendor\\Doctrine\\ORM\\EntityManager' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/EntityManager.php', 'MailPoetVendor\\Doctrine\\ORM\\EntityManagerInterface' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/EntityManagerInterface.php', 'MailPoetVendor\\Doctrine\\ORM\\EntityNotFoundException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/EntityNotFoundException.php', 'MailPoetVendor\\Doctrine\\ORM\\EntityRepository' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\LifecycleEventArgs' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/LifecycleEventArgs.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\ListenersInvoker' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/ListenersInvoker.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\LoadClassMetadataEventArgs' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/LoadClassMetadataEventArgs.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\OnClassMetadataNotFoundEventArgs' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/OnClassMetadataNotFoundEventArgs.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\OnClearEventArgs' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/OnClearEventArgs.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\OnFlushEventArgs' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/OnFlushEventArgs.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\PostFlushEventArgs' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/PostFlushEventArgs.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\PreFlushEventArgs' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/PreFlushEventArgs.php', 'MailPoetVendor\\Doctrine\\ORM\\Event\\PreUpdateEventArgs' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Event/PreUpdateEventArgs.php', 'MailPoetVendor\\Doctrine\\ORM\\Events' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Events.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\ConfigurationException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/ConfigurationException.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\EntityManagerClosed' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/EntityManagerClosed.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\EntityMissingAssignedId' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/EntityMissingAssignedId.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\InvalidEntityRepository' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/InvalidEntityRepository.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\InvalidHydrationMode' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/InvalidHydrationMode.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\ManagerException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/ManagerException.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\MismatchedEventManager' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/MismatchedEventManager.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\MissingIdentifierField' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/MissingIdentifierField.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\MissingMappingDriverImplementation' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/MissingMappingDriverImplementation.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\MultipleSelectorsFoundException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/MultipleSelectorsFoundException.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\NamedNativeQueryNotFound' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/NamedNativeQueryNotFound.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\NamedQueryNotFound' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/NamedQueryNotFound.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\NotSupported' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/NotSupported.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\ORMException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/ORMException.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\PersisterException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/PersisterException.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\ProxyClassesAlwaysRegenerating' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/ProxyClassesAlwaysRegenerating.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\RepositoryException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/RepositoryException.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\SchemaToolException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/SchemaToolException.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\UnexpectedAssociationValue' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/UnexpectedAssociationValue.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\UnknownEntityNamespace' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/UnknownEntityNamespace.php', 'MailPoetVendor\\Doctrine\\ORM\\Exception\\UnrecognizedIdentifierFields' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Exception/UnrecognizedIdentifierFields.php', 'MailPoetVendor\\Doctrine\\ORM\\Id\\AbstractIdGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Id/AbstractIdGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Id\\AssignedGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Id/AssignedGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Id\\BigIntegerIdentityGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Id/BigIntegerIdentityGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Id\\IdentityGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Id/IdentityGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Id\\SequenceGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Id/SequenceGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Id\\TableGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Id/TableGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Id\\UuidGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Id/UuidGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\CommitOrderCalculator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/CommitOrderCalculator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\HydrationCompleteHandler' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/HydrationCompleteHandler.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\AbstractHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\ArrayHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\HydrationException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/HydrationException.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\IterableResult' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/IterableResult.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\ObjectHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\ScalarColumnHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ScalarColumnHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\ScalarHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ScalarHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\SimpleObjectHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\Hydration\\SingleScalarHydrator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/SingleScalarHydrator.php', 'MailPoetVendor\\Doctrine\\ORM\\Internal\\SQLResultCasing' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Internal/SQLResultCasing.php', 'MailPoetVendor\\Doctrine\\ORM\\LazyCriteriaCollection' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/LazyCriteriaCollection.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Annotation' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Annotation.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\AnsiQuoteStrategy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/AnsiQuoteStrategy.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\AssociationOverride' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/AssociationOverride.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\AssociationOverrides' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/AssociationOverrides.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\AttributeOverride' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/AttributeOverride.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\AttributeOverrides' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/AttributeOverrides.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Builder\\AssociationBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Builder/AssociationBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Builder\\ClassMetadataBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Builder/ClassMetadataBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Builder\\EmbeddedBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Builder/EmbeddedBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Builder\\EntityListenerBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Builder/EntityListenerBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Builder\\FieldBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Builder/FieldBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Builder\\ManyToManyAssociationBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Builder/ManyToManyAssociationBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Builder\\OneToManyAssociationBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Builder/OneToManyAssociationBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Cache' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Cache.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\ChangeTrackingPolicy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ChangeTrackingPolicy.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\ClassMetadata' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadata.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\ClassMetadataFactory' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\ClassMetadataInfo' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Column' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Column.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\ColumnResult' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ColumnResult.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\CustomIdGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/CustomIdGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\DefaultEntityListenerResolver' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/DefaultEntityListenerResolver.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\DefaultNamingStrategy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/DefaultNamingStrategy.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\DefaultQuoteStrategy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/DefaultQuoteStrategy.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\DiscriminatorColumn' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/DiscriminatorColumn.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\DiscriminatorMap' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/DiscriminatorMap.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Driver\\AnnotationDriver' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Driver\\AttributeDriver' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/AttributeDriver.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Driver\\AttributeReader' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/AttributeReader.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Driver\\DriverChain' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/DriverChain.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Driver\\PHPDriver' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/PHPDriver.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Driver\\RepeatableAttributeCollection' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/RepeatableAttributeCollection.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Driver\\StaticPHPDriver' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/StaticPHPDriver.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Embeddable' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Embeddable.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Embedded' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Embedded.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Entity' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Entity.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\EntityListenerResolver' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/EntityListenerResolver.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\EntityListeners' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/EntityListeners.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\EntityResult' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/EntityResult.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Exception\\CannotGenerateIds' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Exception/CannotGenerateIds.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Exception\\InvalidCustomGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Exception/InvalidCustomGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Exception\\UnknownGeneratorType' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Exception/UnknownGeneratorType.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\FieldResult' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/FieldResult.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\GeneratedValue' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/GeneratedValue.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\HasLifecycleCallbacks' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/HasLifecycleCallbacks.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Id' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Id.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Index' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Index.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\InheritanceType' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/InheritanceType.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\InverseJoinColumn' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/InverseJoinColumn.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\JoinColumn' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/JoinColumn.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\JoinColumns' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/JoinColumns.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\JoinTable' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/JoinTable.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\ManyToMany' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ManyToMany.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\ManyToOne' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ManyToOne.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\MappedSuperclass' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/MappedSuperclass.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\MappingException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/MappingException.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\NamedNativeQueries' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/NamedNativeQueries.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\NamedNativeQuery' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/NamedNativeQuery.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\NamedQueries' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/NamedQueries.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\NamedQuery' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/NamedQuery.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\NamingStrategy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/NamingStrategy.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\OneToMany' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/OneToMany.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\OneToOne' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/OneToOne.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\OrderBy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/OrderBy.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\PostLoad' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/PostLoad.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\PostPersist' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/PostPersist.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\PostRemove' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/PostRemove.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\PostUpdate' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/PostUpdate.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\PreFlush' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/PreFlush.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\PrePersist' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/PrePersist.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\PreRemove' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/PreRemove.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\PreUpdate' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/PreUpdate.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\QuoteStrategy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/QuoteStrategy.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\ReflectionEmbeddedProperty' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/ReflectionEmbeddedProperty.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Reflection\\ReflectionPropertiesGetter' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Reflection/ReflectionPropertiesGetter.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\SequenceGenerator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/SequenceGenerator.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\SqlResultSetMapping' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/SqlResultSetMapping.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\SqlResultSetMappings' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/SqlResultSetMappings.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Table' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Table.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\UnderscoreNamingStrategy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/UnderscoreNamingStrategy.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\UniqueConstraint' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/UniqueConstraint.php', 'MailPoetVendor\\Doctrine\\ORM\\Mapping\\Version' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Mapping/Version.php', 'MailPoetVendor\\Doctrine\\ORM\\NativeQuery' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/NativeQuery.php', 'MailPoetVendor\\Doctrine\\ORM\\NoResultException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/NoResultException.php', 'MailPoetVendor\\Doctrine\\ORM\\NonUniqueResultException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/NonUniqueResultException.php', 'MailPoetVendor\\Doctrine\\ORM\\ORMException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/ORMException.php', 'MailPoetVendor\\Doctrine\\ORM\\ORMInvalidArgumentException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/ORMInvalidArgumentException.php', 'MailPoetVendor\\Doctrine\\ORM\\OptimisticLockException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/OptimisticLockException.php', 'MailPoetVendor\\Doctrine\\ORM\\PersistentCollection' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/PersistentCollection.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Collection\\AbstractCollectionPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Collection/AbstractCollectionPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Collection\\CollectionPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Collection/CollectionPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Collection\\ManyToManyPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Collection/ManyToManyPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Collection\\OneToManyPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Collection/OneToManyPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Entity\\AbstractEntityInheritancePersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/AbstractEntityInheritancePersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Entity\\BasicEntityPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Entity\\CachedPersisterContext' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/CachedPersisterContext.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Entity\\EntityPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/EntityPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Entity\\JoinedSubclassPersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/JoinedSubclassPersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Entity\\SingleTablePersister' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/SingleTablePersister.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Exception\\CantUseInOperatorOnCompositeKeys' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Exception/CantUseInOperatorOnCompositeKeys.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Exception\\InvalidOrientation' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Exception/InvalidOrientation.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\Exception\\UnrecognizedField' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/Exception/UnrecognizedField.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\MatchingAssociationFieldRequiresObject' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/MatchingAssociationFieldRequiresObject.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\PersisterException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/PersisterException.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\SqlExpressionVisitor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/SqlExpressionVisitor.php', 'MailPoetVendor\\Doctrine\\ORM\\Persisters\\SqlValueVisitor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Persisters/SqlValueVisitor.php', 'MailPoetVendor\\Doctrine\\ORM\\PessimisticLockException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/PessimisticLockException.php', 'MailPoetVendor\\Doctrine\\ORM\\Proxy\\Autoloader' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Proxy/Autoloader.php', 'MailPoetVendor\\Doctrine\\ORM\\Proxy\\Proxy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Proxy/Proxy.php', 'MailPoetVendor\\Doctrine\\ORM\\Proxy\\ProxyFactory' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Proxy/ProxyFactory.php', 'MailPoetVendor\\Doctrine\\ORM\\Query' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query.php', 'MailPoetVendor\\Doctrine\\ORM\\QueryBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/QueryBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ASTException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ASTException.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\AggregateExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/AggregateExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ArithmeticExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ArithmeticExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ArithmeticFactor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ArithmeticFactor.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ArithmeticTerm' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ArithmeticTerm.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\BetweenExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/BetweenExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\CoalesceExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/CoalesceExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\CollectionMemberExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/CollectionMemberExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ComparisonExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ComparisonExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ConditionalExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ConditionalExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ConditionalFactor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ConditionalFactor.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ConditionalPrimary' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ConditionalPrimary.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ConditionalTerm' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ConditionalTerm.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\DeleteClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/DeleteClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\DeleteStatement' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/DeleteStatement.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\EmptyCollectionComparisonExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/EmptyCollectionComparisonExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ExistsExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ExistsExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\FromClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/FromClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\AbsFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/AbsFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\AvgFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/AvgFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\BitAndFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/BitAndFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\BitOrFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/BitOrFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\ConcatFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/ConcatFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\CountFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/CountFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\CurrentDateFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/CurrentDateFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\CurrentTimeFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/CurrentTimeFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\CurrentTimestampFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/CurrentTimestampFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\DateAddFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/DateAddFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\DateDiffFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/DateDiffFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\DateSubFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/DateSubFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\FunctionNode' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/FunctionNode.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\IdentityFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/IdentityFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\LengthFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/LengthFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\LocateFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/LocateFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\LowerFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/LowerFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\MaxFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/MaxFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\MinFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/MinFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\ModFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/ModFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\SizeFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/SizeFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\SqrtFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/SqrtFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\SubstringFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/SubstringFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\SumFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/SumFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\TrimFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/TrimFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Functions\\UpperFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Functions/UpperFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\GeneralCaseExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/GeneralCaseExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\GroupByClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/GroupByClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\HavingClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/HavingClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\IdentificationVariableDeclaration' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/IdentificationVariableDeclaration.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\InExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/InExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\IndexBy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/IndexBy.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\InputParameter' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/InputParameter.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\InstanceOfExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/InstanceOfExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Join' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Join.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\JoinAssociationDeclaration' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/JoinAssociationDeclaration.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\JoinAssociationPathExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/JoinAssociationPathExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\JoinClassPathExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/JoinClassPathExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\JoinVariableDeclaration' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/JoinVariableDeclaration.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\LikeExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/LikeExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Literal' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Literal.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\NewObjectExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/NewObjectExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Node' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Node.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\NullComparisonExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/NullComparisonExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\NullIfExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/NullIfExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\OrderByClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/OrderByClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\OrderByItem' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/OrderByItem.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\ParenthesisExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/ParenthesisExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\PartialObjectExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/PartialObjectExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\PathExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/PathExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\QuantifiedExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/QuantifiedExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\RangeVariableDeclaration' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/RangeVariableDeclaration.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SelectClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SelectClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SelectExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SelectExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SelectStatement' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SelectStatement.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SimpleArithmeticExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SimpleArithmeticExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SimpleCaseExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SimpleCaseExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SimpleSelectClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SimpleSelectClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SimpleSelectExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SimpleSelectExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SimpleWhenClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SimpleWhenClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\Subselect' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/Subselect.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SubselectFromClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SubselectFromClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\SubselectIdentificationVariableDeclaration' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/SubselectIdentificationVariableDeclaration.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\TypedExpression' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/TypedExpression.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\UpdateClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/UpdateClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\UpdateItem' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/UpdateItem.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\UpdateStatement' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/UpdateStatement.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\WhenClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/WhenClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\AST\\WhereClause' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/AST/WhereClause.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Exec\\AbstractSqlExecutor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Exec/AbstractSqlExecutor.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Exec\\MultiTableDeleteExecutor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Exec/MultiTableDeleteExecutor.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Exec\\MultiTableUpdateExecutor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Exec/MultiTableUpdateExecutor.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Exec\\SingleSelectExecutor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Exec/SingleSelectExecutor.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Exec\\SingleTableDeleteUpdateExecutor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Exec/SingleTableDeleteUpdateExecutor.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Andx' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Andx.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Base' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Base.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Comparison' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Comparison.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Composite' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Composite.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\From' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/From.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Func' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Func.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\GroupBy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/GroupBy.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Join' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Join.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Literal' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Literal.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Math' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Math.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\OrderBy' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/OrderBy.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Orx' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Orx.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Expr\\Select' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Select.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\FilterCollection' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/FilterCollection.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Filter\\FilterException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Filter/FilterException.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Filter\\SQLFilter' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Filter/SQLFilter.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Lexer' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Lexer.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Parameter' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Parameter.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\ParameterTypeInferer' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/ParameterTypeInferer.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Parser' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\ParserResult' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/ParserResult.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\Printer' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/Printer.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\QueryException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\QueryExpressionVisitor' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/QueryExpressionVisitor.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\ResultSetMapping' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/ResultSetMapping.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\ResultSetMappingBuilder' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/ResultSetMappingBuilder.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\SqlWalker' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/SqlWalker.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\TreeWalker' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/TreeWalker.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\TreeWalkerAdapter' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/TreeWalkerAdapter.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\TreeWalkerChain' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/TreeWalkerChain.php', 'MailPoetVendor\\Doctrine\\ORM\\Query\\TreeWalkerChainIterator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Query/TreeWalkerChainIterator.php', 'MailPoetVendor\\Doctrine\\ORM\\Repository\\DefaultRepositoryFactory' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Repository/DefaultRepositoryFactory.php', 'MailPoetVendor\\Doctrine\\ORM\\Repository\\Exception\\InvalidFindByCall' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Repository/Exception/InvalidFindByCall.php', 'MailPoetVendor\\Doctrine\\ORM\\Repository\\Exception\\InvalidMagicMethodCall' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Repository/Exception/InvalidMagicMethodCall.php', 'MailPoetVendor\\Doctrine\\ORM\\Repository\\RepositoryFactory' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Repository/RepositoryFactory.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Exception\\MissingColumnException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Exception/MissingColumnException.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Exception\\NotSupported' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Exception/NotSupported.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Pagination\\CountOutputWalker' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Pagination/CountOutputWalker.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Pagination\\CountWalker' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Pagination/CountWalker.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Pagination\\Exception\\RowNumberOverFunctionNotEnabled' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Pagination/Exception/RowNumberOverFunctionNotEnabled.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Pagination\\LimitSubqueryOutputWalker' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Pagination/LimitSubqueryOutputWalker.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Pagination\\LimitSubqueryWalker' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Pagination/LimitSubqueryWalker.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Pagination\\Paginator' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Pagination/Paginator.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Pagination\\RowNumberOverFunction' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Pagination/RowNumberOverFunction.php', 'MailPoetVendor\\Doctrine\\ORM\\Tools\\Pagination\\WhereInWalker' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Tools/Pagination/WhereInWalker.php', 'MailPoetVendor\\Doctrine\\ORM\\TransactionRequiredException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/TransactionRequiredException.php', 'MailPoetVendor\\Doctrine\\ORM\\UnexpectedResultException' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/UnexpectedResultException.php', 'MailPoetVendor\\Doctrine\\ORM\\UnitOfWork' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php', 'MailPoetVendor\\Doctrine\\ORM\\Utility\\HierarchyDiscriminatorResolver' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Utility/HierarchyDiscriminatorResolver.php', 'MailPoetVendor\\Doctrine\\ORM\\Utility\\IdentifierFlattener' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Utility/IdentifierFlattener.php', 'MailPoetVendor\\Doctrine\\ORM\\Utility\\PersisterHelper' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Utility/PersisterHelper.php', 'MailPoetVendor\\Doctrine\\ORM\\Version' => $baseDir . '/vendor-prefixed/doctrine/orm/lib/Doctrine/ORM/Version.php', 'MailPoetVendor\\Doctrine\\Persistence\\AbstractManagerRegistry' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/AbstractManagerRegistry.php', 'MailPoetVendor\\Doctrine\\Persistence\\ConnectionRegistry' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/ConnectionRegistry.php', 'MailPoetVendor\\Doctrine\\Persistence\\Event\\LifecycleEventArgs' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Event/LifecycleEventArgs.php', 'MailPoetVendor\\Doctrine\\Persistence\\Event\\LoadClassMetadataEventArgs' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Event/LoadClassMetadataEventArgs.php', 'MailPoetVendor\\Doctrine\\Persistence\\Event\\ManagerEventArgs' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Event/ManagerEventArgs.php', 'MailPoetVendor\\Doctrine\\Persistence\\Event\\OnClearEventArgs' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Event/OnClearEventArgs.php', 'MailPoetVendor\\Doctrine\\Persistence\\Event\\PreUpdateEventArgs' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Event/PreUpdateEventArgs.php', 'MailPoetVendor\\Doctrine\\Persistence\\ManagerRegistry' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/ManagerRegistry.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\AbstractClassMetadataFactory' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/AbstractClassMetadataFactory.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\ClassMetadata' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/ClassMetadata.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\ClassMetadataFactory' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/ClassMetadataFactory.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\AnnotationDriver' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/AnnotationDriver.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\DefaultFileLocator' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/DefaultFileLocator.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\FileDriver' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/FileDriver.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\FileLocator' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/FileLocator.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\MappingDriver' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/MappingDriver.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\MappingDriverChain' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/MappingDriverChain.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\PHPDriver' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/PHPDriver.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\StaticPHPDriver' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/StaticPHPDriver.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\Driver\\SymfonyFileLocator' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/Driver/SymfonyFileLocator.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\MappingException' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/MappingException.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\ProxyClassNameResolver' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/ProxyClassNameResolver.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\ReflectionService' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/ReflectionService.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\RuntimeReflectionService' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/RuntimeReflectionService.php', 'MailPoetVendor\\Doctrine\\Persistence\\Mapping\\StaticReflectionService' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Mapping/StaticReflectionService.php', 'MailPoetVendor\\Doctrine\\Persistence\\NotifyPropertyChanged' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/NotifyPropertyChanged.php', 'MailPoetVendor\\Doctrine\\Persistence\\ObjectManager' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/ObjectManager.php', 'MailPoetVendor\\Doctrine\\Persistence\\ObjectManagerAware' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/ObjectManagerAware.php', 'MailPoetVendor\\Doctrine\\Persistence\\ObjectManagerDecorator' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/ObjectManagerDecorator.php', 'MailPoetVendor\\Doctrine\\Persistence\\ObjectRepository' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/ObjectRepository.php', 'MailPoetVendor\\Doctrine\\Persistence\\PropertyChangedListener' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/PropertyChangedListener.php', 'MailPoetVendor\\Doctrine\\Persistence\\Proxy' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Proxy.php', 'MailPoetVendor\\Doctrine\\Persistence\\Reflection\\RuntimePublicReflectionProperty' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Reflection/RuntimePublicReflectionProperty.php', 'MailPoetVendor\\Doctrine\\Persistence\\Reflection\\TypedNoDefaultReflectionProperty' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Reflection/TypedNoDefaultReflectionProperty.php', 'MailPoetVendor\\Doctrine\\Persistence\\Reflection\\TypedNoDefaultReflectionPropertyBase' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Reflection/TypedNoDefaultReflectionPropertyBase.php', 'MailPoetVendor\\Doctrine\\Persistence\\Reflection\\TypedNoDefaultRuntimePublicReflectionProperty' => $baseDir . '/vendor-prefixed/doctrine/persistence/lib/Doctrine/Persistence/Reflection/TypedNoDefaultRuntimePublicReflectionProperty.php', 'MailPoetVendor\\Egulias\\EmailValidator\\EmailLexer' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/EmailLexer.php', 'MailPoetVendor\\Egulias\\EmailValidator\\EmailParser' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/EmailParser.php', 'MailPoetVendor\\Egulias\\EmailValidator\\EmailValidator' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/EmailValidator.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\AtextAfterCFWS' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/AtextAfterCFWS.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\CRLFAtTheEnd' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/CRLFAtTheEnd.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\CRLFX2' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/CRLFX2.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\CRNoLF' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/CRNoLF.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\CharNotAllowed' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/CharNotAllowed.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\CommaInDomain' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/CommaInDomain.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\ConsecutiveAt' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/ConsecutiveAt.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\ConsecutiveDot' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/ConsecutiveDot.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\DomainAcceptsNoMail' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/DomainAcceptsNoMail.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\DomainHyphened' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/DomainHyphened.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\DotAtEnd' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/DotAtEnd.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\DotAtStart' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/DotAtStart.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\ExpectingAT' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/ExpectingAT.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\ExpectingATEXT' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/ExpectingATEXT.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\ExpectingCTEXT' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/ExpectingCTEXT.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\ExpectingDTEXT' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/ExpectingDTEXT.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\ExpectingDomainLiteralClose' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/ExpectingDomainLiteralClose.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\ExpectingQPair' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/ExpectingQPair.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\InvalidEmail' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/InvalidEmail.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\LocalOrReservedDomain' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/LocalOrReservedDomain.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\NoDNSRecord' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/NoDNSRecord.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\NoDomainPart' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/NoDomainPart.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\NoLocalPart' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/NoLocalPart.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\UnclosedComment' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/UnclosedComment.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\UnclosedQuotedString' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/UnclosedQuotedString.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Exception\\UnopenedComment' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Exception/UnopenedComment.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Parser\\DomainPart' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Parser/DomainPart.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Parser\\LocalPart' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Parser/LocalPart.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Parser\\Parser' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Parser/Parser.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\DNSCheckValidation' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/DNSCheckValidation.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\EmailValidation' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/EmailValidation.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\Error\\RFCWarnings' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/Error/RFCWarnings.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\Error\\SpoofEmail' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/Error/SpoofEmail.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\Exception\\EmptyValidationList' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\MultipleErrors' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/MultipleErrors.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\MultipleValidationWithAnd' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\NoRFCWarningsValidation' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\RFCValidation' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/RFCValidation.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Validation\\SpoofCheckValidation' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Validation/SpoofCheckValidation.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\AddressLiteral' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/AddressLiteral.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\CFWSNearAt' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/CFWSNearAt.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\CFWSWithFWS' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/CFWSWithFWS.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\Comment' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/Comment.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\DeprecatedComment' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/DeprecatedComment.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\DomainLiteral' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/DomainLiteral.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\DomainTooLong' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/DomainTooLong.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\EmailTooLong' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/EmailTooLong.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\IPV6BadChar' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/IPV6BadChar.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\IPV6ColonEnd' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/IPV6ColonEnd.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\IPV6ColonStart' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/IPV6ColonStart.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\IPV6Deprecated' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/IPV6Deprecated.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\IPV6DoubleColon' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/IPV6DoubleColon.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\IPV6GroupCount' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/IPV6GroupCount.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\IPV6MaxGroups' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/IPV6MaxGroups.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\LabelTooLong' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/LabelTooLong.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\LocalTooLong' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/LocalTooLong.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\NoDNSMXRecord' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/NoDNSMXRecord.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\ObsoleteDTEXT' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/ObsoleteDTEXT.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\QuotedPart' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/QuotedPart.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\QuotedString' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/QuotedString.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\TLD' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/TLD.php', 'MailPoetVendor\\Egulias\\EmailValidator\\Warning\\Warning' => $baseDir . '/vendor-prefixed/egulias/email-validator/src/Warning/Warning.php', 'MailPoetVendor\\Gregwar\\Captcha\\CaptchaBuilder' => $baseDir . '/vendor-prefixed/gregwar/captcha/src/Gregwar/Captcha/CaptchaBuilder.php', 'MailPoetVendor\\Gregwar\\Captcha\\CaptchaBuilderInterface' => $baseDir . '/vendor-prefixed/gregwar/captcha/src/Gregwar/Captcha/CaptchaBuilderInterface.php', 'MailPoetVendor\\Gregwar\\Captcha\\ImageFileHandler' => $baseDir . '/vendor-prefixed/gregwar/captcha/src/Gregwar/Captcha/ImageFileHandler.php', 'MailPoetVendor\\Gregwar\\Captcha\\PhraseBuilder' => $baseDir . '/vendor-prefixed/gregwar/captcha/src/Gregwar/Captcha/PhraseBuilder.php', 'MailPoetVendor\\Gregwar\\Captcha\\PhraseBuilderInterface' => $baseDir . '/vendor-prefixed/gregwar/captcha/src/Gregwar/Captcha/PhraseBuilderInterface.php', 'MailPoetVendor\\Idiorm\\IdiormMethodMissingException' => $baseDir . '/lib-3rd-party/Idiorm/idiorm.php', 'MailPoetVendor\\Idiorm\\IdiormResultSet' => $baseDir . '/lib-3rd-party/Idiorm/idiorm.php', 'MailPoetVendor\\Idiorm\\IdiormString' => $baseDir . '/lib-3rd-party/Idiorm/idiorm.php', 'MailPoetVendor\\Idiorm\\IdiormStringException' => $baseDir . '/lib-3rd-party/Idiorm/idiorm.php', 'MailPoetVendor\\Idiorm\\ORM' => $baseDir . '/lib-3rd-party/Idiorm/idiorm.php', 'MailPoetVendor\\Monolog\\ErrorHandler' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/ErrorHandler.php', 'MailPoetVendor\\Monolog\\Formatter\\FormatterInterface' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php', 'MailPoetVendor\\Monolog\\Formatter\\LineFormatter' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/LineFormatter.php', 'MailPoetVendor\\Monolog\\Formatter\\NormalizerFormatter' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php', 'MailPoetVendor\\Monolog\\Handler\\AbstractHandler' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Handler/AbstractHandler.php', 'MailPoetVendor\\Monolog\\Handler\\AbstractProcessingHandler' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php', 'MailPoetVendor\\Monolog\\Handler\\HandlerInterface' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Handler/HandlerInterface.php', 'MailPoetVendor\\Monolog\\Logger' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Logger.php', 'MailPoetVendor\\Monolog\\Processor\\IntrospectionProcessor' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php', 'MailPoetVendor\\Monolog\\Processor\\MemoryProcessor' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php', 'MailPoetVendor\\Monolog\\Processor\\MemoryUsageProcessor' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php', 'MailPoetVendor\\Monolog\\Processor\\ProcessorInterface' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php', 'MailPoetVendor\\Monolog\\Processor\\WebProcessor' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Processor/WebProcessor.php', 'MailPoetVendor\\Monolog\\Registry' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Registry.php', 'MailPoetVendor\\Monolog\\ResettableInterface' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/ResettableInterface.php', 'MailPoetVendor\\Monolog\\SignalHandler' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/SignalHandler.php', 'MailPoetVendor\\Monolog\\Utils' => $baseDir . '/vendor-prefixed/monolog/monolog/src/Monolog/Utils.php', 'MailPoetVendor\\Normalizer' => $baseDir . '/vendor-prefixed/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'MailPoetVendor\\Paris\\Model' => $baseDir . '/lib-3rd-party/Paris/paris.php', 'MailPoetVendor\\Paris\\ORMWrapper' => $baseDir . '/lib-3rd-party/Paris/paris.php', 'MailPoetVendor\\Paris\\ParisMethodMissingException' => $baseDir . '/lib-3rd-party/Paris/paris.php', 'MailPoetVendor\\Psr\\Cache\\CacheException' => $baseDir . '/vendor-prefixed/psr/cache/src/CacheException.php', 'MailPoetVendor\\Psr\\Cache\\CacheItemInterface' => $baseDir . '/vendor-prefixed/psr/cache/src/CacheItemInterface.php', 'MailPoetVendor\\Psr\\Cache\\CacheItemPoolInterface' => $baseDir . '/vendor-prefixed/psr/cache/src/CacheItemPoolInterface.php', 'MailPoetVendor\\Psr\\Cache\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/psr/cache/src/InvalidArgumentException.php', 'MailPoetVendor\\Psr\\Container\\ContainerExceptionInterface' => $baseDir . '/vendor-prefixed/psr/container/src/ContainerExceptionInterface.php', 'MailPoetVendor\\Psr\\Container\\ContainerInterface' => $baseDir . '/vendor-prefixed/psr/container/src/ContainerInterface.php', 'MailPoetVendor\\Psr\\Container\\NotFoundExceptionInterface' => $baseDir . '/vendor-prefixed/psr/container/src/NotFoundExceptionInterface.php', 'MailPoetVendor\\Psr\\Log\\AbstractLogger' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/AbstractLogger.php', 'MailPoetVendor\\Psr\\Log\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/InvalidArgumentException.php', 'MailPoetVendor\\Psr\\Log\\LogLevel' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/LogLevel.php', 'MailPoetVendor\\Psr\\Log\\LoggerAwareInterface' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/LoggerAwareInterface.php', 'MailPoetVendor\\Psr\\Log\\LoggerAwareTrait' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/LoggerAwareTrait.php', 'MailPoetVendor\\Psr\\Log\\LoggerInterface' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/LoggerInterface.php', 'MailPoetVendor\\Psr\\Log\\LoggerTrait' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/LoggerTrait.php', 'MailPoetVendor\\Psr\\Log\\NullLogger' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/NullLogger.php', 'MailPoetVendor\\Psr\\Log\\Test\\DummyTest' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/Test/DummyTest.php', 'MailPoetVendor\\Psr\\Log\\Test\\LoggerInterfaceTest' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', 'MailPoetVendor\\Psr\\Log\\Test\\TestLogger' => $baseDir . '/vendor-prefixed/psr/log/Psr/Log/Test/TestLogger.php', 'MailPoetVendor\\Sabberworm\\CSS\\CSSList\\AtRuleBlockList' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/AtRuleBlockList.php', 'MailPoetVendor\\Sabberworm\\CSS\\CSSList\\CSSBlockList' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/CSSBlockList.php', 'MailPoetVendor\\Sabberworm\\CSS\\CSSList\\CSSList' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/CSSList.php', 'MailPoetVendor\\Sabberworm\\CSS\\CSSList\\Document' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/Document.php', 'MailPoetVendor\\Sabberworm\\CSS\\CSSList\\KeyFrame' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/CSSList/KeyFrame.php', 'MailPoetVendor\\Sabberworm\\CSS\\Comment\\Comment' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Comment/Comment.php', 'MailPoetVendor\\Sabberworm\\CSS\\Comment\\Commentable' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Comment/Commentable.php', 'MailPoetVendor\\Sabberworm\\CSS\\OutputFormat' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/OutputFormat.php', 'MailPoetVendor\\Sabberworm\\CSS\\OutputFormatter' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/OutputFormat.php', 'MailPoetVendor\\Sabberworm\\CSS\\Parser' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Parser.php', 'MailPoetVendor\\Sabberworm\\CSS\\Parsing\\OutputException' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Parsing/OutputException.php', 'MailPoetVendor\\Sabberworm\\CSS\\Parsing\\ParserState' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Parsing/ParserState.php', 'MailPoetVendor\\Sabberworm\\CSS\\Parsing\\SourceException' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Parsing/SourceException.php', 'MailPoetVendor\\Sabberworm\\CSS\\Parsing\\UnexpectedTokenException' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Parsing/UnexpectedTokenException.php', 'MailPoetVendor\\Sabberworm\\CSS\\Property\\AtRule' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Property/AtRule.php', 'MailPoetVendor\\Sabberworm\\CSS\\Property\\CSSNamespace' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Property/CSSNamespace.php', 'MailPoetVendor\\Sabberworm\\CSS\\Property\\Charset' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Property/Charset.php', 'MailPoetVendor\\Sabberworm\\CSS\\Property\\Import' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Property/Import.php', 'MailPoetVendor\\Sabberworm\\CSS\\Property\\Selector' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Property/Selector.php', 'MailPoetVendor\\Sabberworm\\CSS\\Renderable' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Renderable.php', 'MailPoetVendor\\Sabberworm\\CSS\\RuleSet\\AtRuleSet' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/RuleSet/AtRuleSet.php', 'MailPoetVendor\\Sabberworm\\CSS\\RuleSet\\DeclarationBlock' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/RuleSet/DeclarationBlock.php', 'MailPoetVendor\\Sabberworm\\CSS\\RuleSet\\RuleSet' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/RuleSet/RuleSet.php', 'MailPoetVendor\\Sabberworm\\CSS\\Rule\\Rule' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Rule/Rule.php', 'MailPoetVendor\\Sabberworm\\CSS\\Settings' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Settings.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\CSSFunction' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/CSSFunction.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\CSSString' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/CSSString.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\CalcFunction' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/CalcFunction.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\CalcRuleValueList' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/CalcRuleValueList.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\Color' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/Color.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\LineName' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/LineName.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\PrimitiveValue' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/PrimitiveValue.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\RuleValueList' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/RuleValueList.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\Size' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/Size.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\URL' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/URL.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\Value' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/Value.php', 'MailPoetVendor\\Sabberworm\\CSS\\Value\\ValueList' => $baseDir . '/vendor-prefixed/sabberworm/php-css-parser/lib/Sabberworm/CSS/Value/ValueList.php', 'MailPoetVendor\\Stringable' => $baseDir . '/vendor-prefixed/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'MailPoetVendor\\Sudzy\\Engine' => $baseDir . '/lib-3rd-party/Sudzy/Engine.php', 'MailPoetVendor\\Sudzy\\ValidModel' => $baseDir . '/lib-3rd-party/Sudzy/ValidModel.php', 'MailPoetVendor\\Sudzy\\ValidationException' => $baseDir . '/lib-3rd-party/Sudzy/ValidationException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Alias' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Alias.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\ArgumentInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/ArgumentInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\BoundArgument' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/BoundArgument.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\IteratorArgument' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/IteratorArgument.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\ReferenceSetArgumentTrait' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/ReferenceSetArgumentTrait.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\RewindableGenerator' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/RewindableGenerator.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\ServiceClosureArgument' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/ServiceClosureArgument.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocator' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/ServiceLocator.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocatorArgument' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/ServiceLocatorArgument.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Argument\\TaggedIteratorArgument' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Argument/TaggedIteratorArgument.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ChildDefinition' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ChildDefinition.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Container' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Container.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ContainerAwareInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ContainerAwareInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ContainerAwareTrait' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ContainerAwareTrait.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ContainerBuilder' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ContainerBuilder.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ContainerInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ContainerInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Definition' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Definition.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\EnvVarLoaderInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/EnvVarLoaderInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\EnvVarProcessor' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/EnvVarProcessor.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\EnvVarProcessorInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/EnvVarProcessorInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\AutowiringFailedException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/AutowiringFailedException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\BadMethodCallException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/BadMethodCallException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\EnvNotFoundException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/EnvNotFoundException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\EnvParameterException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/EnvParameterException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\ExceptionInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/ExceptionInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/InvalidArgumentException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\InvalidParameterTypeException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/InvalidParameterTypeException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\LogicException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/LogicException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\OutOfBoundsException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/OutOfBoundsException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\ParameterCircularReferenceException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\ParameterNotFoundException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/ParameterNotFoundException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\RuntimeException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/RuntimeException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\ServiceCircularReferenceException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Exception\\ServiceNotFoundException' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Exception/ServiceNotFoundException.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ExpressionLanguage' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ExpressionLanguage.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ExpressionLanguageProvider' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ExpressionLanguageProvider.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Parameter' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Parameter.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBag' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ParameterBag/ContainerBag.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBagInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\EnvPlaceholderParameterBag' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\FrozenParameterBag' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ParameterBag/ParameterBag.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBagInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Reference' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Reference.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ResettableContainerInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ResettableContainerInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ReverseContainer' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ReverseContainer.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ServiceLocator' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ServiceLocator.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\ServiceSubscriberInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/ServiceSubscriberInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\TaggedContainerInterface' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/TaggedContainerInterface.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\TypedReference' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/TypedReference.php', 'MailPoetVendor\\Symfony\\Component\\DependencyInjection\\Variable' => $baseDir . '/vendor-prefixed/symfony/dependency-injection/Variable.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Comparator\\Comparator' => $baseDir . '/vendor-prefixed/symfony/finder/Comparator/Comparator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Comparator\\DateComparator' => $baseDir . '/vendor-prefixed/symfony/finder/Comparator/DateComparator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Comparator\\NumberComparator' => $baseDir . '/vendor-prefixed/symfony/finder/Comparator/NumberComparator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => $baseDir . '/vendor-prefixed/symfony/finder/Exception/AccessDeniedException.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => $baseDir . '/vendor-prefixed/symfony/finder/Exception/DirectoryNotFoundException.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Finder' => $baseDir . '/vendor-prefixed/symfony/finder/Finder.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Gitignore' => $baseDir . '/vendor-prefixed/symfony/finder/Gitignore.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Glob' => $baseDir . '/vendor-prefixed/symfony/finder/Glob.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/CustomFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/DateRangeFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/DepthRangeFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/FileTypeFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/FilecontentFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/FilenameFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\LazyIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/LazyIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/MultiplePcreFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/PathFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/RecursiveDirectoryIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/SizeRangeFilterIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\Iterator\\SortableIterator' => $baseDir . '/vendor-prefixed/symfony/finder/Iterator/SortableIterator.php', 'MailPoetVendor\\Symfony\\Component\\Finder\\SplFileInfo' => $baseDir . '/vendor-prefixed/symfony/finder/SplFileInfo.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\DataCollectorTranslator' => $baseDir . '/vendor-prefixed/symfony/translation/DataCollectorTranslator.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => $baseDir . '/vendor-prefixed/symfony/translation/Exception/ExceptionInterface.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Exception\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/symfony/translation/Exception/InvalidArgumentException.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => $baseDir . '/vendor-prefixed/symfony/translation/Exception/InvalidResourceException.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Exception\\LogicException' => $baseDir . '/vendor-prefixed/symfony/translation/Exception/LogicException.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => $baseDir . '/vendor-prefixed/symfony/translation/Exception/NotFoundResourceException.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Exception\\RuntimeException' => $baseDir . '/vendor-prefixed/symfony/translation/Exception/RuntimeException.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\IdentityTranslator' => $baseDir . '/vendor-prefixed/symfony/translation/IdentityTranslator.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Interval' => $baseDir . '/vendor-prefixed/symfony/translation/Interval.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\LoggingTranslator' => $baseDir . '/vendor-prefixed/symfony/translation/LoggingTranslator.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\MessageCatalogue' => $baseDir . '/vendor-prefixed/symfony/translation/MessageCatalogue.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\MessageCatalogueInterface' => $baseDir . '/vendor-prefixed/symfony/translation/MessageCatalogueInterface.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\MessageSelector' => $baseDir . '/vendor-prefixed/symfony/translation/MessageSelector.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\MetadataAwareInterface' => $baseDir . '/vendor-prefixed/symfony/translation/MetadataAwareInterface.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\PluralizationRules' => $baseDir . '/vendor-prefixed/symfony/translation/PluralizationRules.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Translator' => $baseDir . '/vendor-prefixed/symfony/translation/Translator.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\TranslatorBagInterface' => $baseDir . '/vendor-prefixed/symfony/translation/TranslatorBagInterface.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\TranslatorInterface' => $baseDir . '/vendor-prefixed/symfony/translation/TranslatorInterface.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Util\\ArrayConverter' => $baseDir . '/vendor-prefixed/symfony/translation/Util/ArrayConverter.php', 'MailPoetVendor\\Symfony\\Component\\Translation\\Util\\XliffUtils' => $baseDir . '/vendor-prefixed/symfony/translation/Util/XliffUtils.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraint' => $baseDir . '/vendor-prefixed/symfony/validator/Constraint.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ConstraintValidator' => $baseDir . '/vendor-prefixed/symfony/validator/ConstraintValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ConstraintValidatorFactory' => $baseDir . '/vendor-prefixed/symfony/validator/ConstraintValidatorFactory.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ConstraintValidatorFactoryInterface' => $baseDir . '/vendor-prefixed/symfony/validator/ConstraintValidatorFactoryInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ConstraintValidatorInterface' => $baseDir . '/vendor-prefixed/symfony/validator/ConstraintValidatorInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ConstraintViolation' => $baseDir . '/vendor-prefixed/symfony/validator/ConstraintViolation.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ConstraintViolationInterface' => $baseDir . '/vendor-prefixed/symfony/validator/ConstraintViolationInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ConstraintViolationList' => $baseDir . '/vendor-prefixed/symfony/validator/ConstraintViolationList.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ConstraintViolationListInterface' => $baseDir . '/vendor-prefixed/symfony/validator/ConstraintViolationListInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\AbstractComparison' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/AbstractComparison.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\AbstractComparisonValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/AbstractComparisonValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\All' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/All.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\AllValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/AllValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Bic' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Bic.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\BicValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/BicValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Blank' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Blank.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\BlankValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/BlankValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Callback' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Callback.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\CallbackValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/CallbackValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\CardScheme' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/CardScheme.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\CardSchemeValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/CardSchemeValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Choice' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Choice.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\ChoiceValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/ChoiceValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Collection' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Collection.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\CollectionValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/CollectionValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Composite' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Composite.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Count' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Count.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\CountValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/CountValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Country' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Country.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\CountryValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/CountryValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Currency' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Currency.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\CurrencyValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/CurrencyValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Date' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Date.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\DateTime' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/DateTime.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\DateTimeValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/DateTimeValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\DateValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/DateValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\DisableAutoMapping' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/DisableAutoMapping.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\DivisibleBy' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/DivisibleBy.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\DivisibleByValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/DivisibleByValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Email' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Email.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\EmailValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/EmailValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\EnableAutoMapping' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/EnableAutoMapping.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\EqualTo' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/EqualTo.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\EqualToValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/EqualToValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Existence' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Existence.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Expression' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Expression.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\ExpressionValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/ExpressionValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\File' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/File.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\FileValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/FileValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\GreaterThan' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/GreaterThan.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\GreaterThanOrEqual' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/GreaterThanOrEqual.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\GreaterThanOrEqualValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/GreaterThanOrEqualValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\GreaterThanValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/GreaterThanValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\GroupSequence' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/GroupSequence.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\GroupSequenceProvider' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/GroupSequenceProvider.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Iban' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Iban.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IbanValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IbanValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IdenticalTo' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IdenticalTo.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IdenticalToValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IdenticalToValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Image' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Image.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\ImageValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/ImageValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Ip' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Ip.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IpValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IpValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IsFalse' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IsFalse.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IsFalseValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IsFalseValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IsNull' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IsNull.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IsNullValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IsNullValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IsTrue' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IsTrue.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IsTrueValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IsTrueValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Isbn' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Isbn.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IsbnValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IsbnValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Issn' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Issn.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\IssnValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/IssnValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Json' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Json.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\JsonValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/JsonValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Language' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Language.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\LanguageValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/LanguageValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Length' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Length.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\LengthValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/LengthValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\LessThan' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/LessThan.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\LessThanOrEqual' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/LessThanOrEqual.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\LessThanOrEqualValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/LessThanOrEqualValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\LessThanValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/LessThanValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Locale' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Locale.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\LocaleValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/LocaleValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Luhn' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Luhn.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\LuhnValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/LuhnValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Negative' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Negative.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NegativeOrZero' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NegativeOrZero.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotBlank' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotBlank.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotBlankValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotBlankValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotCompromisedPassword' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotCompromisedPassword.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotCompromisedPasswordValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotCompromisedPasswordValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotEqualTo' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotEqualTo.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotEqualToValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotEqualToValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotIdenticalTo' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotIdenticalTo.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotIdenticalToValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotIdenticalToValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotNull' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotNull.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NotNullValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NotNullValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\NumberConstraintTrait' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/NumberConstraintTrait.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Optional' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Optional.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Positive' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Positive.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\PositiveOrZero' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/PositiveOrZero.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Range' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Range.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\RangeValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/RangeValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Regex' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Regex.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\RegexValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/RegexValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Required' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Required.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Time' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Time.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\TimeValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/TimeValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Timezone' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Timezone.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\TimezoneValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/TimezoneValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Traverse' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Traverse.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Type' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Type.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\TypeValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/TypeValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Unique' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Unique.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\UniqueValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/UniqueValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Url' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Url.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\UrlValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/UrlValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Uuid' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Uuid.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\UuidValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/UuidValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\Valid' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/Valid.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Constraints\\ValidValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Constraints/ValidValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ContainerConstraintValidatorFactory' => $baseDir . '/vendor-prefixed/symfony/validator/ContainerConstraintValidatorFactory.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Context\\ExecutionContext' => $baseDir . '/vendor-prefixed/symfony/validator/Context/ExecutionContext.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Context\\ExecutionContextFactory' => $baseDir . '/vendor-prefixed/symfony/validator/Context/ExecutionContextFactory.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Context\\ExecutionContextFactoryInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Context/ExecutionContextFactoryInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Context\\ExecutionContextInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Context/ExecutionContextInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\BadMethodCallException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/BadMethodCallException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\ConstraintDefinitionException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/ConstraintDefinitionException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\ExceptionInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/ExceptionInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\GroupDefinitionException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/GroupDefinitionException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\InvalidArgumentException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/InvalidArgumentException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\InvalidOptionsException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/InvalidOptionsException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\LogicException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/LogicException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\MappingException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/MappingException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\MissingOptionsException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/MissingOptionsException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\NoSuchMetadataException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/NoSuchMetadataException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\OutOfBoundsException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/OutOfBoundsException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\RuntimeException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/RuntimeException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\UnexpectedTypeException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/UnexpectedTypeException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\UnexpectedValueException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/UnexpectedValueException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\UnsupportedMetadataException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/UnsupportedMetadataException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Exception\\ValidatorException' => $baseDir . '/vendor-prefixed/symfony/validator/Exception/ValidatorException.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\GroupSequenceProviderInterface' => $baseDir . '/vendor-prefixed/symfony/validator/GroupSequenceProviderInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\AutoMappingStrategy' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/AutoMappingStrategy.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Cache\\CacheInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Cache/CacheInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Cache\\DoctrineCache' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Cache/DoctrineCache.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Cache\\Psr6Cache' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Cache/Psr6Cache.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\CascadingStrategy' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/CascadingStrategy.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\ClassMetadata' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/ClassMetadata.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\ClassMetadataInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/ClassMetadataInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Factory\\BlackHoleMetadataFactory' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Factory/BlackHoleMetadataFactory.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Factory\\LazyLoadingMetadataFactory' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Factory/LazyLoadingMetadataFactory.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Factory\\MetadataFactoryInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Factory/MetadataFactoryInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\GenericMetadata' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/GenericMetadata.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\GetterMetadata' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/GetterMetadata.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\AbstractLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/AbstractLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\AnnotationLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/AnnotationLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\AutoMappingTrait' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/AutoMappingTrait.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\FileLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/FileLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\FilesLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/FilesLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\LoaderChain' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/LoaderChain.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\LoaderInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/LoaderInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\PropertyInfoLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/PropertyInfoLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\StaticMethodLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/StaticMethodLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\XmlFileLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/XmlFileLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\XmlFilesLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/XmlFilesLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\YamlFileLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/YamlFileLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\Loader\\YamlFilesLoader' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/Loader/YamlFilesLoader.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\MemberMetadata' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/MemberMetadata.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\MetadataInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/MetadataInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\PropertyMetadata' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/PropertyMetadata.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\PropertyMetadataInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/PropertyMetadataInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Mapping\\TraversalStrategy' => $baseDir . '/vendor-prefixed/symfony/validator/Mapping/TraversalStrategy.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ObjectInitializerInterface' => $baseDir . '/vendor-prefixed/symfony/validator/ObjectInitializerInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Util\\LegacyTranslatorProxy' => $baseDir . '/vendor-prefixed/symfony/validator/Util/LegacyTranslatorProxy.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Util\\PropertyPath' => $baseDir . '/vendor-prefixed/symfony/validator/Util/PropertyPath.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Validation' => $baseDir . '/vendor-prefixed/symfony/validator/Validation.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ValidatorBuilder' => $baseDir . '/vendor-prefixed/symfony/validator/ValidatorBuilder.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\ValidatorBuilderInterface' => $baseDir . '/vendor-prefixed/symfony/validator/ValidatorBuilderInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Validator\\ContextualValidatorInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Validator/ContextualValidatorInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Validator\\LazyProperty' => $baseDir . '/vendor-prefixed/symfony/validator/Validator/LazyProperty.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Validator\\RecursiveContextualValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Validator/RecursiveContextualValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Validator\\RecursiveValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Validator/RecursiveValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Validator\\TraceableValidator' => $baseDir . '/vendor-prefixed/symfony/validator/Validator/TraceableValidator.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Validator\\ValidatorInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Validator/ValidatorInterface.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Violation\\ConstraintViolationBuilder' => $baseDir . '/vendor-prefixed/symfony/validator/Violation/ConstraintViolationBuilder.php', 'MailPoetVendor\\Symfony\\Component\\Validator\\Violation\\ConstraintViolationBuilderInterface' => $baseDir . '/vendor-prefixed/symfony/validator/Violation/ConstraintViolationBuilderInterface.php', 'MailPoetVendor\\Symfony\\Contracts\\Service\\ResetInterface' => $baseDir . '/vendor-prefixed/symfony/service-contracts/ResetInterface.php', 'MailPoetVendor\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => $baseDir . '/vendor-prefixed/symfony/service-contracts/ServiceLocatorTrait.php', 'MailPoetVendor\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => $baseDir . '/vendor-prefixed/symfony/service-contracts/ServiceProviderInterface.php', 'MailPoetVendor\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => $baseDir . '/vendor-prefixed/symfony/service-contracts/ServiceSubscriberInterface.php', 'MailPoetVendor\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => $baseDir . '/vendor-prefixed/symfony/service-contracts/ServiceSubscriberTrait.php', 'MailPoetVendor\\Symfony\\Contracts\\Service\\Test\\ServiceLocatorTest' => $baseDir . '/vendor-prefixed/symfony/service-contracts/Test/ServiceLocatorTest.php', 'MailPoetVendor\\Symfony\\Contracts\\Translation\\LocaleAwareInterface' => $baseDir . '/vendor-prefixed/symfony/translation-contracts/LocaleAwareInterface.php', 'MailPoetVendor\\Symfony\\Contracts\\Translation\\Test\\TranslatorTest' => $baseDir . '/vendor-prefixed/symfony/translation-contracts/Test/TranslatorTest.php', 'MailPoetVendor\\Symfony\\Contracts\\Translation\\TranslatorInterface' => $baseDir . '/vendor-prefixed/symfony/translation-contracts/TranslatorInterface.php', 'MailPoetVendor\\Symfony\\Contracts\\Translation\\TranslatorTrait' => $baseDir . '/vendor-prefixed/symfony/translation-contracts/TranslatorTrait.php', 'MailPoetVendor\\Symfony\\Polyfill\\Ctype\\Ctype' => $baseDir . '/vendor-prefixed/symfony/polyfill-ctype/Ctype.php', 'MailPoetVendor\\Symfony\\Polyfill\\Iconv\\Iconv' => $baseDir . '/vendor-prefixed/symfony/polyfill-iconv/Iconv.php', 'MailPoetVendor\\Symfony\\Polyfill\\Intl\\Idn\\Idn' => $baseDir . '/vendor-prefixed/symfony/polyfill-intl-idn/Idn.php', 'MailPoetVendor\\Symfony\\Polyfill\\Intl\\Idn\\Info' => $baseDir . '/vendor-prefixed/symfony/polyfill-intl-idn/Info.php', 'MailPoetVendor\\Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\DisallowedRanges' => $baseDir . '/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php', 'MailPoetVendor\\Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\Regex' => $baseDir . '/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/Regex.php', 'MailPoetVendor\\Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => $baseDir . '/vendor-prefixed/symfony/polyfill-intl-normalizer/Normalizer.php', 'MailPoetVendor\\Symfony\\Polyfill\\Mbstring\\Mbstring' => $baseDir . '/vendor-prefixed/symfony/polyfill-mbstring/Mbstring.php', 'MailPoetVendor\\Symfony\\Polyfill\\Php72\\Php72' => $baseDir . '/vendor-prefixed/symfony/polyfill-php72/Php72.php', 'MailPoetVendor\\Symfony\\Polyfill\\Php80\\Php80' => $baseDir . '/vendor-prefixed/symfony/polyfill-php80/Php80.php', 'MailPoetVendor\\Text_Diff_Renderer_parallel' => $baseDir . '/vendor-prefixed/cerdic/css-tidy/testing/unit-tests/class.Text_Diff_Renderer_parallel.php', 'MailPoetVendor\\Twig\\Cache\\CacheInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Cache/CacheInterface.php', 'MailPoetVendor\\Twig\\Cache\\FilesystemCache' => $baseDir . '/vendor-prefixed/twig/twig/src/Cache/FilesystemCache.php', 'MailPoetVendor\\Twig\\Cache\\NullCache' => $baseDir . '/vendor-prefixed/twig/twig/src/Cache/NullCache.php', 'MailPoetVendor\\Twig\\Compiler' => $baseDir . '/vendor-prefixed/twig/twig/src/Compiler.php', 'MailPoetVendor\\Twig\\Environment' => $baseDir . '/vendor-prefixed/twig/twig/src/Environment.php', 'MailPoetVendor\\Twig\\Error\\Error' => $baseDir . '/vendor-prefixed/twig/twig/src/Error/Error.php', 'MailPoetVendor\\Twig\\Error\\LoaderError' => $baseDir . '/vendor-prefixed/twig/twig/src/Error/LoaderError.php', 'MailPoetVendor\\Twig\\Error\\RuntimeError' => $baseDir . '/vendor-prefixed/twig/twig/src/Error/RuntimeError.php', 'MailPoetVendor\\Twig\\Error\\SyntaxError' => $baseDir . '/vendor-prefixed/twig/twig/src/Error/SyntaxError.php', 'MailPoetVendor\\Twig\\ExpressionParser' => $baseDir . '/vendor-prefixed/twig/twig/src/ExpressionParser.php', 'MailPoetVendor\\Twig\\ExtensionSet' => $baseDir . '/vendor-prefixed/twig/twig/src/ExtensionSet.php', 'MailPoetVendor\\Twig\\Extension\\AbstractExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/AbstractExtension.php', 'MailPoetVendor\\Twig\\Extension\\CoreExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/CoreExtension.php', 'MailPoetVendor\\Twig\\Extension\\DebugExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/DebugExtension.php', 'MailPoetVendor\\Twig\\Extension\\EscaperExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/EscaperExtension.php', 'MailPoetVendor\\Twig\\Extension\\ExtensionInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/ExtensionInterface.php', 'MailPoetVendor\\Twig\\Extension\\GlobalsInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/GlobalsInterface.php', 'MailPoetVendor\\Twig\\Extension\\InitRuntimeInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/InitRuntimeInterface.php', 'MailPoetVendor\\Twig\\Extension\\OptimizerExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/OptimizerExtension.php', 'MailPoetVendor\\Twig\\Extension\\ProfilerExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/ProfilerExtension.php', 'MailPoetVendor\\Twig\\Extension\\RuntimeExtensionInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/RuntimeExtensionInterface.php', 'MailPoetVendor\\Twig\\Extension\\SandboxExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/SandboxExtension.php', 'MailPoetVendor\\Twig\\Extension\\StagingExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/StagingExtension.php', 'MailPoetVendor\\Twig\\Extension\\StringLoaderExtension' => $baseDir . '/vendor-prefixed/twig/twig/src/Extension/StringLoaderExtension.php', 'MailPoetVendor\\Twig\\FileExtensionEscapingStrategy' => $baseDir . '/vendor-prefixed/twig/twig/src/FileExtensionEscapingStrategy.php', 'MailPoetVendor\\Twig\\Lexer' => $baseDir . '/vendor-prefixed/twig/twig/src/Lexer.php', 'MailPoetVendor\\Twig\\Loader\\ArrayLoader' => $baseDir . '/vendor-prefixed/twig/twig/src/Loader/ArrayLoader.php', 'MailPoetVendor\\Twig\\Loader\\ChainLoader' => $baseDir . '/vendor-prefixed/twig/twig/src/Loader/ChainLoader.php', 'MailPoetVendor\\Twig\\Loader\\ExistsLoaderInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Loader/ExistsLoaderInterface.php', 'MailPoetVendor\\Twig\\Loader\\FilesystemLoader' => $baseDir . '/vendor-prefixed/twig/twig/src/Loader/FilesystemLoader.php', 'MailPoetVendor\\Twig\\Loader\\LoaderInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Loader/LoaderInterface.php', 'MailPoetVendor\\Twig\\Loader\\SourceContextLoaderInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/Loader/SourceContextLoaderInterface.php', 'MailPoetVendor\\Twig\\Markup' => $baseDir . '/vendor-prefixed/twig/twig/src/Markup.php', 'MailPoetVendor\\Twig\\NodeTraverser' => $baseDir . '/vendor-prefixed/twig/twig/src/NodeTraverser.php', 'MailPoetVendor\\Twig\\NodeVisitor\\AbstractNodeVisitor' => $baseDir . '/vendor-prefixed/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php', 'MailPoetVendor\\Twig\\NodeVisitor\\EscaperNodeVisitor' => $baseDir . '/vendor-prefixed/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php', 'MailPoetVendor\\Twig\\NodeVisitor\\MacroAutoImportNodeVisitor' => $baseDir . '/vendor-prefixed/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.php', 'MailPoetVendor\\Twig\\NodeVisitor\\NodeVisitorInterface' => $baseDir . '/vendor-prefixed/twig/twig/src/NodeVisitor/NodeVisitorInterface.php', 'MailPoetVendor\\Twig\\NodeVisitor\\OptimizerNodeVisitor' => $baseDir . '/vendor-prefixed/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php', 'MailPoetVendor\\Twig\\NodeVisitor\\SafeAnalysisNodeVisitor' => $baseDir . '/vendor-prefixed/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php', 'MailPoetVendor\\Twig\\NodeVisitor\\SandboxNodeVisitor' => $baseDir . '/vendor-prefixed/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php', 'MailPoetVendor\\Twig\\Node\\AutoEscapeNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/AutoEscapeNode.php', 'MailPoetVendor\\Twig\\Node\\BlockNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/BlockNode.php', 'MailPoetVendor\\Twig\\Node\\BlockReferenceNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/BlockReferenceNode.php', 'MailPoetVendor\\Twig\\Node\\BodyNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/BodyNode.php', 'MailPoetVendor\\Twig\\Node\\CheckSecurityNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/CheckSecurityNode.php', 'MailPoetVendor\\Twig\\Node\\CheckToStringNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/CheckToStringNode.php', 'MailPoetVendor\\Twig\\Node\\DeprecatedNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/DeprecatedNode.php', 'MailPoetVendor\\Twig\\Node\\DoNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/DoNode.php', 'MailPoetVendor\\Twig\\Node\\EmbedNode' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/EmbedNode.php', 'MailPoetVendor\\Twig\\Node\\Expression\\AbstractExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/AbstractExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\ArrayExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/ArrayExpression.php', 'MailPoetVendor\\Twig\\Node\\Expression\\ArrowFunctionExpression' => $baseDir . '/vendor-prefixed/twig/twig/src/Node/Expression/ArrowFunctionExpression.php', 'MailPoetVendor\\Twig\\N
|