+{% endblock %}
diff --git a/src/schema.sql b/src/schema.sql
new file mode 100644
index 0000000000..759c399273
--- /dev/null
+++ b/src/schema.sql
@@ -0,0 +1,581 @@
+# ************************************************************
+# Sequel Pro SQL dump
+# Version 4541
+#
+# http://www.sequelpro.com/
+# https://github.com/sequelpro/sequelpro
+#
+# Host: localhost (MySQL 5.6.38)
+# Database: directus
+# Generation Time: 2018-06-11 15:01:55 +0000
+# ************************************************************
+
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+
+# Dump of table directus_activity
+# ------------------------------------------------------------
+
+DROP TABLE IF EXISTS `directus_activity`;
+
+CREATE TABLE `directus_activity` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `type` varchar(45) NOT NULL,
+ `action` varchar(45) NOT NULL,
+ `user` int(11) unsigned NOT NULL DEFAULT '0',
+ `datetime` datetime NOT NULL,
+ `ip` varchar(50) NOT NULL,
+ `user_agent` varchar(255) NOT NULL,
+ `collection` varchar(64) NOT NULL,
+ `item` varchar(255) NOT NULL,
+ `datetime_edited` datetime DEFAULT NULL,
+ `comment` text,
+ `deleted_comment` tinyint(1) unsigned DEFAULT '0',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+# Dump of table directus_activity_read
+# ------------------------------------------------------------
+
+DROP TABLE IF EXISTS `directus_activity_read`;
+
+CREATE TABLE `directus_activity_read` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `activity` int(11) unsigned NOT NULL,
+ `user` int(11) unsigned NOT NULL DEFAULT '0',
+ `read` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `archived` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+# Dump of table directus_collection_presets
+# ------------------------------------------------------------
+
+DROP TABLE IF EXISTS `directus_collection_presets`;
+
+CREATE TABLE `directus_collection_presets` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `title` varchar(255) DEFAULT NULL,
+ `user` int(11) unsigned DEFAULT NULL,
+ `role` int(11) unsigned DEFAULT NULL,
+ `collection` varchar(64) NOT NULL,
+ `search_query` varchar(100) DEFAULT NULL,
+ `filters` text,
+ `view_type` varchar(100) NOT NULL,
+ `view_query` text,
+ `view_options` text,
+ `translation` text,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `idx_user_collection_title` (`user`,`collection`,`title`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+# Dump of table directus_collections
+# ------------------------------------------------------------
+
+DROP TABLE IF EXISTS `directus_collections`;
+
+CREATE TABLE `directus_collections` (
+ `collection` varchar(64) NOT NULL,
+ `item_name_template` varchar(255) DEFAULT NULL,
+ `preview_url` varchar(255) DEFAULT NULL,
+ `hidden` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `single` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `translation` text,
+ `note` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`collection`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+# Dump of table directus_fields
+# ------------------------------------------------------------
+
+DROP TABLE IF EXISTS `directus_fields`;
+
+CREATE TABLE `directus_fields` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `collection` varchar(64) NOT NULL,
+ `field` varchar(64) NOT NULL,
+ `type` varchar(64) NOT NULL,
+ `interface` varchar(64) NOT NULL,
+ `options` text,
+ `locked` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `translation` text,
+ `readonly` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `required` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `sort` int(11) unsigned DEFAULT NULL,
+ `view_width` int(11) unsigned NOT NULL DEFAULT '4',
+ `note` varchar(1024) DEFAULT NULL,
+ `hidden_input` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `validation` varchar(255) DEFAULT NULL,
+ `hidden_list` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `group` int(11) unsigned DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `idx_collection_field` (`collection`,`field`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+LOCK TABLES `directus_fields` WRITE;
+/*!40000 ALTER TABLE `directus_fields` DISABLE KEYS */;
+
+INSERT INTO `directus_fields` (`id`, `collection`, `field`, `type`, `interface`, `options`, `locked`, `translation`, `readonly`, `required`, `sort`, `view_width`, `note`, `hidden_input`, `validation`, `hidden_list`, `group`)
+VALUES
+ (1,'directus_activity','id','int','primary-key',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (2,'directus_activity','type','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (3,'directus_activity','action','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (4,'directus_activity','user','int','user',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (5,'directus_activity','datetime','datetime','datetime',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (6,'directus_activity','ip','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (7,'directus_activity','user_agent','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (8,'directus_activity','collection','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (9,'directus_activity','item','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (10,'directus_activity','comment','text','markdown',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (11,'directus_activity_read','id','int','primary-key',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (12,'directus_activity_read','activity','int','many-to-one',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (13,'directus_activity_read','user','int','user',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (14,'directus_activity_read','read','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (15,'directus_activity_read','archived','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (16,'directus_collections','collection','varchar','primary-key',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (17,'directus_collections','item_name_template','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (18,'directus_collections','preview_url','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (19,'directus_collections','hidden','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (20,'directus_collections','single','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (21,'directus_collections','translation','json','JSON',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (22,'directus_collections','note','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (23,'directus_collection_presets','id','int','primary-key',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (24,'directus_collection_presets','title','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (25,'directus_collection_presets','user','int','user',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (26,'directus_collection_presets','role','int','many-to-one',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (27,'directus_collection_presets','collection','varchar','many-to-one',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (28,'directus_collection_presets','search_query','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (29,'directus_collection_presets','filters','json','json',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (30,'directus_collection_presets','view_options','json','json',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (31,'directus_collection_presets','view_type','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (32,'directus_collection_presets','view_query','json','json',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (33,'directus_collection_presets','translation','json','JSON',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (34,'directus_fields','id','int','primary-key',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (35,'directus_fields','collection','varchar','many-to-one',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (36,'directus_fields','field','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (37,'directus_fields','type','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (38,'directus_fields','interface','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (39,'directus_fields','options','json','json',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (40,'directus_fields','locked','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (41,'directus_fields','translation','json','JSON',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (42,'directus_fields','readonly','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (43,'directus_fields','required','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (44,'directus_fields','sort','int','sort',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (45,'directus_fields','note','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (46,'directus_fields','hidden_input','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (47,'directus_fields','hidden_list','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (48,'directus_fields','view_width','int','numeric',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (49,'directus_fields','group','int','many-to-one',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (50,'directus_files','id','int','primary-key',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (51,'directus_files','filename','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (52,'directus_files','title','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (53,'directus_files','description','text','textarea',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (54,'directus_files','location','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (55,'directus_files','tags','csv','tags',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (56,'directus_files','width','int','numeric',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (57,'directus_files','height','int','numeric',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (58,'directus_files','filesize','int','filesize',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (59,'directus_files','duration','int','numeric',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (60,'directus_files','metadata','json','JSON',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (61,'directus_files','type','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (62,'directus_files','charset','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (63,'directus_files','embed','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (64,'directus_files','folder','int','many-to-one',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (65,'directus_files','upload_user','int','user',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (66,'directus_files','upload_date','datetime','datetime',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (67,'directus_files','storage_adapter','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (68,'directus_files','data','blob','blob','{ \"nameField\": \"filename\", \"sizeField\": \"filesize\", \"typeField\": \"type\" }',0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (69,'directus_files','url','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (70,'directus_files','storage','alias','file-upload',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (71,'directus_folders','id','int','primary-key',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (72,'directus_folders','name','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (73,'directus_folders','parent_folder','int','many-to-one',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (74,'directus_roles','id','int','primary-key',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (75,'directus_roles','name','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (76,'directus_roles','description','varchar','textarea',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (77,'directus_roles','ip_whitelist','text','textarea',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (78,'directus_roles','nav_blacklist','text','textarea',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (79,'directus_user_roles','id','int','primary-key',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (80,'directus_user_roles','user','int','user',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (81,'directus_user_roles','role','int','many-to-one',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (82,'directus_users','id','int','primary-key',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (83,'directus_users','status','int','status','{\"status_mapping\":[{\"name\": \"draft\"},{\"name\": \"active\"},{\"name\": \"delete\"}]}',0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (84,'directus_users','first_name','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (85,'directus_users','last_name','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (86,'directus_users','email','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (87,'directus_users','roles','m2m','m2m',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (88,'directus_users','email_notifications','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (89,'directus_users','password','varchar','password',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (90,'directus_users','avatar','file','single-file',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (91,'directus_users','company','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (92,'directus_users','title','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (93,'directus_users','locale','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (94,'directus_users','locale_options','json','json',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (95,'directus_users','timezone','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (96,'directus_users','last_ip','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (97,'directus_users','last_login','datetime','datetime',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (98,'directus_users','last_access','datetime','datetime',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (99,'directus_users','last_page','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (100,'directus_users','token','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (101,'directus_users','invite_token','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (102,'directus_users','invite_accepted','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (103,'directus_permissions','id','int','primary-key',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (104,'directus_permissions','collection','varchar','many-to-one',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (105,'directus_permissions','role','int','many-to-one',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (106,'directus_permissions','status','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (107,'directus_permissions','create','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (108,'directus_permissions','read','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (109,'directus_permissions','update','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (110,'directus_permissions','delete','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (111,'directus_permissions','navigate','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (112,'directus_permissions','explain','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (113,'directus_permissions','allow_statuses','csv','tags',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (114,'directus_permissions','read_field_blacklist','varchar','textarea',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (115,'directus_relations','id','int','primary-key',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (116,'directus_relations','collection_a','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (117,'directus_relations','field_a','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (118,'directus_relations','junction_key_a','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (119,'directus_relations','junction_mixed_collections','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (120,'directus_relations','junction_key_b','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (121,'directus_relations','collection_b','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (122,'directus_relations','field_b','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (123,'directus_revisions','id','int','primary-key',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (124,'directus_revisions','activity','int','many-to-one',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (125,'directus_revisions','collection','varchar','many-to-one',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (126,'directus_revisions','item','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (127,'directus_revisions','data','longjson','json',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (128,'directus_revisions','delta','longjson','json',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (129,'directus_revisions','parent_item','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (130,'directus_revisions','parent_collection','varchar','many-to-one',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (131,'directus_revisions','parent_changed','boolean','toggle',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (132,'directus_settings','auto_sign_out','int','numeric',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL),
+ (133,'directus_settings','youtube_api_key','varchar','text-input',NULL,0,NULL,0,0,NULL,4,NULL,0,NULL,0,NULL);
+
+/*!40000 ALTER TABLE `directus_fields` ENABLE KEYS */;
+UNLOCK TABLES;
+
+
+# Dump of table directus_files
+# ------------------------------------------------------------
+
+DROP TABLE IF EXISTS `directus_files`;
+
+CREATE TABLE `directus_files` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `filename` varchar(255) NOT NULL,
+ `title` varchar(255) DEFAULT NULL,
+ `description` text,
+ `location` varchar(200) DEFAULT NULL,
+ `tags` varchar(255) DEFAULT NULL,
+ `width` int(11) unsigned DEFAULT NULL,
+ `height` int(11) unsigned DEFAULT NULL,
+ `filesize` int(11) unsigned NOT NULL DEFAULT '0',
+ `duration` int(11) DEFAULT NULL,
+ `metadata` text,
+ `type` varchar(255) DEFAULT NULL,
+ `charset` varchar(50) DEFAULT NULL,
+ `embed` varchar(200) DEFAULT NULL,
+ `folder` int(11) unsigned DEFAULT NULL,
+ `upload_user` int(11) unsigned NOT NULL,
+ `upload_date` datetime NOT NULL,
+ `storage_adapter` varchar(50) NOT NULL DEFAULT 'local',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+LOCK TABLES `directus_files` WRITE;
+/*!40000 ALTER TABLE `directus_files` DISABLE KEYS */;
+
+INSERT INTO `directus_files` (`id`, `filename`, `title`, `description`, `location`, `tags`, `width`, `height`, `filesize`, `duration`, `metadata`, `type`, `charset`, `embed`, `folder`, `upload_user`, `upload_date`, `storage_adapter`)
+VALUES
+ (1,'00000000001.jpg','Mountain Range','A gorgeous view of this wooded mountain range','Earth','trees,rocks,nature,mountains,forest',1800,1200,602058,NULL,NULL,'image/jpeg','binary',NULL,NULL,1,'2018-06-11 13:04:38','local');
+
+/*!40000 ALTER TABLE `directus_files` ENABLE KEYS */;
+UNLOCK TABLES;
+
+
+# Dump of table directus_folders
+# ------------------------------------------------------------
+
+DROP TABLE IF EXISTS `directus_folders`;
+
+CREATE TABLE `directus_folders` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(191) CHARACTER SET utf8mb4 NOT NULL,
+ `parent_folder` int(11) unsigned DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `idx_name_parent_folder` (`name`,`parent_folder`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+# Dump of table directus_migrations
+# ------------------------------------------------------------
+
+DROP TABLE IF EXISTS `directus_migrations`;
+
+CREATE TABLE `directus_migrations` (
+ `version` bigint(20) NOT NULL,
+ `migration_name` varchar(100) DEFAULT NULL,
+ `start_time` timestamp NULL DEFAULT NULL,
+ `end_time` timestamp NULL DEFAULT NULL,
+ `breakpoint` tinyint(1) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`version`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+LOCK TABLES `directus_migrations` WRITE;
+/*!40000 ALTER TABLE `directus_migrations` DISABLE KEYS */;
+
+INSERT INTO `directus_migrations` (`version`, `migration_name`, `start_time`, `end_time`, `breakpoint`)
+VALUES
+ (20180220023138,'CreateActivityTable','2018-06-11 15:04:38','2018-06-11 15:04:38',0),
+ (20180220023144,'CreateActivityReadTable','2018-06-11 15:04:38','2018-06-11 15:04:38',0),
+ (20180220023152,'CreateCollectionsPresetsTable','2018-06-11 15:04:38','2018-06-11 15:04:38',0),
+ (20180220023157,'CreateCollectionsTable','2018-06-11 15:04:38','2018-06-11 15:04:38',0),
+ (20180220023202,'CreateFieldsTable','2018-06-11 15:04:38','2018-06-11 15:04:38',0),
+ (20180220023208,'CreateFilesTable','2018-06-11 15:04:38','2018-06-11 15:04:38',0),
+ (20180220023213,'CreateFoldersTable','2018-06-11 15:04:38','2018-06-11 15:04:38',0),
+ (20180220023217,'CreateRolesTable','2018-06-11 15:04:38','2018-06-11 15:04:38',0),
+ (20180220023226,'CreatePermissionsTable','2018-06-11 15:04:38','2018-06-11 15:04:38',0),
+ (20180220023232,'CreateRelationsTable','2018-06-11 15:04:38','2018-06-11 15:04:38',0),
+ (20180220023238,'CreateRevisionsTable','2018-06-11 15:04:38','2018-06-11 15:04:38',0),
+ (20180220023243,'CreateSettingsTable','2018-06-11 15:04:38','2018-06-11 15:04:38',0),
+ (20180220023248,'CreateUsersTable','2018-06-11 15:04:38','2018-06-11 15:04:38',0),
+ (20180426173310,'CreateUserRoles','2018-06-11 15:04:38','2018-06-11 15:04:38',0);
+
+/*!40000 ALTER TABLE `directus_migrations` ENABLE KEYS */;
+UNLOCK TABLES;
+
+
+# Dump of table directus_permissions
+# ------------------------------------------------------------
+
+DROP TABLE IF EXISTS `directus_permissions`;
+
+CREATE TABLE `directus_permissions` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `collection` varchar(64) NOT NULL,
+ `role` int(11) unsigned NOT NULL,
+ `status` varchar(64) DEFAULT NULL,
+ `create` varchar(16) DEFAULT NULL,
+ `read` varchar(16) DEFAULT NULL,
+ `update` varchar(16) DEFAULT NULL,
+ `delete` varchar(16) DEFAULT NULL,
+ `navigate` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `comment` varchar(8) DEFAULT NULL,
+ `read_field_blacklist` varchar(1000) DEFAULT NULL,
+ `write_field_blacklist` varchar(1000) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+# Dump of table directus_relations
+# ------------------------------------------------------------
+
+DROP TABLE IF EXISTS `directus_relations`;
+
+CREATE TABLE `directus_relations` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `collection_a` varchar(64) NOT NULL,
+ `field_a` varchar(45) NOT NULL,
+ `junction_key_a` varchar(64) DEFAULT NULL,
+ `junction_collection` varchar(64) DEFAULT NULL,
+ `junction_mixed_collections` varchar(64) DEFAULT NULL,
+ `junction_key_b` varchar(64) DEFAULT NULL,
+ `collection_b` varchar(64) DEFAULT NULL,
+ `field_b` varchar(64) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+LOCK TABLES `directus_relations` WRITE;
+/*!40000 ALTER TABLE `directus_relations` DISABLE KEYS */;
+
+INSERT INTO `directus_relations` (`id`, `collection_a`, `field_a`, `junction_key_a`, `junction_collection`, `junction_mixed_collections`, `junction_key_b`, `collection_b`, `field_b`)
+VALUES
+ (1,'directus_activity','user',NULL,NULL,NULL,NULL,'directus_users',NULL),
+ (2,'directus_activity_read','user',NULL,NULL,NULL,NULL,'directus_users',NULL),
+ (3,'directus_activity_read','activity',NULL,NULL,NULL,NULL,'directus_activity',NULL),
+ (4,'directus_collections_presets','user',NULL,NULL,NULL,NULL,'directus_users',NULL),
+ (5,'directus_collections_presets','group',NULL,NULL,NULL,NULL,'directus_groups',NULL),
+ (6,'directus_files','upload_user',NULL,NULL,NULL,NULL,'directus_users',NULL),
+ (7,'directus_files','folder',NULL,NULL,NULL,NULL,'directus_folders',NULL),
+ (8,'directus_folders','parent_folder',NULL,NULL,NULL,NULL,'directus_folders',NULL),
+ (9,'directus_permissions','group',NULL,NULL,NULL,NULL,'directus_groups',NULL),
+ (10,'directus_revisions','activity',NULL,NULL,NULL,NULL,'directus_activity',NULL),
+ (11,'directus_users','roles','user','directus_user_roles',NULL,'role','directus_roles','users'),
+ (12,'directus_users','avatar',NULL,NULL,NULL,NULL,'directus_files',NULL);
+
+/*!40000 ALTER TABLE `directus_relations` ENABLE KEYS */;
+UNLOCK TABLES;
+
+
+# Dump of table directus_revisions
+# ------------------------------------------------------------
+
+DROP TABLE IF EXISTS `directus_revisions`;
+
+CREATE TABLE `directus_revisions` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `activity` int(11) unsigned NOT NULL,
+ `collection` varchar(64) NOT NULL,
+ `item` varchar(255) NOT NULL,
+ `data` longtext NOT NULL,
+ `delta` longtext,
+ `parent_item` varchar(255) DEFAULT NULL,
+ `parent_collection` varchar(64) DEFAULT NULL,
+ `parent_changed` tinyint(1) unsigned DEFAULT '0',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+# Dump of table directus_roles
+# ------------------------------------------------------------
+
+DROP TABLE IF EXISTS `directus_roles`;
+
+CREATE TABLE `directus_roles` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `external_id` varchar(255) DEFAULT NULL,
+ `name` varchar(100) NOT NULL,
+ `description` varchar(500) DEFAULT NULL,
+ `ip_whitelist` text,
+ `nav_blacklist` text,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `idx_group_name` (`name`),
+ UNIQUE KEY `idx_users_external_id` (`external_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+LOCK TABLES `directus_roles` WRITE;
+/*!40000 ALTER TABLE `directus_roles` DISABLE KEYS */;
+
+INSERT INTO `directus_roles` (`id`, `external_id`, `name`, `description`, `ip_whitelist`, `nav_blacklist`)
+VALUES
+ (1,NULL,'Administrator','Admins have access to all managed data within the system by default',NULL,NULL),
+ (2,NULL,'Public','This sets the data that is publicly available through the API without a token',NULL,NULL);
+
+/*!40000 ALTER TABLE `directus_roles` ENABLE KEYS */;
+UNLOCK TABLES;
+
+
+# Dump of table directus_settings
+# ------------------------------------------------------------
+
+DROP TABLE IF EXISTS `directus_settings`;
+
+CREATE TABLE `directus_settings` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `scope` varchar(64) NOT NULL,
+ `key` varchar(64) NOT NULL,
+ `value` varchar(255) NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `idx_scope_name` (`scope`,`key`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+LOCK TABLES `directus_settings` WRITE;
+/*!40000 ALTER TABLE `directus_settings` DISABLE KEYS */;
+
+INSERT INTO `directus_settings` (`id`, `scope`, `key`, `value`)
+VALUES
+ (1,'global','auto_sign_out','60'),
+ (2,'global','project_name','Directus'),
+ (3,'global','default_limit','200'),
+ (4,'global','logo',''),
+ (5,'files','file_naming','file_id'),
+ (6,'files','youtube_api_key','');
+
+/*!40000 ALTER TABLE `directus_settings` ENABLE KEYS */;
+UNLOCK TABLES;
+
+
+# Dump of table directus_user_roles
+# ------------------------------------------------------------
+
+DROP TABLE IF EXISTS `directus_user_roles`;
+
+CREATE TABLE `directus_user_roles` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `user` int(11) unsigned DEFAULT NULL,
+ `role` int(11) unsigned DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `idx_user_role` (`user`,`role`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+LOCK TABLES `directus_user_roles` WRITE;
+/*!40000 ALTER TABLE `directus_user_roles` DISABLE KEYS */;
+
+INSERT INTO `directus_user_roles` (`id`, `user`, `role`)
+VALUES
+ (1,1,1);
+
+/*!40000 ALTER TABLE `directus_user_roles` ENABLE KEYS */;
+UNLOCK TABLES;
+
+
+# Dump of table directus_users
+# ------------------------------------------------------------
+
+DROP TABLE IF EXISTS `directus_users`;
+
+CREATE TABLE `directus_users` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `status` int(1) unsigned NOT NULL DEFAULT '2',
+ `first_name` varchar(50) DEFAULT NULL,
+ `last_name` varchar(50) DEFAULT NULL,
+ `email` varchar(128) NOT NULL,
+ `email_notifications` int(1) NOT NULL DEFAULT '1',
+ `password` varchar(255) DEFAULT NULL,
+ `avatar` int(11) unsigned DEFAULT NULL,
+ `company` varchar(191) DEFAULT NULL,
+ `title` varchar(191) DEFAULT NULL,
+ `locale` varchar(8) DEFAULT 'en-US',
+ `high_contrast_mode` tinyint(1) unsigned DEFAULT '0',
+ `locale_options` text,
+ `timezone` varchar(32) NOT NULL DEFAULT 'America/New_York',
+ `last_ip` varchar(50) DEFAULT NULL,
+ `last_login` datetime DEFAULT NULL,
+ `last_access` datetime DEFAULT NULL,
+ `last_page` varchar(45) DEFAULT NULL,
+ `token` varchar(255) DEFAULT NULL,
+ `invite_token` varchar(255) DEFAULT NULL,
+ `invite_accepted` tinyint(1) unsigned DEFAULT '0',
+ `external_id` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `idx_users_email` (`email`),
+ UNIQUE KEY `idx_users_token` (`token`),
+ UNIQUE KEY `idx_users_external_id` (`external_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+LOCK TABLES `directus_users` WRITE;
+/*!40000 ALTER TABLE `directus_users` DISABLE KEYS */;
+
+INSERT INTO `directus_users` (`id`, `status`, `first_name`, `last_name`, `email`, `email_notifications`, `password`, `avatar`, `company`, `title`, `locale`, `high_contrast_mode`, `locale_options`, `timezone`, `last_ip`, `last_login`, `last_access`, `last_page`, `token`, `invite_token`, `invite_accepted`, `external_id`)
+VALUES
+ (1,1,'Admin','User','admin@example.com',1,'$2y$12$MLltm.JyJ9ozdzDLjwJygeBypXvtwsTjXVIX/VbQS/9QE6Hx0dbdm',NULL,NULL,NULL,'en-US',0,NULL,'America/New_York',NULL,NULL,NULL,NULL,'admin_token',NULL,0,NULL);
+
+/*!40000 ALTER TABLE `directus_users` ENABLE KEYS */;
+UNLOCK TABLES;
+
+
+
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
diff --git a/src/services/.gitkeep b/src/services/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/src/web.php b/src/web.php
new file mode 100644
index 0000000000..90c7666420
--- /dev/null
+++ b/src/web.php
@@ -0,0 +1,178 @@
+ [
+ 'error' => 8,
+ 'message' => 'API Environment Configuration Not Found: ' . $env
+ ]
+ ]);
+ exit;
+ }
+}
+
+$app = create_app($basePath, require $configFilePath);
+
+// ----------------------------------------------------------------------------
+//
+
+// =============================================================================
+// Error reporting
+// -----------------------------------------------------------------------------
+// Possible values:
+//
+// 'production' => error suppression
+// 'development' => no error suppression
+// 'staging' => no error suppression
+//
+// =============================================================================
+
+$errorReporting = E_ALL;
+$displayErrors = 1;
+if ($app->getConfig()->get('app.env', 'development') === 'production') {
+ $displayErrors = $errorReporting = 0;
+}
+
+error_reporting($errorReporting);
+ini_set('display_errors', $displayErrors);
+
+// =============================================================================
+// Timezone
+// =============================================================================
+date_default_timezone_set($app->getConfig()->get('timezone', 'America/New_York'));
+
+$container = $app->getContainer();
+
+register_global_hooks($app);
+register_extensions_hooks($app);
+
+$app->getContainer()->get('hook_emitter')->run('application.boot', $app);
+
+// TODO: Implement old Slim 2 hooks into middleware
+
+//
+// ----------------------------------------------------------------------------
+
+$app->add(new \Directus\Application\Http\Middleware\TableGatewayMiddleware($app->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\IpRateLimitMiddleware($app->getContainer()))
+ ->add(new RKA\Middleware\IpAddress())
+ ->add(new \Directus\Application\Http\Middleware\CorsMiddleware($app->getContainer()));
+
+$app->get('/', \Directus\Api\Routes\Home::class)
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($app->getContainer()));
+
+$app->group('/{env}', function () {
+ $this->group('/activity', \Directus\Api\Routes\Activity::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($this->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($this->getContainer()));
+ $this->group('/auth', \Directus\Api\Routes\Auth::class);
+ $this->group('/fields', \Directus\Api\Routes\Fields::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($this->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($this->getContainer()));
+ $this->group('/files', \Directus\Api\Routes\Files::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($this->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($this->getContainer()));
+ $this->group('/items', \Directus\Api\Routes\Items::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($this->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($this->getContainer()));
+ $this->group('/collection_presets', \Directus\Api\Routes\CollectionPresets::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($this->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($this->getContainer()));
+ $this->group('/permissions', \Directus\Api\Routes\Permissions::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($this->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($this->getContainer()));
+ $this->group('/relations', \Directus\Api\Routes\Relations::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($this->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($this->getContainer()));
+ $this->group('/revisions', \Directus\Api\Routes\Revisions::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($this->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($this->getContainer()));
+ $this->group('/roles', \Directus\Api\Routes\Roles::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($this->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($this->getContainer()));
+ $this->group('/settings', \Directus\Api\Routes\Settings::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($this->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($this->getContainer()));
+ $this->group('/collections', \Directus\Api\Routes\Collections::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($this->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($this->getContainer()));
+ $this->group('/users', \Directus\Api\Routes\Users::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($this->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($this->getContainer()));
+ $this->group('/scim', function () {
+ $this->group('/v2', \Directus\Api\Routes\ScimTwo::class);
+ })->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($this->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($this->getContainer()));;
+ $this->group('/utils', \Directus\Api\Routes\Utils::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($this->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($this->getContainer()));
+
+ $this->group('/custom', function () {
+ $endpointsList = get_custom_endpoints('/public/custom/endpoints');
+
+ foreach ($endpointsList as $name => $endpoints) {
+ create_group_route_from_array($this, $name, $endpoints);
+ }
+ });
+
+ $this->group('/pages', function () {
+ $endpointsList = get_custom_endpoints('public/extensions/core/pages', true);
+
+ foreach ($endpointsList as $name => $endpoints) {
+ create_group_route_from_array($this, $name, $endpoints);
+ }
+ })
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($this->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($this->getContainer()));
+
+ $this->group('/interfaces', function () {
+ $endpointsList = get_custom_endpoints('public/extensions/core/interfaces', true);
+
+ foreach ($endpointsList as $name => $endpoints) {
+ create_group_route_from_array($this, $name, $endpoints);
+ }
+ })
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($this->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($this->getContainer()));
+});
+
+$app->group('/interfaces', \Directus\Api\Routes\Interfaces::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($app->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($app->getContainer()));
+$app->group('/listings', \Directus\Api\Routes\Listings::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($app->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($app->getContainer()));
+$app->group('/pages', \Directus\Api\Routes\Pages::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($app->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($app->getContainer()));
+$app->group('/server', \Directus\Api\Routes\Server::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($app->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($app->getContainer()));
+$app->group('/types', \Directus\Api\Routes\Types::class)
+ ->add(new \Directus\Application\Http\Middleware\UserRateLimitMiddleware($app->getContainer()))
+ ->add(new \Directus\Application\Http\Middleware\AuthenticationMiddleware($app->getContainer()));
+
+$app->add(new \Directus\Application\Http\Middleware\ResponseCacheMiddleware($app->getContainer()));
+
+return $app;
diff --git a/vendor/akrabat/rka-ip-address-middleware/.travis.yml b/vendor/akrabat/rka-ip-address-middleware/.travis.yml
new file mode 100644
index 0000000000..f6408f316b
--- /dev/null
+++ b/vendor/akrabat/rka-ip-address-middleware/.travis.yml
@@ -0,0 +1,19 @@
+sudo: false
+
+language: php
+
+php:
+ - 5.5
+ - 5.6
+ - 7.0
+
+before_install:
+ - composer self-update
+
+install:
+ - travis_retry composer install --no-interaction --ignore-platform-reqs --prefer-source
+ - composer info -i
+
+script:
+ - vendor/bin/phpcs
+ - vendor/bin/phpunit
diff --git a/vendor/akrabat/rka-ip-address-middleware/LICENSE b/vendor/akrabat/rka-ip-address-middleware/LICENSE
new file mode 100644
index 0000000000..1f8a265589
--- /dev/null
+++ b/vendor/akrabat/rka-ip-address-middleware/LICENSE
@@ -0,0 +1,26 @@
+Copyright (c) 2015, Rob Allen (rob@akrabat.com)
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ * The name of Rob Allen may not be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/akrabat/rka-ip-address-middleware/README.md b/vendor/akrabat/rka-ip-address-middleware/README.md
new file mode 100644
index 0000000000..3bb3856080
--- /dev/null
+++ b/vendor/akrabat/rka-ip-address-middleware/README.md
@@ -0,0 +1,45 @@
+# Client IP address middleware
+
+PSR-7 Middleware that determines the client IP address and stores it as an `ServerRequest` attribute called `ip_address`.
+
+[![Build status][Master image]][Master]
+
+
+This middleware checks the 'X-Forwarded-For', 'X-Forwarded', 'X-Cluster-Client-Ip', 'Client-Ip' headers for the first IP address it can find. If none of the headers exist, or do not have a valid IP address, then the `$_SERVER['REMOTE_ADDR']` is used.
+
+*Note that the proxy headers are only checked if the first parameter to the constructor is set to `true`. If set to false, then only `$_SERVER['REMOTE_ADDR']` is used*
+
+**Trusted Proxies**
+
+You can set a list of proxies that are trusted as the second constructor parameter. If this list is set, then the proxy headers will only be checked if the `REMOTE_ADDR` is in the trusted list.
+
+
+## Installation
+
+`composer require akrabat/rka-ip-address-middleware`
+
+## Usage
+
+In Slim 3:
+
+```php
+$checkProxyHeaders = true; // Note: Never trust the IP address for security processes!
+$trustedProxies = ['10.0.0.1', '10.0.0.2']; // Note: Never trust the IP address for security processes!
+$app->add(new RKA\Middleware\IpAddress($checkProxyHeaders, $trustedProxies));
+
+$app->get('/', function ($request, $response, $args) {
+ $ipAddress = $request->getAttribute('ip_address');
+
+ return $response;
+});
+```
+
+## Testing
+
+* Code coverage: ``$ vendor/bin/phpcs``
+* Unit tests: ``$ vendor/bin/phpunit``
+* Code coverage: ``$ vendor/bin/phpunit --coverage-html ./build``
+
+
+[Master]: https://travis-ci.org/akrabat/rka-content-type-renderer
+[Master image]: https://secure.travis-ci.org/akrabat/rka-content-type-renderer.svg?branch=master
diff --git a/vendor/akrabat/rka-ip-address-middleware/composer.json b/vendor/akrabat/rka-ip-address-middleware/composer.json
new file mode 100644
index 0000000000..fc8e5218c4
--- /dev/null
+++ b/vendor/akrabat/rka-ip-address-middleware/composer.json
@@ -0,0 +1,30 @@
+{
+ "name": "akrabat/rka-ip-address-middleware",
+ "description": "PSR-7 Middleware that determines the client IP address and stores it as an ServerRequest attribute",
+ "keywords": [
+ "psr7", "middleware", "ip"
+ ],
+ "homepage": "http://github.com/akrabat/rka-ip-address-middleware",
+ "type": "library",
+ "license": "BSD-3-Clause",
+ "authors": [
+ {
+ "name": "Rob Allen",
+ "email": "rob@akrabat.com",
+ "homepage": "http://akrabat.com"
+ }
+ ],
+ "require": {
+ "psr/http-message": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8",
+ "squizlabs/php_codesniffer": "^2.3",
+ "zendframework/zend-diactoros": "^1.1"
+ },
+ "autoload": {
+ "psr-4": {
+ "RKA\\Middleware\\": "src"
+ }
+ }
+}
diff --git a/vendor/akrabat/rka-ip-address-middleware/phpcs.xml b/vendor/akrabat/rka-ip-address-middleware/phpcs.xml
new file mode 100644
index 0000000000..baa2623219
--- /dev/null
+++ b/vendor/akrabat/rka-ip-address-middleware/phpcs.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+ src
+ tests
+
+
diff --git a/vendor/akrabat/rka-ip-address-middleware/phpunit.xml b/vendor/akrabat/rka-ip-address-middleware/phpunit.xml
new file mode 100644
index 0000000000..fb5fbdc1ab
--- /dev/null
+++ b/vendor/akrabat/rka-ip-address-middleware/phpunit.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+ ./tests/
+
+
+
+
+ ./src
+
+
+
\ No newline at end of file
diff --git a/vendor/akrabat/rka-ip-address-middleware/src/IpAddress.php b/vendor/akrabat/rka-ip-address-middleware/src/IpAddress.php
new file mode 100644
index 0000000000..1d632d7e16
--- /dev/null
+++ b/vendor/akrabat/rka-ip-address-middleware/src/IpAddress.php
@@ -0,0 +1,172 @@
+checkProxyHeaders = $checkProxyHeaders;
+ $this->trustedProxies = $trustedProxies;
+
+ if ($attributeName) {
+ $this->attributeName = $attributeName;
+ }
+ if (!empty($headersToInspect)) {
+ $this->headersToInspect = $headersToInspect;
+ }
+ }
+
+ /**
+ * Set the "$attributeName" attribute to the client's IP address as determined from
+ * the proxy header (X-Forwarded-For or from $_SERVER['REMOTE_ADDR']
+ *
+ * @param ServerRequestInterface $request PSR7 request
+ * @param ResponseInterface $response PSR7 response
+ * @param callable $next Next middleware
+ *
+ * @return ResponseInterface
+ */
+ public function __invoke(ServerRequestInterface $request, ResponseInterface $response, $next)
+ {
+ if (!$next) {
+ return $response;
+ }
+
+ $ipAddress = $this->determineClientIpAddress($request);
+ $request = $request->withAttribute($this->attributeName, $ipAddress);
+
+ return $response = $next($request, $response);
+ }
+
+ /**
+ * Find out the client's IP address from the headers available to us
+ *
+ * @param ServerRequestInterface $request PSR-7 Request
+ * @return string
+ */
+ protected function determineClientIpAddress($request)
+ {
+ $ipAddress = null;
+
+ $serverParams = $request->getServerParams();
+ if (isset($serverParams['REMOTE_ADDR']) && $this->isValidIpAddress($serverParams['REMOTE_ADDR'])) {
+ $ipAddress = $serverParams['REMOTE_ADDR'];
+ }
+
+ $checkProxyHeaders = $this->checkProxyHeaders;
+ if ($checkProxyHeaders && !empty($this->trustedProxies)) {
+ if (!in_array($ipAddress, $this->trustedProxies)) {
+ $checkProxyHeaders = false;
+ }
+ }
+
+ if ($checkProxyHeaders) {
+ foreach ($this->headersToInspect as $header) {
+ if ($request->hasHeader($header)) {
+ $ip = $this->getFirstIpAddressFromHeader($request, $header);
+ if ($this->isValidIpAddress($ip)) {
+ $ipAddress = $ip;
+ break;
+ }
+ }
+ }
+ }
+
+ return $ipAddress;
+ }
+
+ /**
+ * Check that a given string is a valid IP address
+ *
+ * @param string $ip
+ * @return boolean
+ */
+ protected function isValidIpAddress($ip)
+ {
+ $flags = FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6;
+ if (filter_var($ip, FILTER_VALIDATE_IP, $flags) === false) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Find out the client's IP address from the headers available to us
+ *
+ * @param ServerRequestInterface $request PSR-7 Request
+ * @param string $header Header name
+ * @return string
+ */
+ private function getFirstIpAddressFromHeader($request, $header)
+ {
+ $items = explode(',', $request->getHeaderLine($header));
+ $headerValue = trim(reset($items));
+
+ if (ucfirst($header) == 'Forwarded') {
+ foreach (explode(';', $headerValue) as $headerPart) {
+ if (strtolower(substr($headerPart, 0, 4)) == 'for=') {
+ $for = explode(']', $headerPart);
+ $headerValue = trim(substr(reset($for), 4), " \t\n\r\0\x0B" . "\"[]");
+ break;
+ }
+ }
+ }
+
+ return $headerValue;
+ }
+}
diff --git a/vendor/akrabat/rka-ip-address-middleware/tests/IpAddressTest.php b/vendor/akrabat/rka-ip-address-middleware/tests/IpAddressTest.php
new file mode 100644
index 0000000000..decd557c8e
--- /dev/null
+++ b/vendor/akrabat/rka-ip-address-middleware/tests/IpAddressTest.php
@@ -0,0 +1,271 @@
+ '192.168.1.1',
+ ]);
+ $response = new Response();
+
+ $response = $middleware($request, $response, function ($request, $response) use (&$ipAddress) {
+ // simply store the "ip_address" attribute in to the referenced $ipAddress
+ $ipAddress = $request->getAttribute('IP');
+ return $response;
+ });
+
+ $this->assertSame('192.168.1.1', $ipAddress);
+ }
+
+ public function testIpIsNullIfMissing()
+ {
+ $middleware = new IPAddress();
+
+ $request = ServerRequestFactory::fromGlobals();
+ $response = new Response();
+
+ $ipAddress = '123';
+ $response = $middleware($request, $response, function ($request, $response) use (&$ipAddress) {
+ // simply store the "ip_address" attribute in to the referenced $ipAddress
+ $ipAddress = $request->getAttribute('ip_address');
+ return $response;
+ });
+
+ $this->assertNull($ipAddress);
+ }
+
+ public function testXForwardedForIp()
+ {
+ $middleware = new IPAddress(true);
+
+ $request = ServerRequestFactory::fromGlobals([
+ 'REMOTE_ADDR' => '192.168.1.1',
+ 'HTTP_X_FORWARDED_FOR' => '192.168.1.3, 192.168.1.2, 192.168.1.1'
+ ]);
+ $response = new Response();
+
+ $ipAddress = '123';
+ $response = $middleware($request, $response, function ($request, $response) use (&$ipAddress) {
+ // simply store the "ip_address" attribute in to the referenced $ipAddress
+ $ipAddress = $request->getAttribute('ip_address');
+ return $response;
+ });
+
+ $this->assertSame('192.168.1.3', $ipAddress);
+ }
+
+ public function testProxyIpIsIgnored()
+ {
+ $middleware = new IPAddress();
+
+ $request = ServerRequestFactory::fromGlobals([
+ 'REMOTE_ADDR' => '192.168.0.1',
+ 'HTTP_X_FORWARDED_FOR' => '192.168.1.3, 192.168.1.2, 192.168.1.1'
+ ]);
+ $response = new Response();
+
+ $ipAddress = '123';
+ $response = $middleware($request, $response, function ($request, $response) use (&$ipAddress) {
+ // simply store the "ip_address" attribute in to the referenced $ipAddress
+ $ipAddress = $request->getAttribute('ip_address');
+ return $response;
+ });
+
+ $this->assertSame('192.168.0.1', $ipAddress);
+ }
+
+ public function testHttpClientIp()
+ {
+ $middleware = new IPAddress(true);
+
+ $request = ServerRequestFactory::fromGlobals([
+ 'REMOTE_ADDR' => '192.168.1.1',
+ 'HTTP_CLIENT_IP' => '192.168.1.3'
+ ]);
+ $response = new Response();
+
+ $ipAddress = '123';
+ $response = $middleware($request, $response, function ($request, $response) use (&$ipAddress) {
+ // simply store the "ip_address" attribute in to the referenced $ipAddress
+ $ipAddress = $request->getAttribute('ip_address');
+ return $response;
+ });
+
+ $this->assertSame('192.168.1.3', $ipAddress);
+ }
+
+ public function testXForwardedForIpV6()
+ {
+ $middleware = new IPAddress(true);
+
+ $request = ServerRequestFactory::fromGlobals([
+ 'REMOTE_ADDR' => '192.168.1.1',
+ 'HTTP_X_FORWARDED_FOR' => '001:DB8::21f:5bff:febf:ce22:8a2e'
+ ]);
+ $response = new Response();
+
+ $ipAddress = '123';
+ $response = $middleware($request, $response, function ($request, $response) use (&$ipAddress) {
+ // simply store the "ip_address" attribute in to the referenced $ipAddress
+ $ipAddress = $request->getAttribute('ip_address');
+ return $response;
+ });
+
+ $this->assertSame('001:DB8::21f:5bff:febf:ce22:8a2e', $ipAddress);
+ }
+
+ public function testXForwardedForWithInvalidIp()
+ {
+ $middleware = new IPAddress(true);
+
+ $request = ServerRequestFactory::fromGlobals([
+ 'REMOTE_ADDR' => '192.168.1.1',
+ 'HTTP_X_FORWARDED_FOR' => 'foo-bar'
+ ]);
+ $response = new Response();
+
+ $ipAddress = '123';
+ $response = $middleware($request, $response, function ($request, $response) use (&$ipAddress) {
+ // simply store the "ip_address" attribute in to the referenced $ipAddress
+ $ipAddress = $request->getAttribute('ip_address');
+ return $response;
+ });
+
+ $this->assertSame('192.168.1.1', $ipAddress);
+ }
+
+ public function testXForwardedForIpWithTrustedProxy()
+ {
+ $middleware = new IPAddress(true, ['192.168.0.1', '192.168.0.2']);
+
+ $request = ServerRequestFactory::fromGlobals([
+ 'REMOTE_ADDR' => '192.168.0.2',
+ 'HTTP_X_FORWARDED_FOR' => '192.168.1.3, 192.168.1.2, 192.168.1.1'
+ ]);
+ $response = new Response();
+
+ $ipAddress = '123';
+ $response = $middleware($request, $response, function ($request, $response) use (&$ipAddress) {
+ // simply store the "ip_address" attribute in to the referenced $ipAddress
+ $ipAddress = $request->getAttribute('ip_address');
+ return $response;
+ });
+
+ $this->assertSame('192.168.1.3', $ipAddress);
+ }
+
+ public function testXForwardedForIpWithUntrustedProxy()
+ {
+ $middleware = new IPAddress(true, ['192.168.0.1']);
+
+ $request = ServerRequestFactory::fromGlobals([
+ 'REMOTE_ADDR' => '192.168.0.2',
+ 'HTTP_X_FORWARDED_FOR' => '192.168.1.3, 192.168.1.2, 192.168.1.1'
+ ]);
+ $response = new Response();
+
+ $ipAddress = '123';
+ $response = $middleware($request, $response, function ($request, $response) use (&$ipAddress) {
+ // simply store the "ip_address" attribute in to the referenced $ipAddress
+ $ipAddress = $request->getAttribute('ip_address');
+ return $response;
+ });
+
+ $this->assertSame('192.168.0.2', $ipAddress);
+ }
+
+ public function testForwardedWithMultipleFor()
+ {
+ $middleware = new IPAddress(true);
+
+ $request = ServerRequestFactory::fromGlobals([
+ 'REMOTE_ADDR' => '192.168.1.1',
+ 'HTTP_FORWARDED' => 'for=192.0.2.43, for=198.51.100.17;by=203.0.113.60;proto=http;host=example.com',
+ ]);
+ $response = new Response();
+
+ $ipAddress = '123';
+ $response = $middleware($request, $response, function ($request, $response) use (&$ipAddress) {
+ // simply store the "ip_address" attribute in to the referenced $ipAddress
+ $ipAddress = $request->getAttribute('ip_address');
+ return $response;
+ });
+
+ $this->assertSame('192.0.2.43', $ipAddress);
+ }
+
+ public function testForwardedWithAllOptions()
+ {
+ $middleware = new IPAddress(true);
+
+ $request = ServerRequestFactory::fromGlobals([
+ 'REMOTE_ADDR' => '192.168.1.1',
+ 'HTTP_FORWARDED' => 'for=192.0.2.60; proto=http;by=203.0.113.43; host=_hiddenProxy, for=192.0.2.61',
+ ]);
+ $response = new Response();
+
+ $ipAddress = '123';
+ $response = $middleware($request, $response, function ($request, $response) use (&$ipAddress) {
+ // simply store the "ip_address" attribute in to the referenced $ipAddress
+ $ipAddress = $request->getAttribute('ip_address');
+ return $response;
+ });
+
+ $this->assertSame('192.0.2.60', $ipAddress);
+ }
+
+ public function testForwardedWithWithIpV6()
+ {
+ $middleware = new IPAddress(true);
+
+ $request = ServerRequestFactory::fromGlobals([
+ 'REMOTE_ADDR' => '192.168.1.1',
+ 'HTTP_FORWARDED' => 'For="[2001:db8:cafe::17]:4711", for=_internalProxy',
+ ]);
+ $response = new Response();
+
+ $ipAddress = '123';
+ $response = $middleware($request, $response, function ($request, $response) use (&$ipAddress) {
+ // simply store the "ip_address" attribute in to the referenced $ipAddress
+ $ipAddress = $request->getAttribute('ip_address');
+ return $response;
+ });
+
+ $this->assertSame('2001:db8:cafe::17', $ipAddress);
+ }
+
+ public function testCustomHeader()
+ {
+ $headersToInspect = [
+ 'Foo-Bar'
+ ];
+ $middleware = new IPAddress(true, [], null, $headersToInspect);
+
+ $request = ServerRequestFactory::fromGlobals([
+ 'REMOTE_ADDR' => '192.168.0.1',
+ ]);
+ $request = $request->withAddedHeader('Foo-Bar', '192.168.1.3');
+ $response = new Response();
+
+ $ipAddress = '123';
+ $response = $middleware($request, $response, function ($request, $response) use (&$ipAddress) {
+ // simply store the "ip_address" attribute in to the referenced $ipAddress
+ $ipAddress = $request->getAttribute('ip_address');
+ return $response;
+ });
+
+ $this->assertSame('192.168.1.3', $ipAddress);
+ }
+}
diff --git a/vendor/akrabat/rka-ip-address-middleware/tests/bootstrap.php b/vendor/akrabat/rka-ip-address-middleware/tests/bootstrap.php
new file mode 100644
index 0000000000..a4ae4bea2a
--- /dev/null
+++ b/vendor/akrabat/rka-ip-address-middleware/tests/bootstrap.php
@@ -0,0 +1,5 @@
+addPsr4('RKA\\Middleware\\Test\\', __DIR__);
diff --git a/vendor/autoload.php b/vendor/autoload.php
new file mode 100644
index 0000000000..dfc0577d5d
--- /dev/null
+++ b/vendor/autoload.php
@@ -0,0 +1,7 @@
+&1 &&
+ echo "########################################" &&
+ echo "########################################" &&
+ echo -e "\\e[32mOK\\e[0m $title\\n\\ntravis_fold:end:$fold" ||
+ ( echo -e "\\e[41mKO\\e[0m $title\\n" && exit 1 )
+ }
+ export -f tfold
+
+ COMPONENTS=$(find src -mindepth 2 -type f -name phpunit.xml.dist -printf '%h\n')
+
+ # php.ini configuration
+ INI=~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini
+ echo memory_limit = -1 >> $INI
+
+install:
+ - if [[ ! $skip ]]; then $COMPOSER_UP; fi
+ - |
+ run_tests () {
+ set -e
+ if [[ $skip ]]; then
+ echo -e "\\n\\e[1;34mIntermediate PHP version $PHP is skipped for pull requests.\\e[0m"
+ elif [[ $deps = high ]]; then
+ echo "$COMPONENTS" | parallel --gnu -j10% "tfold {} 'cd {} && $COMPOSER_UP && $PHPUNIT_X$LEGACY'"
+ elif [[ $deps = low ]]; then
+ sleep 3
+ echo "$COMPONENTS" | parallel --gnu -j10% "tfold {} 'cd {} && $COMPOSER_UP --prefer-lowest --prefer-stable && $PHPUNIT_X'"
+ elif [[ $COVERAGE == true ]]; then
+ $PHPUNIT_COVERAGE
+ else
+ echo "$COMPONENTS" | parallel --gnu "tfold {} $PHPUNIT_X {}"
+ tfold tty-group $PHPUNIT --group tty
+ fi
+ }
+
+script:
+ - (run_tests)
+
+after_success:
+ - if [[ $COVERAGE == true ]]; then pip install --user codecov && codecov ; fi
+
+notifications:
+ email: false
+ webhooks:
+ urls:
+ - https://webhooks.gitter.im/e/7b0035a70de31fa976df
diff --git a/vendor/cache/cache/CONTRIBUTING.md b/vendor/cache/cache/CONTRIBUTING.md
new file mode 100644
index 0000000000..5bc36e55d6
--- /dev/null
+++ b/vendor/cache/cache/CONTRIBUTING.md
@@ -0,0 +1,68 @@
+# Contribute to PHP-Cache*
+
+Thank you for contributing to PHP-Cache!
+
+Before we can merge your Pull-Request here are some guidelines that you need to follow.
+These guidelines exist not to annoy you, but to keep the code base clean,
+unified and future proof.
+
+## We only accept PRs to "master"
+
+Our branching strategy is "everything to master first", even
+bugfixes and we then merge them into the stable branches. You should only
+open pull requests against the master branch. Otherwise we cannot accept the PR.
+
+There is one exception to the rule, when we merged a bug into some stable branches
+we do occasionally accept pull requests that merge the same bug fix into earlier
+branches.
+
+## Coding Standard
+
+We use PSR-1 and PSR-2:
+
+* https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md
+* https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
+
+with some exceptions/differences:
+
+* Keep the nesting of control structures per method as small as possible
+* Align equals (=) signs
+* Prefer early exit over nesting conditions
+
+All pull requests will end up getting run through Style CI, which is required to pass.
+
+## Unit-Tests
+
+Please try to add a test for your pull-request.
+
+* If your test is specific for an adapter/library, put it in the library tests.
+* If it is adapter agnostic, put it in the src/IntegrationTests directory
+
+You can run the unit-tests by calling `composer test` from the root of the project.
+It will run all the tests for each library.
+
+In order to do that, you will need a fresh copy of php-cache/cache, and you
+will have to run a composer installation in the project:
+
+```sh
+git clone git@github.com:php-cache/cache.git
+cd cache
+curl -sS https://getcomposer.org/installer | php --
+./composer.phar install
+```
+
+## Travis
+
+We automatically run your pull request through [Travis CI](http://www.travis-ci.org)
+against on all of the adapters. If you break the tests, we cannot merge your code,
+so please make sure that your code is working before opening up a Pull-Request.
+
+## Getting merged
+
+Please allow us time to review your pull requests. We will give our best to review
+everything as fast as possible, but cannot always live up to our own expectations.
+
+Thank you very much again for your contribution!
+
+\* Any similarities to the Doctrine contributing file is NOT coincidence. We've used their CONTRIBUTING.md file as a basis for ours :)
+
diff --git a/vendor/cache/cache/LICENSE b/vendor/cache/cache/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/README.md b/vendor/cache/cache/README.md
new file mode 100644
index 0000000000..e8c7ef2440
--- /dev/null
+++ b/vendor/cache/cache/README.md
@@ -0,0 +1,20 @@
+# PHP Cache
+
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![codecov.io](https://codecov.io/github/php-cache/cache/coverage.svg?branch=master)](https://codecov.io/github/php-cache/cache?branch=master)
+[![Build Status](https://travis-ci.org/php-cache/cache.svg?branch=master)](https://travis-ci.org/php-cache/cache)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+[![StyleCI](https://styleci.io/repos/50789153/shield)](https://styleci.io/repos/50789153)
+
+This is the main repository for all our cache adapters and libraries. To read about
+features like tagging and hierarchy support please read the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+### Notice
+
+This library is for development use. All pull requests to the adapters, and libraries included in here, should be made to this library.
+
+If you are lazy, you can also include this project, to include all the adapters and libraries.
+
+### Contribute
+
+Contributions are very welcome! Make sure you check out the [contributing docs](CONTRIBUTING.md) and send us a pull request or report any issues you find on the [issue tracker](http://issues.php-cache.com). Feel free to come chat with us on [Gitter](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) too.
diff --git a/vendor/cache/cache/build/README.md b/vendor/cache/cache/build/README.md
new file mode 100755
index 0000000000..5637a313e7
--- /dev/null
+++ b/vendor/cache/cache/build/README.md
@@ -0,0 +1,7 @@
+# Build Scripts
+
+This directory contains the scripts that travis uses to build the project.
+
+The scripts in [the php directory](php/) are ran when travis is testing the given version and adapter. [`all.sh`](php/all.sh) is ran for all adapters but for one php version.
+
+Tests are ran using [`runTest.sh`](runTest.sh). This file changes the directory to the library subdirectory, installs composer, and runs the tests.
diff --git a/vendor/cache/cache/build/php/5.6/Apc.sh b/vendor/cache/cache/build/php/5.6/Apc.sh
new file mode 100755
index 0000000000..c4a15ef54c
--- /dev/null
+++ b/vendor/cache/cache/build/php/5.6/Apc.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+echo "Add php.ini settings"
+phpenv config-add ./build/php/apc.ini
+
+echo "Install APC Adapter & APCu Adapter dependencies"
+yes '' | pecl install -f apcu-4.0.11
diff --git a/vendor/cache/cache/build/php/5.6/Apcu.sh b/vendor/cache/cache/build/php/5.6/Apcu.sh
new file mode 100755
index 0000000000..dbc71fd656
--- /dev/null
+++ b/vendor/cache/cache/build/php/5.6/Apcu.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+echo "Add php.ini settings"
+phpenv config-add ./build/php/apc.ini
+
+echo "Install APC Adapter & APCu Adapter dependencies"
+yes '' | pecl install -f apcu-4.0.10
diff --git a/vendor/cache/cache/build/php/5.6/Memcache.sh b/vendor/cache/cache/build/php/5.6/Memcache.sh
new file mode 100755
index 0000000000..eb60e26a24
--- /dev/null
+++ b/vendor/cache/cache/build/php/5.6/Memcache.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+echo "Add php.ini settings"
+phpenv config-add ./build/php/memcache.ini
+
+echo "Enable extension"
+echo "extension = memcache.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
\ No newline at end of file
diff --git a/vendor/cache/cache/build/php/5.6/Memcached.sh b/vendor/cache/cache/build/php/5.6/Memcached.sh
new file mode 100755
index 0000000000..5c7ff622a7
--- /dev/null
+++ b/vendor/cache/cache/build/php/5.6/Memcached.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+
+echo "Enable extension"
+echo "extension = memcached.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
\ No newline at end of file
diff --git a/vendor/cache/cache/build/php/5.6/MongoDB.sh b/vendor/cache/cache/build/php/5.6/MongoDB.sh
new file mode 100755
index 0000000000..5a58535c84
--- /dev/null
+++ b/vendor/cache/cache/build/php/5.6/MongoDB.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+
+pecl install -f mongodb-1.1.2
+
diff --git a/vendor/cache/cache/build/php/5.6/Redis.sh b/vendor/cache/cache/build/php/5.6/Redis.sh
new file mode 100755
index 0000000000..3589d6eaef
--- /dev/null
+++ b/vendor/cache/cache/build/php/5.6/Redis.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+echo "Install redis"
+yes '' | pecl install -f redis-2.2.8
+
+#echo "Enable extension"
+#echo "extension = redis.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini
diff --git a/vendor/cache/cache/build/php/7.0/Apcu.sh b/vendor/cache/cache/build/php/7.0/Apcu.sh
new file mode 100755
index 0000000000..319d2aaf36
--- /dev/null
+++ b/vendor/cache/cache/build/php/7.0/Apcu.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+echo "Add php.ini settings"
+phpenv config-add ./build/php/apc.ini
+
+echo "Install APCu Adapter dependencies"
+yes '' | pecl install -f apcu-5.1.8
diff --git a/vendor/cache/cache/build/php/7.0/Memcached.sh b/vendor/cache/cache/build/php/7.0/Memcached.sh
new file mode 100755
index 0000000000..9577aa037b
--- /dev/null
+++ b/vendor/cache/cache/build/php/7.0/Memcached.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+
+echo "Install memcache(d)"
+yes '' | pecl install memcached
diff --git a/vendor/cache/cache/build/php/7.0/MongoDB.sh b/vendor/cache/cache/build/php/7.0/MongoDB.sh
new file mode 100755
index 0000000000..b690595749
--- /dev/null
+++ b/vendor/cache/cache/build/php/7.0/MongoDB.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+
+echo "Install MongoDB"
+pecl install -f mongodb-1.1.2
+
diff --git a/vendor/cache/cache/build/php/7.0/Redis.sh b/vendor/cache/cache/build/php/7.0/Redis.sh
new file mode 100755
index 0000000000..ace1417615
--- /dev/null
+++ b/vendor/cache/cache/build/php/7.0/Redis.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+
+echo "Install Redis"
+yes '' | pecl install -f redis-3.0.0
diff --git a/vendor/cache/cache/build/php/7.1/Apcu.sh b/vendor/cache/cache/build/php/7.1/Apcu.sh
new file mode 100755
index 0000000000..319d2aaf36
--- /dev/null
+++ b/vendor/cache/cache/build/php/7.1/Apcu.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+echo "Add php.ini settings"
+phpenv config-add ./build/php/apc.ini
+
+echo "Install APCu Adapter dependencies"
+yes '' | pecl install -f apcu-5.1.8
diff --git a/vendor/cache/cache/build/php/7.1/Memcached.sh b/vendor/cache/cache/build/php/7.1/Memcached.sh
new file mode 100755
index 0000000000..9577aa037b
--- /dev/null
+++ b/vendor/cache/cache/build/php/7.1/Memcached.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+
+echo "Install memcache(d)"
+yes '' | pecl install memcached
diff --git a/vendor/cache/cache/build/php/7.1/MongoDB.sh b/vendor/cache/cache/build/php/7.1/MongoDB.sh
new file mode 100755
index 0000000000..103bcf7eb8
--- /dev/null
+++ b/vendor/cache/cache/build/php/7.1/MongoDB.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+
+echo "Install MongoDB"
+pecl install -f mongodb-1.1.2
diff --git a/vendor/cache/cache/build/php/7.1/Redis.sh b/vendor/cache/cache/build/php/7.1/Redis.sh
new file mode 100755
index 0000000000..65ca9bdd43
--- /dev/null
+++ b/vendor/cache/cache/build/php/7.1/Redis.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+
+echo "Install redis"
+yes '' | pecl install -f redis-3.0.0
diff --git a/vendor/cache/cache/build/php/all.sh b/vendor/cache/cache/build/php/all.sh
new file mode 100755
index 0000000000..4aeb861cec
--- /dev/null
+++ b/vendor/cache/cache/build/php/all.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+
+for SCRIPT in build/php/$TRAVIS_PHP_VERSION/*.sh
+do
+ echo "Found Script: $SCRIPT"
+ if [ -f $SCRIPT -a -x $SCRIPT ]
+ then
+ echo "Running: $SCRIPT"
+ . $SCRIPT
+ fi
+done
\ No newline at end of file
diff --git a/vendor/cache/cache/build/php/apc.ini b/vendor/cache/cache/build/php/apc.ini
new file mode 100755
index 0000000000..d85888ee61
--- /dev/null
+++ b/vendor/cache/cache/build/php/apc.ini
@@ -0,0 +1,3 @@
+apc.enabled=1
+apc.enable_cli=1
+apc.use_request_time=0
\ No newline at end of file
diff --git a/vendor/cache/cache/build/php/apcu_bc.ini b/vendor/cache/cache/build/php/apcu_bc.ini
new file mode 100644
index 0000000000..3ff19e7d78
--- /dev/null
+++ b/vendor/cache/cache/build/php/apcu_bc.ini
@@ -0,0 +1 @@
+extension=apc.so
\ No newline at end of file
diff --git a/vendor/cache/cache/build/php/memcache.ini b/vendor/cache/cache/build/php/memcache.ini
new file mode 100755
index 0000000000..c23acc3be8
--- /dev/null
+++ b/vendor/cache/cache/build/php/memcache.ini
@@ -0,0 +1,2 @@
+memcache.enabled=1
+memcache.enable_cli=1
\ No newline at end of file
diff --git a/vendor/cache/cache/composer.json b/vendor/cache/cache/composer.json
new file mode 100644
index 0000000000..6b255d2bf4
--- /dev/null
+++ b/vendor/cache/cache/composer.json
@@ -0,0 +1,79 @@
+{
+ "name": "cache/cache",
+ "type": "library",
+ "description": "Library of all the php-cache adapters",
+ "keywords": [
+ "cache",
+ "psr6"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "psr/log": "^1.0",
+ "doctrine/cache": "^1.3",
+ "psr/simple-cache": "^1.0",
+ "league/flysystem": "^1.0"
+ },
+ "require-dev": {
+ "defuse/php-encryption": "^2.0",
+ "phpunit/phpunit": "^5.7.21",
+ "mockery/mockery": "^0.9.9",
+ "cache/integration-tests": "^0.16",
+ "predis/predis": "^1.1",
+ "symfony/cache": "^3.1",
+ "illuminate/cache": "^5.4"
+ },
+ "suggest": {
+ "ext-apc": "APC extension is required to use the APC Adapter",
+ "ext-apcu": "APCu extension is required to use the APCu Adapter",
+ "ext-memcache": "Memcache extension is required to use the Memcache Adapter",
+ "ext-memcached": "Memcached extension is required to use the Memcached Adapter",
+ "ext-redis": "Redis extension is required to use the Redis adapter",
+ "ext-mongodb": "Mongodb extension required to use the Mongodb adapter",
+ "mongodb/mongodb": "Mongodb lib required to use the Mongodb adapter"
+ },
+ "conflict": {
+ "cache/apc-adapter": "*",
+ "cache/apcu-adapter": "*",
+ "cache/chain-adapter": "*",
+ "cache/adapter-common": "*",
+ "cache/doctrine-adapter": "*",
+ "cache/filesystem-adapter": "*",
+ "cache/memcache-adapter": "*",
+ "cache/memcached-adapter": "*",
+ "cache/mongodb-adapter": "*",
+ "cache/array-adapter": "*",
+ "cache/predis-adapter": "*",
+ "cache/redis-adapter": "*",
+ "cache/void-adapter": "*",
+ "cache/psr-6-doctrine-bridge": "*",
+ "cache/hierarchical-cache": "*",
+ "cache/session-handler": "*",
+ "cache/taggable-cache": "*",
+ "cache/illuminate-adapter": "*"
+ },
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "autoload": {
+ "psr-4": {
+ "Cache\\": "src/"
+ },
+ "exclude-from-classmap": [
+ "**/Tests/"
+ ]
+ }
+}
diff --git a/vendor/cache/cache/phpunit b/vendor/cache/cache/phpunit
new file mode 100755
index 0000000000..14194b1bc6
--- /dev/null
+++ b/vendor/cache/cache/phpunit
@@ -0,0 +1,9 @@
+#!/usr/bin/env php
+
+
+
+
+
+ ./src/*/Tests
+ ./src/*/*/Tests
+
+
+
+
+
+
+
+
+
+
+
+ ./
+
+ ./src/*/Tests
+ ./src/*/*/Tests
+ ./vendor
+
+
+
+
diff --git a/vendor/cache/cache/script/remove-vendor-dirs.sh b/vendor/cache/cache/script/remove-vendor-dirs.sh
new file mode 100755
index 0000000000..9c6af13afd
--- /dev/null
+++ b/vendor/cache/cache/script/remove-vendor-dirs.sh
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+# Remove all vendor dirs
+ROOT=$(pwd)
+
+# Run for each components
+find src -mindepth 2 -type f -name composer.json | while read line; do
+ # Save the directory name
+ DIR=$(dirname $line)
+
+ if [[ ! -z $DIR ]]; then
+ # Remove vendors
+ rm -rf "$DIR/vendor"
+ fi
+
+done
diff --git a/vendor/cache/cache/script/update-integration-tests-version.sh b/vendor/cache/cache/script/update-integration-tests-version.sh
new file mode 100755
index 0000000000..f8b0451665
--- /dev/null
+++ b/vendor/cache/cache/script/update-integration-tests-version.sh
@@ -0,0 +1,33 @@
+#!/usr/bin/env bash
+
+if [ $# -eq 0 ]
+then
+ echo "No arguments supplied. You need to specify the version to composer."
+ exit 1
+fi
+
+VERSION=$1
+ROOT=$(pwd)
+
+# Run for each components
+find src -mindepth 2 -type f -name phpunit.xml.dist | while read line; do
+ # Save the directory name
+ DIR=$(dirname $line)
+
+ # Go to that directory
+ cd $DIR
+ pwd
+
+ if [[ "$DIR" != "src/Bridge/Doctrine" && "$DIR" != "src/Hierarchy" && "$DIR" != "src/Namespaced" && "$DIR" != "src/SessionHandler" ]]; then
+ # Let composer update the composer.json
+ composer require --dev --no-update cache/integration-tests:$VERSION
+ fi
+
+ # Go back to the root
+ cd $ROOT
+ echo ""
+done
+
+# Update integration test for the root
+pwd
+composer require --dev --no-update cache/integration-tests:$VERSION
diff --git a/vendor/cache/cache/src/Adapter/Apc/ApcCachePool.php b/vendor/cache/cache/src/Adapter/Apc/ApcCachePool.php
new file mode 100644
index 0000000000..36ad518867
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Apc/ApcCachePool.php
@@ -0,0 +1,116 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Apc;
+
+use Cache\Adapter\Common\AbstractCachePool;
+use Cache\Adapter\Common\PhpCacheItem;
+use Cache\Adapter\Common\TagSupportWithArray;
+
+/**
+ * @author Tobias Nyholm
+ */
+class ApcCachePool extends AbstractCachePool
+{
+ use TagSupportWithArray;
+
+ /**
+ * @type bool
+ */
+ private $skipOnCli;
+
+ /**
+ * @param bool $skipOnCli
+ */
+ public function __construct($skipOnCli = false)
+ {
+ $this->skipOnCli = $skipOnCli;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function fetchObjectFromCache($key)
+ {
+ if ($this->skipIfCli()) {
+ return [false, null, [], null];
+ }
+
+ $success = false;
+ $cacheData = apc_fetch($key, $success);
+ if (!$success) {
+ return [false, null, [], null];
+ }
+ list($data, $tags, $timestamp) = unserialize($cacheData);
+
+ return [$success, $data, $tags, $timestamp];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearAllObjectsFromCache()
+ {
+ return apc_clear_cache('user');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearOneObjectFromCache($key)
+ {
+ apc_delete($key);
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function storeItemInCache(PhpCacheItem $item, $ttl)
+ {
+ if ($this->skipIfCli()) {
+ return false;
+ }
+
+ if ($ttl < 0) {
+ return false;
+ }
+
+ return apc_store($item->getKey(), serialize([$item->get(), $item->getTags(), $item->getExpirationTimestamp()]), $ttl);
+ }
+
+ /**
+ * Returns true if CLI and if it should skip on cli.
+ *
+ * @return bool
+ */
+ private function skipIfCli()
+ {
+ return $this->skipOnCli && php_sapi_name() === 'cli';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDirectValue($name)
+ {
+ return apc_fetch($name);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setDirectValue($name, $value)
+ {
+ apc_store($name, $value);
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Apc/Changelog.md b/vendor/cache/cache/src/Adapter/Apc/Changelog.md
new file mode 100644
index 0000000000..03a97a4e6f
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Apc/Changelog.md
@@ -0,0 +1,36 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+No changes since 0.4.0
+
+## 0.4.0
+
+### Added
+
+* Support for the new `TaggableCacheItemPoolInterface`.
+* Support for PSR-16 SimpleCache
+
+### Changed
+
+* The behavior of `CacheItem::getTags()` has changed. It will not return the tags stored in the cache storage.
+
+### Removed
+
+* `CacheItem::getExpirationDate()`. Use `CacheItem::getExpirationTimestamp()`
+* `CacheItem::getTags()`. Use `CacheItem::getPreviousTags()`
+* `CacheItem::addTag()`. Use `CacheItem::setTags()`
+
+## 0.3.2
+
+### Added
+
+* You may configure the adapter to be disabled on CLI
+
+## 0.3.1
+
+No changelog before this version
diff --git a/vendor/cache/cache/src/Adapter/Apc/LICENSE b/vendor/cache/cache/src/Adapter/Apc/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Apc/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Adapter/Apc/README.md b/vendor/cache/cache/src/Adapter/Apc/README.md
new file mode 100644
index 0000000000..d92a142152
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Apc/README.md
@@ -0,0 +1,29 @@
+# Apc PSR-6 Cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/apc-adapter/v/stable)](https://packagist.org/packages/cache/apc-adapter)
+[![codecov.io](https://codecov.io/github/php-cache/apc-adapter/coverage.svg?branch=master)](https://codecov.io/github/php-cache/apc-adapter?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/apc-adapter/downloads)](https://packagist.org/packages/cache/apc-adapter)
+[![Monthly Downloads](https://poser.pugx.org/cache/apc-adapter/d/monthly.png)](https://packagist.org/packages/cache/apc-adapter)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is a PSR-6 cache implementation using Apc. It is a part of the PHP Cache organisation. To read about
+features like tagging and hierarchy support please read the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+### Install
+
+```bash
+composer require cache/apc-adapter
+```
+
+### Use
+
+You do not need to do any configuration to use the `ApcCachePool`.
+
+```php
+$pool = new ApcCachePool();
+```
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Adapter/Apc/composer.json b/vendor/cache/cache/src/Adapter/Apc/composer.json
new file mode 100644
index 0000000000..f19e515759
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Apc/composer.json
@@ -0,0 +1,55 @@
+{
+ "name": "cache/apc-adapter",
+ "description": "A PSR-6 cache implementation using apc. This implementation supports tags",
+ "type": "library",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "keywords": [
+ "cache",
+ "psr-6",
+ "apc"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "psr/simple-cache": "^1.0",
+ "cache/adapter-common": "^1.0"
+ },
+ "suggest": {
+ "ext-apc": "The extension required to use this pool."
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/integration-tests": "^0.16"
+ },
+ "provide": {
+ "psr/cache-implementation": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Adapter\\Apc\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Apcu/ApcuCachePool.php b/vendor/cache/cache/src/Adapter/Apcu/ApcuCachePool.php
new file mode 100644
index 0000000000..de11f580ab
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Apcu/ApcuCachePool.php
@@ -0,0 +1,116 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Apcu;
+
+use Cache\Adapter\Common\AbstractCachePool;
+use Cache\Adapter\Common\PhpCacheItem;
+use Cache\Adapter\Common\TagSupportWithArray;
+
+/**
+ * @author Tobias Nyholm
+ */
+class ApcuCachePool extends AbstractCachePool
+{
+ use TagSupportWithArray;
+
+ /**
+ * @type bool
+ */
+ private $skipOnCli;
+
+ /**
+ * @param bool $skipOnCli
+ */
+ public function __construct($skipOnCli = false)
+ {
+ $this->skipOnCli = $skipOnCli;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function fetchObjectFromCache($key)
+ {
+ if ($this->skipIfCli()) {
+ return [false, null, [], null];
+ }
+
+ $success = false;
+ $cacheData = apcu_fetch($key, $success);
+ if (!$success) {
+ return [false, null, [], null];
+ }
+ list($data, $tags, $timestamp) = unserialize($cacheData);
+
+ return [$success, $data, $tags, $timestamp];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearAllObjectsFromCache()
+ {
+ return apcu_clear_cache();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearOneObjectFromCache($key)
+ {
+ apcu_delete($key);
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function storeItemInCache(PhpCacheItem $item, $ttl)
+ {
+ if ($this->skipIfCli()) {
+ return false;
+ }
+
+ if ($ttl < 0) {
+ return false;
+ }
+
+ return apcu_store($item->getKey(), serialize([$item->get(), $item->getTags(), $item->getExpirationTimestamp()]), $ttl);
+ }
+
+ /**
+ * Returns true if CLI and if it should skip on cli.
+ *
+ * @return bool
+ */
+ private function skipIfCli()
+ {
+ return $this->skipOnCli && php_sapi_name() === 'cli';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDirectValue($name)
+ {
+ return apcu_fetch($name);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setDirectValue($name, $value)
+ {
+ apcu_store($name, $value);
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Apcu/Changelog.md b/vendor/cache/cache/src/Adapter/Apcu/Changelog.md
new file mode 100644
index 0000000000..4f778cd47b
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Apcu/Changelog.md
@@ -0,0 +1,37 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+No changes since 0.3.0
+
+## 0.3.0
+
+### Added
+
+* Support for the new `TaggableCacheItemPoolInterface`.
+* Support for PSR-16 SimpleCache
+
+### Changed
+
+* The behavior of `CacheItem::getTags()` has changed. It will not return the tags stored in the cache storage.
+
+### Removed
+
+* `CacheItem::getExpirationDate()`. Use `CacheItem::getExpirationTimestamp()`
+* `CacheItem::getTags()`. Use `CacheItem::getPreviousTags()`
+* `CacheItem::addTag()`. Use `CacheItem::setTags()`
+* Dropped PHP 5.5 support
+
+## 0.2.2
+
+### Added
+
+* You may configure the adapter to be disabled on CLI
+
+## 0.2.1
+
+No changelog before this version
diff --git a/vendor/cache/cache/src/Adapter/Apcu/LICENSE b/vendor/cache/cache/src/Adapter/Apcu/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Apcu/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Adapter/Apcu/README.md b/vendor/cache/cache/src/Adapter/Apcu/README.md
new file mode 100644
index 0000000000..fd031a1088
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Apcu/README.md
@@ -0,0 +1,29 @@
+# Apcu PSR-6 Cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/apcu-adapter/v/stable)](https://packagist.org/packages/cache/apcu-adapter)
+[![codecov.io](https://codecov.io/github/php-cache/apcu-adapter/coverage.svg?branch=master)](https://codecov.io/github/php-cache/apcu-adapter?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/apcu-adapter/downloads)](https://packagist.org/packages/cache/apcu-adapter)
+[![Monthly Downloads](https://poser.pugx.org/cache/apcu-adapter/d/monthly.png)](https://packagist.org/packages/cache/apcu-adapter)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is a PSR-6 cache implementation using Apcu. It is a part of the PHP Cache organisation. To read about
+features like tagging and hierarchy support please read the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+### Install
+
+```bash
+composer require cache/apcu-adapter
+```
+
+### Use
+
+You do not need to do any configuration to use the `ApcuCachePool`.
+
+```php
+$pool = new ApcuCachePool();
+```
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Adapter/Apcu/composer.json b/vendor/cache/cache/src/Adapter/Apcu/composer.json
new file mode 100644
index 0000000000..d8c2783cb3
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Apcu/composer.json
@@ -0,0 +1,55 @@
+{
+ "name": "cache/apcu-adapter",
+ "description": "A PSR-6 cache implementation using apcu. This implementation supports tags",
+ "type": "library",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "keywords": [
+ "cache",
+ "psr-6",
+ "apcu"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "psr/simple-cache": "^1.0",
+ "cache/adapter-common": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/integration-tests": "^0.16"
+ },
+ "suggest": {
+ "ext-apcu": "The extension required to use this pool."
+ },
+ "provide": {
+ "psr/cache-implementation": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Adapter\\Apcu\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Chain/CachePoolChain.php b/vendor/cache/cache/src/Adapter/Chain/CachePoolChain.php
new file mode 100644
index 0000000000..2d18db1202
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Chain/CachePoolChain.php
@@ -0,0 +1,353 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Chain;
+
+use Cache\Adapter\Chain\Exception\NoPoolAvailableException;
+use Cache\Adapter\Chain\Exception\PoolFailedException;
+use Cache\Adapter\Common\Exception\CachePoolException;
+use Cache\TagInterop\TaggableCacheItemPoolInterface;
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\CacheItemPoolInterface;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+
+/**
+ * @author Tobias Nyholm
+ */
+class CachePoolChain implements CacheItemPoolInterface, TaggableCacheItemPoolInterface, LoggerAwareInterface
+{
+ /**
+ * @type LoggerInterface
+ */
+ private $logger;
+
+ /**
+ * @type TaggableCacheItemPoolInterface[]|CacheItemPoolInterface[]
+ */
+ private $pools;
+
+ /**
+ * @type array
+ */
+ private $options;
+
+ /**
+ * @param array $pools
+ * @param array $options {
+ *
+ * @type bool $skip_on_failure If true we will remove a pool form the chain if it fails.
+ * }
+ */
+ public function __construct(array $pools, array $options = [])
+ {
+ $this->pools = $pools;
+
+ if (!isset($options['skip_on_failure'])) {
+ $options['skip_on_failure'] = false;
+ }
+
+ $this->options = $options;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getItem($key)
+ {
+ $found = false;
+ $result = null;
+ $item = null;
+ $needsSave = [];
+
+ foreach ($this->getPools() as $poolKey => $pool) {
+ try {
+ $item = $pool->getItem($key);
+
+ if ($item->isHit()) {
+ $found = true;
+ $result = $item;
+ break;
+ }
+
+ $needsSave[] = $pool;
+ } catch (CachePoolException $e) {
+ $this->handleException($poolKey, __FUNCTION__, $e);
+ }
+ }
+
+ if ($found) {
+ foreach ($needsSave as $pool) {
+ $pool->save($result);
+ }
+
+ $item = $result;
+ }
+
+ return $item;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getItems(array $keys = [])
+ {
+ $hits = [];
+ $loadedItems = [];
+ $notFoundItems = [];
+ $keysCount = count($keys);
+ foreach ($this->getPools() as $poolKey => $pool) {
+ try {
+ $items = $pool->getItems($keys);
+
+ /** @type CacheItemInterface $item */
+ foreach ($items as $item) {
+ if ($item->isHit()) {
+ $hits[$item->getKey()] = $item;
+ unset($keys[array_search($item->getKey(), $keys)]);
+ } else {
+ $notFoundItems[$poolKey][$item->getKey()] = $item->getKey();
+ }
+ $loadedItems[$item->getKey()] = $item;
+ }
+ if (count($hits) === $keysCount) {
+ break;
+ }
+ } catch (CachePoolException $e) {
+ $this->handleException($poolKey, __FUNCTION__, $e);
+ }
+ }
+
+ if (!empty($hits) && !empty($notFoundItems)) {
+ foreach ($notFoundItems as $poolKey => $itemKeys) {
+ try {
+ $pool = $this->getPools()[$poolKey];
+ $found = false;
+ foreach ($itemKeys as $itemKey) {
+ if (!empty($hits[$itemKey])) {
+ $found = true;
+ $pool->saveDeferred($hits[$itemKey]);
+ }
+ }
+ if ($found) {
+ $pool->commit();
+ }
+ } catch (CachePoolException $e) {
+ $this->handleException($poolKey, __FUNCTION__, $e);
+ }
+ }
+ }
+
+ return array_merge($loadedItems, $hits);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function hasItem($key)
+ {
+ foreach ($this->getPools() as $poolKey => $pool) {
+ try {
+ if ($pool->hasItem($key)) {
+ return true;
+ }
+ } catch (CachePoolException $e) {
+ $this->handleException($poolKey, __FUNCTION__, $e);
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function clear()
+ {
+ $result = true;
+ foreach ($this->getPools() as $poolKey => $pool) {
+ try {
+ $result = $result && $pool->clear();
+ } catch (CachePoolException $e) {
+ $this->handleException($poolKey, __FUNCTION__, $e);
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function deleteItem($key)
+ {
+ $result = true;
+ foreach ($this->getPools() as $poolKey => $pool) {
+ try {
+ $result = $result && $pool->deleteItem($key);
+ } catch (CachePoolException $e) {
+ $this->handleException($poolKey, __FUNCTION__, $e);
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function deleteItems(array $keys)
+ {
+ $result = true;
+ foreach ($this->getPools() as $poolKey => $pool) {
+ try {
+ $result = $result && $pool->deleteItems($keys);
+ } catch (CachePoolException $e) {
+ $this->handleException($poolKey, __FUNCTION__, $e);
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function save(CacheItemInterface $item)
+ {
+ $result = true;
+ foreach ($this->getPools() as $poolKey => $pool) {
+ try {
+ $result = $pool->save($item) && $result;
+ } catch (CachePoolException $e) {
+ $this->handleException($poolKey, __FUNCTION__, $e);
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function saveDeferred(CacheItemInterface $item)
+ {
+ $result = true;
+ foreach ($this->getPools() as $poolKey => $pool) {
+ try {
+ $result = $pool->saveDeferred($item) && $result;
+ } catch (CachePoolException $e) {
+ $this->handleException($poolKey, __FUNCTION__, $e);
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function commit()
+ {
+ $result = true;
+ foreach ($this->getPools() as $poolKey => $pool) {
+ try {
+ $result = $pool->commit() && $result;
+ } catch (CachePoolException $e) {
+ $this->handleException($poolKey, __FUNCTION__, $e);
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function invalidateTag($tag)
+ {
+ return $this->invalidateTags([$tag]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function invalidateTags(array $tags)
+ {
+ $result = true;
+ foreach ($this->getPools() as $poolKey => $pool) {
+ try {
+ $result = $pool->invalidateTags($tags) && $result;
+ } catch (CachePoolException $e) {
+ $this->handleException($poolKey, __FUNCTION__, $e);
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * @param LoggerInterface $logger
+ */
+ public function setLogger(LoggerInterface $logger)
+ {
+ $this->logger = $logger;
+ }
+
+ /**
+ * Logs with an arbitrary level if the logger exists.
+ *
+ * @param mixed $level
+ * @param string $message
+ * @param array $context
+ */
+ protected function log($level, $message, array $context = [])
+ {
+ if ($this->logger !== null) {
+ $this->logger->log($level, $message, $context);
+ }
+ }
+
+ /**
+ * @return array|\Psr\Cache\CacheItemPoolInterface[]
+ */
+ protected function getPools()
+ {
+ if (empty($this->pools)) {
+ throw new NoPoolAvailableException('No valid cache pool available for the chain.');
+ }
+
+ return $this->pools;
+ }
+
+ /**
+ * @param string $poolKey
+ * @param string $operation
+ * @param CachePoolException $exception
+ *
+ * @throws PoolFailedException
+ */
+ private function handleException($poolKey, $operation, CachePoolException $exception)
+ {
+ if (!$this->options['skip_on_failure']) {
+ throw $exception;
+ }
+
+ $this->log(
+ 'warning',
+ sprintf('Removing pool "%s" from chain because it threw an exception when executing "%s"', $poolKey,
+ $operation),
+ ['exception' => $exception]
+ );
+
+ unset($this->pools[$poolKey]);
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Chain/Changelog.md b/vendor/cache/cache/src/Adapter/Chain/Changelog.md
new file mode 100644
index 0000000000..4844c1100c
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Chain/Changelog.md
@@ -0,0 +1,38 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+### Added
+
+The `CachePoolChain` does now implement `Cache\TagInterop\TaggableCacheItemPoolInterface`
+
+### Removed
+
+- Removed deprecated function `clearTags`
+
+## 0.5.1
+
+### Fixed
+
+* Fixed issue with generator
+* Make sure `getItems` always save values back to previous pools
+
+## 0.5.0
+
+### Added
+
+* Support for the new `TaggableCacheItemPoolInterface`.
+
+## 0.4.0
+
+### Changed
+
+* `CachePoolChain::getPools` is protected instead of public
+
+## 0.3.1
+
+No changelog before this version
diff --git a/vendor/cache/cache/src/Adapter/Chain/Exception/NoPoolAvailableException.php b/vendor/cache/cache/src/Adapter/Chain/Exception/NoPoolAvailableException.php
new file mode 100644
index 0000000000..3c66ba3a1e
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Chain/Exception/NoPoolAvailableException.php
@@ -0,0 +1,21 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Chain\Exception;
+
+use Cache\Adapter\Common\Exception\CachePoolException;
+
+/**
+ * @author Tobias Nyholm
+ */
+class NoPoolAvailableException extends CachePoolException
+{
+}
diff --git a/vendor/cache/cache/src/Adapter/Chain/Exception/PoolFailedException.php b/vendor/cache/cache/src/Adapter/Chain/Exception/PoolFailedException.php
new file mode 100644
index 0000000000..50f38637eb
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Chain/Exception/PoolFailedException.php
@@ -0,0 +1,23 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Chain\Exception;
+
+use Cache\Adapter\Common\Exception\CachePoolException;
+
+/**
+ * When a cache pool fails with its operation.
+ *
+ * @author Tobias Nyholm
+ */
+class PoolFailedException extends CachePoolException
+{
+}
diff --git a/vendor/cache/cache/src/Adapter/Chain/LICENSE b/vendor/cache/cache/src/Adapter/Chain/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Chain/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Adapter/Chain/README.md b/vendor/cache/cache/src/Adapter/Chain/README.md
new file mode 100644
index 0000000000..d32c73029a
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Chain/README.md
@@ -0,0 +1,31 @@
+# PSR-6 Cache pool chain
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/chain-adapter/v/stable)](https://packagist.org/packages/cache/chain-adapter)
+[![codecov.io](https://codecov.io/github/php-cache/chain-adapter/coverage.svg?branch=master)](https://codecov.io/github/php-cache/chain-adapter?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/chain-adapter/downloads)](https://packagist.org/packages/cache/chain-adapter)
+[![Monthly Downloads](https://poser.pugx.org/cache/chain-adapter/d/monthly.png)](https://packagist.org/packages/cache/chain-adapter)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is a PSR-6 cache implementation using a chain of other PSR-6 cache pools. It is a part of the PHP Cache organisation. To read about
+features like tagging and hierarchy support please read the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+### Install
+
+```bash
+composer require cache/chain-adapter
+```
+
+### Use
+
+You do not need to do any configuration to use the `CachePoolChain`.
+
+```php
+$redisPool = new RedisCachePool($redisClient);
+$apcPool = new ApcCachePool();
+$pool = new CachePoolChain([$apcPool, $redisPool]);
+```
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Adapter/Chain/composer.json b/vendor/cache/cache/src/Adapter/Chain/composer.json
new file mode 100644
index 0000000000..3b3efc002a
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Chain/composer.json
@@ -0,0 +1,56 @@
+{
+ "name": "cache/chain-adapter",
+ "description": "A PSR-6 cache implementation using chain. This implementation supports tags",
+ "type": "library",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "keywords": [
+ "cache",
+ "psr-6",
+ "chain",
+ "tag"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "psr/log": "^1.0",
+ "cache/adapter-common": "^1.0",
+ "cache/tag-interop": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/filesystem-adapter": "^1.0",
+ "cache/array-adapter": "^1.0",
+ "cache/integration-tests": "^0.16"
+ },
+ "provide": {
+ "psr/cache-implementation": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Adapter\\Chain\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Common/AbstractCachePool.php b/vendor/cache/cache/src/Adapter/Common/AbstractCachePool.php
new file mode 100644
index 0000000000..4760b74462
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Common/AbstractCachePool.php
@@ -0,0 +1,558 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Common;
+
+use Cache\Adapter\Common\Exception\CacheException;
+use Cache\Adapter\Common\Exception\CachePoolException;
+use Cache\Adapter\Common\Exception\InvalidArgumentException;
+use Psr\Cache\CacheItemInterface;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\SimpleCache\CacheInterface;
+
+/**
+ * @author Aaron Scherer
+ * @author Tobias Nyholm
+ */
+abstract class AbstractCachePool implements PhpCachePool, LoggerAwareInterface, CacheInterface
+{
+ const SEPARATOR_TAG = '!';
+
+ /**
+ * @type LoggerInterface
+ */
+ private $logger;
+
+ /**
+ * @type PhpCacheItem[] deferred
+ */
+ protected $deferred = [];
+
+ /**
+ * @param PhpCacheItem $item
+ * @param int|null $ttl seconds from now
+ *
+ * @return bool true if saved
+ */
+ abstract protected function storeItemInCache(PhpCacheItem $item, $ttl);
+
+ /**
+ * Fetch an object from the cache implementation.
+ *
+ * If it is a cache miss, it MUST return [false, null, [], null]
+ *
+ * @param string $key
+ *
+ * @return array with [isHit, value, tags[], expirationTimestamp]
+ */
+ abstract protected function fetchObjectFromCache($key);
+
+ /**
+ * Clear all objects from cache.
+ *
+ * @return bool false if error
+ */
+ abstract protected function clearAllObjectsFromCache();
+
+ /**
+ * Remove one object from cache.
+ *
+ * @param string $key
+ *
+ * @return bool
+ */
+ abstract protected function clearOneObjectFromCache($key);
+
+ /**
+ * Get an array with all the values in the list named $name.
+ *
+ * @param string $name
+ *
+ * @return array
+ */
+ abstract protected function getList($name);
+
+ /**
+ * Remove the list.
+ *
+ * @param string $name
+ *
+ * @return bool
+ */
+ abstract protected function removeList($name);
+
+ /**
+ * Add a item key on a list named $name.
+ *
+ * @param string $name
+ * @param string $key
+ */
+ abstract protected function appendListItem($name, $key);
+
+ /**
+ * Remove an item from the list.
+ *
+ * @param string $name
+ * @param string $key
+ */
+ abstract protected function removeListItem($name, $key);
+
+ /**
+ * Make sure to commit before we destruct.
+ */
+ public function __destruct()
+ {
+ $this->commit();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getItem($key)
+ {
+ $this->validateKey($key);
+ if (isset($this->deferred[$key])) {
+ /** @type CacheItem $item */
+ $item = clone $this->deferred[$key];
+ $item->moveTagsToPrevious();
+
+ return $item;
+ }
+
+ $func = function () use ($key) {
+ try {
+ return $this->fetchObjectFromCache($key);
+ } catch (\Exception $e) {
+ $this->handleException($e, __FUNCTION__);
+ }
+ };
+
+ return new CacheItem($key, $func);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getItems(array $keys = [])
+ {
+ $items = [];
+ foreach ($keys as $key) {
+ $items[$key] = $this->getItem($key);
+ }
+
+ return $items;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function hasItem($key)
+ {
+ try {
+ return $this->getItem($key)->isHit();
+ } catch (\Exception $e) {
+ $this->handleException($e, __FUNCTION__);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function clear()
+ {
+ // Clear the deferred items
+ $this->deferred = [];
+
+ try {
+ return $this->clearAllObjectsFromCache();
+ } catch (\Exception $e) {
+ $this->handleException($e, __FUNCTION__);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function deleteItem($key)
+ {
+ try {
+ return $this->deleteItems([$key]);
+ } catch (\Exception $e) {
+ $this->handleException($e, __FUNCTION__);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function deleteItems(array $keys)
+ {
+ $deleted = true;
+ foreach ($keys as $key) {
+ $this->validateKey($key);
+
+ // Delete form deferred
+ unset($this->deferred[$key]);
+
+ // We have to commit here to be able to remove deferred hierarchy items
+ $this->commit();
+ $this->preRemoveItem($key);
+
+ if (!$this->clearOneObjectFromCache($key)) {
+ $deleted = false;
+ }
+ }
+
+ return $deleted;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function save(CacheItemInterface $item)
+ {
+ if (!$item instanceof PhpCacheItem) {
+ $e = new InvalidArgumentException('Cache items are not transferable between pools. Item MUST implement PhpCacheItem.');
+ $this->handleException($e, __FUNCTION__);
+ }
+
+ $this->removeTagEntries($item);
+ $this->saveTags($item);
+ $timeToLive = null;
+ if (null !== $timestamp = $item->getExpirationTimestamp()) {
+ $timeToLive = $timestamp - time();
+
+ if ($timeToLive < 0) {
+ return $this->deleteItem($item->getKey());
+ }
+ }
+
+ try {
+ return $this->storeItemInCache($item, $timeToLive);
+ } catch (\Exception $e) {
+ $this->handleException($e, __FUNCTION__);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function saveDeferred(CacheItemInterface $item)
+ {
+ $this->deferred[$item->getKey()] = $item;
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function commit()
+ {
+ $saved = true;
+ foreach ($this->deferred as $item) {
+ if (!$this->save($item)) {
+ $saved = false;
+ }
+ }
+ $this->deferred = [];
+
+ return $saved;
+ }
+
+ /**
+ * @param string $key
+ *
+ * @throws InvalidArgumentException
+ */
+ protected function validateKey($key)
+ {
+ if (!is_string($key)) {
+ $e = new InvalidArgumentException(sprintf(
+ 'Cache key must be string, "%s" given', gettype($key)
+ ));
+ $this->handleException($e, __FUNCTION__);
+ }
+ if (!isset($key[0])) {
+ $e = new InvalidArgumentException('Cache key cannot be an empty string');
+ $this->handleException($e, __FUNCTION__);
+ }
+ if (preg_match('|[\{\}\(\)/\\\@\:]|', $key)) {
+ $e = new InvalidArgumentException(sprintf(
+ 'Invalid key: "%s". The key contains one or more characters reserved for future extension: {}()/\@:',
+ $key
+ ));
+ $this->handleException($e, __FUNCTION__);
+ }
+ }
+
+ /**
+ * @param LoggerInterface $logger
+ */
+ public function setLogger(LoggerInterface $logger)
+ {
+ $this->logger = $logger;
+ }
+
+ /**
+ * Logs with an arbitrary level if the logger exists.
+ *
+ * @param mixed $level
+ * @param string $message
+ * @param array $context
+ */
+ protected function log($level, $message, array $context = [])
+ {
+ if ($this->logger !== null) {
+ $this->logger->log($level, $message, $context);
+ }
+ }
+
+ /**
+ * Log exception and rethrow it.
+ *
+ * @param \Exception $e
+ * @param string $function
+ *
+ * @throws CachePoolException
+ */
+ private function handleException(\Exception $e, $function)
+ {
+ $level = 'alert';
+ if ($e instanceof InvalidArgumentException) {
+ $level = 'warning';
+ }
+
+ $this->log($level, $e->getMessage(), ['exception' => $e]);
+ if (!$e instanceof CacheException) {
+ $e = new CachePoolException(sprintf('Exception thrown when executing "%s". ', $function), 0, $e);
+ }
+
+ throw $e;
+ }
+
+ /**
+ * @param array $tags
+ *
+ * @return bool
+ */
+ public function invalidateTags(array $tags)
+ {
+ $itemIds = [];
+ foreach ($tags as $tag) {
+ $itemIds = array_merge($itemIds, $this->getList($this->getTagKey($tag)));
+ }
+
+ // Remove all items with the tag
+ $success = $this->deleteItems($itemIds);
+
+ if ($success) {
+ // Remove the tag list
+ foreach ($tags as $tag) {
+ $this->removeList($this->getTagKey($tag));
+ $l = $this->getList($this->getTagKey($tag));
+ }
+ }
+
+ return $success;
+ }
+
+ public function invalidateTag($tag)
+ {
+ return $this->invalidateTags([$tag]);
+ }
+
+ /**
+ * @param PhpCacheItem $item
+ */
+ protected function saveTags(PhpCacheItem $item)
+ {
+ $tags = $item->getTags();
+ foreach ($tags as $tag) {
+ $this->appendListItem($this->getTagKey($tag), $item->getKey());
+ }
+ }
+
+ /**
+ * Removes the key form all tag lists. When an item with tags is removed
+ * we MUST remove the tags. If we fail to remove the tags a new item with
+ * the same key will automatically get the previous tags.
+ *
+ * @param string $key
+ *
+ * @return $this
+ */
+ protected function preRemoveItem($key)
+ {
+ $item = $this->getItem($key);
+ $this->removeTagEntries($item);
+
+ return $this;
+ }
+
+ /**
+ * @param PhpCacheItem $item
+ */
+ private function removeTagEntries(PhpCacheItem $item)
+ {
+ $tags = $item->getPreviousTags();
+ foreach ($tags as $tag) {
+ $this->removeListItem($this->getTagKey($tag), $item->getKey());
+ }
+ }
+
+ /**
+ * @param string $tag
+ *
+ * @return string
+ */
+ protected function getTagKey($tag)
+ {
+ return 'tag'.self::SEPARATOR_TAG.$tag;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get($key, $default = null)
+ {
+ $item = $this->getItem($key);
+ if (!$item->isHit()) {
+ return $default;
+ }
+
+ return $item->get();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function set($key, $value, $ttl = null)
+ {
+ $item = $this->getItem($key);
+ $item->set($value);
+ $item->expiresAfter($ttl);
+
+ return $this->save($item);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function delete($key)
+ {
+ return $this->deleteItem($key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getMultiple($keys, $default = null)
+ {
+ if (!is_array($keys)) {
+ if (!$keys instanceof \Traversable) {
+ throw new InvalidArgumentException('$keys is neither an array nor Traversable');
+ }
+
+ // Since we need to throw an exception if *any* key is invalid, it doesn't
+ // make sense to wrap iterators or something like that.
+ $keys = iterator_to_array($keys, false);
+ }
+
+ $items = $this->getItems($keys);
+
+ return $this->generateValues($default, $items);
+ }
+
+ /**
+ * @param $default
+ * @param $items
+ *
+ * @return \Generator
+ */
+ private function generateValues($default, $items)
+ {
+ foreach ($items as $key => $item) {
+ /** @type $item CacheItemInterface */
+ if (!$item->isHit()) {
+ yield $key => $default;
+ } else {
+ yield $key => $item->get();
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setMultiple($values, $ttl = null)
+ {
+ if (!is_array($values)) {
+ if (!$values instanceof \Traversable) {
+ throw new InvalidArgumentException('$values is neither an array nor Traversable');
+ }
+ }
+
+ $keys = [];
+ $arrayValues = [];
+ foreach ($values as $key => $value) {
+ if (is_int($key)) {
+ $key = (string) $key;
+ }
+ $this->validateKey($key);
+ $keys[] = $key;
+ $arrayValues[$key] = $value;
+ }
+
+ $items = $this->getItems($keys);
+ $itemSuccess = true;
+ foreach ($items as $key => $item) {
+ $item->set($arrayValues[$key]);
+
+ try {
+ $item->expiresAfter($ttl);
+ } catch (InvalidArgumentException $e) {
+ throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+ }
+
+ $itemSuccess = $itemSuccess && $this->saveDeferred($item);
+ }
+
+ return $itemSuccess && $this->commit();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function deleteMultiple($keys)
+ {
+ if (!is_array($keys)) {
+ if (!$keys instanceof \Traversable) {
+ throw new InvalidArgumentException('$keys is neither an array nor Traversable');
+ }
+
+ // Since we need to throw an exception if *any* key is invalid, it doesn't
+ // make sense to wrap iterators or something like that.
+ $keys = iterator_to_array($keys, false);
+ }
+
+ return $this->deleteItems($keys);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function has($key)
+ {
+ return $this->hasItem($key);
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Common/CacheItem.php b/vendor/cache/cache/src/Adapter/Common/CacheItem.php
new file mode 100644
index 0000000000..47c0081c12
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Common/CacheItem.php
@@ -0,0 +1,269 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Common;
+
+use Cache\Adapter\Common\Exception\InvalidArgumentException;
+use Cache\TagInterop\TaggableCacheItemInterface;
+
+/**
+ * @author Aaron Scherer
+ * @author Tobias Nyholm
+ */
+class CacheItem implements PhpCacheItem
+{
+ /**
+ * @type array
+ */
+ private $prevTags = [];
+
+ /**
+ * @type array
+ */
+ private $tags = [];
+
+ /**
+ * @type \Closure
+ */
+ private $callable;
+
+ /**
+ * @type string
+ */
+ private $key;
+
+ /**
+ * @type mixed
+ */
+ private $value;
+
+ /**
+ * The expiration timestamp is the source of truth. This is the UTC timestamp
+ * when the cache item expire. A value of zero means it never expires. A nullvalue
+ * means that no expiration is set.
+ *
+ * @type int|null
+ */
+ private $expirationTimestamp = null;
+
+ /**
+ * @type bool
+ */
+ private $hasValue = false;
+
+ /**
+ * @param string $key
+ * @param \Closure|bool $callable or boolean hasValue
+ */
+ public function __construct($key, $callable = null, $value = null)
+ {
+ $this->key = $key;
+
+ if ($callable === true) {
+ $this->hasValue = true;
+ $this->value = $value;
+ } elseif ($callable !== false) {
+ // This must be a callable or null
+ $this->callable = $callable;
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getKey()
+ {
+ return $this->key;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function set($value)
+ {
+ $this->value = $value;
+ $this->hasValue = true;
+ $this->callable = null;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get()
+ {
+ if (!$this->isHit()) {
+ return;
+ }
+
+ return $this->value;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isHit()
+ {
+ $this->initialize();
+
+ if (!$this->hasValue) {
+ return false;
+ }
+
+ if ($this->expirationTimestamp !== null) {
+ return $this->expirationTimestamp > time();
+ }
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getExpirationTimestamp()
+ {
+ return $this->expirationTimestamp;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function expiresAt($expiration)
+ {
+ if ($expiration instanceof \DateTimeInterface) {
+ $this->expirationTimestamp = $expiration->getTimestamp();
+ } elseif (is_int($expiration) || null === $expiration) {
+ $this->expirationTimestamp = $expiration;
+ } else {
+ throw new InvalidArgumentException('Cache item ttl/expiresAt must be of type integer or \DateTimeInterface.');
+ }
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function expiresAfter($time)
+ {
+ if ($time === null) {
+ $this->expirationTimestamp = null;
+ } elseif ($time instanceof \DateInterval) {
+ $date = new \DateTime();
+ $date->add($time);
+ $this->expirationTimestamp = $date->getTimestamp();
+ } elseif (is_int($time)) {
+ $this->expirationTimestamp = time() + $time;
+ } else {
+ throw new InvalidArgumentException('Cache item ttl/expiresAfter must be of type integer or \DateInterval.');
+ }
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPreviousTags()
+ {
+ $this->initialize();
+
+ return $this->prevTags;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTags()
+ {
+ return $this->tags;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setTags(array $tags)
+ {
+ $this->tags = [];
+ $this->tag($tags);
+
+ return $this;
+ }
+
+ /**
+ * Adds a tag to a cache item.
+ *
+ * @param string|string[] $tags A tag or array of tags
+ *
+ * @throws InvalidArgumentException When $tag is not valid.
+ *
+ * @return TaggableCacheItemInterface
+ */
+ private function tag($tags)
+ {
+ $this->initialize();
+
+ if (!is_array($tags)) {
+ $tags = [$tags];
+ }
+ foreach ($tags as $tag) {
+ if (!is_string($tag)) {
+ throw new InvalidArgumentException(sprintf('Cache tag must be string, "%s" given', is_object($tag) ? get_class($tag) : gettype($tag)));
+ }
+ if (isset($this->tags[$tag])) {
+ continue;
+ }
+ if (!isset($tag[0])) {
+ throw new InvalidArgumentException('Cache tag length must be greater than zero');
+ }
+ if (isset($tag[strcspn($tag, '{}()/\@:')])) {
+ throw new InvalidArgumentException(sprintf('Cache tag "%s" contains reserved characters {}()/\@:', $tag));
+ }
+ $this->tags[$tag] = $tag;
+ }
+
+ return $this;
+ }
+
+ /**
+ * If callable is not null, execute it an populate this object with values.
+ */
+ private function initialize()
+ {
+ if ($this->callable !== null) {
+ // $f will be $adapter->fetchObjectFromCache();
+ $f = $this->callable;
+ $result = $f();
+ $this->hasValue = $result[0];
+ $this->value = $result[1];
+ $this->prevTags = isset($result[2]) ? $result[2] : [];
+ $this->expirationTimestamp = null;
+
+ if (isset($result[3]) && is_int($result[3])) {
+ $this->expirationTimestamp = $result[3];
+ }
+
+ $this->callable = null;
+ }
+ }
+
+ /**
+ * @internal This function should never be used and considered private.
+ *
+ * Move tags from $tags to $prevTags
+ */
+ public function moveTagsToPrevious()
+ {
+ $this->prevTags = $this->tags;
+ $this->tags = [];
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Common/Changelog.md b/vendor/cache/cache/src/Adapter/Common/Changelog.md
new file mode 100644
index 0000000000..c896e891dd
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Common/Changelog.md
@@ -0,0 +1,47 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## 1.0.0
+
+No changes since 0.4.0.
+
+## 0.4.0
+
+### Added
+
+* `AbstractCachePool` has 4 new abstract methods: `getList`, `removeList`, `appendListItem` and `removeListItem`.
+* `AbstractCachePool::invalidateTags` and `AbstractCachePool::invalidateTags`
+* Added interfaces for our items and pools `PhpCachePool` and `PhpCacheItem`
+* Trait to help adapters to support tags. `TagSupportWithArray`.
+
+### Changed
+
+* First parameter to `AbstractCachePool::storeItemInCache` must be a `PhpCacheItem`.
+* Return value from `AbstractCachePool::fetchObjectFromCache` must be a an array with 4 values. Added expiration timestamp.
+* `HasExpirationDateInterface` is replaced by `HasExpirationTimestampInterface`
+* We do not work with `\DateTime` internally anymore. We work with timestamps.
+
+## 0.3.3
+
+### Fixed
+
+* Bugfix when you fetch data from the cache storage that was saved as "non-tagging item" but fetch as a tagging item.
+
+## 0.3.2
+
+### Added
+
+* Cache pools do implement `LoggerAwareInterface`
+
+## 0.3.0
+
+### Changed
+
+* The `AbstractCachePool` does not longer implement `TaggablePoolInterface`. However, the `CacheItem` does still implement `TaggableItemInterface`.
+* `CacheItem::getKeyFromTaggedKey` has been removed
+* The `CacheItem`'s second parameter is a callable that must return an array with 3 elements; [`hasValue`, `value`, `tags`].
+
+## 0.2.0
+
+No changelog before this version
diff --git a/vendor/cache/cache/src/Adapter/Common/Exception/CacheException.php b/vendor/cache/cache/src/Adapter/Common/Exception/CacheException.php
new file mode 100644
index 0000000000..54fbb11593
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Common/Exception/CacheException.php
@@ -0,0 +1,23 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Common\Exception;
+
+use Psr\Cache\CacheException as CacheExceptionInterface;
+
+/**
+ * A base exception. All exceptions in this organization will extend this exception.
+ *
+ * @author Tobias Nyholm
+ */
+abstract class CacheException extends \RuntimeException implements CacheExceptionInterface
+{
+}
diff --git a/vendor/cache/cache/src/Adapter/Common/Exception/CachePoolException.php b/vendor/cache/cache/src/Adapter/Common/Exception/CachePoolException.php
new file mode 100644
index 0000000000..c0b7e59964
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Common/Exception/CachePoolException.php
@@ -0,0 +1,21 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Common\Exception;
+
+/**
+ * If an exception is caused by a pool or by the cache storage.
+ *
+ * @author Tobias Nyholm
+ */
+class CachePoolException extends CacheException
+{
+}
diff --git a/vendor/cache/cache/src/Adapter/Common/Exception/InvalidArgumentException.php b/vendor/cache/cache/src/Adapter/Common/Exception/InvalidArgumentException.php
new file mode 100644
index 0000000000..e3cc8f443a
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Common/Exception/InvalidArgumentException.php
@@ -0,0 +1,19 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Common\Exception;
+
+use Psr\Cache\InvalidArgumentException as CacheInvalidArgumentException;
+use Psr\SimpleCache\InvalidArgumentException as SimpleCacheInvalidArgumentException;
+
+class InvalidArgumentException extends CacheException implements CacheInvalidArgumentException, SimpleCacheInvalidArgumentException
+{
+}
diff --git a/vendor/cache/cache/src/Adapter/Common/HasExpirationTimestampInterface.php b/vendor/cache/cache/src/Adapter/Common/HasExpirationTimestampInterface.php
new file mode 100644
index 0000000000..22f0adf219
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Common/HasExpirationTimestampInterface.php
@@ -0,0 +1,26 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Common;
+
+/**
+ * @author Aaron Scherer
+ * @author Tobias Nyholm
+ */
+interface HasExpirationTimestampInterface
+{
+ /**
+ * The timestamp when the object expires.
+ *
+ * @return int|null
+ */
+ public function getExpirationTimestamp();
+}
diff --git a/vendor/cache/cache/src/Adapter/Common/LICENSE b/vendor/cache/cache/src/Adapter/Common/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Common/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Adapter/Common/PhpCacheItem.php b/vendor/cache/cache/src/Adapter/Common/PhpCacheItem.php
new file mode 100644
index 0000000000..8d6ed5eaea
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Common/PhpCacheItem.php
@@ -0,0 +1,32 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Common;
+
+use Cache\TagInterop\TaggableCacheItemInterface;
+
+/**
+ * @author Tobias Nyholm
+ */
+interface PhpCacheItem extends HasExpirationTimestampInterface, TaggableCacheItemInterface
+{
+ /**
+ * Get the current tags. These are not the same tags as getPrevious tags. This
+ * is the tags that has been added to the item after the item was fetched from
+ * the cache storage.
+ *
+ * WARNING: This is generally not the function you want to use. Please see
+ * `getPreviousTags`.
+ *
+ * @return array
+ */
+ public function getTags();
+}
diff --git a/vendor/cache/cache/src/Adapter/Common/PhpCachePool.php b/vendor/cache/cache/src/Adapter/Common/PhpCachePool.php
new file mode 100644
index 0000000000..5ccfb6718e
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Common/PhpCachePool.php
@@ -0,0 +1,34 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Common;
+
+use Cache\TagInterop\TaggableCacheItemPoolInterface;
+
+/**
+ * @author Tobias Nyholm
+ */
+interface PhpCachePool extends TaggableCacheItemPoolInterface
+{
+ /**
+ * {@inheritdoc}
+ *
+ * @return PhpCacheItem
+ */
+ public function getItem($key);
+
+ /**
+ * {@inheritdoc}
+ *
+ * @return array|\Traversable|PhpCacheItem[]
+ */
+ public function getItems(array $keys = []);
+}
diff --git a/vendor/cache/cache/src/Adapter/Common/README.md b/vendor/cache/cache/src/Adapter/Common/README.md
new file mode 100644
index 0000000000..4a806770aa
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Common/README.md
@@ -0,0 +1,16 @@
+# Common PSR-6 Cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/adapter-common/v/stable)](https://packagist.org/packages/cache/adapter-common)
+[![codecov.io](https://codecov.io/github/php-cache/adapter-common/coverage.svg?branch=master)](https://codecov.io/github/php-cache/adapter-common?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/adapter-common/downloads)](https://packagist.org/packages/cache/adapter-common)
+[![Monthly Downloads](https://poser.pugx.org/cache/adapter-common/d/monthly.png)](https://packagist.org/packages/cache/adapter-common)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This repository contains shared classes and interfaces used by the PHP Cache organisation. To read about
+features like tagging and hierarchy support please read the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Adapter/Common/TagSupportWithArray.php b/vendor/cache/cache/src/Adapter/Common/TagSupportWithArray.php
new file mode 100644
index 0000000000..81859d2b6e
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Common/TagSupportWithArray.php
@@ -0,0 +1,88 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Common;
+
+/**
+ * This trait could be used by adapters that do not have a native support for lists.
+ *
+ * @author Tobias Nyholm
+ */
+trait TagSupportWithArray
+{
+ /**
+ * Get a value from the storage.
+ *
+ * @param string $name
+ *
+ * @return mixed
+ */
+ abstract public function getDirectValue($name);
+
+ /**
+ * Set a value to the storage.
+ *
+ * @param string $name
+ * @param mixed $value
+ */
+ abstract public function setDirectValue($name, $value);
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function appendListItem($name, $value)
+ {
+ $data = $this->getDirectValue($name);
+ if (!is_array($data)) {
+ $data = [];
+ }
+ $data[] = $value;
+ $this->setDirectValue($name, $data);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getList($name)
+ {
+ $data = $this->getDirectValue($name);
+ if (!is_array($data)) {
+ $data = [];
+ }
+
+ return $data;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function removeList($name)
+ {
+ $this->setDirectValue($name, []);
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function removeListItem($name, $key)
+ {
+ $data = $this->getList($name);
+ foreach ($data as $i => $value) {
+ if ($key === $value) {
+ unset($data[$i]);
+ }
+ }
+
+ return $this->setDirectValue($name, $data);
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Common/composer.json b/vendor/cache/cache/src/Adapter/Common/composer.json
new file mode 100644
index 0000000000..0e56545746
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Common/composer.json
@@ -0,0 +1,55 @@
+{
+ "name": "cache/adapter-common",
+ "description": "Common classes for PSR-6 adapters",
+ "type": "library",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "keywords": [
+ "cache",
+ "psr-6",
+ "tag"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "psr/simple-cache": "^1.0",
+ "psr/log": "^1.0",
+ "cache/tag-interop": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/integration-tests": "^0.16"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Adapter\\Common\\": ""
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Cache\\Adapter\\Common\\Tests\\": "Tests/"
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Doctrine/Changelog.md b/vendor/cache/cache/src/Adapter/Doctrine/Changelog.md
new file mode 100644
index 0000000000..8ce6119593
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Doctrine/Changelog.md
@@ -0,0 +1,36 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+No changes since 0.6.0
+
+## 0.6.0
+
+### Added
+
+* Support for the new `TaggableCacheItemPoolInterface`.
+* Support for PSR-16 SimpleCache
+
+### Changed
+
+* The behavior of `CacheItem::getTags()` has changed. It will not return the tags stored in the cache storage.
+
+### Removed
+
+* `CacheItem::getExpirationDate()`. Use `CacheItem::getExpirationTimestamp()`
+* `CacheItem::getTags()`. Use `CacheItem::getPreviousTags()`
+* `CacheItem::addTag()`. Use `CacheItem::setTags()`
+
+## 0.5.1
+
+### Changed
+
+* The `DoctrineCachePool::$cache` is now protected instead of private
+
+## 0.5.0
+
+No changelog before this version
diff --git a/vendor/cache/cache/src/Adapter/Doctrine/DoctrineCachePool.php b/vendor/cache/cache/src/Adapter/Doctrine/DoctrineCachePool.php
new file mode 100644
index 0000000000..3fd333d2e7
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Doctrine/DoctrineCachePool.php
@@ -0,0 +1,137 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Doctrine;
+
+use Cache\Adapter\Common\AbstractCachePool;
+use Cache\Adapter\Common\PhpCacheItem;
+use Doctrine\Common\Cache\Cache;
+use Doctrine\Common\Cache\FlushableCache;
+
+/**
+ * This is a bridge between PSR-6 and aDoctrine cache.
+ *
+ * @author Aaron Scherer
+ * @author Tobias Nyholm
+ */
+class DoctrineCachePool extends AbstractCachePool
+{
+ /**
+ * @type Cache
+ */
+ protected $cache;
+
+ /**
+ * @param Cache $cache
+ */
+ public function __construct(Cache $cache)
+ {
+ $this->cache = $cache;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function fetchObjectFromCache($key)
+ {
+ if (false === $data = $this->cache->fetch($key)) {
+ return [false, null, [], null];
+ }
+
+ return unserialize($data);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearAllObjectsFromCache()
+ {
+ if ($this->cache instanceof FlushableCache) {
+ return $this->cache->flushAll();
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearOneObjectFromCache($key)
+ {
+ return $this->cache->delete($key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function storeItemInCache(PhpCacheItem $item, $ttl)
+ {
+ if ($ttl === null) {
+ $ttl = 0;
+ }
+
+ $data = serialize([true, $item->get(), $item->getTags(), $item->getExpirationTimestamp()]);
+
+ return $this->cache->save($item->getKey(), $data, $ttl);
+ }
+
+ /**
+ * @return Cache
+ */
+ public function getCache()
+ {
+ return $this->cache;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getList($name)
+ {
+ if (false === $list = $this->cache->fetch($name)) {
+ return [];
+ }
+
+ return $list;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function removeList($name)
+ {
+ return $this->cache->delete($name);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function appendListItem($name, $key)
+ {
+ $list = $this->getList($name);
+ $list[] = $key;
+ $this->cache->save($name, $list);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function removeListItem($name, $key)
+ {
+ $list = $this->getList($name);
+ foreach ($list as $i => $item) {
+ if ($item === $key) {
+ unset($list[$i]);
+ }
+ }
+ $this->cache->save($name, $list);
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Doctrine/LICENSE b/vendor/cache/cache/src/Adapter/Doctrine/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Doctrine/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Adapter/Doctrine/README.md b/vendor/cache/cache/src/Adapter/Doctrine/README.md
new file mode 100644
index 0000000000..1ffe78328c
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Doctrine/README.md
@@ -0,0 +1,43 @@
+# Doctrine PSR-6 Cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/doctrine-adapter/v/stable)](https://packagist.org/packages/cache/doctrine-adapter)
+[![codecov.io](https://codecov.io/github/php-cache/doctrine-adapter/coverage.svg?branch=master)](https://codecov.io/github/php-cache/doctrine-adapter?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/doctrine-adapter/downloads)](https://packagist.org/packages/cache/doctrine-adapter)
+[![Monthly Downloads](https://poser.pugx.org/cache/doctrine-adapter/d/monthly.png)](https://packagist.org/packages/cache/doctrine-adapter)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is a PSR-6 cache implementation using Doctrine cache. It is a part of the PHP Cache organisation. To read about
+features like tagging and hierarchy support please read the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+This is a PSR-6 to Doctrine bridge. If you are interested in a Doctrine to PSR-6 bridge you should have a look at
+[PSR-6 Doctrine Bridge](https://github.com/php-cache/doctrine-bridge).
+
+### Install
+
+```bash
+composer require cache/doctrine-adapter
+```
+
+## Use
+
+```php
+use Doctrine\Common\Cache\MemcachedCache;
+use Cache\Adapter\Doctrine\DoctrineCachePool;
+
+
+$memcached = new \Memcached();
+$memcached->addServer('localhost', 11211);
+
+// Create a instance of Doctrine's MemcachedCache
+$doctrineCache = new MemcachedCache();
+$doctrineCache->setMemcached($memcached);
+
+// Wrap Doctrine's cache with the PSR-6 adapter
+$pool = new DoctrineCachePool($doctrineCache);
+```
+
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Adapter/Doctrine/composer.json b/vendor/cache/cache/src/Adapter/Doctrine/composer.json
new file mode 100644
index 0000000000..5f19b27524
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Doctrine/composer.json
@@ -0,0 +1,61 @@
+{
+ "name": "cache/doctrine-adapter",
+ "description": "A PSR-6 cache implementation using Doctrine. This implementation supports tags",
+ "type": "library",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "keywords": [
+ "cache",
+ "psr-6",
+ "doctrine",
+ "tag"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "psr/simple-cache": "^1.0",
+ "cache/adapter-common": "^1.0",
+ "doctrine/cache": "^1.6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "mockery/mockery": "^0.9.9",
+ "cache/integration-tests": "^0.16"
+ },
+ "provide": {
+ "psr/cache-implementation": "^1.0"
+ },
+ "suggest": {
+ "ext-apc": "Allows for caching with Apc",
+ "ext-memcache": "Allows for caching with Memcache",
+ "ext-memcached": "Allows for caching with Memcached",
+ "ext-redis": "Allows for caching with Redis"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Adapter\\Doctrine\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Filesystem/Changelog.md b/vendor/cache/cache/src/Adapter/Filesystem/Changelog.md
new file mode 100644
index 0000000000..6c381741c7
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Filesystem/Changelog.md
@@ -0,0 +1,48 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+No changes since 0.4.0
+
+## 0.4.0
+
+### Added
+
+* Support for the new `TaggableCacheItemPoolInterface`.
+* Support for PSR-16 SimpleCache
+
+### Changed
+
+* The behavior of `CacheItem::getTags()` has changed. It will not return the tags stored in the cache storage.
+
+### Removed
+
+* `CacheItem::getExpirationDate()`. Use `CacheItem::getExpirationTimestamp()`
+* `CacheItem::getTags()`. Use `CacheItem::getPreviousTags()`
+* `CacheItem::addTag()`. Use `CacheItem::setTags()`
+
+## 0.3.3
+
+### Fixed
+
+Race condition in `fetchObjectFromCache`.
+
+## 0.3.2
+
+### Changed
+
+Using `Filesystem::update` instead of `Filesystem::delete` and `Filesystem::write`.
+
+## 0.3.1
+
+### Added
+
+* Add ability to change cache path in FilesystemCachePool
+
+## 0.3.0
+
+No changelog before this version
diff --git a/vendor/cache/cache/src/Adapter/Filesystem/FilesystemCachePool.php b/vendor/cache/cache/src/Adapter/Filesystem/FilesystemCachePool.php
new file mode 100644
index 0000000000..0e6d8af7da
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Filesystem/FilesystemCachePool.php
@@ -0,0 +1,213 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Filesystem;
+
+use Cache\Adapter\Common\AbstractCachePool;
+use Cache\Adapter\Common\Exception\InvalidArgumentException;
+use Cache\Adapter\Common\PhpCacheItem;
+use League\Flysystem\FileExistsException;
+use League\Flysystem\FileNotFoundException;
+use League\Flysystem\Filesystem;
+
+/**
+ * @author Tobias Nyholm
+ */
+class FilesystemCachePool extends AbstractCachePool
+{
+ /**
+ * @type Filesystem
+ */
+ private $filesystem;
+
+ /**
+ * The folder should not begin nor end with a slash. Example: path/to/cache.
+ *
+ * @type string
+ */
+ private $folder;
+
+ /**
+ * @param Filesystem $filesystem
+ * @param string $folder
+ */
+ public function __construct(Filesystem $filesystem, $folder = 'cache')
+ {
+ $this->folder = $folder;
+
+ $this->filesystem = $filesystem;
+ $this->filesystem->createDir($this->folder);
+ }
+
+ /**
+ * @param string $folder
+ */
+ public function setFolder($folder)
+ {
+ $this->folder = $folder;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function fetchObjectFromCache($key)
+ {
+ $empty = [false, null, [], null];
+ $file = $this->getFilePath($key);
+
+ try {
+ $data = @unserialize($this->filesystem->read($file));
+ if ($data === false) {
+ return $empty;
+ }
+ } catch (FileNotFoundException $e) {
+ return $empty;
+ }
+
+ // Determine expirationTimestamp from data, remove items if expired
+ $expirationTimestamp = $data[2] ?: null;
+ if ($expirationTimestamp !== null && time() > $expirationTimestamp) {
+ foreach ($data[1] as $tag) {
+ $this->removeListItem($this->getTagKey($tag), $key);
+ }
+ $this->forceClear($key);
+
+ return $empty;
+ }
+
+ return [true, $data[0], $data[1], $expirationTimestamp];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearAllObjectsFromCache()
+ {
+ $this->filesystem->deleteDir($this->folder);
+ $this->filesystem->createDir($this->folder);
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearOneObjectFromCache($key)
+ {
+ return $this->forceClear($key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function storeItemInCache(PhpCacheItem $item, $ttl)
+ {
+ $data = serialize(
+ [
+ $item->get(),
+ $item->getTags(),
+ $item->getExpirationTimestamp(),
+ ]
+ );
+
+ $file = $this->getFilePath($item->getKey());
+ if ($this->filesystem->has($file)) {
+ // Update file if it exists
+ return $this->filesystem->update($file, $data);
+ }
+
+ try {
+ return $this->filesystem->write($file, $data);
+ } catch (FileExistsException $e) {
+ // To handle issues when/if race conditions occurs, we try to update here.
+ return $this->filesystem->update($file, $data);
+ }
+ }
+
+ /**
+ * @param string $key
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return string
+ */
+ private function getFilePath($key)
+ {
+ if (!preg_match('|^[a-zA-Z0-9_\.! ]+$|', $key)) {
+ throw new InvalidArgumentException(sprintf('Invalid key "%s". Valid filenames must match [a-zA-Z0-9_\.! ].', $key));
+ }
+
+ return sprintf('%s/%s', $this->folder, $key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getList($name)
+ {
+ $file = $this->getFilePath($name);
+
+ if (!$this->filesystem->has($file)) {
+ $this->filesystem->write($file, serialize([]));
+ }
+
+ return unserialize($this->filesystem->read($file));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function removeList($name)
+ {
+ $file = $this->getFilePath($name);
+ $this->filesystem->delete($file);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function appendListItem($name, $key)
+ {
+ $list = $this->getList($name);
+ $list[] = $key;
+
+ return $this->filesystem->update($this->getFilePath($name), serialize($list));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function removeListItem($name, $key)
+ {
+ $list = $this->getList($name);
+ foreach ($list as $i => $item) {
+ if ($item === $key) {
+ unset($list[$i]);
+ }
+ }
+
+ return $this->filesystem->update($this->getFilePath($name), serialize($list));
+ }
+
+ /**
+ * @param $key
+ *
+ * @return bool
+ */
+ private function forceClear($key)
+ {
+ try {
+ return $this->filesystem->delete($this->getFilePath($key));
+ } catch (FileNotFoundException $e) {
+ return true;
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Filesystem/LICENSE b/vendor/cache/cache/src/Adapter/Filesystem/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Filesystem/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Adapter/Filesystem/README.md b/vendor/cache/cache/src/Adapter/Filesystem/README.md
new file mode 100644
index 0000000000..90b4e45075
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Filesystem/README.md
@@ -0,0 +1,45 @@
+# Filesystem PSR-6 Cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/filesystem-adapter/v/stable)](https://packagist.org/packages/cache/filesystem-adapter)
+[![codecov.io](https://codecov.io/github/php-cache/filesystem-adapter/coverage.svg?branch=master)](https://codecov.io/github/php-cache/filesystem-adapter?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/filesystem-adapter/downloads)](https://packagist.org/packages/cache/filesystem-adapter)
+[![Monthly Downloads](https://poser.pugx.org/cache/filesystem-adapter/d/monthly.png)](https://packagist.org/packages/cache/filesystem-adapter)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is a PSR-6 cache implementation using Filesystem. It is a part of the PHP Cache organisation. To read about
+features like tagging and hierarchy support please read the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+This implementation is using the excellent [Flysystem](http://flysystem.thephpleague.com/).
+
+### Install
+
+```bash
+composer require cache/filesystem-adapter
+```
+
+### Use
+
+To create an instance of `FilesystemCachePool` you need to configure a `Filesystem` and its adapter.
+
+```php
+use League\Flysystem\Adapter\Local;
+use League\Flysystem\Filesystem;
+use Cache\Adapter\Filesystem\FilesystemCachePool;
+
+$filesystemAdapter = new Local(__DIR__.'/');
+$filesystem = new Filesystem($filesystemAdapter);
+
+$pool = new FilesystemCachePool($filesystem);
+```
+
+You can change the folder the cache pool will write to through the `setFolder` setter:
+
+```php
+$pool = new FilesystemCachePool($filesystem);
+$pool->setFolder('path/to/cache');
+```
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Adapter/Filesystem/composer.json b/vendor/cache/cache/src/Adapter/Filesystem/composer.json
new file mode 100644
index 0000000000..cbaa8806d4
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Filesystem/composer.json
@@ -0,0 +1,54 @@
+{
+ "name": "cache/filesystem-adapter",
+ "description": "A PSR-6 cache implementation using filesystem. This implementation supports tags",
+ "type": "library",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "keywords": [
+ "cache",
+ "psr-6",
+ "filesystem",
+ "tag"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "psr/simple-cache": "^1.0",
+ "cache/adapter-common": "^1.0",
+ "league/flysystem": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/integration-tests": "^0.16"
+ },
+ "provide": {
+ "psr/cache-implementation": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Adapter\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Illuminate/Changelog.md b/vendor/cache/cache/src/Adapter/Illuminate/Changelog.md
new file mode 100644
index 0000000000..0c39f697f3
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Illuminate/Changelog.md
@@ -0,0 +1,7 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## 0.1.0
+
+First version
diff --git a/vendor/cache/cache/src/Adapter/Illuminate/IlluminateCachePool.php b/vendor/cache/cache/src/Adapter/Illuminate/IlluminateCachePool.php
new file mode 100644
index 0000000000..56efe651f1
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Illuminate/IlluminateCachePool.php
@@ -0,0 +1,128 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Illuminate;
+
+use Cache\Adapter\Common\AbstractCachePool;
+use Cache\Adapter\Common\PhpCacheItem;
+use Illuminate\Contracts\Cache\Store;
+
+/**
+ * This is a bridge between PSR-6 and an Illuminate cache store.
+ *
+ * @author Florian Voutzinos
+ */
+class IlluminateCachePool extends AbstractCachePool
+{
+ /**
+ * @type Store
+ */
+ protected $store;
+
+ /**
+ * @param Store $store
+ */
+ public function __construct(Store $store)
+ {
+ $this->store = $store;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function storeItemInCache(PhpCacheItem $item, $ttl)
+ {
+ $ttl = null === $ttl ? 0 : $ttl / 60;
+
+ $data = serialize([true, $item->get(), $item->getTags(), $item->getExpirationTimestamp()]);
+
+ $this->store->put($item->getKey(), $data, $ttl);
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function fetchObjectFromCache($key)
+ {
+ if (null === $data = $this->store->get($key)) {
+ return [false, null, [], null];
+ }
+
+ return unserialize($data);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearAllObjectsFromCache()
+ {
+ return $this->store->flush();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearOneObjectFromCache($key)
+ {
+ return $this->store->forget($key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getList($name)
+ {
+ $list = $this->store->get($name);
+
+ if (!is_array($list)) {
+ return [];
+ }
+
+ return $list;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function removeList($name)
+ {
+ return $this->store->forget($name);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function appendListItem($name, $key)
+ {
+ $list = $this->getList($name);
+ $list[] = $key;
+
+ $this->store->forever($name, $list);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function removeListItem($name, $key)
+ {
+ $list = $this->getList($name);
+
+ foreach ($list as $i => $item) {
+ if ($item === $key) {
+ unset($list[$i]);
+ }
+ }
+
+ $this->store->forever($name, $list);
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Illuminate/LICENSE b/vendor/cache/cache/src/Adapter/Illuminate/LICENSE
new file mode 100644
index 0000000000..0a65e395f1
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Illuminate/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/cache/cache/src/Adapter/Illuminate/README.md b/vendor/cache/cache/src/Adapter/Illuminate/README.md
new file mode 100644
index 0000000000..ed3fbd3f4f
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Illuminate/README.md
@@ -0,0 +1,37 @@
+# Illuminate PSR-6 Cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/illuminate-adapter/v/stable)](https://packagist.org/packages/cache/illuminate-adapter)
+[![codecov.io](https://codecov.io/github/php-cache/illuminate-adapter/coverage.svg?branch=master)](https://codecov.io/github/php-cache/illuminate-adapter?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/illuminate-adapter/downloads)](https://packagist.org/packages/cache/illuminate-adapter)
+[![Monthly Downloads](https://poser.pugx.org/cache/illuminate-adapter/d/monthly.png)](https://packagist.org/packages/cache/illuminate-adapter)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is a PSR-6 cache implementation using Illuminate cache. It is a part of the PHP Cache organisation. To read about
+features like tagging and hierarchy support please read the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+This is a PSR-6 to Illuminate bridge.
+
+### Install
+
+```bash
+composer require cache/illuminate-adapter
+```
+
+## Use
+
+```php
+use Illuminate\Cache\ArrayStore;
+use Cache\Adapter\Illuminate\IlluminateCachePool;
+
+// Create an instance of an Illuminate's Store
+$store = new ArrayStore();
+
+// Wrap the Illuminate's store with the PSR-6 adapter
+$pool = new IlluminateCachePool($store);
+```
+
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Adapter/Illuminate/composer.json b/vendor/cache/cache/src/Adapter/Illuminate/composer.json
new file mode 100644
index 0000000000..4552cc8250
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Illuminate/composer.json
@@ -0,0 +1,61 @@
+{
+ "name": "cache/illuminate-adapter",
+ "description": "A PSR-6 cache implementation using Illuminate. This implementation supports tags",
+ "type": "library",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "keywords": [
+ "cache",
+ "psr-6",
+ "illuminate",
+ "laravel",
+ "tag"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Florian Voutzinos",
+ "email": "florian@voutzinos.com",
+ "homepage": "https://github.com/florianv"
+ },
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "psr/simple-cache": "^1.0",
+ "cache/adapter-common": "^1.0",
+ "illuminate/cache": "^5.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "mockery/mockery": "^0.9",
+ "cache/integration-tests": "^0.16"
+ },
+ "provide": {
+ "psr/cache-implementation": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Adapter\\Illuminate\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Memcache/Changelog.md b/vendor/cache/cache/src/Adapter/Memcache/Changelog.md
new file mode 100644
index 0000000000..079e669a6b
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Memcache/Changelog.md
@@ -0,0 +1,40 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+No changes since 0.3.0
+
+## 0.3.0
+
+### Added
+
+* Support for the new `TaggableCacheItemPoolInterface`.
+* Support for PSR-16 SimpleCache
+
+### Changed
+
+* The behavior of `CacheItem::getTags()` has changed. It will not return the tags stored in the cache storage.
+
+### Removed
+
+* `CacheItem::getExpirationDate()`. Use `CacheItem::getExpirationTimestamp()`
+* `CacheItem::getTags()`. Use `CacheItem::getPreviousTags()`
+* `CacheItem::addTag()`. Use `CacheItem::setTags()`
+
+## 0.2.2
+
+### Added
+
+Support for PHP7
+
+### Changed
+
+* The `MemcachedCachePool::$cache` is now protected instead of private
+
+## 0.2.1
+
+No changelog before this version
diff --git a/vendor/cache/cache/src/Adapter/Memcache/LICENSE b/vendor/cache/cache/src/Adapter/Memcache/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Memcache/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Adapter/Memcache/MemcacheCachePool.php b/vendor/cache/cache/src/Adapter/Memcache/MemcacheCachePool.php
new file mode 100644
index 0000000000..8efedd9dee
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Memcache/MemcacheCachePool.php
@@ -0,0 +1,91 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Memcache;
+
+use Cache\Adapter\Common\AbstractCachePool;
+use Cache\Adapter\Common\PhpCacheItem;
+use Cache\Adapter\Common\TagSupportWithArray;
+use Memcache;
+
+class MemcacheCachePool extends AbstractCachePool
+{
+ use TagSupportWithArray;
+
+ /**
+ * @type Memcache
+ */
+ protected $cache;
+
+ /**
+ * @param Memcache $cache
+ */
+ public function __construct(Memcache $cache)
+ {
+ $this->cache = $cache;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function fetchObjectFromCache($key)
+ {
+ if (false === $result = unserialize($this->cache->get($key))) {
+ return [false, null, [], null];
+ }
+
+ return $result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearAllObjectsFromCache()
+ {
+ return $this->cache->flush();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearOneObjectFromCache($key)
+ {
+ $this->cache->delete($key);
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function storeItemInCache(PhpCacheItem $item, $ttl)
+ {
+ $data = serialize([true, $item->get(), $item->getTags(), $item->getExpirationTimestamp()]);
+
+ return $this->cache->set($item->getKey(), $data, 0, $ttl ?: 0);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDirectValue($name)
+ {
+ return $this->cache->get($name);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setDirectValue($name, $value)
+ {
+ $this->cache->set($name, $value);
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Memcache/README.md b/vendor/cache/cache/src/Adapter/Memcache/README.md
new file mode 100644
index 0000000000..5f1a5de230
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Memcache/README.md
@@ -0,0 +1,31 @@
+# Memcache PSR-6 Cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/memcache-adapter/v/stable)](https://packagist.org/packages/cache/memcache-adapter)
+[![codecov.io](https://codecov.io/github/php-cache/memcache-adapter/coverage.svg?branch=master)](https://codecov.io/github/php-cache/memcache-adapter?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/memcache-adapter/downloads)](https://packagist.org/packages/cache/memcache-adapter)
+[![Monthly Downloads](https://poser.pugx.org/cache/memcache-adapter/d/monthly.png)](https://packagist.org/packages/cache/memcache-adapter)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is a PSR-6 cache implementation using Memcache. It is a part of the PHP Cache organisation. To read about
+features like tagging and hierarchy support please read the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+### Install
+
+```bash
+composer require cache/memcache-adapter
+```
+
+### Use
+
+To create an instance of `MemcacheCachePool` you need to configure a `\Memcache` client.
+
+```php
+$client = new Memcache();
+$client->connect('localhost', 11211);
+$pool = new MemcacheCachePool($client);
+```
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Adapter/Memcache/composer.json b/vendor/cache/cache/src/Adapter/Memcache/composer.json
new file mode 100644
index 0000000000..32eba4d68a
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Memcache/composer.json
@@ -0,0 +1,61 @@
+{
+ "name": "cache/memcache-adapter",
+ "description": "A PSR-6 cache implementation using memcache. This implementation supports tags",
+ "type": "library",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "keywords": [
+ "cache",
+ "psr-6",
+ "memcache",
+ "tag"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "psr/simple-cache": "^1.0",
+ "cache/adapter-common": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/integration-tests": "^0.16"
+ },
+ "suggest": {
+ "ext-memcache": "The extension required to use this pool."
+ },
+ "provide": {
+ "psr/cache-implementation": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Adapter\\Memcache\\": ""
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Cache\\Adapter\\Memcache\\Tests\\": "Tests/"
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Memcached/Changelog.md b/vendor/cache/cache/src/Adapter/Memcached/Changelog.md
new file mode 100644
index 0000000000..87b044a61a
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Memcached/Changelog.md
@@ -0,0 +1,45 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+### Fixed
+
+* Fixed `$path` variable not initialized in `clearOneObjectFromCache`.
+
+## 0.4.0
+
+### Added
+
+* Support for the new `TaggableCacheItemPoolInterface`.
+* Support for PSR-16 SimpleCache
+
+### Changed
+
+* The behavior of `CacheItem::getTags()` has changed. It will not return the tags stored in the cache storage.
+
+### Removed
+
+* `CacheItem::getExpirationDate()`. Use `CacheItem::getExpirationTimestamp()`
+* `CacheItem::getTags()`. Use `CacheItem::getPreviousTags()`
+* `CacheItem::addTag()`. Use `CacheItem::setTags()`
+
+## 0.3.3
+
+### Fixed
+
+* Issue when ttl is larger than 30 days.
+
+## 0.3.2
+
+### Changed
+
+* The `MemcachedCachePool::$cache` is now protected instead of private
+* Using `cache/hierarchical-cache:^0.3`
+
+## 0.3.1
+
+No changelog before this version
diff --git a/vendor/cache/cache/src/Adapter/Memcached/LICENSE b/vendor/cache/cache/src/Adapter/Memcached/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Memcached/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Adapter/Memcached/MemcachedCachePool.php b/vendor/cache/cache/src/Adapter/Memcached/MemcachedCachePool.php
new file mode 100644
index 0000000000..ad3eca1f4a
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Memcached/MemcachedCachePool.php
@@ -0,0 +1,119 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Memcached;
+
+use Cache\Adapter\Common\AbstractCachePool;
+use Cache\Adapter\Common\PhpCacheItem;
+use Cache\Adapter\Common\TagSupportWithArray;
+use Cache\Hierarchy\HierarchicalCachePoolTrait;
+use Cache\Hierarchy\HierarchicalPoolInterface;
+
+/**
+ * @author Aaron Scherer
+ * @author Tobias Nyholm
+ */
+class MemcachedCachePool extends AbstractCachePool implements HierarchicalPoolInterface
+{
+ use HierarchicalCachePoolTrait;
+ use TagSupportWithArray;
+
+ /**
+ * @type \Memcached
+ */
+ protected $cache;
+
+ /**
+ * @param \Memcached $cache
+ */
+ public function __construct(\Memcached $cache)
+ {
+ $this->cache = $cache;
+ $this->cache->setOption(\Memcached::OPT_BINARY_PROTOCOL, true);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function fetchObjectFromCache($key)
+ {
+ if (false === $result = unserialize($this->cache->get($this->getHierarchyKey($key)))) {
+ return [false, null, [], null];
+ }
+
+ return $result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearAllObjectsFromCache()
+ {
+ return $this->cache->flush();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearOneObjectFromCache($key)
+ {
+ $this->commit();
+ $path = null;
+ $key = $this->getHierarchyKey($key, $path);
+ if ($path) {
+ $this->cache->increment($path, 1, 0);
+ }
+ $this->clearHierarchyKeyCache();
+
+ if ($this->cache->delete($key)) {
+ return true;
+ }
+
+ // Return true if key not found
+ return $this->cache->getResultCode() === \Memcached::RES_NOTFOUND;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function storeItemInCache(PhpCacheItem $item, $ttl)
+ {
+ if ($ttl === null) {
+ $ttl = 0;
+ } elseif ($ttl < 0) {
+ return false;
+ } elseif ($ttl > 86400 * 30) {
+ // Any time higher than 30 days is interpreted as a unix timestamp date.
+ // https://github.com/memcached/memcached/wiki/Programming#expiration
+ $ttl = time() + $ttl;
+ }
+
+ $key = $this->getHierarchyKey($item->getKey());
+
+ return $this->cache->set($key, serialize([true, $item->get(), $item->getTags(), $item->getExpirationTimestamp()]), $ttl);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDirectValue($name)
+ {
+ return $this->cache->get($name);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setDirectValue($name, $value)
+ {
+ $this->cache->set($name, $value);
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Memcached/README.md b/vendor/cache/cache/src/Adapter/Memcached/README.md
new file mode 100644
index 0000000000..3f31922690
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Memcached/README.md
@@ -0,0 +1,31 @@
+# Memcached PSR-6 Cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/memcached-adapter/v/stable)](https://packagist.org/packages/cache/memcached-adapter)
+[![codecov.io](https://codecov.io/github/php-cache/memcached-adapter/coverage.svg?branch=master)](https://codecov.io/github/php-cache/memcached-adapter?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/memcached-adapter/downloads)](https://packagist.org/packages/cache/memcached-adapter)
+[![Monthly Downloads](https://poser.pugx.org/cache/memcached-adapter/d/monthly.png)](https://packagist.org/packages/cache/memcached-adapter)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is a PSR-6 cache implementation using Memcached. It is a part of the PHP Cache organisation. To read about
+features like tagging and hierarchy support please read the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+### Install
+
+```bash
+composer require cache/memcached-adapter
+```
+
+### Use
+
+To create an instance of `MemcachedCachePool` you need to configure a `\Memcached` client.
+
+```php
+$client = new \Memcached();
+$client->addServer('localhost', 11211);
+$pool = new MemcachedCachePool($client);
+```
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Adapter/Memcached/composer.json b/vendor/cache/cache/src/Adapter/Memcached/composer.json
new file mode 100644
index 0000000000..c5f35b140e
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Memcached/composer.json
@@ -0,0 +1,57 @@
+{
+ "name": "cache/memcached-adapter",
+ "description": "A PSR-6 cache implementation using Memcached. This implementation supports tags",
+ "type": "library",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "keywords": [
+ "cache",
+ "psr-6",
+ "memcached",
+ "tag"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "psr/simple-cache": "^1.0",
+ "cache/adapter-common": "^1.0",
+ "cache/hierarchical-cache": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/integration-tests": "^0.16"
+ },
+ "suggest": {
+ "ext-memcached": "The extension required to use this pool."
+ },
+ "provide": {
+ "psr/cache-implementation": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Adapter\\Memcached\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/MongoDB/Changelog.md b/vendor/cache/cache/src/Adapter/MongoDB/Changelog.md
new file mode 100644
index 0000000000..9a8cd8700f
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/MongoDB/Changelog.md
@@ -0,0 +1,30 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+No changes since 0.3.0
+
+## 0.3.0
+
+### Added
+
+* Support for the new `TaggableCacheItemPoolInterface`.
+* Support for PSR-16 SimpleCache
+
+### Changed
+
+* The behavior of `CacheItem::getTags()` has changed. It will not return the tags stored in the cache storage.
+
+### Removed
+
+* `CacheItem::getExpirationDate()`. Use `CacheItem::getExpirationTimestamp()`
+* `CacheItem::getTags()`. Use `CacheItem::getPreviousTags()`
+* `CacheItem::addTag()`. Use `CacheItem::setTags()`
+
+## 0.2.0
+
+No changelog before this version
diff --git a/vendor/cache/cache/src/Adapter/MongoDB/LICENSE b/vendor/cache/cache/src/Adapter/MongoDB/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/MongoDB/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Adapter/MongoDB/MongoDBCachePool.php b/vendor/cache/cache/src/Adapter/MongoDB/MongoDBCachePool.php
new file mode 100644
index 0000000000..922deca035
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/MongoDB/MongoDBCachePool.php
@@ -0,0 +1,142 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\MongoDB;
+
+use Cache\Adapter\Common\AbstractCachePool;
+use Cache\Adapter\Common\PhpCacheItem;
+use Cache\Adapter\Common\TagSupportWithArray;
+use MongoDB\Collection;
+use MongoDB\Driver\Manager;
+
+/**
+ * @author Tobias Nyholm
+ * @author Magnus Nordlander
+ */
+class MongoDBCachePool extends AbstractCachePool
+{
+ use TagSupportWithArray;
+
+ /**
+ * @type Collection
+ */
+ private $collection;
+
+ /**
+ * @param Collection $collection
+ */
+ public function __construct(Collection $collection)
+ {
+ $this->collection = $collection;
+ }
+
+ /**
+ * @param Manager $manager
+ * @param string $database
+ * @param string $collection
+ *
+ * @return Collection
+ */
+ public static function createCollection(Manager $manager, $database, $collection)
+ {
+ $collection = new Collection($manager, $database, $collection);
+ $collection->createIndex(['expireAt' => 1], ['expireAfterSeconds' => 0]);
+
+ return $collection;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function fetchObjectFromCache($key)
+ {
+ $object = $this->collection->findOne(['_id' => $key]);
+
+ if (!$object || !isset($object->data)) {
+ return [false, null, [], null];
+ }
+
+ if (isset($object->expiresAt)) {
+ if ($object->expiresAt < time()) {
+ return [false, null, [], null];
+ }
+ }
+
+ return [true, unserialize($object->data), unserialize($object->tags), $object->expirationTimestamp];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearAllObjectsFromCache()
+ {
+ $this->collection->deleteMany([]);
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearOneObjectFromCache($key)
+ {
+ $this->collection->deleteOne(['_id' => $key]);
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function storeItemInCache(PhpCacheItem $item, $ttl)
+ {
+ $object = [
+ '_id' => $item->getKey(),
+ 'data' => serialize($item->get()),
+ 'tags' => serialize($item->getTags()),
+ 'expirationTimestamp' => $item->getExpirationTimestamp(),
+ ];
+
+ if ($ttl) {
+ $object['expiresAt'] = time() + $ttl;
+ }
+
+ $this->collection->updateOne(['_id' => $item->getKey()], ['$set' => $object], ['upsert' => true]);
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDirectValue($name)
+ {
+ $object = $this->collection->findOne(['_id' => $name]);
+ if (!$object || !isset($object->data)) {
+ return;
+ }
+
+ return unserialize($object->data);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setDirectValue($name, $value)
+ {
+ $object = [
+ '_id' => $name,
+ 'data' => serialize($value),
+ ];
+
+ $this->collection->updateOne(['_id' => $name], ['$set' => $object], ['upsert' => true]);
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/MongoDB/README.md b/vendor/cache/cache/src/Adapter/MongoDB/README.md
new file mode 100644
index 0000000000..47b808f2e6
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/MongoDB/README.md
@@ -0,0 +1,30 @@
+# MongoDB PSR-6 Cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/mongodb-adapter/v/stable)](https://packagist.org/packages/cache/mongodb-adapter)
+[![codecov.io](https://codecov.io/github/php-cache/mongodb-adapter/coverage.svg?branch=master)](https://codecov.io/github/php-cache/mongodb-adapter?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/mongodb-adapter/downloads)](https://packagist.org/packages/cache/mongodb-adapter)
+[![Monthly Downloads](https://poser.pugx.org/cache/mongodb-adapter/d/monthly.png)](https://packagist.org/packages/cache/mongodb-adapter)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is a PSR-6 cache implementation using MongoDB. It is a part of the PHP Cache organisation. To read about
+features like tagging and hierarchy support please read the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+### Install
+
+```bash
+composer require cache/mongodb-adapter
+```
+
+### Use
+
+```php
+$manager = new Manager('mongodb://'.getenv('MONGODB_HOST'));
+$collection = MongoDBCachePool::createCollection($manager, 'localhost:27017', 'psr6test.cache');
+
+$pool = new MongoDBCachePool($collection);
+```
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Adapter/MongoDB/composer.json b/vendor/cache/cache/src/Adapter/MongoDB/composer.json
new file mode 100644
index 0000000000..6009ae2be0
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/MongoDB/composer.json
@@ -0,0 +1,54 @@
+{
+ "name": "cache/mongodb-adapter",
+ "description": "A PSR-6 cache implementation using MongoDB. This implementation supports tags",
+ "type": "library",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "keywords": [
+ "cache",
+ "psr-6",
+ "mongodb",
+ "tag"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "psr/simple-cache": "^1.0",
+ "cache/adapter-common": "^1.0",
+ "mongodb/mongodb": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/integration-tests": "^0.16"
+ },
+ "provide": {
+ "psr/cache-implementation": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Adapter\\MongoDB\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/PHPArray/ArrayCachePool.php b/vendor/cache/cache/src/Adapter/PHPArray/ArrayCachePool.php
new file mode 100644
index 0000000000..d448e32836
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/PHPArray/ArrayCachePool.php
@@ -0,0 +1,206 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\PHPArray;
+
+use Cache\Adapter\Common\AbstractCachePool;
+use Cache\Adapter\Common\CacheItem;
+use Cache\Adapter\Common\PhpCacheItem;
+use Cache\Hierarchy\HierarchicalCachePoolTrait;
+use Cache\Hierarchy\HierarchicalPoolInterface;
+
+/**
+ * Array cache pool. You could set a limit of how many items you want to be stored to avoid memory leaks.
+ *
+ * @author Tobias Nyholm
+ */
+class ArrayCachePool extends AbstractCachePool implements HierarchicalPoolInterface
+{
+ use HierarchicalCachePoolTrait;
+
+ /**
+ * @type PhpCacheItem[]
+ */
+ private $cache;
+
+ /**
+ * @type array
+ * A map to hold keys
+ */
+ private $keyMap = [];
+
+ /**
+ * @type int
+ * The maximum number of keys in the map
+ */
+ private $limit;
+
+ /**
+ * @type int
+ * The next key that we should remove from the cache
+ */
+ private $currentPosition = 0;
+
+ /**
+ * @param int $limit the amount if items stored in the cache. Using a limit will reduce memory leaks.
+ * @param array $cache
+ */
+ public function __construct($limit = null, array &$cache = [])
+ {
+ $this->cache = &$cache;
+ $this->limit = $limit;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getItemWithoutGenerateCacheKey($key)
+ {
+ if (isset($this->deferred[$key])) {
+ /** @type CacheItem $item */
+ $item = clone $this->deferred[$key];
+ $item->moveTagsToPrevious();
+
+ return $item;
+ }
+
+ return $this->fetchObjectFromCache($key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function fetchObjectFromCache($key)
+ {
+ $keyString = $this->getHierarchyKey($key);
+ if (!isset($this->cache[$keyString])) {
+ return [false, null, [], null];
+ }
+
+ list($data, $tags, $timestamp) = $this->cache[$keyString];
+
+ if (is_object($data)) {
+ $data = clone $data;
+ }
+
+ return [true, $data, $tags, $timestamp];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearAllObjectsFromCache()
+ {
+ $this->cache = [];
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearOneObjectFromCache($key)
+ {
+ $this->commit();
+ $path = null;
+ $keyString = $this->getHierarchyKey($key, $path);
+ if (isset($this->cache[$path])) {
+ $this->cache[$path]++;
+ } else {
+ $this->cache[$path] = 0;
+ }
+ $this->clearHierarchyKeyCache();
+
+ unset($this->cache[$keyString]);
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function storeItemInCache(PhpCacheItem $item, $ttl)
+ {
+ $key = $this->getHierarchyKey($item->getKey());
+ $value = $item->get();
+ if (is_object($value)) {
+ $value = clone $value;
+ }
+ $this->cache[$key] = [$value, $item->getTags(), $item->getExpirationTimestamp()];
+
+ if ($this->limit !== null) {
+ // Remove the oldest value
+ if (isset($this->keyMap[$this->currentPosition])) {
+ unset($this->cache[$this->keyMap[$this->currentPosition]]);
+ }
+
+ // Add the new key to the current position
+ $this->keyMap[$this->currentPosition] = $key;
+
+ // Increase the current position
+ $this->currentPosition = ($this->currentPosition + 1) % $this->limit;
+ }
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getDirectValue($key)
+ {
+ if (isset($this->cache[$key])) {
+ return $this->cache[$key];
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getList($name)
+ {
+ if (!isset($this->cache[$name])) {
+ $this->cache[$name] = [];
+ }
+
+ return $this->cache[$name];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function removeList($name)
+ {
+ unset($this->cache[$name]);
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function appendListItem($name, $key)
+ {
+ $this->cache[$name][] = $key;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function removeListItem($name, $key)
+ {
+ foreach ($this->cache[$name] as $i => $item) {
+ if ($item === $key) {
+ unset($this->cache[$name][$i]);
+ }
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/PHPArray/Changelog.md b/vendor/cache/cache/src/Adapter/PHPArray/Changelog.md
new file mode 100644
index 0000000000..97b45d756b
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/PHPArray/Changelog.md
@@ -0,0 +1,38 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+### Fixed
+
+* Fixed `$path` variable not initialized in `clearOneObjectFromCache`.
+
+## 0.5.0
+
+### Added
+
+* Support for the new `TaggableCacheItemPoolInterface`.
+* Support for PSR-16 SimpleCache
+
+### Changed
+
+* The behavior of `CacheItem::getTags()` has changed. It will not return the tags stored in the cache storage.
+
+### Removed
+
+* `CacheItem::getExpirationDate()`. Use `CacheItem::getExpirationTimestamp()`
+* `CacheItem::getTags()`. Use `CacheItem::getPreviousTags()`
+* `CacheItem::addTag()`. Use `CacheItem::setTags()`
+
+## 0.4.2
+
+### Changed
+
+* Using `cache/hierarchical-cache:^0.3`
+
+## 0.4.1
+
+No changelog before this version
diff --git a/vendor/cache/cache/src/Adapter/PHPArray/LICENSE b/vendor/cache/cache/src/Adapter/PHPArray/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/PHPArray/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Adapter/PHPArray/README.md b/vendor/cache/cache/src/Adapter/PHPArray/README.md
new file mode 100644
index 0000000000..e5c89fc0b9
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/PHPArray/README.md
@@ -0,0 +1,29 @@
+# Array PSR-6 Cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/array-adapter/v/stable)](https://packagist.org/packages/cache/array-adapter)
+[![codecov.io](https://codecov.io/github/php-cache/array-adapter/coverage.svg?branch=master)](https://codecov.io/github/array-cache/apc-adapter?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/array-adapter/downloads)](https://packagist.org/packages/cache/array-adapter)
+[![Monthly Downloads](https://poser.pugx.org/cache/array-adapter/d/monthly.png)](https://packagist.org/packages/cache/array-adapter)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is a PSR-6 cache implementation using PHP array. It is a part of the PHP Cache organisation. To read about
+features like tagging and hierarchy support please read the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+### Install
+
+```bash
+composer require cache/array-adapter
+```
+
+### Use
+
+You do not need to do any configuration to use the `ArrayCachePool`.
+
+```php
+$pool = new ArrayCachePool();
+```
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Adapter/PHPArray/composer.json b/vendor/cache/cache/src/Adapter/PHPArray/composer.json
new file mode 100644
index 0000000000..4ec3fd7d40
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/PHPArray/composer.json
@@ -0,0 +1,54 @@
+{
+ "name": "cache/array-adapter",
+ "description": "A PSR-6 cache implementation using a php array. This implementation supports tags",
+ "type": "library",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "keywords": [
+ "cache",
+ "psr-6",
+ "array",
+ "tag"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "psr/simple-cache": "^1.0",
+ "cache/adapter-common": "^1.0",
+ "cache/hierarchical-cache": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/integration-tests": "^0.16"
+ },
+ "provide": {
+ "psr/cache-implementation": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Adapter\\PHPArray\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Predis/Changelog.md b/vendor/cache/cache/src/Adapter/Predis/Changelog.md
new file mode 100644
index 0000000000..50e162951d
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Predis/Changelog.md
@@ -0,0 +1,45 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+### Fixed
+
+* Fixed `$path` variable not initialized in `clearOneObjectFromCache`.
+
+## 0.5.0
+
+### Added
+
+* Support for the new `TaggableCacheItemPoolInterface`.
+* Support for PSR-16 SimpleCache
+
+### Changed
+
+* The behavior of `CacheItem::getTags()` has changed. It will not return the tags stored in the cache storage.
+
+### Removed
+
+* `CacheItem::getExpirationDate()`. Use `CacheItem::getExpirationTimestamp()`
+* `CacheItem::getTags()`. Use `CacheItem::getPreviousTags()`
+* `CacheItem::addTag()`. Use `CacheItem::setTags()`
+
+## 0.4.2
+
+### Changed
+
+* Rely on `Predis\ClientInterface` instead of `Predis\Client` in `PredisCachePool`
+
+## 0.4.1
+
+### Changed
+
+* The `PredisCachePool::$cache` is now protected instead of private
+* Using `cache/hierarchical-cache:^0.3`
+
+## 0.4.0
+
+No changelog before this version
diff --git a/vendor/cache/cache/src/Adapter/Predis/LICENSE b/vendor/cache/cache/src/Adapter/Predis/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Predis/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Adapter/Predis/PredisCachePool.php b/vendor/cache/cache/src/Adapter/Predis/PredisCachePool.php
new file mode 100644
index 0000000000..f1ec6eeee2
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Predis/PredisCachePool.php
@@ -0,0 +1,133 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Predis;
+
+use Cache\Adapter\Common\AbstractCachePool;
+use Cache\Adapter\Common\PhpCacheItem;
+use Cache\Hierarchy\HierarchicalCachePoolTrait;
+use Cache\Hierarchy\HierarchicalPoolInterface;
+use Predis\ClientInterface as Client;
+
+/**
+ * @author Tobias Nyholm
+ */
+class PredisCachePool extends AbstractCachePool implements HierarchicalPoolInterface
+{
+ use HierarchicalCachePoolTrait;
+
+ /**
+ * @type Client
+ */
+ protected $cache;
+
+ /**
+ * @param Client $cache
+ */
+ public function __construct(Client $cache)
+ {
+ $this->cache = $cache;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function fetchObjectFromCache($key)
+ {
+ if (false === $result = unserialize($this->cache->get($this->getHierarchyKey($key)))) {
+ return [false, null, [], null];
+ }
+
+ return $result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearAllObjectsFromCache()
+ {
+ return 'OK' === $this->cache->flushdb()->getPayload();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearOneObjectFromCache($key)
+ {
+ $path = null;
+ $keyString = $this->getHierarchyKey($key, $path);
+ if ($path) {
+ $this->cache->incr($path);
+ }
+ $this->clearHierarchyKeyCache();
+
+ return $this->cache->del($keyString) >= 0;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function storeItemInCache(PhpCacheItem $item, $ttl)
+ {
+ if ($ttl < 0) {
+ return false;
+ }
+
+ $key = $this->getHierarchyKey($item->getKey());
+ $data = serialize([true, $item->get(), $item->getTags(), $item->getExpirationTimestamp()]);
+
+ if ($ttl === null || $ttl === 0) {
+ return 'OK' === $this->cache->set($key, $data)->getPayload();
+ }
+
+ return 'OK' === $this->cache->setex($key, $ttl, $data)->getPayload();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getDirectValue($key)
+ {
+ return $this->cache->get($key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function appendListItem($name, $value)
+ {
+ $this->cache->lpush($name, $value);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getList($name)
+ {
+ return $this->cache->lrange($name, 0, -1);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function removeList($name)
+ {
+ return $this->cache->del($name);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function removeListItem($name, $key)
+ {
+ return $this->cache->lrem($name, 0, $key);
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Predis/README.md b/vendor/cache/cache/src/Adapter/Predis/README.md
new file mode 100644
index 0000000000..683058ef3a
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Predis/README.md
@@ -0,0 +1,33 @@
+# Predis PSR-6 Cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/predis-adapter/v/stable)](https://packagist.org/packages/cache/predis-adapter)
+[![codecov.io](https://codecov.io/github/php-cache/predis-adapter/coverage.svg?branch=master)](https://codecov.io/github/php-cache/predis-adapter?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/predis-adapter/downloads)](https://packagist.org/packages/cache/predis-adapter)
+[![Monthly Downloads](https://poser.pugx.org/cache/predis-adapter/d/monthly.png)](https://packagist.org/packages/cache/predis-adapter)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is a PSR-6 cache implementation using Predis. It is a part of the PHP Cache organisation. To read about
+features like tagging and hierarchy support please read the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+This implementation is using [Predis](https://github.com/nrk/predis). If you want an adapter with
+[PhpRedis](https://github.com/phpredis/phpredis) you should look at our [Redis adapter](https://github.com/php-cache/redis-adapter).
+
+### Install
+
+```bash
+composer require cache/predis-adapter
+```
+
+### Use
+
+To create an instance of `PredisCachePool` you need to configure a `\Predis\Client` object.
+
+```php
+$client = new \Predis\Client('tcp:/127.0.0.1:6379');
+$pool = new PredisCachePool($client);
+```
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Adapter/Predis/composer.json b/vendor/cache/cache/src/Adapter/Predis/composer.json
new file mode 100644
index 0000000000..aa9fea250b
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Predis/composer.json
@@ -0,0 +1,56 @@
+{
+ "name": "cache/predis-adapter",
+ "description": "A PSR-6 cache implementation using Redis (Predis). This implementation supports tags",
+ "type": "library",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "keywords": [
+ "cache",
+ "psr-6",
+ "redis",
+ "predis",
+ "tag"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "psr/simple-cache": "^1.0",
+ "cache/adapter-common": "^1.0",
+ "cache/hierarchical-cache": "^1.0",
+ "predis/predis": "^1.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/integration-tests": "^0.16"
+ },
+ "provide": {
+ "psr/cache-implementation": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Adapter\\Predis\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Redis/Changelog.md b/vendor/cache/cache/src/Adapter/Redis/Changelog.md
new file mode 100644
index 0000000000..3893a063ba
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Redis/Changelog.md
@@ -0,0 +1,39 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+### Fixed
+
+* Fixed `$path` variable not initialized in `clearOneObjectFromCache`.
+
+## 0.5.0
+
+### Added
+
+* Support for the new `TaggableCacheItemPoolInterface`.
+* Support for PSR-16 SimpleCache
+
+### Changed
+
+* The behavior of `CacheItem::getTags()` has changed. It will not return the tags stored in the cache storage.
+
+### Removed
+
+* `CacheItem::getExpirationDate()`. Use `CacheItem::getExpirationTimestamp()`
+* `CacheItem::getTags()`. Use `CacheItem::getPreviousTags()`
+* `CacheItem::addTag()`. Use `CacheItem::setTags()`
+
+## 0.4.2
+
+### Changed
+
+* The `RedisCachePool::$cache` is now protected instead of private
+* Using `cache/hierarchical-cache:^0.3`
+
+## 0.4.1
+
+No changelog before this version
diff --git a/vendor/cache/cache/src/Adapter/Redis/LICENSE b/vendor/cache/cache/src/Adapter/Redis/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Redis/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Adapter/Redis/README.md b/vendor/cache/cache/src/Adapter/Redis/README.md
new file mode 100644
index 0000000000..d85e55f4ec
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Redis/README.md
@@ -0,0 +1,35 @@
+# Redis PSR-6 Cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/redis-adapter/v/stable)](https://packagist.org/packages/cache/redis-adapter)
+[![codecov.io](https://codecov.io/github/php-cache/redis-adapter/coverage.svg?branch=master)](https://codecov.io/github/php-cache/redis-adapter?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/redis-adapter/downloads)](https://packagist.org/packages/cache/redis-adapter)
+[![Monthly Downloads](https://poser.pugx.org/cache/redis-adapter/d/monthly.png)](https://packagist.org/packages/cache/redis-adapter)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is a PSR-6 cache implementation using Redis. It is a part of the PHP Cache organisation. To read about
+features like tagging and hierarchy support please read the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+This implementation is using [PhpRedis](https://github.com/phpredis/phpredis). If you want an adapter with
+[Predis](https://github.com/nrk/predis) you should look at our [Predis adapter](https://github.com/php-cache/predis-adapter).
+
+### Install
+
+```bash
+composer require cache/redis-adapter
+```
+
+### Use
+
+To create an instance of `RedisCachePool` you need to configure a `\Redis` client.
+
+```php
+$client = new \Redis();
+$client->connect('127.0.0.1', 6379);
+$pool = new RedisCachePool($client);
+```
+
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Adapter/Redis/RedisCachePool.php b/vendor/cache/cache/src/Adapter/Redis/RedisCachePool.php
new file mode 100644
index 0000000000..1ee038133d
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Redis/RedisCachePool.php
@@ -0,0 +1,127 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Redis;
+
+use Cache\Adapter\Common\AbstractCachePool;
+use Cache\Adapter\Common\PhpCacheItem;
+use Cache\Hierarchy\HierarchicalCachePoolTrait;
+use Cache\Hierarchy\HierarchicalPoolInterface;
+
+/**
+ * @author Tobias Nyholm
+ */
+class RedisCachePool extends AbstractCachePool implements HierarchicalPoolInterface
+{
+ use HierarchicalCachePoolTrait;
+
+ /**
+ * @type \Redis
+ */
+ protected $cache;
+
+ /**
+ * @param \Redis $cache
+ */
+ public function __construct(\Redis $cache)
+ {
+ $this->cache = $cache;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function fetchObjectFromCache($key)
+ {
+ if (false === $result = unserialize($this->cache->get($this->getHierarchyKey($key)))) {
+ return [false, null, [], null];
+ }
+
+ return $result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearAllObjectsFromCache()
+ {
+ return $this->cache->flushDb();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearOneObjectFromCache($key)
+ {
+ $path = null;
+ $keyString = $this->getHierarchyKey($key, $path);
+ if ($path) {
+ $this->cache->incr($path);
+ }
+ $this->clearHierarchyKeyCache();
+
+ return $this->cache->del($keyString) >= 0;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function storeItemInCache(PhpCacheItem $item, $ttl)
+ {
+ $key = $this->getHierarchyKey($item->getKey());
+ $data = serialize([true, $item->get(), $item->getTags(), $item->getExpirationTimestamp()]);
+ if ($ttl === null || $ttl === 0) {
+ return $this->cache->set($key, $data);
+ }
+
+ return $this->cache->setex($key, $ttl, $data);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getDirectValue($key)
+ {
+ return $this->cache->get($key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function appendListItem($name, $value)
+ {
+ $this->cache->lPush($name, $value);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getList($name)
+ {
+ return $this->cache->lRange($name, 0, -1);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function removeList($name)
+ {
+ return $this->cache->del($name);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function removeListItem($name, $key)
+ {
+ return $this->cache->lrem($name, $key, 0);
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Redis/composer.json b/vendor/cache/cache/src/Adapter/Redis/composer.json
new file mode 100644
index 0000000000..b5def50f03
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Redis/composer.json
@@ -0,0 +1,58 @@
+{
+ "name": "cache/redis-adapter",
+ "description": "A PSR-6 cache implementation using Redis (PhpRedis). This implementation supports tags",
+ "type": "library",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "keywords": [
+ "cache",
+ "psr-6",
+ "phpredis",
+ "redis",
+ "tag"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "psr/simple-cache": "^1.0",
+ "cache/adapter-common": "^1.0",
+ "cache/hierarchical-cache": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/integration-tests": "^0.16"
+ },
+ "suggest": {
+ "ext-redis": "The extension required to use this pool."
+ },
+ "provide": {
+ "psr/cache-implementation": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Adapter\\Redis\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Void/Changelog.md b/vendor/cache/cache/src/Adapter/Void/Changelog.md
new file mode 100644
index 0000000000..3834c98ecb
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Void/Changelog.md
@@ -0,0 +1,42 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+No changes since 0.4.1.
+
+## 0.4.1
+
+### Changed
+
+- We now support cache/hierarchical-cache: ^0.4
+
+## 0.4.0
+
+### Added
+
+* Support for the new `TaggableCacheItemPoolInterface`.
+* Support for PSR-16 SimpleCache
+
+### Changed
+
+* The behavior of `CacheItem::getTags()` has changed. It will not return the tags stored in the cache storage.
+
+### Removed
+
+* `CacheItem::getExpirationDate()`. Use `CacheItem::getExpirationTimestamp()`
+* `CacheItem::getTags()`. Use `CacheItem::getPreviousTags()`
+* `CacheItem::addTag()`. Use `CacheItem::setTags()`
+
+## 0.3.1
+
+### Changed
+
+Updated dependencies
+
+## 0.3.0
+
+No changelog before this version
diff --git a/vendor/cache/cache/src/Adapter/Void/LICENSE b/vendor/cache/cache/src/Adapter/Void/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Void/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Adapter/Void/README.md b/vendor/cache/cache/src/Adapter/Void/README.md
new file mode 100644
index 0000000000..5ef5784061
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Void/README.md
@@ -0,0 +1,31 @@
+# Void PSR-6 Cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/void-adapter/v/stable)](https://packagist.org/packages/cache/void-adapter)
+[![codecov.io](https://codecov.io/github/php-cache/void-adapter/coverage.svg?branch=master)](https://codecov.io/github/php-cache/void-adapter?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/void-adapter/downloads)](https://packagist.org/packages/cache/void-adapter)
+[![Monthly Downloads](https://poser.pugx.org/cache/void-adapter/d/monthly.png)](https://packagist.org/packages/cache/void-adapter)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is a void implementation of a PSR-6 cache. Other names for this adapter could be Blackhole or Null apdapter.
+This adapter does not save anything and will always return an empty CacheItem. It is a part of the PHP Cache
+organisation. To read about features like tagging and hierarchy support please read the
+shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+### Install
+
+```bash
+composer require cache/void-adapter
+```
+
+### Use
+
+You do not need to do any configuration to use the `VoidCachePool`.
+
+```php
+$pool = new VoidCachePool();
+```
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Adapter/Void/VoidCachePool.php b/vendor/cache/cache/src/Adapter/Void/VoidCachePool.php
new file mode 100644
index 0000000000..9ea9d16115
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Void/VoidCachePool.php
@@ -0,0 +1,80 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Adapter\Void;
+
+use Cache\Adapter\Common\AbstractCachePool;
+use Cache\Adapter\Common\PhpCacheItem;
+use Cache\Hierarchy\HierarchicalPoolInterface;
+
+/**
+ * @author Tobias Nyholm
+ */
+class VoidCachePool extends AbstractCachePool implements HierarchicalPoolInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function fetchObjectFromCache($key)
+ {
+ return [false, null, [], null];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearAllObjectsFromCache()
+ {
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearOneObjectFromCache($key)
+ {
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function storeItemInCache(PhpCacheItem $item, $ttl)
+ {
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function clearTags(array $tags)
+ {
+ return true;
+ }
+
+ protected function getList($name)
+ {
+ return [];
+ }
+
+ protected function removeList($name)
+ {
+ return true;
+ }
+
+ protected function appendListItem($name, $key)
+ {
+ }
+
+ protected function removeListItem($name, $key)
+ {
+ }
+}
diff --git a/vendor/cache/cache/src/Adapter/Void/composer.json b/vendor/cache/cache/src/Adapter/Void/composer.json
new file mode 100644
index 0000000000..5e353954da
--- /dev/null
+++ b/vendor/cache/cache/src/Adapter/Void/composer.json
@@ -0,0 +1,54 @@
+{
+ "name": "cache/void-adapter",
+ "description": "A PSR-6 cache implementation using Void. This implementation supports tags",
+ "type": "library",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "keywords": [
+ "cache",
+ "psr-6",
+ "void",
+ "tag"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "psr/simple-cache": "^1.0",
+ "cache/adapter-common": "^1.0",
+ "cache/hierarchical-cache": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/integration-tests": "^0.16"
+ },
+ "provide": {
+ "psr/cache-implementation": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Adapter\\Void\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Bridge/Doctrine/Changelog.md b/vendor/cache/cache/src/Bridge/Doctrine/Changelog.md
new file mode 100644
index 0000000000..c9888d8293
--- /dev/null
+++ b/vendor/cache/cache/src/Bridge/Doctrine/Changelog.md
@@ -0,0 +1,20 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+
+## 3.0.1
+
+### Changed
+
+* Bumped versions on dependencies.
+
+## 3.0.0
+
+### Changed
+
+* Changed Namespace from `Cache\Bridge` to `Cache\Bridge\Doctrine`
+
+## 2.2.0
+
+No changelog before this version
diff --git a/vendor/cache/cache/src/Bridge/Doctrine/DoctrineCacheBridge.php b/vendor/cache/cache/src/Bridge/Doctrine/DoctrineCacheBridge.php
new file mode 100644
index 0000000000..e4e15f92ff
--- /dev/null
+++ b/vendor/cache/cache/src/Bridge/Doctrine/DoctrineCacheBridge.php
@@ -0,0 +1,149 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Bridge\Doctrine;
+
+use Doctrine\Common\Cache\Cache;
+use Doctrine\Common\Cache\CacheProvider;
+use Psr\Cache\CacheItemPoolInterface;
+
+/**
+ * This is a bridge between a Doctrine cache and PSR6.
+ *
+ * @author Aaron Scherer
+ */
+class DoctrineCacheBridge extends CacheProvider
+{
+ /**
+ * @type CacheItemPoolInterface
+ */
+ private $cachePool;
+
+ /**
+ * DoctrineCacheBridge constructor.
+ *
+ * @param CacheItemPoolInterface $cachePool
+ */
+ public function __construct(CacheItemPoolInterface $cachePool)
+ {
+ $this->cachePool = $cachePool;
+ }
+
+ /**
+ * @return CacheItemPoolInterface
+ */
+ public function getCachePool()
+ {
+ return $this->cachePool;
+ }
+
+ /**
+ * Fetches an entry from the cache.
+ *
+ * @param string $id The id of the cache entry to fetch.
+ *
+ * @return mixed|false The cached data or FALSE, if no cache entry exists for the given id.
+ */
+ protected function doFetch($id)
+ {
+ $item = $this->cachePool->getItem($this->normalizeKey($id));
+
+ if ($item->isHit()) {
+ return $item->get();
+ }
+
+ return false;
+ }
+
+ /**
+ * Tests if an entry exists in the cache.
+ *
+ * @param string $id The cache id of the entry to check for.
+ *
+ * @return bool TRUE if a cache entry exists for the given cache id, FALSE otherwise.
+ */
+ protected function doContains($id)
+ {
+ return $this->cachePool->hasItem($this->normalizeKey($id));
+ }
+
+ /**
+ * Puts data into the cache.
+ *
+ * @param string $id The cache id.
+ * @param string $data The cache entry/data.
+ * @param int $lifeTime The lifetime. If != 0, sets a specific lifetime for this
+ * cache entry (0 => infinite lifeTime).
+ *
+ * @return bool TRUE if the entry was successfully stored in the cache, FALSE otherwise.
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ $item = $this->cachePool->getItem($this->normalizeKey($id));
+ $item->set($data);
+
+ if ($lifeTime !== 0) {
+ $item->expiresAfter($lifeTime);
+ }
+
+ return $this->cachePool->save($item);
+ }
+
+ /**
+ * Deletes a cache entry.
+ *
+ * @param string $id The cache id.
+ *
+ * @return bool TRUE if the cache entry was successfully deleted, FALSE otherwise.
+ */
+ protected function doDelete($id)
+ {
+ return $this->cachePool->deleteItem($this->normalizeKey($id));
+ }
+
+ /**
+ * Flushes all cache entries.
+ *
+ * @return bool TRUE if the cache entries were successfully flushed, FALSE otherwise.
+ */
+ protected function doFlush()
+ {
+ $this->cachePool->clear();
+ }
+
+ /**
+ * Retrieves cached information from the data store.
+ *
+ * @since 2.2
+ *
+ * @return array|null An associative array with server's statistics if available, NULL otherwise.
+ */
+ protected function doGetStats()
+ {
+ // Not possible, as of yet
+ }
+
+ /**
+ * We need to make sure we do not use any characters not supported.
+ *
+ * @param string $key
+ *
+ * @return string
+ */
+ private function normalizeKey($key)
+ {
+ if (preg_match('|[\{\}\(\)/\\\@\:]|', $key)) {
+ return preg_replace('|[\{\}\(\)/\\\@\:]|', '_', $key);
+ }
+
+ return $key;
+ }
+}
diff --git a/vendor/cache/cache/src/Bridge/Doctrine/LICENSE b/vendor/cache/cache/src/Bridge/Doctrine/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Bridge/Doctrine/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Bridge/Doctrine/README.md b/vendor/cache/cache/src/Bridge/Doctrine/README.md
new file mode 100644
index 0000000000..e6f62f2d11
--- /dev/null
+++ b/vendor/cache/cache/src/Bridge/Doctrine/README.md
@@ -0,0 +1,39 @@
+# PSR 6 Doctrine Bridge
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/psr-6-doctrine-bridge/v/stable)](https://packagist.org/packages/cache/psr-6-doctrine-bridge)
+[![codecov.io](https://codecov.io/github/php-cache/doctrine-bridge/coverage.svg?branch=master)](https://codecov.io/github/php-cache/doctrine-bridge?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/psr-6-doctrine-bridge/downloads)](https://packagist.org/packages/cache/psr-6-doctrine-bridge)
+[![Monthly Downloads](https://poser.pugx.org/cache/psr-6-doctrine-bridge/d/monthly.png)](https://packagist.org/packages/cache/psr-6-doctrine-bridge)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This library provides a PSR-6 compliant bridge between Doctrine and a Cache Pool. The bridge implements the
+`Doctrine\Common\Cache\Cache` interface. This is useful for projects that require an implementation of
+`Doctrine\Common\Cache\Cache`, but you still want to use a PSR-6 implementation.
+
+### Install
+
+```bash
+composer require cache/psr-6-doctrine-bridge
+```
+
+### Usage
+
+```php
+use Cache\Bridge\Doctrine\DoctrineCacheBridge;
+
+// Assuming $pool is an instance of \Psr\Cache\CacheItemPoolInterface
+$cacheProvider = new DoctrineCacheBridge($pool);
+
+$cacheProvider->contains($key);
+$cacheProvider->fetch($key);
+$cacheProvider->save($key, $value, $ttl);
+$cacheProvider->delete($key);
+
+// Also, if you need it:
+$cacheProvider->getPool(); // same as $pool
+```
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Bridge/Doctrine/composer.json b/vendor/cache/cache/src/Bridge/Doctrine/composer.json
new file mode 100644
index 0000000000..3724358e79
--- /dev/null
+++ b/vendor/cache/cache/src/Bridge/Doctrine/composer.json
@@ -0,0 +1,44 @@
+{
+ "name": "cache/psr-6-doctrine-bridge",
+ "type": "library",
+ "description": "PSR-6 Doctrine bridge",
+ "keywords": [
+ "cache",
+ "psr-6",
+ "doctrine"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "doctrine/cache": "^1.6",
+ "psr/cache-implementation": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "mockery/mockery": "^0.9.9",
+ "cache/doctrine-adapter": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Bridge\\Doctrine\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Bridge/SimpleCache/Changelog.md b/vendor/cache/cache/src/Bridge/SimpleCache/Changelog.md
new file mode 100644
index 0000000000..9868847383
--- /dev/null
+++ b/vendor/cache/cache/src/Bridge/SimpleCache/Changelog.md
@@ -0,0 +1,19 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+No changes since 0.1.1
+
+## 0.1.1
+
+### Fixed
+
+* Bugs with iterators
+
+## 0.1.0
+
+First release
diff --git a/vendor/cache/cache/src/Bridge/SimpleCache/Exception/CacheException.php b/vendor/cache/cache/src/Bridge/SimpleCache/Exception/CacheException.php
new file mode 100644
index 0000000000..7da958c352
--- /dev/null
+++ b/vendor/cache/cache/src/Bridge/SimpleCache/Exception/CacheException.php
@@ -0,0 +1,16 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Bridge\SimpleCache\Exception;
+
+class CacheException extends \RuntimeException implements \Psr\SimpleCache\CacheException
+{
+}
diff --git a/vendor/cache/cache/src/Bridge/SimpleCache/Exception/InvalidArgumentException.php b/vendor/cache/cache/src/Bridge/SimpleCache/Exception/InvalidArgumentException.php
new file mode 100644
index 0000000000..4d485ca281
--- /dev/null
+++ b/vendor/cache/cache/src/Bridge/SimpleCache/Exception/InvalidArgumentException.php
@@ -0,0 +1,16 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Bridge\SimpleCache\Exception;
+
+class InvalidArgumentException extends CacheException implements \Psr\SimpleCache\InvalidArgumentException
+{
+}
diff --git a/vendor/cache/cache/src/Bridge/SimpleCache/LICENSE b/vendor/cache/cache/src/Bridge/SimpleCache/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Bridge/SimpleCache/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Bridge/SimpleCache/README.md b/vendor/cache/cache/src/Bridge/SimpleCache/README.md
new file mode 100644
index 0000000000..3f7ead109c
--- /dev/null
+++ b/vendor/cache/cache/src/Bridge/SimpleCache/README.md
@@ -0,0 +1,30 @@
+# PSR-6 to PSR-16 Bridge (Simple cache)
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/simple-cache-bridge/v/stable)](https://packagist.org/packages/cache/simple-cache-bridge)
+[![codecov.io](https://codecov.io/github/php-cache/simple-cache-bridge/coverage.svg?branch=master)](https://codecov.io/github/array-cache/apc-adapter?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/simple-cache-bridge/downloads)](https://packagist.org/packages/cache/simple-cache-bridge)
+[![Monthly Downloads](https://poser.pugx.org/cache/simple-cache-bridge/d/monthly.png)](https://packagist.org/packages/cache/simple-cache-bridge)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is a bridge that converts a PSR-6 cache implementation to PSR-16 (SimpleCache). It is a part of the PHP Cache organisation. To read about
+features like tagging and hierarchy support please read the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+### Install
+
+```bash
+composer require cache/simple-cache-bridge
+```
+
+### Use
+
+You need an existing PSR-6 pool as a cnstructor argument to the bridge.
+
+```php
+$psr6pool = new ArrayCachePool();
+$simpleCache = new SimpleCacheBridge($psr6pool);
+```
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Bridge/SimpleCache/SimpleCacheBridge.php b/vendor/cache/cache/src/Bridge/SimpleCache/SimpleCacheBridge.php
new file mode 100644
index 0000000000..a0047beebe
--- /dev/null
+++ b/vendor/cache/cache/src/Bridge/SimpleCache/SimpleCacheBridge.php
@@ -0,0 +1,224 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Bridge\SimpleCache;
+
+use Cache\Bridge\SimpleCache\Exception\InvalidArgumentException;
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\CacheItemPoolInterface;
+use Psr\Cache\InvalidArgumentException as CacheInvalidArgumentException;
+use Psr\SimpleCache\CacheInterface;
+
+/**
+ * Adds a SimpleCache interface on a PSR-6 cache pool.
+ *
+ * @author Magnus Nordlander
+ */
+class SimpleCacheBridge implements CacheInterface
+{
+ /**
+ * @type CacheItemPoolInterface
+ */
+ protected $cacheItemPool;
+
+ /**
+ * SimpleCacheBridge constructor.
+ */
+ public function __construct(CacheItemPoolInterface $cacheItemPool)
+ {
+ $this->cacheItemPool = $cacheItemPool;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get($key, $default = null)
+ {
+ try {
+ $item = $this->cacheItemPool->getItem($key);
+ } catch (CacheInvalidArgumentException $e) {
+ throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+ }
+
+ if (!$item->isHit()) {
+ return $default;
+ }
+
+ return $item->get();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function set($key, $value, $ttl = null)
+ {
+ try {
+ $item = $this->cacheItemPool->getItem($key);
+ $item->expiresAfter($ttl);
+ } catch (CacheInvalidArgumentException $e) {
+ throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+ }
+
+ $item->set($value);
+
+ return $this->cacheItemPool->save($item);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function delete($key)
+ {
+ try {
+ return $this->cacheItemPool->deleteItem($key);
+ } catch (CacheInvalidArgumentException $e) {
+ throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function clear()
+ {
+ return $this->cacheItemPool->clear();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getMultiple($keys, $default = null)
+ {
+ if (!is_array($keys)) {
+ if (!$keys instanceof \Traversable) {
+ throw new InvalidArgumentException('$keys is neither an array nor Traversable');
+ }
+
+ // Since we need to throw an exception if *any* key is invalid, it doesn't
+ // make sense to wrap iterators or something like that.
+ $keys = iterator_to_array($keys, false);
+ }
+
+ try {
+ $items = $this->cacheItemPool->getItems($keys);
+ } catch (CacheInvalidArgumentException $e) {
+ throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+ }
+
+ return $this->generateValues($default, $items);
+ }
+
+ /**
+ * @param $default
+ * @param $items
+ *
+ * @return \Generator
+ */
+ private function generateValues($default, $items)
+ {
+ foreach ($items as $key => $item) {
+ /** @type $item CacheItemInterface */
+ if (!$item->isHit()) {
+ yield $key => $default;
+ } else {
+ yield $key => $item->get();
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setMultiple($values, $ttl = null)
+ {
+ if (!is_array($values)) {
+ if (!$values instanceof \Traversable) {
+ throw new InvalidArgumentException('$values is neither an array nor Traversable');
+ }
+ }
+
+ $keys = [];
+ $arrayValues = [];
+ foreach ($values as $key => $value) {
+ if (is_int($key)) {
+ $key = (string) $key;
+ }
+
+ if (!is_string($key)) {
+ throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given', gettype($key)));
+ }
+
+ if (preg_match('|[\{\}\(\)/\\\@\:]|', $key)) {
+ throw new InvalidArgumentException(sprintf('Invalid key: "%s". The key contains one or more characters reserved for future extension: {}()/\@:', $key));
+ }
+
+ $keys[] = $key;
+ $arrayValues[$key] = $value;
+ }
+
+ try {
+ $items = $this->cacheItemPool->getItems($keys);
+ } catch (CacheInvalidArgumentException $e) {
+ throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+ }
+
+ $itemSuccess = true;
+
+ foreach ($items as $key => $item) {
+ /* @var $item CacheItemInterface */
+ $item->set($arrayValues[$key]);
+
+ try {
+ $item->expiresAfter($ttl);
+ } catch (CacheInvalidArgumentException $e) {
+ throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+ }
+
+ $itemSuccess = $itemSuccess && $this->cacheItemPool->saveDeferred($item);
+ }
+
+ return $itemSuccess && $this->cacheItemPool->commit();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function deleteMultiple($keys)
+ {
+ if (!is_array($keys)) {
+ if (!$keys instanceof \Traversable) {
+ throw new InvalidArgumentException('$keys is neither an array nor Traversable');
+ }
+
+ // Since we need to throw an exception if *any* key is invalid, it doesn't
+ // make sense to wrap iterators or something like that.
+ $keys = iterator_to_array($keys, false);
+ }
+
+ try {
+ return $this->cacheItemPool->deleteItems($keys);
+ } catch (CacheInvalidArgumentException $e) {
+ throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function has($key)
+ {
+ try {
+ return $this->cacheItemPool->hasItem($key);
+ } catch (CacheInvalidArgumentException $e) {
+ throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Bridge/SimpleCache/composer.json b/vendor/cache/cache/src/Bridge/SimpleCache/composer.json
new file mode 100644
index 0000000000..747c0a9a16
--- /dev/null
+++ b/vendor/cache/cache/src/Bridge/SimpleCache/composer.json
@@ -0,0 +1,49 @@
+{
+ "name": "cache/simple-cache-bridge",
+ "description": "A PSR-6 bridge to PSR-16. This will make any PSR-6 cache compatible with SimpleCache.",
+ "type": "library",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "keywords": [
+ "cache",
+ "psr-6",
+ "psr-16",
+ "bridge"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Magnus Nordlander",
+ "email": "magnus@fervo.se",
+ "homepage": "https://github.com/magnusnordlander"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "psr/simple-cache": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/integration-tests": "^0.16",
+ "mockery/mockery": "^0.9",
+ "symfony/cache": "^3.2"
+ },
+ "provide": {
+ "psr/simple-cache-implementation": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Bridge\\SimpleCache\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Encryption/Changelog.md b/vendor/cache/cache/src/Encryption/Changelog.md
new file mode 100644
index 0000000000..e06e1694b5
--- /dev/null
+++ b/vendor/cache/cache/src/Encryption/Changelog.md
@@ -0,0 +1,30 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## 1.0.0
+
+No changes since 0.2.0
+
+## 0.2.0
+
+### Added
+
+* Support for `TaggableCacheItemPoolInterface`
+* Added `EncryptedCachePool::invalidateTags()` and `EncryptedCachePool::invalidateTag()`
+* Added `EncryptedItemDecorator::getCacheItem()`
+
+### Changed
+
+* EncryptedCachePool constructor takes a `TaggableCacheItemPoolInterface` instead of a `CacheItemPoolInterface`
+* EncryptedItemDecorator constructor takes a `TaggableCacheItemInterface` instead of a `CacheItemInterface`
+
+### Removed
+
+* `EncryptedItemDecorator::getExpirationTimestamp()`.
+* `EncryptedItemDecorator::getTags()`. Use `EncryptedItemDecorator::getPreviousTags()`
+* `EncryptedItemDecorator::addTag()`. Use `EncryptedItemDecorator::setTags()`
+
+## 0.1.0
+
+First release
diff --git a/vendor/cache/cache/src/Encryption/EncryptedCachePool.php b/vendor/cache/cache/src/Encryption/EncryptedCachePool.php
new file mode 100644
index 0000000000..cf166765ec
--- /dev/null
+++ b/vendor/cache/cache/src/Encryption/EncryptedCachePool.php
@@ -0,0 +1,149 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Encryption;
+
+use Cache\TagInterop\TaggableCacheItemPoolInterface;
+use Defuse\Crypto\Key;
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\InvalidArgumentException;
+
+/**
+ * Wraps a CacheItemInterface with EncryptedItemDecorator.
+ *
+ * @author Daniel Bannert
+ */
+class EncryptedCachePool implements TaggableCacheItemPoolInterface
+{
+ /**
+ * @type TaggableCacheItemPoolInterface
+ */
+ private $cachePool;
+
+ /**
+ * @type Key
+ */
+ private $key;
+
+ /**
+ * @param TaggableCacheItemPoolInterface $cachePool
+ * @param Key $key
+ */
+ public function __construct(TaggableCacheItemPoolInterface $cachePool, Key $key)
+ {
+ $this->cachePool = $cachePool;
+ $this->key = $key;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getItem($key)
+ {
+ $items = $this->getItems([$key]);
+
+ return reset($items);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getItems(array $keys = [])
+ {
+ return array_map(function (CacheItemInterface $inner) {
+ if (!($inner instanceof EncryptedItemDecorator)) {
+ return new EncryptedItemDecorator($inner, $this->key);
+ }
+
+ return $inner;
+ }, $this->cachePool->getItems($keys));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function hasItem($key)
+ {
+ return $this->cachePool->hasItem($key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function clear()
+ {
+ return $this->cachePool->clear();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function deleteItem($key)
+ {
+ return $this->cachePool->deleteItem($key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function deleteItems(array $keys)
+ {
+ return $this->cachePool->deleteItems($keys);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function save(CacheItemInterface $item)
+ {
+ if (!$item instanceof EncryptedItemDecorator) {
+ throw new InvalidArgumentException('Cache items are not transferable between pools. Item MUST implement EncryptedItemDecorator.');
+ }
+
+ return $this->cachePool->save($item->getCacheItem());
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function saveDeferred(CacheItemInterface $item)
+ {
+ if (!$item instanceof EncryptedItemDecorator) {
+ throw new InvalidArgumentException('Cache items are not transferable between pools. Item MUST implement EncryptedItemDecorator.');
+ }
+
+ return $this->cachePool->saveDeferred($item->getCacheItem());
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function commit()
+ {
+ return $this->cachePool->commit();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function invalidateTags(array $tags)
+ {
+ return $this->cachePool->invalidateTags($tags);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function invalidateTag($tag)
+ {
+ return $this->cachePool->invalidateTag($tag);
+ }
+}
diff --git a/vendor/cache/cache/src/Encryption/EncryptedItemDecorator.php b/vendor/cache/cache/src/Encryption/EncryptedItemDecorator.php
new file mode 100644
index 0000000000..205a2612b6
--- /dev/null
+++ b/vendor/cache/cache/src/Encryption/EncryptedItemDecorator.php
@@ -0,0 +1,168 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Encryption;
+
+use Cache\TagInterop\TaggableCacheItemInterface;
+use Defuse\Crypto\Crypto;
+use Defuse\Crypto\Key;
+
+/**
+ * Encrypt and Decrypt all the stored items.
+ *
+ * @author Daniel Bannert
+ */
+class EncryptedItemDecorator implements TaggableCacheItemInterface
+{
+ /**
+ * The cacheItem should always contain encrypted data.
+ *
+ * @type TaggableCacheItemInterface
+ */
+ private $cacheItem;
+
+ /**
+ * @type Key
+ */
+ private $key;
+
+ /**
+ * @param TaggableCacheItemInterface $cacheItem
+ * @param Key $key
+ */
+ public function __construct(TaggableCacheItemInterface $cacheItem, Key $key)
+ {
+ $this->cacheItem = $cacheItem;
+ $this->key = $key;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getKey()
+ {
+ return $this->cacheItem->getKey();
+ }
+
+ /**
+ * @return TaggableCacheItemInterface
+ */
+ public function getCacheItem()
+ {
+ return $this->cacheItem;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function set($value)
+ {
+ $type = gettype($value);
+
+ if ($type === 'object') {
+ $value = serialize($value);
+ }
+
+ $json = json_encode(['type' => $type, 'value' => $value]);
+
+ $this->cacheItem->set(Crypto::encrypt($json, $this->key));
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get()
+ {
+ if (!$this->isHit()) {
+ return;
+ }
+
+ $item = json_decode(Crypto::decrypt($this->cacheItem->get(), $this->key), true);
+
+ return $this->transform($item);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isHit()
+ {
+ return $this->cacheItem->isHit();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function expiresAt($expiration)
+ {
+ $this->cacheItem->expiresAt($expiration);
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function expiresAfter($time)
+ {
+ $this->cacheItem->expiresAfter($time);
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPreviousTags()
+ {
+ return $this->cacheItem->getPreviousTags();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setTags(array $tags)
+ {
+ $this->cacheItem->setTags($tags);
+
+ return $this;
+ }
+
+ /**
+ * Creating a copy of the original CacheItemInterface object.
+ */
+ public function __clone()
+ {
+ $this->cacheItem = clone $this->cacheItem;
+ }
+
+ /**
+ * Transform value back to it original type.
+ *
+ * @param array $item
+ *
+ * @return mixed
+ */
+ private function transform(array $item)
+ {
+ if ($item['type'] === 'object') {
+ return unserialize($item['value']);
+ }
+
+ $value = $item['value'];
+
+ settype($value, $item['type']);
+
+ return $value;
+ }
+}
diff --git a/vendor/cache/cache/src/Encryption/LICENSE b/vendor/cache/cache/src/Encryption/LICENSE
new file mode 100644
index 0000000000..26e041d07d
--- /dev/null
+++ b/vendor/cache/cache/src/Encryption/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 - 2016 Aaron Scherer
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Encryption/README.md b/vendor/cache/cache/src/Encryption/README.md
new file mode 100644
index 0000000000..5de3664a68
--- /dev/null
+++ b/vendor/cache/cache/src/Encryption/README.md
@@ -0,0 +1,31 @@
+# Encryption PSR-6 Cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/encryption-cache/v/stable)](https://packagist.org/packages/cache/encryption-cache)
+[![codecov.io](https://codecov.io/github/php-cache/encryption-cache/coverage.svg?branch=master)](https://codecov.io/github/php-cache/encryption-cache?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/encryption-cache/downloads)](https://packagist.org/packages/cache/encryption-cache)
+[![Monthly Downloads](https://poser.pugx.org/cache/encryption-cache/d/monthly.png)](https://packagist.org/packages/cache/encryption-cache)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This repository has a encryption wrapper that makes the PSR-6 cache implementation encrypted.
+
+Encryption and decryption are both expensive operations, and frequent reads from an encrypted data store can quickly become a bottleneck in otherwise performant applications. Use encrypted caches sparingly.
+
+
+### Install
+
+```bash
+composer require cache/encryption-cache
+```
+
+### Use
+
+Read the [documentation on usage](http://www.php-cache.com/en/latest/encryption/).
+
+### Implement
+
+Read the [documentation on implementation](http://www.php-cache.com/en/latest/implementing-cache-pools/encryption/).
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Encryption/composer.json b/vendor/cache/cache/src/Encryption/composer.json
new file mode 100644
index 0000000000..a2fb8c5af1
--- /dev/null
+++ b/vendor/cache/cache/src/Encryption/composer.json
@@ -0,0 +1,56 @@
+{
+ "name": "cache/encryption-cache",
+ "type": "library",
+ "description": "Adds encryption support to your PSR-6 cache implementation",
+ "keywords": [
+ "cache",
+ "psr6",
+ "encrypted",
+ "encryption"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ },
+ {
+ "name": "Daniel Bannert",
+ "email": "d.bannert@anolilab.de",
+ "homepage": "https://github.com/prisis"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "defuse/php-encryption": "^2.0",
+ "cache/tag-interop": "^1.0",
+ "psr/cache": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/integration-tests": "^0.16",
+ "cache/array-adapter": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Encryption\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Hierarchy/Changelog.md b/vendor/cache/cache/src/Hierarchy/Changelog.md
new file mode 100644
index 0000000000..58431cf980
--- /dev/null
+++ b/vendor/cache/cache/src/Hierarchy/Changelog.md
@@ -0,0 +1,29 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+No changes since 0.4.0
+
+## 0.4.0
+
+### Changed
+
+* `HierarchicalCachePoolTrait::getValueFormStore` was renamed to `HierarchicalCachePoolTrait::getDirectValue`
+
+### Removed
+
+* Dependency to `cache/taggable-cache`.
+
+## 0.3.0
+
+### Changed
+
+The `HierarchicalPoolInterface` extends `CacheItemPoolInterface`
+
+## 0.2.1
+
+No changelog before this version
diff --git a/vendor/cache/cache/src/Hierarchy/HierarchicalCachePoolTrait.php b/vendor/cache/cache/src/Hierarchy/HierarchicalCachePoolTrait.php
new file mode 100644
index 0000000000..0a4a4a18f6
--- /dev/null
+++ b/vendor/cache/cache/src/Hierarchy/HierarchicalCachePoolTrait.php
@@ -0,0 +1,125 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Hierarchy;
+
+use Cache\Adapter\Common\AbstractCachePool;
+
+/**
+ * @author Tobias Nyholm
+ */
+trait HierarchicalCachePoolTrait
+{
+ /**
+ * A temporary cache for keys.
+ *
+ * @type array
+ */
+ private $keyCache = [];
+
+ /**
+ * Get a value from the storage.
+ *
+ * @param string $name
+ *
+ * @return mixed
+ */
+ abstract public function getDirectValue($name);
+
+ /**
+ * Get a key to use with the hierarchy. If the key does not start with HierarchicalPoolInterface::SEPARATOR
+ * this will return an unalterered key. This function supports a tagged key. Ie "foo:bar".
+ *
+ * @param string $key The original key
+ * @param string &$pathKey A cache key for the path. If this key is changed everything beyond that path is changed.
+ *
+ * @return string
+ */
+ protected function getHierarchyKey($key, &$pathKey = null)
+ {
+ if (!$this->isHierarchyKey($key)) {
+ return $key;
+ }
+
+ $key = $this->explodeKey($key);
+
+ $keyString = '';
+ // The comments below is for a $key = ["foo!tagHash", "bar!tagHash"]
+ foreach ($key as $name) {
+ // 1) $keyString = "foo!tagHash"
+ // 2) $keyString = "foo!tagHash![foo_index]!bar!tagHash"
+ $keyString .= $name;
+ $pathKey = sha1('path'.AbstractCachePool::SEPARATOR_TAG.$keyString);
+
+ if (isset($this->keyCache[$pathKey])) {
+ $index = $this->keyCache[$pathKey];
+ } else {
+ $index = $this->getDirectValue($pathKey);
+ $this->keyCache[$pathKey] = $index;
+ }
+
+ // 1) $keyString = "foo!tagHash![foo_index]!"
+ // 2) $keyString = "foo!tagHash![foo_index]!bar!tagHash![bar_index]!"
+ $keyString .= AbstractCachePool::SEPARATOR_TAG.$index.AbstractCachePool::SEPARATOR_TAG;
+ }
+
+ // Assert: $pathKey = "path!foo!tagHash![foo_index]!bar!tagHash"
+ // Assert: $keyString = "foo!tagHash![foo_index]!bar!tagHash![bar_index]!"
+
+ // Make sure we do not get awfully long (>250 chars) keys
+ return sha1($keyString);
+ }
+
+ /**
+ * Clear the cache for the keys.
+ */
+ protected function clearHierarchyKeyCache()
+ {
+ $this->keyCache = [];
+ }
+
+ /**
+ * A hierarchy key MUST begin with the separator.
+ *
+ * @param string $key
+ *
+ * @return bool
+ */
+ private function isHierarchyKey($key)
+ {
+ return substr($key, 0, 1) === HierarchicalPoolInterface::HIERARCHY_SEPARATOR;
+ }
+
+ /**
+ * This will take a hierarchy key ("|foo|bar") with tags ("|foo|bar!tagHash") and return an array with
+ * each level in the hierarchy appended with the tags. ["foo!tagHash", "bar!tagHash"].
+ *
+ * @param string $key
+ *
+ * @return array
+ */
+ private function explodeKey($string)
+ {
+ list($key, $tag) = explode(AbstractCachePool::SEPARATOR_TAG, $string.AbstractCachePool::SEPARATOR_TAG);
+
+ if ($key === HierarchicalPoolInterface::HIERARCHY_SEPARATOR) {
+ $parts = ['root'];
+ } else {
+ $parts = explode(HierarchicalPoolInterface::HIERARCHY_SEPARATOR, $key);
+ // remove first element since it is always empty and replace it with 'root'
+ $parts[0] = 'root';
+ }
+
+ return array_map(function ($level) use ($tag) {
+ return $level.AbstractCachePool::SEPARATOR_TAG.$tag;
+ }, $parts);
+ }
+}
diff --git a/vendor/cache/cache/src/Hierarchy/HierarchicalPoolInterface.php b/vendor/cache/cache/src/Hierarchy/HierarchicalPoolInterface.php
new file mode 100644
index 0000000000..4646c66a57
--- /dev/null
+++ b/vendor/cache/cache/src/Hierarchy/HierarchicalPoolInterface.php
@@ -0,0 +1,24 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Hierarchy;
+
+use Psr\Cache\CacheItemPoolInterface;
+
+/**
+ * Let you use hierarchy if you start your tag key with the HIERARCHY_SEPARATOR.
+ *
+ * @author Tobias Nyholm
+ */
+interface HierarchicalPoolInterface extends CacheItemPoolInterface
+{
+ const HIERARCHY_SEPARATOR = '|';
+}
diff --git a/vendor/cache/cache/src/Hierarchy/LICENSE b/vendor/cache/cache/src/Hierarchy/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Hierarchy/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Hierarchy/README.md b/vendor/cache/cache/src/Hierarchy/README.md
new file mode 100644
index 0000000000..63d275e739
--- /dev/null
+++ b/vendor/cache/cache/src/Hierarchy/README.md
@@ -0,0 +1,35 @@
+# Hierarchical PSR-6 cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/hierarchical-cache/v/stable)](https://packagist.org/packages/cache/hierarchical-cache)
+[![codecov.io](https://codecov.io/github/php-cache/hierarchical-cache/coverage.svg?branch=master)](https://codecov.io/github/php-cache/hierarchical-cache?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/hierarchical-cache/downloads)](https://packagist.org/packages/cache/hierarchical-cache)
+[![Monthly Downloads](https://poser.pugx.org/cache/hierarchical-cache/d/monthly.png)](https://packagist.org/packages/cache/hierarchical-cache)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is an implementation for the PSR-6 for an hierarchical cache architecture.
+
+If you have a cache key like `|users|:uid|followers|:fid|likes` where `:uid` and `:fid` are arbitrary integers. You
+ may flush all followers by flushing `|users|:uid|followers`.
+
+It is a part of the PHP Cache organisation. To read about features like tagging and hierarchy support please read
+the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+### Install
+
+```bash
+composer require cache/hierarchical-cache
+```
+
+### Use
+
+Read the [documentation on usage](http://www.php-cache.com/en/latest/hierarchy/).
+
+### Implement
+
+Read the [documentation on implementation](http://www.php-cache.com/en/latest/implementing-cache-pools/hierarchy/).
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
+
diff --git a/vendor/cache/cache/src/Hierarchy/composer.json b/vendor/cache/cache/src/Hierarchy/composer.json
new file mode 100644
index 0000000000..fe66eaf96e
--- /dev/null
+++ b/vendor/cache/cache/src/Hierarchy/composer.json
@@ -0,0 +1,48 @@
+{
+ "name": "cache/hierarchical-cache",
+ "description": "A helper trait and interface to your PSR-6 cache to support hierarchical keys.",
+ "type": "library",
+ "license": "MIT",
+ "keywords": [
+ "cache",
+ "psr-6",
+ "hierarchy",
+ "hierarchical"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "cache/adapter-common": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Hierarchy\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Namespaced/Changelog.md b/vendor/cache/cache/src/Namespaced/Changelog.md
new file mode 100644
index 0000000000..45a2b4ab33
--- /dev/null
+++ b/vendor/cache/cache/src/Namespaced/Changelog.md
@@ -0,0 +1,34 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+### Added
+
+* NamespacedCachePool implements HierarchicalPoolInterface
+
+## 0.1.3
+
+### Changed
+
+* Updated dependencies
+
+## 0.1.2
+
+### Fixed
+
+* Typos, documentation and general package improvements.
+
+## 0.1.1
+
+### Changed
+
+* Updated type hints for the cache pool.
+* Using `cache/hierarchical-cache:^0.3`
+
+## 0.1.0
+
+First release
diff --git a/vendor/cache/cache/src/Namespaced/LICENSE b/vendor/cache/cache/src/Namespaced/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Namespaced/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Namespaced/NamespacedCachePool.php b/vendor/cache/cache/src/Namespaced/NamespacedCachePool.php
new file mode 100644
index 0000000000..d7c85c8378
--- /dev/null
+++ b/vendor/cache/cache/src/Namespaced/NamespacedCachePool.php
@@ -0,0 +1,147 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Namespaced;
+
+use Cache\Hierarchy\HierarchicalPoolInterface;
+use Psr\Cache\CacheItemInterface;
+
+/**
+ * Prefix all the stored items with a namespace. Also make sure you can clear all items
+ * in that namespace.
+ *
+ * @author Tobias Nyholm
+ */
+class NamespacedCachePool implements HierarchicalPoolInterface
+{
+ /**
+ * @type HierarchicalPoolInterface
+ */
+ private $cachePool;
+
+ /**
+ * @type string
+ */
+ private $namespace;
+
+ /**
+ * @param HierarchicalPoolInterface $cachePool
+ * @param string $namespace
+ */
+ public function __construct(HierarchicalPoolInterface $cachePool, $namespace)
+ {
+ $this->cachePool = $cachePool;
+ $this->namespace = $namespace;
+ }
+
+ /**
+ * Add namespace prefix on the key.
+ *
+ * @param array $keys
+ */
+ private function prefixValue(&$key)
+ {
+ // |namespace|key
+ $key = HierarchicalPoolInterface::HIERARCHY_SEPARATOR.$this->namespace.HierarchicalPoolInterface::HIERARCHY_SEPARATOR.$key;
+ }
+
+ /**
+ * @param array $keys
+ */
+ private function prefixValues(array &$keys)
+ {
+ foreach ($keys as &$key) {
+ $this->prefixValue($key);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getItem($key)
+ {
+ $this->prefixValue($key);
+
+ return $this->cachePool->getItem($key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getItems(array $keys = [])
+ {
+ $this->prefixValues($keys);
+
+ return $this->cachePool->getItems($keys);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function hasItem($key)
+ {
+ $this->prefixValue($key);
+
+ return $this->cachePool->hasItem($key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function clear()
+ {
+ return $this->cachePool->deleteItem(HierarchicalPoolInterface::HIERARCHY_SEPARATOR.$this->namespace);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function deleteItem($key)
+ {
+ $this->prefixValue($key);
+
+ return $this->cachePool->deleteItem($key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function deleteItems(array $keys)
+ {
+ $this->prefixValues($keys);
+
+ return $this->cachePool->deleteItems($keys);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function save(CacheItemInterface $item)
+ {
+ return $this->cachePool->save($item);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function saveDeferred(CacheItemInterface $item)
+ {
+ return $this->cachePool->saveDeferred($item);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function commit()
+ {
+ return $this->cachePool->commit();
+ }
+}
diff --git a/vendor/cache/cache/src/Namespaced/README.md b/vendor/cache/cache/src/Namespaced/README.md
new file mode 100644
index 0000000000..cbaeb2cd32
--- /dev/null
+++ b/vendor/cache/cache/src/Namespaced/README.md
@@ -0,0 +1,31 @@
+# Namespaced PSR-6 cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/namespaced-cache/v/stable)](https://packagist.org/packages/cache/namespaced-cache)
+[![codecov.io](https://codecov.io/github/php-cache/namespaced-cache/coverage.svg?branch=master)](https://codecov.io/github/php-cache/namespaced-cache?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/namespaced-cache/downloads)](https://packagist.org/packages/cache/namespaced-cache)
+[![Monthly Downloads](https://poser.pugx.org/cache/namespaced-cache/d/monthly.png)](https://packagist.org/packages/cache/namespaced-cache)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is a decorator for a PSR-6 hierarchical cache. It will allow you to use namespaces.
+
+It is a part of the PHP Cache organisation. To read about features like tagging and hierarchy support please read
+the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+### Install
+
+```bash
+composer require cache/namespaced-cache
+```
+
+### Use
+
+```php
+$hierarchyPool = new RedisCachePool($client);
+$namespacedPool = new NamespacedCachePool($hierarchyPool, 'acme');
+```
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
+
diff --git a/vendor/cache/cache/src/Namespaced/composer.json b/vendor/cache/cache/src/Namespaced/composer.json
new file mode 100644
index 0000000000..3e5a52d587
--- /dev/null
+++ b/vendor/cache/cache/src/Namespaced/composer.json
@@ -0,0 +1,43 @@
+{
+ "name": "cache/namespaced-cache",
+ "description": "A decorator that makes your cache support namespaces",
+ "type": "library",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "keywords": [
+ "cache",
+ "psr-6",
+ "namespace"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "cache/hierarchical-cache": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/memcached-adapter": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Namespaced\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Prefixed/Changelog.md b/vendor/cache/cache/src/Prefixed/Changelog.md
new file mode 100644
index 0000000000..73149d9d04
--- /dev/null
+++ b/vendor/cache/cache/src/Prefixed/Changelog.md
@@ -0,0 +1,25 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+### Removed
+
+- Dependency on `cache/hierarchical-cache`
+
+## 0.1.2
+
+### Changed
+
+- We now support cache/hierarchical-cache: ^0.4
+
+## 0.1.1
+
+### Fixed
+
+- Typos, documentation and general package improvements.
+
+
diff --git a/vendor/cache/cache/src/Prefixed/LICENSE b/vendor/cache/cache/src/Prefixed/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Prefixed/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Prefixed/PrefixedCachePool.php b/vendor/cache/cache/src/Prefixed/PrefixedCachePool.php
new file mode 100644
index 0000000000..ca8b87df49
--- /dev/null
+++ b/vendor/cache/cache/src/Prefixed/PrefixedCachePool.php
@@ -0,0 +1,145 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Prefixed;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\CacheItemPoolInterface;
+
+/**
+ * Prefix all cache items with a string.
+ *
+ * @author Tobias Nyholm
+ */
+class PrefixedCachePool implements CacheItemPoolInterface
+{
+ /**
+ * @type CacheItemPoolInterface
+ */
+ private $cachePool;
+
+ /**
+ * @type string
+ */
+ private $prefix;
+
+ /**
+ * @param CacheItemPoolInterface $cachePool
+ * @param string $prefix
+ */
+ public function __construct(CacheItemPoolInterface $cachePool, $prefix)
+ {
+ $this->cachePool = $cachePool;
+ $this->prefix = $prefix;
+ }
+
+ /**
+ * Add namespace prefix on the key.
+ *
+ * @param array $keys
+ */
+ private function prefixValue(&$key)
+ {
+ $key = $this->prefix.$key;
+ }
+
+ /**
+ * @param array $keys
+ */
+ private function prefixValues(array &$keys)
+ {
+ foreach ($keys as &$key) {
+ $this->prefixValue($key);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getItem($key)
+ {
+ $this->prefixValue($key);
+
+ return $this->cachePool->getItem($key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getItems(array $keys = [])
+ {
+ $this->prefixValues($keys);
+
+ return $this->cachePool->getItems($keys);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function hasItem($key)
+ {
+ $this->prefixValue($key);
+
+ return $this->cachePool->hasItem($key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function clear()
+ {
+ return $this->cachePool->clear();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function deleteItem($key)
+ {
+ $this->prefixValue($key);
+
+ return $this->cachePool->deleteItem($key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function deleteItems(array $keys)
+ {
+ $this->prefixValues($keys);
+
+ return $this->cachePool->deleteItems($keys);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function save(CacheItemInterface $item)
+ {
+ return $this->cachePool->save($item);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function saveDeferred(CacheItemInterface $item)
+ {
+ return $this->cachePool->saveDeferred($item);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function commit()
+ {
+ return $this->cachePool->commit();
+ }
+}
diff --git a/vendor/cache/cache/src/Prefixed/README.md b/vendor/cache/cache/src/Prefixed/README.md
new file mode 100644
index 0000000000..0c3503d4ee
--- /dev/null
+++ b/vendor/cache/cache/src/Prefixed/README.md
@@ -0,0 +1,31 @@
+# Prefixed PSR-6 cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/prefixed-cache/v/stable)](https://packagist.org/packages/cache/prefixed-cache)
+[![codecov.io](https://codecov.io/github/php-cache/prefixed-cache/coverage.svg?branch=master)](https://codecov.io/github/php-cache/prefixed-cache?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/prefixed-cache/downloads)](https://packagist.org/packages/cache/prefixed-cache)
+[![Monthly Downloads](https://poser.pugx.org/cache/prefixed-cache/d/monthly.png)](https://packagist.org/packages/cache/prefixed-cache)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is a decorator for a PSR-6 cache. It will allow you to prefix all cache items with a predefined key.
+
+It is a part of the PHP Cache organisation. To read about features like tagging and hierarchy support please read
+the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+### Install
+
+```bash
+composer require cache/prefixed-cache
+```
+
+### Use
+
+```php
+$anyPSR6Pool = new RedisCachePool($client);
+$prefixedPool = new PrefixedCachePool($anyPSR6Pool, 'acme');
+```
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
+
diff --git a/vendor/cache/cache/src/Prefixed/composer.json b/vendor/cache/cache/src/Prefixed/composer.json
new file mode 100644
index 0000000000..569b4bad85
--- /dev/null
+++ b/vendor/cache/cache/src/Prefixed/composer.json
@@ -0,0 +1,42 @@
+{
+ "name": "cache/prefixed-cache",
+ "description": "A decorator that makes your cache support prefix",
+ "type": "library",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "keywords": [
+ "cache",
+ "psr-6",
+ "prefix"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "authors": [
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/integration-tests": "^0.16"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Prefixed\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/SessionHandler/Changelog.md b/vendor/cache/cache/src/SessionHandler/Changelog.md
new file mode 100644
index 0000000000..77c8b2b4df
--- /dev/null
+++ b/vendor/cache/cache/src/SessionHandler/Changelog.md
@@ -0,0 +1,19 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+No changes since 0.2.1
+
+## 0.2.1
+
+### Fixed
+
+Typos, documentation and general package improvements.
+
+## 0.2.0
+
+No changelog before this version
diff --git a/vendor/cache/cache/src/SessionHandler/LICENSE b/vendor/cache/cache/src/SessionHandler/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/SessionHandler/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/SessionHandler/Psr6SessionHandler.php b/vendor/cache/cache/src/SessionHandler/Psr6SessionHandler.php
new file mode 100644
index 0000000000..4938128d84
--- /dev/null
+++ b/vendor/cache/cache/src/SessionHandler/Psr6SessionHandler.php
@@ -0,0 +1,119 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\SessionHandler;
+
+use Psr\Cache\CacheItemPoolInterface;
+
+/**
+ * @author Aaron Scherer
+ */
+class Psr6SessionHandler implements \SessionHandlerInterface
+{
+ /**
+ * @type CacheItemPoolInterface
+ */
+ private $cache;
+
+ /**
+ * @type int Time to live in seconds
+ */
+ private $ttl;
+
+ /**
+ * @type string Key prefix for shared environments.
+ */
+ private $prefix;
+
+ /**
+ * @param CacheItemPoolInterface $cache
+ * @param array $options {
+ *
+ * @type int $ttl The time to live in seconds
+ * @type string $prefix The prefix to use for the cache keys in order to avoid collision
+ * }
+ */
+ public function __construct(CacheItemPoolInterface $cache, array $options = [])
+ {
+ $this->cache = $cache;
+
+ $this->ttl = isset($options['ttl']) ? (int) $options['ttl'] : 86400;
+ $this->prefix = isset($options['prefix']) ? $options['prefix'] : 'psr6ses_';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function open($savePath, $sessionName)
+ {
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function close()
+ {
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function read($sessionId)
+ {
+ $item = $this->getCacheItem($sessionId);
+ if ($item->isHit()) {
+ return $item->get();
+ }
+
+ return '';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function write($sessionId, $data)
+ {
+ $item = $this->getCacheItem($sessionId);
+ $item->set($data)
+ ->expiresAfter($this->ttl);
+
+ return $this->cache->save($item);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function destroy($sessionId)
+ {
+ return $this->cache->deleteItem($this->prefix.$sessionId);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function gc($lifetime)
+ {
+ // not required here because cache will auto expire the records anyhow.
+ return true;
+ }
+
+ /**
+ * @param $sessionId
+ *
+ * @return \Psr\Cache\CacheItemInterface
+ */
+ private function getCacheItem($sessionId)
+ {
+ return $this->cache->getItem($this->prefix.$sessionId);
+ }
+}
diff --git a/vendor/cache/cache/src/SessionHandler/README.md b/vendor/cache/cache/src/SessionHandler/README.md
new file mode 100644
index 0000000000..9500db8d5f
--- /dev/null
+++ b/vendor/cache/cache/src/SessionHandler/README.md
@@ -0,0 +1,33 @@
+# PSR-6 Session handler
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/session-handler/v/stable)](https://packagist.org/packages/cache/session-handler)
+[![codecov.io](https://codecov.io/github/php-cache/session-handler/coverage.svg?branch=master)](https://codecov.io/github/php-cache/session-handler?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/session-handler/downloads)](https://packagist.org/packages/cache/session-handler)
+[![Monthly Downloads](https://poser.pugx.org/cache/session-handler/d/monthly.png)](https://packagist.org/packages/cache/session-handler)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This is a PHP session handler that supports PSR-6 cache. It is a part of the PHP Cache organisation. Find more
+documentation at [www.php-cache.com](http://www.php-cache.com).
+
+
+### Install
+
+```bash
+composer require cache/session-handler
+```
+
+### Use
+
+```php
+$pool = new ArrayCachePool();
+$config = ['ttl'=>3600, 'prefix'=>'foobar'];
+
+$sessionHandler = new Psr6SessionHandler($pool, $config);
+```
+
+Note that this session handler does no kind of locking, so it will lose or overwrite your session data if you run scripts concurrently. You have been warned.
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/SessionHandler/composer.json b/vendor/cache/cache/src/SessionHandler/composer.json
new file mode 100644
index 0000000000..7cce79a073
--- /dev/null
+++ b/vendor/cache/cache/src/SessionHandler/composer.json
@@ -0,0 +1,47 @@
+{
+ "name": "cache/session-handler",
+ "type": "library",
+ "description": "An implementation of PHP's SessionHandlerInterface that allows PSR-6",
+ "keywords": [
+ "cache",
+ "psr-6",
+ "session handler"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/array-adapter": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\SessionHandler\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/TagInterop/.github/PULL_REQUEST_TEMPLATE.md b/vendor/cache/cache/src/TagInterop/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000000..4a339b4c2f
--- /dev/null
+++ b/vendor/cache/cache/src/TagInterop/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,5 @@
+This is a READ ONLY repository.
+
+Please make your pull request to https://github.com/php-cache/cache
+
+Thank you for contributing.
diff --git a/vendor/cache/cache/src/TagInterop/.travis.yml b/vendor/cache/cache/src/TagInterop/.travis.yml
new file mode 100644
index 0000000000..942fe27e94
--- /dev/null
+++ b/vendor/cache/cache/src/TagInterop/.travis.yml
@@ -0,0 +1,22 @@
+language: php
+sudo: false
+
+matrix:
+ include:
+ - php: 7.0
+
+cache:
+ directories:
+ - "$HOME/.composer/cache"
+
+install:
+ - composer update --prefer-dist --prefer-stable
+
+script:
+ - ./vendor/bin/phpunit --coverage-clover=coverage.xml
+
+after_success:
+ - pip install --user codecov && codecov
+
+notifications:
+ email: false
diff --git a/vendor/cache/cache/src/TagInterop/Changelog.md b/vendor/cache/cache/src/TagInterop/Changelog.md
new file mode 100644
index 0000000000..1596519c3c
--- /dev/null
+++ b/vendor/cache/cache/src/TagInterop/Changelog.md
@@ -0,0 +1,9 @@
+# Change Log
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## 1.0.0
+
+First release
+
+
diff --git a/vendor/cache/cache/src/TagInterop/LICENSE b/vendor/cache/cache/src/TagInterop/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/TagInterop/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/TagInterop/README.md b/vendor/cache/cache/src/TagInterop/README.md
new file mode 100644
index 0000000000..28511c91db
--- /dev/null
+++ b/vendor/cache/cache/src/TagInterop/README.md
@@ -0,0 +1,25 @@
+# Tag support for PSR-6 Cache
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/tag-interop/v/stable)](https://packagist.org/packages/cache/tag-interop)
+[![Total Downloads](https://poser.pugx.org/cache/tag-interop/downloads)](https://packagist.org/packages/cache/tag-interop)
+[![Monthly Downloads](https://poser.pugx.org/cache/tag-interop/d/monthly.png)](https://packagist.org/packages/cache/tag-interop)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This repository holds two interfaces for tagging. These interfaces will make their
+way into PHP Fig. Representatives from Symfony, PHP-cache and Drupal has worked
+together to agree on these interfaces.
+
+### Install
+
+```bash
+composer require cache/tag-interop
+```
+
+### Use
+
+Read the [documentation on usage](http://www.php-cache.com/).
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/TagInterop/TaggableCacheItemInterface.php b/vendor/cache/cache/src/TagInterop/TaggableCacheItemInterface.php
new file mode 100644
index 0000000000..5823b0bb2b
--- /dev/null
+++ b/vendor/cache/cache/src/TagInterop/TaggableCacheItemInterface.php
@@ -0,0 +1,43 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\TagInterop;
+
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\InvalidArgumentException;
+
+/**
+ * An item that supports tags. This interface is a soon-to-be-PSR.
+ *
+ * @author Tobias Nyholm
+ * @author Nicolas Grekas
+ */
+interface TaggableCacheItemInterface extends CacheItemInterface
+{
+ /**
+ * Get all existing tags. These are the tags the item has when the item is
+ * returned from the pool.
+ *
+ * @return array
+ */
+ public function getPreviousTags();
+
+ /**
+ * Overwrite all tags with a new set of tags.
+ *
+ * @param string[] $tags An array of tags
+ *
+ * @throws InvalidArgumentException When a tag is not valid.
+ *
+ * @return TaggableCacheItemInterface
+ */
+ public function setTags(array $tags);
+}
diff --git a/vendor/cache/cache/src/TagInterop/TaggableCacheItemPoolInterface.php b/vendor/cache/cache/src/TagInterop/TaggableCacheItemPoolInterface.php
new file mode 100644
index 0000000000..055bf4b09d
--- /dev/null
+++ b/vendor/cache/cache/src/TagInterop/TaggableCacheItemPoolInterface.php
@@ -0,0 +1,60 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\TagInterop;
+
+use Psr\Cache\CacheItemPoolInterface;
+use Psr\Cache\InvalidArgumentException;
+
+/**
+ * Interface for invalidating cached items using tags. This interface is a soon-to-be-PSR.
+ *
+ * @author Tobias Nyholm
+ * @author Nicolas Grekas
+ */
+interface TaggableCacheItemPoolInterface extends CacheItemPoolInterface
+{
+ /**
+ * Invalidates cached items using a tag.
+ *
+ * @param string $tag The tag to invalidate
+ *
+ * @throws InvalidArgumentException When $tags is not valid
+ *
+ * @return bool True on success
+ */
+ public function invalidateTag($tag);
+
+ /**
+ * Invalidates cached items using tags.
+ *
+ * @param string[] $tags An array of tags to invalidate
+ *
+ * @throws InvalidArgumentException When $tags is not valid
+ *
+ * @return bool True on success
+ */
+ public function invalidateTags(array $tags);
+
+ /**
+ * {@inheritdoc}
+ *
+ * @return TaggableCacheItemInterface
+ */
+ public function getItem($key);
+
+ /**
+ * {@inheritdoc}
+ *
+ * @return array|\Traversable|TaggableCacheItemInterface[]
+ */
+ public function getItems(array $keys = []);
+}
diff --git a/vendor/cache/cache/src/TagInterop/composer.json b/vendor/cache/cache/src/TagInterop/composer.json
new file mode 100644
index 0000000000..03bc1e50eb
--- /dev/null
+++ b/vendor/cache/cache/src/TagInterop/composer.json
@@ -0,0 +1,39 @@
+{
+ "name": "cache/tag-interop",
+ "type": "library",
+ "description": "Framework interoperable interfaces for tags",
+ "keywords": [
+ "cache",
+ "psr6",
+ "tag",
+ "psr"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ },
+ {
+ "name": "Nicolas Grekas ",
+ "email": "p@tchwork.com",
+ "homepage": "https://github.com/nicolas-grekas"
+ }
+ ],
+ "require": {
+ "php": "^5.5 || ^7.0",
+ "psr/cache": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\TagInterop\\": ""
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Taggable/Changelog.md b/vendor/cache/cache/src/Taggable/Changelog.md
new file mode 100644
index 0000000000..da23421b97
--- /dev/null
+++ b/vendor/cache/cache/src/Taggable/Changelog.md
@@ -0,0 +1,78 @@
+# Changelog
+
+The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.
+
+## UNRELEASED
+
+## 1.0.0
+
+### Added
+
+* `Cache\Taggable\Exception\InvalidArgumentException`
+
+### Changed
+
+* We do not throw `Cache\Adapter\Common\Exception\InvalidArgumentException` anymore. Instead we throw
+`Cache\Taggable\Exception\InvalidArgumentException`. Both exceptions do implement `Psr\Cache\InvalidArgumentException`
+* We do not require `cache/adapter-common`
+
+### Removed
+
+* Deprecated interfaces `TaggableItemInterface` and `TaggablePoolInterface`
+
+## 0.5.1
+
+### Fixed
+
+* Bug on `TaggablePSR6ItemAdapter::isItemCreatedHere` where item value was `null`.
+
+## 0.5.0
+
+### Added
+
+* Support for `TaggableCacheItemPoolInterface`
+
+### Changed
+
+* The behavior of `TaggablePSR6ItemAdapter::getTags()` has changed. It will not return the tags stored in the cache storage.
+
+### Removed
+
+* `TaggablePoolTrait`
+* Deprecated `TaggablePoolInterface` in favor of `Cache\TagInterop\TaggableCacheItemPoolInterface`
+* Deprecated `TaggableItemInterface` in favor of `Cache\TagInterop\TaggableCacheItemInterface`
+* Removed support for `TaggablePoolInterface` and `TaggableItemInterface`
+* `TaggablePSR6ItemAdapter::getTags()`. Use `TaggablePSR6ItemAdapter::getPreviousTags()`
+* `TaggablePSR6ItemAdapter::addTag()`. Use `TaggablePSR6ItemAdapter::setTags()`
+
+## 0.4.3
+
+### Fixed
+
+* Do not lose the data when you start using the `TaggablePSR6PoolAdapter`
+
+## 0.4.2
+
+### Changed
+
+* Updated version for integration tests
+* Made `TaggablePSR6PoolAdapter::getTags` protected instead of private
+
+## 0.4.1
+
+### Fixed
+
+* Saving an expired value should be the same as removing that value
+
+## 0.4.0
+
+This is a big BC break. The API is rewritten and how we store tags has changed. Each tag is a key to a list in the
+cache storage. The list contains keys to items that uses that tag.
+
+* The `TaggableItemInterface` is completely rewritten. It extends `CacheItemInterface` and has three methods: `getTags`, `setTags` and `addTag`.
+* The `TaggablePoolInterface` is also rewritten. It has a new `clearTags` function.
+* The `TaggablePoolTrait` has new methods to manipulate the list of tags.
+
+## 0.3.1
+
+No changelog before this version
diff --git a/vendor/cache/cache/src/Taggable/Exception/InvalidArgumentException.php b/vendor/cache/cache/src/Taggable/Exception/InvalidArgumentException.php
new file mode 100644
index 0000000000..bcfa342e41
--- /dev/null
+++ b/vendor/cache/cache/src/Taggable/Exception/InvalidArgumentException.php
@@ -0,0 +1,16 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Taggable\Exception;
+
+class InvalidArgumentException extends \InvalidArgumentException implements \Psr\Cache\InvalidArgumentException
+{
+}
diff --git a/vendor/cache/cache/src/Taggable/LICENSE b/vendor/cache/cache/src/Taggable/LICENSE
new file mode 100644
index 0000000000..82f8feef6b
--- /dev/null
+++ b/vendor/cache/cache/src/Taggable/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Aaron Scherer, Tobias Nyholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/cache/cache/src/Taggable/README.md b/vendor/cache/cache/src/Taggable/README.md
new file mode 100644
index 0000000000..13f287ddc4
--- /dev/null
+++ b/vendor/cache/cache/src/Taggable/README.md
@@ -0,0 +1,22 @@
+# Taggable PSR-6 Cache pool
+[![Gitter](https://badges.gitter.im/php-cache/cache.svg)](https://gitter.im/php-cache/cache?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+[![Latest Stable Version](https://poser.pugx.org/cache/taggable-cache/v/stable)](https://packagist.org/packages/cache/taggable-cache)
+[![codecov.io](https://codecov.io/github/php-cache/taggable-cache/coverage.svg?branch=master)](https://codecov.io/github/php-cache/taggable-cache?branch=master)
+[![Total Downloads](https://poser.pugx.org/cache/taggable-cache/downloads)](https://packagist.org/packages/cache/taggable-cache)
+[![Monthly Downloads](https://poser.pugx.org/cache/taggable-cache/d/monthly.png)](https://packagist.org/packages/cache/taggable-cache)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+
+This repository has a adapter that makes any PSR-6 pool taggable. All PHPC ache pools support tagging out of the box.
+Using tags allow you to tag related items, and then clear the cached data for that tag only. It is a part of the PHP Cache
+organisation. To read about features like tagging and hierarchy support please read the shared documentation at [www.php-cache.com](http://www.php-cache.com).
+
+### Install
+
+```bash
+composer require cache/taggable-cache
+```
+
+### Contribute
+
+Contributions are very welcome! Send a pull request to the [main repository](https://github.com/php-cache/cache) or
+report any issues you find on the [issue tracker](http://issues.php-cache.com).
diff --git a/vendor/cache/cache/src/Taggable/TaggablePSR6ItemAdapter.php b/vendor/cache/cache/src/Taggable/TaggablePSR6ItemAdapter.php
new file mode 100644
index 0000000000..1147124aee
--- /dev/null
+++ b/vendor/cache/cache/src/Taggable/TaggablePSR6ItemAdapter.php
@@ -0,0 +1,235 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Taggable;
+
+use Cache\Taggable\Exception\InvalidArgumentException;
+use Cache\TagInterop\TaggableCacheItemInterface;
+use Psr\Cache\CacheItemInterface;
+
+/**
+ * @internal
+ *
+ * An adapter for non-taggable cache items, to be used with the cache pool
+ * adapter.
+ *
+ * This adapter stores tags along with the cached value, by storing wrapping
+ * the item in an array structure containing both
+ *
+ * @author Magnus Nordlander
+ */
+class TaggablePSR6ItemAdapter implements TaggableCacheItemInterface
+{
+ /**
+ * @type bool
+ */
+ private $initialized = false;
+
+ /**
+ * @type CacheItemInterface
+ */
+ private $cacheItem;
+
+ /**
+ * @type array
+ */
+ private $prevTags = [];
+
+ /**
+ * @type array
+ */
+ private $tags = [];
+
+ /**
+ * @param CacheItemInterface $cacheItem
+ */
+ private function __construct(CacheItemInterface $cacheItem)
+ {
+ $this->cacheItem = $cacheItem;
+ }
+
+ /**
+ * @param CacheItemInterface $cacheItem
+ *
+ * @return TaggablePSR6ItemAdapter
+ */
+ public static function makeTaggable(CacheItemInterface $cacheItem)
+ {
+ return new self($cacheItem);
+ }
+
+ /**
+ * @return CacheItemInterface
+ */
+ public function unwrap()
+ {
+ return $this->cacheItem;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getKey()
+ {
+ return $this->cacheItem->getKey();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get()
+ {
+ $rawItem = $this->cacheItem->get();
+
+ // If it is a cache item we created
+ if ($this->isItemCreatedHere($rawItem)) {
+ return $rawItem['value'];
+ }
+
+ // This is an item stored before we used this fake cache
+ return $rawItem;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isHit()
+ {
+ return $this->cacheItem->isHit();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function set($value)
+ {
+ $this->initializeTags();
+
+ $this->cacheItem->set([
+ 'value' => $value,
+ 'tags' => $this->tags,
+ ]);
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPreviousTags()
+ {
+ $this->initializeTags();
+
+ return $this->prevTags;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTags()
+ {
+ return $this->tags;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setTags(array $tags)
+ {
+ $this->tags = [];
+
+ return $this->tag($tags);
+ }
+
+ private function tag($tags)
+ {
+ if (!is_array($tags)) {
+ $tags = [$tags];
+ }
+
+ $this->initializeTags();
+
+ foreach ($tags as $tag) {
+ if (!is_string($tag)) {
+ throw new InvalidArgumentException(sprintf('Cache tag must be string, "%s" given', is_object($tag) ? get_class($tag) : gettype($tag)));
+ }
+ if (isset($this->tags[$tag])) {
+ continue;
+ }
+ if (!isset($tag[0])) {
+ throw new InvalidArgumentException('Cache tag length must be greater than zero');
+ }
+ if (isset($tag[strcspn($tag, '{}()/\@:')])) {
+ throw new InvalidArgumentException(sprintf('Cache tag "%s" contains reserved characters {}()/\@:', $tag));
+ }
+ $this->tags[$tag] = $tag;
+ }
+
+ $this->updateTags();
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function expiresAt($expiration)
+ {
+ $this->cacheItem->expiresAt($expiration);
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function expiresAfter($time)
+ {
+ $this->cacheItem->expiresAfter($time);
+
+ return $this;
+ }
+
+ private function updateTags()
+ {
+ $this->cacheItem->set([
+ 'value' => $this->get(),
+ 'tags' => $this->tags,
+ ]);
+ }
+
+ private function initializeTags()
+ {
+ if (!$this->initialized) {
+ if ($this->cacheItem->isHit()) {
+ $rawItem = $this->cacheItem->get();
+
+ if ($this->isItemCreatedHere($rawItem)) {
+ $this->prevTags = $rawItem['tags'];
+ }
+ }
+
+ $this->initialized = true;
+ }
+ }
+
+ /**
+ * Verify that the raw data is a cache item created by this class.
+ *
+ * @param mixed $rawItem
+ *
+ * @return bool
+ */
+ private function isItemCreatedHere($rawItem)
+ {
+ return is_array($rawItem) && array_key_exists('value', $rawItem) && array_key_exists('tags', $rawItem) && count($rawItem) === 2;
+ }
+}
diff --git a/vendor/cache/cache/src/Taggable/TaggablePSR6PoolAdapter.php b/vendor/cache/cache/src/Taggable/TaggablePSR6PoolAdapter.php
new file mode 100644
index 0000000000..3c784f4f8a
--- /dev/null
+++ b/vendor/cache/cache/src/Taggable/TaggablePSR6PoolAdapter.php
@@ -0,0 +1,307 @@
+, Tobias Nyholm
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Cache\Taggable;
+
+use Cache\TagInterop\TaggableCacheItemInterface;
+use Cache\TagInterop\TaggableCacheItemPoolInterface;
+use Psr\Cache\CacheItemInterface;
+use Psr\Cache\CacheItemPoolInterface;
+
+/**
+ * This adapter lets you make any PSR-6 cache pool taggable. If a pool is
+ * already taggable, it is simply returned by makeTaggable. Tags are stored
+ * either in the same cache pool, or a a separate pool, and both of these
+ * appoaches come with different caveats.
+ *
+ * A general caveat is that using this adapter reserves any cache key starting
+ * with '__tag.'.
+ *
+ * Using the same pool is precarious if your cache does LRU evictions of items
+ * even if they do not expire (as in e.g. memcached). If so, the tag item may
+ * be evicted without all of the tagged items having been evicted first,
+ * causing items to lose their tags.
+ *
+ * In order to mitigate this issue, you may use a separate, more persistent
+ * pool for your tag items. Do however note that if you are doing so, the
+ * entire pool is reserved for tags, as this pool is cleared whenever the
+ * main pool is cleared.
+ *
+ * @author Magnus Nordlander
+ */
+class TaggablePSR6PoolAdapter implements TaggableCacheItemPoolInterface
+{
+ /**
+ * @type CacheItemPoolInterface
+ */
+ private $cachePool;
+
+ /**
+ * @type CacheItemPoolInterface
+ */
+ private $tagStorePool;
+
+ /**
+ * @param CacheItemPoolInterface $cachePool
+ * @param CacheItemPoolInterface $tagStorePool
+ */
+ private function __construct(CacheItemPoolInterface $cachePool, CacheItemPoolInterface $tagStorePool = null)
+ {
+ $this->cachePool = $cachePool;
+ if ($tagStorePool) {
+ $this->tagStorePool = $tagStorePool;
+ } else {
+ $this->tagStorePool = $cachePool;
+ }
+ }
+
+ /**
+ * @param CacheItemPoolInterface $cachePool The pool to which to add tagging capabilities
+ * @param CacheItemPoolInterface|null $tagStorePool The pool to store tags in. If null is passed, the main pool is used
+ *
+ * @return TaggableCacheItemPoolInterface
+ */
+ public static function makeTaggable(CacheItemPoolInterface $cachePool, CacheItemPoolInterface $tagStorePool = null)
+ {
+ if ($cachePool instanceof TaggableCacheItemPoolInterface && $tagStorePool === null) {
+ return $cachePool;
+ }
+
+ return new self($cachePool, $tagStorePool);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getItem($key)
+ {
+ return TaggablePSR6ItemAdapter::makeTaggable($this->cachePool->getItem($key));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getItems(array $keys = [])
+ {
+ $items = $this->cachePool->getItems($keys);
+
+ $wrappedItems = [];
+ foreach ($items as $key => $item) {
+ $wrappedItems[$key] = TaggablePSR6ItemAdapter::makeTaggable($item);
+ }
+
+ return $wrappedItems;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function hasItem($key)
+ {
+ return $this->cachePool->hasItem($key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function clear()
+ {
+ $ret = $this->cachePool->clear();
+
+ return $this->tagStorePool->clear() && $ret; // Is this acceptable?
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function deleteItem($key)
+ {
+ $this->preRemoveItem($key);
+
+ return $this->cachePool->deleteItem($key);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function deleteItems(array $keys)
+ {
+ foreach ($keys as $key) {
+ $this->preRemoveItem($key);
+ }
+
+ return $this->cachePool->deleteItems($keys);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function save(CacheItemInterface $item)
+ {
+ $this->removeTagEntries($item);
+ $this->saveTags($item);
+
+ return $this->cachePool->save($item->unwrap());
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function saveDeferred(CacheItemInterface $item)
+ {
+ $this->saveTags($item);
+
+ return $this->cachePool->saveDeferred($item->unwrap());
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function commit()
+ {
+ $this->tagStorePool->commit();
+ $this->cachePool->commit();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function appendListItem($name, $value)
+ {
+ $listItem = $this->tagStorePool->getItem($name);
+ if (!is_array($list = $listItem->get())) {
+ $list = [];
+ }
+
+ $list[] = $value;
+ $listItem->set($list);
+ $this->tagStorePool->save($listItem);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function removeList($name)
+ {
+ return $this->tagStorePool->deleteItem($name);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function removeListItem($name, $key)
+ {
+ $listItem = $this->tagStorePool->getItem($name);
+ if (!is_array($list = $listItem->get())) {
+ $list = [];
+ }
+
+ $list = array_filter($list, function ($value) use ($key) {
+ return $value !== $key;
+ });
+
+ $listItem->set($list);
+ $this->tagStorePool->save($listItem);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getList($name)
+ {
+ $listItem = $this->tagStorePool->getItem($name);
+ if (!is_array($list = $listItem->get())) {
+ $list = [];
+ }
+
+ return $list;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getTagKey($tag)
+ {
+ return '__tag.'.$tag;
+ }
+
+ /**
+ * @param TaggablePSR6ItemAdapter $item
+ *
+ * @return $this
+ */
+ private function saveTags(TaggablePSR6ItemAdapter $item)
+ {
+ $tags = $item->getTags();
+ foreach ($tags as $tag) {
+ $this->appendListItem($this->getTagKey($tag), $item->getKey());
+ }
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function invalidateTags(array $tags)
+ {
+ $itemIds = [];
+ foreach ($tags as $tag) {
+ $itemIds = array_merge($itemIds, $this->getList($this->getTagKey($tag)));
+ }
+
+ // Remove all items with the tag
+ $success = $this->deleteItems($itemIds);
+
+ if ($success) {
+ // Remove the tag list
+ foreach ($tags as $tag) {
+ $this->removeList($this->getTagKey($tag));
+ }
+ }
+
+ return $success;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function invalidateTag($tag)
+ {
+ return $this->invalidateTags([$tag]);
+ }
+
+ /**
+ * Removes the key form all tag lists.
+ *
+ * @param string $key
+ *
+ * @return $this
+ */
+ private function preRemoveItem($key)
+ {
+ $item = $this->getItem($key);
+ $this->removeTagEntries($item);
+
+ return $this;
+ }
+
+ /**
+ * @param TaggableCacheItemInterface $item
+ */
+ private function removeTagEntries($item)
+ {
+ $tags = $item->getPreviousTags();
+ foreach ($tags as $tag) {
+ $this->removeListItem($this->getTagKey($tag), $item->getKey());
+ }
+ }
+}
diff --git a/vendor/cache/cache/src/Taggable/composer.json b/vendor/cache/cache/src/Taggable/composer.json
new file mode 100644
index 0000000000..fded8de5c0
--- /dev/null
+++ b/vendor/cache/cache/src/Taggable/composer.json
@@ -0,0 +1,55 @@
+{
+ "name": "cache/taggable-cache",
+ "type": "library",
+ "description": "Add tag support to your PSR-6 cache implementation",
+ "keywords": [
+ "cache",
+ "psr6",
+ "tag",
+ "taggable"
+ ],
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Magnus Nordlander",
+ "email": "magnus@fervo.se",
+ "homepage": "https://github.com/magnusnordlander"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "cache/tag-interop": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.21",
+ "cache/integration-tests": "^0.16",
+ "symfony/cache": "^3.1"
+ },
+ "autoload": {
+ "psr-4": {
+ "Cache\\Taggable\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php
new file mode 100644
index 0000000000..2c72175e77
--- /dev/null
+++ b/vendor/composer/ClassLoader.php
@@ -0,0 +1,445 @@
+
+ * Jordi Boggiano
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ * $loader = new \Composer\Autoload\ClassLoader();
+ *
+ * // register classes with namespaces
+ * $loader->add('Symfony\Component', __DIR__.'/component');
+ * $loader->add('Symfony', __DIR__.'/framework');
+ *
+ * // activate the autoloader
+ * $loader->register();
+ *
+ * // to enable searching the include path (eg. for PEAR packages)
+ * $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier
+ * @author Jordi Boggiano
+ * @see http://www.php-fig.org/psr/psr-0/
+ * @see http://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+ // PSR-4
+ private $prefixLengthsPsr4 = array();
+ private $prefixDirsPsr4 = array();
+ private $fallbackDirsPsr4 = array();
+
+ // PSR-0
+ private $prefixesPsr0 = array();
+ private $fallbackDirsPsr0 = array();
+
+ private $useIncludePath = false;
+ private $classMap = array();
+ private $classMapAuthoritative = false;
+ private $missingClasses = array();
+ private $apcuPrefix;
+
+ public function getPrefixes()
+ {
+ if (!empty($this->prefixesPsr0)) {
+ return call_user_func_array('array_merge', $this->prefixesPsr0);
+ }
+
+ return array();
+ }
+
+ public function getPrefixesPsr4()
+ {
+ return $this->prefixDirsPsr4;
+ }
+
+ public function getFallbackDirs()
+ {
+ return $this->fallbackDirsPsr0;
+ }
+
+ public function getFallbackDirsPsr4()
+ {
+ return $this->fallbackDirsPsr4;
+ }
+
+ public function getClassMap()
+ {
+ return $this->classMap;
+ }
+
+ /**
+ * @param array $classMap Class to filename map
+ */
+ public function addClassMap(array $classMap)
+ {
+ if ($this->classMap) {
+ $this->classMap = array_merge($this->classMap, $classMap);
+ } else {
+ $this->classMap = $classMap;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix, either
+ * appending or prepending to the ones previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
+ */
+ public function add($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ if ($prepend) {
+ $this->fallbackDirsPsr0 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr0
+ );
+ } else {
+ $this->fallbackDirsPsr0 = array_merge(
+ $this->fallbackDirsPsr0,
+ (array) $paths
+ );
+ }
+
+ return;
+ }
+
+ $first = $prefix[0];
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+ return;
+ }
+ if ($prepend) {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixesPsr0[$first][$prefix]
+ );
+ } else {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ $this->prefixesPsr0[$first][$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace, either
+ * appending or prepending to the ones previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function addPsr4($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ // Register directories for the root namespace.
+ if ($prepend) {
+ $this->fallbackDirsPsr4 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr4
+ );
+ } else {
+ $this->fallbackDirsPsr4 = array_merge(
+ $this->fallbackDirsPsr4,
+ (array) $paths
+ );
+ }
+ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+ // Register directories for a new namespace.
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ } elseif ($prepend) {
+ // Prepend directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixDirsPsr4[$prefix]
+ );
+ } else {
+ // Append directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ $this->prefixDirsPsr4[$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix,
+ * replacing any others previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 base directories
+ */
+ public function set($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr0 = (array) $paths;
+ } else {
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace,
+ * replacing any others previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-4 base directories
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function setPsr4($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr4 = (array) $paths;
+ } else {
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Turns on searching the include path for class files.
+ *
+ * @param bool $useIncludePath
+ */
+ public function setUseIncludePath($useIncludePath)
+ {
+ $this->useIncludePath = $useIncludePath;
+ }
+
+ /**
+ * Can be used to check if the autoloader uses the include path to check
+ * for classes.
+ *
+ * @return bool
+ */
+ public function getUseIncludePath()
+ {
+ return $this->useIncludePath;
+ }
+
+ /**
+ * Turns off searching the prefix and fallback directories for classes
+ * that have not been registered with the class map.
+ *
+ * @param bool $classMapAuthoritative
+ */
+ public function setClassMapAuthoritative($classMapAuthoritative)
+ {
+ $this->classMapAuthoritative = $classMapAuthoritative;
+ }
+
+ /**
+ * Should class lookup fail if not found in the current class map?
+ *
+ * @return bool
+ */
+ public function isClassMapAuthoritative()
+ {
+ return $this->classMapAuthoritative;
+ }
+
+ /**
+ * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+ *
+ * @param string|null $apcuPrefix
+ */
+ public function setApcuPrefix($apcuPrefix)
+ {
+ $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
+ }
+
+ /**
+ * The APCu prefix in use, or null if APCu caching is not enabled.
+ *
+ * @return string|null
+ */
+ public function getApcuPrefix()
+ {
+ return $this->apcuPrefix;
+ }
+
+ /**
+ * Registers this instance as an autoloader.
+ *
+ * @param bool $prepend Whether to prepend the autoloader or not
+ */
+ public function register($prepend = false)
+ {
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+ }
+
+ /**
+ * Unregisters this instance as an autoloader.
+ */
+ public function unregister()
+ {
+ spl_autoload_unregister(array($this, 'loadClass'));
+ }
+
+ /**
+ * Loads the given class or interface.
+ *
+ * @param string $class The name of the class
+ * @return bool|null True if loaded, null otherwise
+ */
+ public function loadClass($class)
+ {
+ if ($file = $this->findFile($class)) {
+ includeFile($file);
+
+ return true;
+ }
+ }
+
+ /**
+ * Finds the path to the file where the class is defined.
+ *
+ * @param string $class The name of the class
+ *
+ * @return string|false The path if found, false otherwise
+ */
+ public function findFile($class)
+ {
+ // class map lookup
+ if (isset($this->classMap[$class])) {
+ return $this->classMap[$class];
+ }
+ if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
+ return false;
+ }
+ if (null !== $this->apcuPrefix) {
+ $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+ if ($hit) {
+ return $file;
+ }
+ }
+
+ $file = $this->findFileWithExtension($class, '.php');
+
+ // Search for Hack files if we are running on HHVM
+ if (false === $file && defined('HHVM_VERSION')) {
+ $file = $this->findFileWithExtension($class, '.hh');
+ }
+
+ if (null !== $this->apcuPrefix) {
+ apcu_add($this->apcuPrefix.$class, $file);
+ }
+
+ if (false === $file) {
+ // Remember that this class does not exist.
+ $this->missingClasses[$class] = true;
+ }
+
+ return $file;
+ }
+
+ private function findFileWithExtension($class, $ext)
+ {
+ // PSR-4 lookup
+ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+ $first = $class[0];
+ if (isset($this->prefixLengthsPsr4[$first])) {
+ $subPath = $class;
+ while (false !== $lastPos = strrpos($subPath, '\\')) {
+ $subPath = substr($subPath, 0, $lastPos);
+ $search = $subPath.'\\';
+ if (isset($this->prefixDirsPsr4[$search])) {
+ foreach ($this->prefixDirsPsr4[$search] as $dir) {
+ $length = $this->prefixLengthsPsr4[$first][$search];
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-4 fallback dirs
+ foreach ($this->fallbackDirsPsr4 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 lookup
+ if (false !== $pos = strrpos($class, '\\')) {
+ // namespaced class name
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+ } else {
+ // PEAR-like class name
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+ }
+
+ if (isset($this->prefixesPsr0[$first])) {
+ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($dirs as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-0 fallback dirs
+ foreach ($this->fallbackDirsPsr0 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 include paths.
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+ return $file;
+ }
+
+ return false;
+ }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ */
+function includeFile($file)
+{
+ include $file;
+}
diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE
new file mode 100644
index 0000000000..f27399a042
--- /dev/null
+++ b/vendor/composer/LICENSE
@@ -0,0 +1,21 @@
+
+Copyright (c) Nils Adermann, Jordi Boggiano
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
new file mode 100644
index 0000000000..bc91e341ad
--- /dev/null
+++ b/vendor/composer/autoload_classmap.php
@@ -0,0 +1,2620 @@
+ $vendorDir . '/cache/cache/src/Adapter/Apc/ApcCachePool.php',
+ 'Cache\\Adapter\\Apcu\\ApcuCachePool' => $vendorDir . '/cache/cache/src/Adapter/Apcu/ApcuCachePool.php',
+ 'Cache\\Adapter\\Chain\\CachePoolChain' => $vendorDir . '/cache/cache/src/Adapter/Chain/CachePoolChain.php',
+ 'Cache\\Adapter\\Chain\\Exception\\NoPoolAvailableException' => $vendorDir . '/cache/cache/src/Adapter/Chain/Exception/NoPoolAvailableException.php',
+ 'Cache\\Adapter\\Chain\\Exception\\PoolFailedException' => $vendorDir . '/cache/cache/src/Adapter/Chain/Exception/PoolFailedException.php',
+ 'Cache\\Adapter\\Common\\AbstractCachePool' => $vendorDir . '/cache/cache/src/Adapter/Common/AbstractCachePool.php',
+ 'Cache\\Adapter\\Common\\CacheItem' => $vendorDir . '/cache/cache/src/Adapter/Common/CacheItem.php',
+ 'Cache\\Adapter\\Common\\Exception\\CacheException' => $vendorDir . '/cache/cache/src/Adapter/Common/Exception/CacheException.php',
+ 'Cache\\Adapter\\Common\\Exception\\CachePoolException' => $vendorDir . '/cache/cache/src/Adapter/Common/Exception/CachePoolException.php',
+ 'Cache\\Adapter\\Common\\Exception\\InvalidArgumentException' => $vendorDir . '/cache/cache/src/Adapter/Common/Exception/InvalidArgumentException.php',
+ 'Cache\\Adapter\\Common\\HasExpirationTimestampInterface' => $vendorDir . '/cache/cache/src/Adapter/Common/HasExpirationTimestampInterface.php',
+ 'Cache\\Adapter\\Common\\PhpCacheItem' => $vendorDir . '/cache/cache/src/Adapter/Common/PhpCacheItem.php',
+ 'Cache\\Adapter\\Common\\PhpCachePool' => $vendorDir . '/cache/cache/src/Adapter/Common/PhpCachePool.php',
+ 'Cache\\Adapter\\Common\\TagSupportWithArray' => $vendorDir . '/cache/cache/src/Adapter/Common/TagSupportWithArray.php',
+ 'Cache\\Adapter\\Doctrine\\DoctrineCachePool' => $vendorDir . '/cache/cache/src/Adapter/Doctrine/DoctrineCachePool.php',
+ 'Cache\\Adapter\\Filesystem\\FilesystemCachePool' => $vendorDir . '/cache/cache/src/Adapter/Filesystem/FilesystemCachePool.php',
+ 'Cache\\Adapter\\Illuminate\\IlluminateCachePool' => $vendorDir . '/cache/cache/src/Adapter/Illuminate/IlluminateCachePool.php',
+ 'Cache\\Adapter\\Memcache\\MemcacheCachePool' => $vendorDir . '/cache/cache/src/Adapter/Memcache/MemcacheCachePool.php',
+ 'Cache\\Adapter\\Memcached\\MemcachedCachePool' => $vendorDir . '/cache/cache/src/Adapter/Memcached/MemcachedCachePool.php',
+ 'Cache\\Adapter\\MongoDB\\MongoDBCachePool' => $vendorDir . '/cache/cache/src/Adapter/MongoDB/MongoDBCachePool.php',
+ 'Cache\\Adapter\\PHPArray\\ArrayCachePool' => $vendorDir . '/cache/cache/src/Adapter/PHPArray/ArrayCachePool.php',
+ 'Cache\\Adapter\\Predis\\PredisCachePool' => $vendorDir . '/cache/cache/src/Adapter/Predis/PredisCachePool.php',
+ 'Cache\\Adapter\\Redis\\RedisCachePool' => $vendorDir . '/cache/cache/src/Adapter/Redis/RedisCachePool.php',
+ 'Cache\\Adapter\\Void\\VoidCachePool' => $vendorDir . '/cache/cache/src/Adapter/Void/VoidCachePool.php',
+ 'Cache\\Bridge\\Doctrine\\DoctrineCacheBridge' => $vendorDir . '/cache/cache/src/Bridge/Doctrine/DoctrineCacheBridge.php',
+ 'Cache\\Bridge\\SimpleCache\\Exception\\CacheException' => $vendorDir . '/cache/cache/src/Bridge/SimpleCache/Exception/CacheException.php',
+ 'Cache\\Bridge\\SimpleCache\\Exception\\InvalidArgumentException' => $vendorDir . '/cache/cache/src/Bridge/SimpleCache/Exception/InvalidArgumentException.php',
+ 'Cache\\Bridge\\SimpleCache\\SimpleCacheBridge' => $vendorDir . '/cache/cache/src/Bridge/SimpleCache/SimpleCacheBridge.php',
+ 'Cache\\Encryption\\EncryptedCachePool' => $vendorDir . '/cache/cache/src/Encryption/EncryptedCachePool.php',
+ 'Cache\\Encryption\\EncryptedItemDecorator' => $vendorDir . '/cache/cache/src/Encryption/EncryptedItemDecorator.php',
+ 'Cache\\Hierarchy\\HierarchicalCachePoolTrait' => $vendorDir . '/cache/cache/src/Hierarchy/HierarchicalCachePoolTrait.php',
+ 'Cache\\Hierarchy\\HierarchicalPoolInterface' => $vendorDir . '/cache/cache/src/Hierarchy/HierarchicalPoolInterface.php',
+ 'Cache\\Namespaced\\NamespacedCachePool' => $vendorDir . '/cache/cache/src/Namespaced/NamespacedCachePool.php',
+ 'Cache\\Prefixed\\PrefixedCachePool' => $vendorDir . '/cache/cache/src/Prefixed/PrefixedCachePool.php',
+ 'Cache\\SessionHandler\\Psr6SessionHandler' => $vendorDir . '/cache/cache/src/SessionHandler/Psr6SessionHandler.php',
+ 'Cache\\TagInterop\\TaggableCacheItemInterface' => $vendorDir . '/cache/cache/src/TagInterop/TaggableCacheItemInterface.php',
+ 'Cache\\TagInterop\\TaggableCacheItemPoolInterface' => $vendorDir . '/cache/cache/src/TagInterop/TaggableCacheItemPoolInterface.php',
+ 'Cache\\Taggable\\Exception\\InvalidArgumentException' => $vendorDir . '/cache/cache/src/Taggable/Exception/InvalidArgumentException.php',
+ 'Cache\\Taggable\\TaggablePSR6ItemAdapter' => $vendorDir . '/cache/cache/src/Taggable/TaggablePSR6ItemAdapter.php',
+ 'Cache\\Taggable\\TaggablePSR6PoolAdapter' => $vendorDir . '/cache/cache/src/Taggable/TaggablePSR6PoolAdapter.php',
+ 'DeepCopy\\DeepCopy' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/DeepCopy.php',
+ 'DeepCopy\\Exception\\CloneException' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php',
+ 'DeepCopy\\Exception\\PropertyException' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php',
+ 'DeepCopy\\Filter\\Doctrine\\DoctrineCollectionFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php',
+ 'DeepCopy\\Filter\\Doctrine\\DoctrineEmptyCollectionFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php',
+ 'DeepCopy\\Filter\\Doctrine\\DoctrineProxyFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php',
+ 'DeepCopy\\Filter\\Filter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php',
+ 'DeepCopy\\Filter\\KeepFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php',
+ 'DeepCopy\\Filter\\ReplaceFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php',
+ 'DeepCopy\\Filter\\SetNullFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php',
+ 'DeepCopy\\Matcher\\Doctrine\\DoctrineProxyMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php',
+ 'DeepCopy\\Matcher\\Matcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php',
+ 'DeepCopy\\Matcher\\PropertyMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php',
+ 'DeepCopy\\Matcher\\PropertyNameMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php',
+ 'DeepCopy\\Matcher\\PropertyTypeMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php',
+ 'DeepCopy\\Reflection\\ReflectionHelper' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php',
+ 'DeepCopy\\TypeFilter\\Date\\DateIntervalFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php',
+ 'DeepCopy\\TypeFilter\\ReplaceFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php',
+ 'DeepCopy\\TypeFilter\\ShallowCopyFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php',
+ 'DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedList' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php',
+ 'DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedListFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php',
+ 'DeepCopy\\TypeFilter\\TypeFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php',
+ 'DeepCopy\\TypeMatcher\\TypeMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php',
+ 'Directus\\Api\\Routes\\Activity' => $baseDir . '/src/endpoints/Activity.php',
+ 'Directus\\Api\\Routes\\Auth' => $baseDir . '/src/endpoints/Auth.php',
+ 'Directus\\Api\\Routes\\CollectionPresets' => $baseDir . '/src/endpoints/CollectionPresets.php',
+ 'Directus\\Api\\Routes\\Collections' => $baseDir . '/src/endpoints/Collections.php',
+ 'Directus\\Api\\Routes\\Fields' => $baseDir . '/src/endpoints/Fields.php',
+ 'Directus\\Api\\Routes\\Files' => $baseDir . '/src/endpoints/Files.php',
+ 'Directus\\Api\\Routes\\Home' => $baseDir . '/src/endpoints/Home.php',
+ 'Directus\\Api\\Routes\\Interfaces' => $baseDir . '/src/endpoints/Interfaces.php',
+ 'Directus\\Api\\Routes\\Items' => $baseDir . '/src/endpoints/Items.php',
+ 'Directus\\Api\\Routes\\Listings' => $baseDir . '/src/endpoints/Listings.php',
+ 'Directus\\Api\\Routes\\Pages' => $baseDir . '/src/endpoints/Pages.php',
+ 'Directus\\Api\\Routes\\Permissions' => $baseDir . '/src/endpoints/Permissions.php',
+ 'Directus\\Api\\Routes\\Relations' => $baseDir . '/src/endpoints/Relations.php',
+ 'Directus\\Api\\Routes\\Revisions' => $baseDir . '/src/endpoints/Revisions.php',
+ 'Directus\\Api\\Routes\\Roles' => $baseDir . '/src/endpoints/Roles.php',
+ 'Directus\\Api\\Routes\\ScimTwo' => $baseDir . '/src/endpoints/ScimTwo.php',
+ 'Directus\\Api\\Routes\\Server' => $baseDir . '/src/endpoints/Server.php',
+ 'Directus\\Api\\Routes\\Settings' => $baseDir . '/src/endpoints/Settings.php',
+ 'Directus\\Api\\Routes\\Types' => $baseDir . '/src/endpoints/Types.php',
+ 'Directus\\Api\\Routes\\Users' => $baseDir . '/src/endpoints/Users.php',
+ 'Directus\\Api\\Routes\\Utils' => $baseDir . '/src/endpoints/Utils.php',
+ 'Directus\\Application\\Application' => $baseDir . '/src/core/Directus/Application/Application.php',
+ 'Directus\\Application\\Container' => $baseDir . '/src/core/Directus/Application/Container.php',
+ 'Directus\\Application\\CoreServicesProvider' => $baseDir . '/src/core/Directus/Application/CoreServicesProvider.php',
+ 'Directus\\Application\\DefaultServicesProvider' => $baseDir . '/src/core/Directus/Application/DefaultServicesProvider.php',
+ 'Directus\\Application\\ErrorHandlers\\ErrorHandler' => $baseDir . '/src/core/Directus/Application/ErrorHandlers/ErrorHandler.php',
+ 'Directus\\Application\\ErrorHandlers\\MethodNotAllowedHandler' => $baseDir . '/src/core/Directus/Application/ErrorHandlers/MethodNotAllowedHandler.php',
+ 'Directus\\Application\\ErrorHandlers\\NotFoundHandler' => $baseDir . '/src/core/Directus/Application/ErrorHandlers/NotFoundHandler.php',
+ 'Directus\\Application\\Http\\Middleware\\AbstractMiddleware' => $baseDir . '/src/core/Directus/Application/Http/Middleware/AbstractMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\AbstractRateLimitMiddleware' => $baseDir . '/src/core/Directus/Application/Http/Middleware/AbstractRateLimitMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\AdminMiddleware' => $baseDir . '/src/core/Directus/Application/Http/Middleware/AdminMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\AuthenticatedMiddleware' => $baseDir . '/src/core/Directus/Application/Http/Middleware/AuthenticatedMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\AuthenticationMiddleware' => $baseDir . '/src/core/Directus/Application/Http/Middleware/AuthenticationMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\CorsMiddleware' => $baseDir . '/src/core/Directus/Application/Http/Middleware/CorsMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\IpRateLimitMiddleware' => $baseDir . '/src/core/Directus/Application/Http/Middleware/IpRateLimitMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\RateLimit\\UserIdentityResolver' => $baseDir . '/src/core/Directus/Application/Http/Middleware/RateLimit/UserIdentityResolver.php',
+ 'Directus\\Application\\Http\\Middleware\\ResponseCacheMiddleware' => $baseDir . '/src/core/Directus/Application/Http/Middleware/ResponseCacheMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\TableGatewayMiddleware' => $baseDir . '/src/core/Directus/Application/Http/Middleware/TableGatewayMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\UserRateLimitMiddleware' => $baseDir . '/src/core/Directus/Application/Http/Middleware/UserRateLimitMiddleware.php',
+ 'Directus\\Application\\Http\\Request' => $baseDir . '/src/core/Directus/Application/Http/Request.php',
+ 'Directus\\Application\\Http\\Response' => $baseDir . '/src/core/Directus/Application/Http/Response.php',
+ 'Directus\\Application\\Route' => $baseDir . '/src/core/Directus/Application/Route.php',
+ 'Directus\\Authentication\\Exception\\ExpiredRequestTokenException' => $baseDir . '/src/core/Directus/Authentication/Exception/ExpiredRequestTokenException.php',
+ 'Directus\\Authentication\\Exception\\ExpiredResetPasswordToken' => $baseDir . '/src/core/Directus/Authentication/Exception/ExpiredResetPasswordToken.php',
+ 'Directus\\Authentication\\Exception\\ExpiredTokenException' => $baseDir . '/src/core/Directus/Authentication/Exception/ExpiredTokenException.php',
+ 'Directus\\Authentication\\Exception\\InvalidInvitationCodeException' => $baseDir . '/src/core/Directus/Authentication/Exception/InvalidInvitationCodeException.php',
+ 'Directus\\Authentication\\Exception\\InvalidRequestTokenException' => $baseDir . '/src/core/Directus/Authentication/Exception/InvalidRequestTokenException.php',
+ 'Directus\\Authentication\\Exception\\InvalidResetPasswordTokenException' => $baseDir . '/src/core/Directus/Authentication/Exception/InvalidResetPasswordTokenException.php',
+ 'Directus\\Authentication\\Exception\\InvalidTokenException' => $baseDir . '/src/core/Directus/Authentication/Exception/InvalidTokenException.php',
+ 'Directus\\Authentication\\Exception\\InvalidUserCredentialsException' => $baseDir . '/src/core/Directus/Authentication/Exception/InvalidUserCredentialsException.php',
+ 'Directus\\Authentication\\Exception\\UnknownUserAttributeException' => $baseDir . '/src/core/Directus/Authentication/Exception/UnknownUserAttributeException.php',
+ 'Directus\\Authentication\\Exception\\UserAlreadyLoggedInException' => $baseDir . '/src/core/Directus/Authentication/Exception/UserAlreadyLoggedInException.php',
+ 'Directus\\Authentication\\Exception\\UserInactiveException' => $baseDir . '/src/core/Directus/Authentication/Exception/UserInactiveException.php',
+ 'Directus\\Authentication\\Exception\\UserNotAuthenticatedException' => $baseDir . '/src/core/Directus/Authentication/Exception/UserNotAuthenticatedException.php',
+ 'Directus\\Authentication\\Exception\\UserNotFoundException' => $baseDir . '/src/core/Directus/Authentication/Exception/UserNotFoundException.php',
+ 'Directus\\Authentication\\Exception\\UserWithEmailNotFoundException' => $baseDir . '/src/core/Directus/Authentication/Exception/UserWithEmailNotFoundException.php',
+ 'Directus\\Authentication\\Provider' => $baseDir . '/src/core/Directus/Authentication/Provider.php',
+ 'Directus\\Authentication\\Sso\\AbstractSocialProvider' => $baseDir . '/src/core/Directus/Authentication/Sso/AbstractSocialProvider.php',
+ 'Directus\\Authentication\\Sso\\OneSocialProvider' => $baseDir . '/src/core/Directus/Authentication/Sso/OneSocialProvider.php',
+ 'Directus\\Authentication\\Sso\\Provider\\facebook\\Provider' => $baseDir . '/public/extensions/core/auth/facebook/Provider.php',
+ 'Directus\\Authentication\\Sso\\Provider\\github\\Provider' => $baseDir . '/public/extensions/core/auth/github/Provider.php',
+ 'Directus\\Authentication\\Sso\\Provider\\google\\Provider' => $baseDir . '/public/extensions/core/auth/google/Provider.php',
+ 'Directus\\Authentication\\Sso\\Provider\\okta\\Provider' => $baseDir . '/public/extensions/core/auth/okta/Provider.php',
+ 'Directus\\Authentication\\Sso\\Provider\\twitter\\Provider' => $baseDir . '/public/extensions/core/auth/twitter/Provider.php',
+ 'Directus\\Authentication\\Sso\\Social' => $baseDir . '/src/core/Directus/Authentication/Sso/Social.php',
+ 'Directus\\Authentication\\Sso\\SocialProviderInterface' => $baseDir . '/src/core/Directus/Authentication/Sso/SocialProviderInterface.php',
+ 'Directus\\Authentication\\Sso\\SocialUser' => $baseDir . '/src/core/Directus/Authentication/Sso/SocialUser.php',
+ 'Directus\\Authentication\\Sso\\TwoSocialProvider' => $baseDir . '/src/core/Directus/Authentication/Sso/TwoSocialProvider.php',
+ 'Directus\\Authentication\\User\\Provider\\UserProviderInterface' => $baseDir . '/src/core/Directus/Authentication/User/Provider/UserProviderInterface.php',
+ 'Directus\\Authentication\\User\\Provider\\UserTableGatewayProvider' => $baseDir . '/src/core/Directus/Authentication/User/Provider/UserTableGatewayProvider.php',
+ 'Directus\\Authentication\\User\\User' => $baseDir . '/src/core/Directus/Authentication/User/User.php',
+ 'Directus\\Authentication\\User\\UserInterface' => $baseDir . '/src/core/Directus/Authentication/User/UserInterface.php',
+ 'Directus\\Cache\\Cache' => $baseDir . '/src/core/Directus/Cache/Cache.php',
+ 'Directus\\Cache\\Response' => $baseDir . '/src/core/Directus/Cache/Response.php',
+ 'Directus\\Collection\\Arrayable' => $baseDir . '/src/core/Directus/Collection/Arrayable.php',
+ 'Directus\\Collection\\Collection' => $baseDir . '/src/core/Directus/Collection/Collection.php',
+ 'Directus\\Collection\\CollectionInterface' => $baseDir . '/src/core/Directus/Collection/CollectionInterface.php',
+ 'Directus\\Config\\Config' => $baseDir . '/src/core/Directus/Config/Config.php',
+ 'Directus\\Config\\ConfigInterface' => $baseDir . '/src/core/Directus/Config/ConfigInterface.php',
+ 'Directus\\Config\\Exception\\InvalidStatusException' => $baseDir . '/src/core/Directus/Config/Exception/InvalidStatusException.php',
+ 'Directus\\Config\\Exception\\InvalidValueException' => $baseDir . '/src/core/Directus/Config/Exception/InvalidValueException.php',
+ 'Directus\\Config\\StatusItem' => $baseDir . '/src/core/Directus/Config/StatusItem.php',
+ 'Directus\\Config\\StatusMapping' => $baseDir . '/src/core/Directus/Config/StatusMapping.php',
+ 'Directus\\Console\\Cli' => $baseDir . '/src/core/Directus/Console/Cli.php',
+ 'Directus\\Console\\Common\\Exception\\PasswordChangeException' => $baseDir . '/src/core/Directus/Console/Common/Exception/PasswordChangeException.php',
+ 'Directus\\Console\\Common\\Exception\\SettingUpdateException' => $baseDir . '/src/core/Directus/Console/Common/Exception/SettingUpdateException.php',
+ 'Directus\\Console\\Common\\Exception\\UserUpdateException' => $baseDir . '/src/core/Directus/Console/Common/Exception/UserUpdateException.php',
+ 'Directus\\Console\\Common\\Setting' => $baseDir . '/src/core/Directus/Console/Common/Setting.php',
+ 'Directus\\Console\\Common\\User' => $baseDir . '/src/core/Directus/Console/Common/User.php',
+ 'Directus\\Console\\Exception\\CommandFailedException' => $baseDir . '/src/core/Directus/Console/Exception/CommandFailedException.php',
+ 'Directus\\Console\\Exception\\UnsupportedCommandException' => $baseDir . '/src/core/Directus/Console/Exception/UnsupportedCommandException.php',
+ 'Directus\\Console\\Exception\\WrongArgumentsException' => $baseDir . '/src/core/Directus/Console/Exception/WrongArgumentsException.php',
+ 'Directus\\Console\\Modules\\CacheModule' => $baseDir . '/src/core/Directus/Console/Modules/CacheModule.php',
+ 'Directus\\Console\\Modules\\DatabaseModule' => $baseDir . '/src/core/Directus/Console/Modules/DatabaseModule.php',
+ 'Directus\\Console\\Modules\\InstallModule' => $baseDir . '/src/core/Directus/Console/Modules/InstallModule.php',
+ 'Directus\\Console\\Modules\\ModuleBase' => $baseDir . '/src/core/Directus/Console/Modules/ModuleBase.php',
+ 'Directus\\Console\\Modules\\ModuleInterface' => $baseDir . '/src/core/Directus/Console/Modules/ModuleInterface.php',
+ 'Directus\\Console\\Modules\\UserModule' => $baseDir . '/src/core/Directus/Console/Modules/UserModule.php',
+ 'Directus\\Container\\Container' => $baseDir . '/src/core/Directus/Container/Container.php',
+ 'Directus\\Container\\Exception\\ValueNotFoundException' => $baseDir . '/src/core/Directus/Container/Exception/ValueNotFoundException.php',
+ 'Directus\\Custom\\Hasher\\CustomHasher' => $baseDir . '/public/extensions/custom/hashers/_CustomHasher.php',
+ 'Directus\\Custom\\Hooks\\Products\\BeforeInsertProducts' => $baseDir . '/public/extensions/custom/hooks/_products/BeforeInsertProducts.php',
+ 'Directus\\Database\\Connection' => $baseDir . '/src/core/Directus/Database/Connection.php',
+ 'Directus\\Database\\Ddl\\Column\\Bit' => $baseDir . '/src/core/Directus/Database/Ddl/Column/Bit.php',
+ 'Directus\\Database\\Ddl\\Column\\Boolean' => $baseDir . '/src/core/Directus/Database/Ddl/Column/Boolean.php',
+ 'Directus\\Database\\Ddl\\Column\\CollectionLength' => $baseDir . '/src/core/Directus/Database/Ddl/Column/CollectionLength.php',
+ 'Directus\\Database\\Ddl\\Column\\Custom' => $baseDir . '/src/core/Directus/Database/Ddl/Column/Custom.php',
+ 'Directus\\Database\\Ddl\\Column\\Double' => $baseDir . '/src/core/Directus/Database/Ddl/Column/Double.php',
+ 'Directus\\Database\\Ddl\\Column\\Enum' => $baseDir . '/src/core/Directus/Database/Ddl/Column/Enum.php',
+ 'Directus\\Database\\Ddl\\Column\\File' => $baseDir . '/src/core/Directus/Database/Ddl/Column/File.php',
+ 'Directus\\Database\\Ddl\\Column\\LongBlob' => $baseDir . '/src/core/Directus/Database/Ddl/Column/LongBlob.php',
+ 'Directus\\Database\\Ddl\\Column\\LongText' => $baseDir . '/src/core/Directus/Database/Ddl/Column/LongText.php',
+ 'Directus\\Database\\Ddl\\Column\\MediumBlob' => $baseDir . '/src/core/Directus/Database/Ddl/Column/MediumBlob.php',
+ 'Directus\\Database\\Ddl\\Column\\MediumInteger' => $baseDir . '/src/core/Directus/Database/Ddl/Column/MediumInteger.php',
+ 'Directus\\Database\\Ddl\\Column\\MediumText' => $baseDir . '/src/core/Directus/Database/Ddl/Column/MediumText.php',
+ 'Directus\\Database\\Ddl\\Column\\Numeric' => $baseDir . '/src/core/Directus/Database/Ddl/Column/Numeric.php',
+ 'Directus\\Database\\Ddl\\Column\\Real' => $baseDir . '/src/core/Directus/Database/Ddl/Column/Real.php',
+ 'Directus\\Database\\Ddl\\Column\\Serial' => $baseDir . '/src/core/Directus/Database/Ddl/Column/Serial.php',
+ 'Directus\\Database\\Ddl\\Column\\Set' => $baseDir . '/src/core/Directus/Database/Ddl/Column/Set.php',
+ 'Directus\\Database\\Ddl\\Column\\SmallInteger' => $baseDir . '/src/core/Directus/Database/Ddl/Column/SmallInteger.php',
+ 'Directus\\Database\\Ddl\\Column\\TinyBlob' => $baseDir . '/src/core/Directus/Database/Ddl/Column/TinyBlob.php',
+ 'Directus\\Database\\Ddl\\Column\\TinyInteger' => $baseDir . '/src/core/Directus/Database/Ddl/Column/TinyInteger.php',
+ 'Directus\\Database\\Ddl\\Column\\TinyText' => $baseDir . '/src/core/Directus/Database/Ddl/Column/TinyText.php',
+ 'Directus\\Database\\Ddl\\Column\\Uuid' => $baseDir . '/src/core/Directus/Database/Ddl/Column/Uuid.php',
+ 'Directus\\Database\\Exception\\CollectionAlreadyExistsException' => $baseDir . '/src/core/Directus/Database/Exception/CollectionAlreadyExistsException.php',
+ 'Directus\\Database\\Exception\\CollectionHasNotStatusInterfaceException' => $baseDir . '/src/core/Directus/Database/Exception/CollectionHasNotStatusInterfaceException.php',
+ 'Directus\\Database\\Exception\\CollectionNotFoundException' => $baseDir . '/src/core/Directus/Database/Exception/CollectionNotFoundException.php',
+ 'Directus\\Database\\Exception\\CollectionNotManagedException' => $baseDir . '/src/core/Directus/Database/Exception/CollectionNotManagedException.php',
+ 'Directus\\Database\\Exception\\ConnectionFailedException' => $baseDir . '/src/core/Directus/Database/Exception/ConnectionFailedException.php',
+ 'Directus\\Database\\Exception\\CustomUiValidationError' => $baseDir . '/src/core/Directus/Database/Exception/CustomUiValidationError.php',
+ 'Directus\\Database\\Exception\\DbException' => $baseDir . '/src/core/Directus/Database/Exception/DbException.php',
+ 'Directus\\Database\\Exception\\DuplicateItemException' => $baseDir . '/src/core/Directus/Database/Exception/DuplicateItemException.php',
+ 'Directus\\Database\\Exception\\FieldAlreadyExistsException' => $baseDir . '/src/core/Directus/Database/Exception/FieldAlreadyExistsException.php',
+ 'Directus\\Database\\Exception\\FieldAlreadyHasUniqueKeyException' => $baseDir . '/src/core/Directus/Database/Exception/FieldAlreadyHasUniqueKeyException.php',
+ 'Directus\\Database\\Exception\\FieldNotFoundException' => $baseDir . '/src/core/Directus/Database/Exception/FieldNotFoundException.php',
+ 'Directus\\Database\\Exception\\FieldNotManagedException' => $baseDir . '/src/core/Directus/Database/Exception/FieldNotManagedException.php',
+ 'Directus\\Database\\Exception\\ForbiddenSystemTableDirectAccessException' => $baseDir . '/src/core/Directus/Database/Exception/ForbiddenSystemTableDirectAccessException.php',
+ 'Directus\\Database\\Exception\\InvalidFieldException' => $baseDir . '/src/core/Directus/Database/Exception/InvalidFieldException.php',
+ 'Directus\\Database\\Exception\\InvalidQueryException' => $baseDir . '/src/core/Directus/Database/Exception/InvalidQueryException.php',
+ 'Directus\\Database\\Exception\\ItemNotFoundException' => $baseDir . '/src/core/Directus/Database/Exception/ItemNotFoundException.php',
+ 'Directus\\Database\\Exception\\RelationshipMetadataException' => $baseDir . '/src/core/Directus/Database/Exception/RelationshipMetadataException.php',
+ 'Directus\\Database\\Exception\\RevisionInvalidDeltaException' => $baseDir . '/src/core/Directus/Database/Exception/RevisionInvalidDeltaException.php',
+ 'Directus\\Database\\Exception\\RevisionNotFoundException' => $baseDir . '/src/core/Directus/Database/Exception/RevisionNotFoundException.php',
+ 'Directus\\Database\\Exception\\StatusMappingEmptyException' => $baseDir . '/src/core/Directus/Database/Exception/StatusMappingEmptyException.php',
+ 'Directus\\Database\\Exception\\StatusMappingWrongValueTypeException' => $baseDir . '/src/core/Directus/Database/Exception/StatusMappingWrongValueTypeException.php',
+ 'Directus\\Database\\Exception\\SuppliedArrayAsColumnValue' => $baseDir . '/src/core/Directus/Database/Exception/SuppliedArrayAsColumnValue.php',
+ 'Directus\\Database\\Exception\\UnknownDataTypeException' => $baseDir . '/src/core/Directus/Database/Exception/UnknownDataTypeException.php',
+ 'Directus\\Database\\Filters\\Filter' => $baseDir . '/src/core/Directus/Database/Filters/Filter.php',
+ 'Directus\\Database\\Filters\\In' => $baseDir . '/src/core/Directus/Database/Filters/In.php',
+ 'Directus\\Database\\Query\\Builder' => $baseDir . '/src/core/Directus/Database/Query/Builder.php',
+ 'Directus\\Database\\Query\\Relations\\ManyToManyRelation' => $baseDir . '/src/core/Directus/Database/Query/Relations/ManyToManyRelation.php',
+ 'Directus\\Database\\Query\\Relations\\ManyToOneRelation' => $baseDir . '/src/core/Directus/Database/Query/Relations/ManyToOneRelation.php',
+ 'Directus\\Database\\Query\\Relations\\OneToManyRelation' => $baseDir . '/src/core/Directus/Database/Query/Relations/OneToManyRelation.php',
+ 'Directus\\Database\\Repositories\\AbstractRepository' => $baseDir . '/src/core/Directus/Database/Repositories/AbstractRepository.php',
+ 'Directus\\Database\\Repositories\\Repository' => $baseDir . '/src/core/Directus/Database/Repositories/Repository.php',
+ 'Directus\\Database\\Repositories\\RepositoryFactory' => $baseDir . '/src/core/Directus/Database/Repositories/RepositoryFactory.php',
+ 'Directus\\Database\\Repositories\\RepositoryInterface' => $baseDir . '/src/core/Directus/Database/Repositories/RepositoryInterface.php',
+ 'Directus\\Database\\ResultItem' => $baseDir . '/src/core/Directus/Database/ResultItem.php',
+ 'Directus\\Database\\ResultSet' => $baseDir . '/src/core/Directus/Database/ResultSet.php',
+ 'Directus\\Database\\RowGateway\\BaseRowGateway' => $baseDir . '/src/core/Directus/Database/RowGateway/BaseRowGateway.php',
+ 'Directus\\Database\\RowGateway\\DirectusFilesRowGateway' => $baseDir . '/src/core/Directus/Database/RowGateway/DirectusMediaRowGateway.php',
+ 'Directus\\Database\\RowGateway\\DirectusUsersRowGateway' => $baseDir . '/src/core/Directus/Database/RowGateway/DirectusUsersRowGateway.php',
+ 'Directus\\Database\\SchemaService' => $baseDir . '/src/core/Directus/Database/SchemaService.php',
+ 'Directus\\Database\\Schema\\DataTypes' => $baseDir . '/src/core/Directus/Database/Schema/DataTypes.php',
+ 'Directus\\Database\\Schema\\Object\\AbstractObject' => $baseDir . '/src/core/Directus/Database/Schema/Object/AbstractObject.php',
+ 'Directus\\Database\\Schema\\Object\\Collection' => $baseDir . '/src/core/Directus/Database/Schema/Object/Collection.php',
+ 'Directus\\Database\\Schema\\Object\\Field' => $baseDir . '/src/core/Directus/Database/Schema/Object/Field.php',
+ 'Directus\\Database\\Schema\\Object\\FieldRelationship' => $baseDir . '/src/core/Directus/Database/Schema/Object/FieldRelationship.php',
+ 'Directus\\Database\\Schema\\SchemaFactory' => $baseDir . '/src/core/Directus/Database/Schema/SchemaFactory.php',
+ 'Directus\\Database\\Schema\\SchemaManager' => $baseDir . '/src/core/Directus/Database/Schema/SchemaManager.php',
+ 'Directus\\Database\\Schema\\Sources\\AbstractSchema' => $baseDir . '/src/core/Directus/Database/Schema/Sources/AbstractSchema.php',
+ 'Directus\\Database\\Schema\\Sources\\MySQLSchema' => $baseDir . '/src/core/Directus/Database/Schema/Sources/MySQLSchema.php',
+ 'Directus\\Database\\Schema\\Sources\\SQLiteSchema' => $baseDir . '/src/core/Directus/Database/Schema/Sources/SQLiteSchema.php',
+ 'Directus\\Database\\Schema\\Sources\\SchemaInterface' => $baseDir . '/src/core/Directus/Database/Schema/Sources/SchemaInterface.php',
+ 'Directus\\Database\\TableGatewayFactory' => $baseDir . '/src/core/Directus/Database/TableGatewayFactory.php',
+ 'Directus\\Database\\TableGateway\\BaseTableGateway' => $baseDir . '/src/core/Directus/Database/TableGateway/BaseTableGateway.php',
+ 'Directus\\Database\\TableGateway\\DirectusActivityTableGateway' => $baseDir . '/src/core/Directus/Database/TableGateway/DirectusActivityTableGateway.php',
+ 'Directus\\Database\\TableGateway\\DirectusCollectionPresetsTableGateway' => $baseDir . '/src/core/Directus/Database/TableGateway/DirectusCollectionPresetsTableGateway.php',
+ 'Directus\\Database\\TableGateway\\DirectusCollectionsTableGateway' => $baseDir . '/src/core/Directus/Database/TableGateway/DirectusCollectionsTableGateway.php',
+ 'Directus\\Database\\TableGateway\\DirectusPermissionsTableGateway' => $baseDir . '/src/core/Directus/Database/TableGateway/DirectusPermissionsTableGateway.php',
+ 'Directus\\Database\\TableGateway\\DirectusRolesTableGateway' => $baseDir . '/src/core/Directus/Database/TableGateway/DirectusRolesTableGateway.php',
+ 'Directus\\Database\\TableGateway\\DirectusSettingsTableGateway' => $baseDir . '/src/core/Directus/Database/TableGateway/DirectusSettingsTableGateway.php',
+ 'Directus\\Database\\TableGateway\\DirectusUsersTableGateway' => $baseDir . '/src/core/Directus/Database/TableGateway/DirectusUsersTableGateway.php',
+ 'Directus\\Database\\TableGateway\\RelationalTableGateway' => $baseDir . '/src/core/Directus/Database/TableGateway/RelationalTableGateway.php',
+ 'Directus\\Embed\\EmbedManager' => $baseDir . '/src/core/Directus/Embed/EmbedManager.php',
+ 'Directus\\Embed\\Provider\\AbstractProvider' => $baseDir . '/src/core/Directus/Embed/Provider/AbstractProvider.php',
+ 'Directus\\Embed\\Provider\\ProviderInterface' => $baseDir . '/src/core/Directus/Embed/Provider/ProviderInterface.php',
+ 'Directus\\Embed\\Provider\\VimeoProvider' => $baseDir . '/src/core/Directus/Embed/Provider/VimeoProvider.php',
+ 'Directus\\Embed\\Provider\\YoutubeProvider' => $baseDir . '/src/core/Directus/Embed/Provider/YoutubeProvider.php',
+ 'Directus\\Exception\\BadRequestException' => $baseDir . '/src/core/Directus/Exception/BadRequestException.php',
+ 'Directus\\Exception\\BadRequestExceptionInterface' => $baseDir . '/src/core/Directus/Exception/BadRequestExceptionInterface.php',
+ 'Directus\\Exception\\ConflictExceptionInterface' => $baseDir . '/src/core/Directus/Exception/ConflictExceptionInterface.php',
+ 'Directus\\Exception\\ErrorException' => $baseDir . '/src/core/Directus/Exception/ErrorException.php',
+ 'Directus\\Exception\\ErrorExceptionInterface' => $baseDir . '/src/core/Directus/Exception/ErrorExceptionInterface.php',
+ 'Directus\\Exception\\Exception' => $baseDir . '/src/core/Directus/Exception/Exception.php',
+ 'Directus\\Exception\\ForbiddenException' => $baseDir . '/src/core/Directus/Exception/ForbiddenException.php',
+ 'Directus\\Exception\\ForbiddenExceptionInterface' => $baseDir . '/src/core/Directus/Exception/ForbiddenExceptionInterface.php',
+ 'Directus\\Exception\\Http\\Auth\\ForbiddenException' => $baseDir . '/src/core/Directus/Exception/Http/Auth/ForbiddenException.php',
+ 'Directus\\Exception\\Http\\BadRequestException' => $baseDir . '/src/core/Directus/Exception/Http/BadRequestException.php',
+ 'Directus\\Exception\\Http\\NotFoundException' => $baseDir . '/src/core/Directus/Exception/Http/NotFoundException.php',
+ 'Directus\\Exception\\MethodNotAllowedException' => $baseDir . '/src/core/Directus/Exception/MethodNotAllowedException.php',
+ 'Directus\\Exception\\NotFoundException' => $baseDir . '/src/core/Directus/Exception/NotFoundException.php',
+ 'Directus\\Exception\\NotFoundExceptionInterface' => $baseDir . '/src/core/Directus/Exception/NotFoundExceptionInterface.php',
+ 'Directus\\Exception\\RuntimeException' => $baseDir . '/src/core/Directus/Exception/RuntimeException.php',
+ 'Directus\\Exception\\UnauthorizedException' => $baseDir . '/src/core/Directus/Exception/UnauthorizedException.php',
+ 'Directus\\Exception\\UnauthorizedExceptionInterface' => $baseDir . '/src/core/Directus/Exception/UnauthorizedExceptionInterface.php',
+ 'Directus\\Exception\\UnprocessableEntityExceptionInterface' => $baseDir . '/src/core/Directus/Exception/UnprocessableEntityExceptionInterface.php',
+ 'Directus\\Filesystem\\Exception\\FailedUploadException' => $baseDir . '/src/core/Directus/Filesystem/Exception/FailedUploadException.php',
+ 'Directus\\Filesystem\\Exception\\FilesystemException' => $baseDir . '/src/core/Directus/Filesystem/Exception/FilesystemException.php',
+ 'Directus\\Filesystem\\Exception\\ForbiddenException' => $baseDir . '/src/core/Directus/Filesystem/Exception/ForbiddenException.php',
+ 'Directus\\Filesystem\\Files' => $baseDir . '/src/core/Directus/Filesystem/Files.php',
+ 'Directus\\Filesystem\\Filesystem' => $baseDir . '/src/core/Directus/Filesystem/Filesystem.php',
+ 'Directus\\Filesystem\\FilesystemFactory' => $baseDir . '/src/core/Directus/Filesystem/FilesystemFactory.php',
+ 'Directus\\Filesystem\\Thumbnail' => $baseDir . '/src/core/Directus/Filesystem/Thumbnail.php',
+ 'Directus\\Filesystem\\Thumbnailer' => $baseDir . '/src/core/Directus/Filesystem/Thumbnailer.php',
+ 'Directus\\Hash\\Exception\\HasherNotFoundException' => $baseDir . '/src/core/Directus/Hash/Exception/HasherNotFoundException.php',
+ 'Directus\\Hash\\HashManager' => $baseDir . '/src/core/Directus/Hash/HashManager.php',
+ 'Directus\\Hash\\Hasher\\AbstractHashHasher' => $baseDir . '/src/core/Directus/Hash/Hasher/AbstractHashHasher.php',
+ 'Directus\\Hash\\Hasher\\BCryptHasher' => $baseDir . '/src/core/Directus/Hash/Hasher/BCryptHasher.php',
+ 'Directus\\Hash\\Hasher\\CoreHasher' => $baseDir . '/src/core/Directus/Hash/Hasher/CoreHasher.php',
+ 'Directus\\Hash\\Hasher\\HasherInterface' => $baseDir . '/src/core/Directus/Hash/Hasher/HasherInterface.php',
+ 'Directus\\Hash\\Hasher\\MD5Hasher' => $baseDir . '/src/core/Directus/Hash/Hasher/MD5Hasher.php',
+ 'Directus\\Hash\\Hasher\\Sha1Hasher' => $baseDir . '/src/core/Directus/Hash/Hasher/Sha1Hasher.php',
+ 'Directus\\Hash\\Hasher\\Sha224Hasher' => $baseDir . '/src/core/Directus/Hash/Hasher/Sha224Hasher.php',
+ 'Directus\\Hash\\Hasher\\Sha256Hasher' => $baseDir . '/src/core/Directus/Hash/Hasher/Sha256Hasher.php',
+ 'Directus\\Hash\\Hasher\\Sha384Hasher' => $baseDir . '/src/core/Directus/Hash/Hasher/Sha384Hasher.php',
+ 'Directus\\Hash\\Hasher\\Sha512Hasher' => $baseDir . '/src/core/Directus/Hash/Hasher/Sha512Hasher.php',
+ 'Directus\\Hook\\Emitter' => $baseDir . '/src/core/Directus/Hook/Emitter.php',
+ 'Directus\\Hook\\HookInterface' => $baseDir . '/src/core/Directus/Hook/HookInterface.php',
+ 'Directus\\Hook\\Payload' => $baseDir . '/src/core/Directus/Hook/Payload.php',
+ 'Directus\\Mail\\Exception\\InvalidTransportException' => $baseDir . '/src/core/Directus/Mail/Exception/InvalidTransportException.php',
+ 'Directus\\Mail\\Exception\\InvalidTransportObjectException' => $baseDir . '/src/core/Directus/Mail/Exception/InvalidTransportObjectException.php',
+ 'Directus\\Mail\\Exception\\TransportNotFoundException' => $baseDir . '/src/core/Directus/Mail/Exception/TransportNotFoundException.php',
+ 'Directus\\Mail\\Mailer' => $baseDir . '/src/core/Directus/Mail/Mailer.php',
+ 'Directus\\Mail\\Message' => $baseDir . '/src/core/Directus/Mail/Message.php',
+ 'Directus\\Mail\\TransportManager' => $baseDir . '/src/core/Directus/Mail/TransportManager.php',
+ 'Directus\\Mail\\Transports\\AbstractTransport' => $baseDir . '/src/core/Directus/Mail/Transports/AbstractTransport.php',
+ 'Directus\\Mail\\Transports\\SendMailTransport' => $baseDir . '/src/core/Directus/Mail/Transports/SendMailTransport.php',
+ 'Directus\\Mail\\Transports\\SimpleFileTransport' => $baseDir . '/src/core/Directus/Mail/Transports/SimpleFileTransport.php',
+ 'Directus\\Mail\\Transports\\SmtpTransport' => $baseDir . '/src/core/Directus/Mail/Transports/SmtpTransport.php',
+ 'Directus\\Permissions\\Acl' => $baseDir . '/src/core/Directus/Permissions/Acl.php',
+ 'Directus\\Permissions\\Exception\\ForbiddenCollectionAlterException' => $baseDir . '/src/core/Directus/Permissions/Exception/ForbiddenCollectionAlterException.php',
+ 'Directus\\Permissions\\Exception\\ForbiddenCollectionCreateException' => $baseDir . '/src/core/Directus/Permissions/Exception/ForbiddenCollectionCreateException.php',
+ 'Directus\\Permissions\\Exception\\ForbiddenCollectionDeleteException' => $baseDir . '/src/core/Directus/Permissions/Exception/ForbiddenCollectionDeleteException.php',
+ 'Directus\\Permissions\\Exception\\ForbiddenCollectionReadException' => $baseDir . '/src/core/Directus/Permissions/Exception/ForbiddenCollectionReadException.php',
+ 'Directus\\Permissions\\Exception\\ForbiddenCollectionUpdateException' => $baseDir . '/src/core/Directus/Permissions/Exception/ForbiddenCollectionUpdateException.php',
+ 'Directus\\Permissions\\Exception\\ForbiddenException' => $baseDir . '/src/core/Directus/Permissions/Exception/ForbiddenException.php',
+ 'Directus\\Permissions\\Exception\\ForbiddenFieldReadException' => $baseDir . '/src/core/Directus/Permissions/Exception/ForbiddenFieldReadException.php',
+ 'Directus\\Permissions\\Exception\\ForbiddenFieldWriteException' => $baseDir . '/src/core/Directus/Permissions/Exception/ForbiddenFieldWriteException.php',
+ 'Directus\\Permissions\\Exception\\PermissionException' => $baseDir . '/src/core/Directus/Permissions/Exception/PermissionException.php',
+ 'Directus\\Services\\AbstractExtensionsController' => $baseDir . '/src/core/Directus/Services/AbstractExtensionsController.php',
+ 'Directus\\Services\\AbstractService' => $baseDir . '/src/core/Directus/Services/AbstractService.php',
+ 'Directus\\Services\\ActivityService' => $baseDir . '/src/core/Directus/Services/ActivityService.php',
+ 'Directus\\Services\\AuthService' => $baseDir . '/src/core/Directus/Services/AuthService.php',
+ 'Directus\\Services\\CollectionPresetsService' => $baseDir . '/src/core/Directus/Services/CollectionPresetsService.php',
+ 'Directus\\Services\\FilesServices' => $baseDir . '/src/core/Directus/Services/FilesServices.php',
+ 'Directus\\Services\\InterfacesService' => $baseDir . '/src/core/Directus/Services/InterfacesService.php',
+ 'Directus\\Services\\ItemsService' => $baseDir . '/src/core/Directus/Services/ItemsService.php',
+ 'Directus\\Services\\ListingsService' => $baseDir . '/src/core/Directus/Services/ListingsService.php',
+ 'Directus\\Services\\PagesService' => $baseDir . '/src/core/Directus/Services/PagesService.php',
+ 'Directus\\Services\\PermissionsService' => $baseDir . '/src/core/Directus/Services/PermissionsService.php',
+ 'Directus\\Services\\RelationsService' => $baseDir . '/src/core/Directus/Services/RelationsService.php',
+ 'Directus\\Services\\RevisionsService' => $baseDir . '/src/core/Directus/Services/RevisionsService.php',
+ 'Directus\\Services\\RolesService' => $baseDir . '/src/core/Directus/Services/RolesService.php',
+ 'Directus\\Services\\ScimService' => $baseDir . '/src/core/Directus/Services/ScimService.php',
+ 'Directus\\Services\\ServerService' => $baseDir . '/src/core/Directus/Services/ServerService.php',
+ 'Directus\\Services\\SettingsService' => $baseDir . '/src/core/Directus/Services/SettingsService.php',
+ 'Directus\\Services\\TablesService' => $baseDir . '/src/core/Directus/Services/TablesService.php',
+ 'Directus\\Services\\UsersService' => $baseDir . '/src/core/Directus/Services/UsersService.php',
+ 'Directus\\Services\\UtilsService' => $baseDir . '/src/core/Directus/Services/UtilsService.php',
+ 'Directus\\Session\\Session' => $baseDir . '/src/core/Directus/Session/Session.php',
+ 'Directus\\Session\\Storage\\ArraySessionStorage' => $baseDir . '/src/core/Directus/Session/Storage/ArraySessionStorage.php',
+ 'Directus\\Session\\Storage\\NativeSessionStorage' => $baseDir . '/src/core/Directus/Session/Storage/NativeSessionStorage.php',
+ 'Directus\\Session\\Storage\\SessionStorageInterface' => $baseDir . '/src/core/Directus/Session/Storage/SessionStorageInterface.php',
+ 'Directus\\Slim\\Middleware' => $baseDir . '/src/core/Directus/Application/Http/Middleware/Middleware.php',
+ 'Directus\\Util\\ArrayUtils' => $baseDir . '/src/core/Directus/Util/ArrayUtils.php',
+ 'Directus\\Util\\DateTimeUtils' => $baseDir . '/src/core/Directus/Util/DateTimeUtils.php',
+ 'Directus\\Util\\Formatting' => $baseDir . '/src/core/Directus/Util/Formatting.php',
+ 'Directus\\Util\\Git' => $baseDir . '/src/core/Directus/Util/Git.php',
+ 'Directus\\Util\\Installation\\InstallerUtils' => $baseDir . '/src/core/Directus/Util/Installation/InstallerUtils.php',
+ 'Directus\\Util\\JWTUtils' => $baseDir . '/src/core/Directus/Util/JWTUtils.php',
+ 'Directus\\Util\\SchemaUtils' => $baseDir . '/src/core/Directus/Util/SchemaUtils.php',
+ 'Directus\\Util\\StringUtils' => $baseDir . '/src/core/Directus/Util/StringUtils.php',
+ 'Directus\\Validator\\Constraints\\Required' => $baseDir . '/src/core/Directus/Validator/Constraints/Required.php',
+ 'Directus\\Validator\\Constraints\\RequiredValidator' => $baseDir . '/src/core/Directus/Validator/Constraints/RequiredValidator.php',
+ 'Directus\\Validator\\Exception\\InvalidRequestException' => $baseDir . '/src/core/Directus/Validator/Exception/InvalidRequestException.php',
+ 'Directus\\Validator\\Exception\\UnknownConstraintException' => $baseDir . '/src/core/Directus/Validator/Exception/UnknownConstraintException.php',
+ 'Directus\\Validator\\Validator' => $baseDir . '/src/core/Directus/Validator/Validator.php',
+ 'Doctrine\\Common\\Cache\\ApcCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php',
+ 'Doctrine\\Common\\Cache\\ApcuCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ApcuCache.php',
+ 'Doctrine\\Common\\Cache\\ArrayCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php',
+ 'Doctrine\\Common\\Cache\\Cache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php',
+ 'Doctrine\\Common\\Cache\\CacheProvider' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php',
+ 'Doctrine\\Common\\Cache\\ChainCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php',
+ 'Doctrine\\Common\\Cache\\ClearableCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php',
+ 'Doctrine\\Common\\Cache\\CouchbaseCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php',
+ 'Doctrine\\Common\\Cache\\ExtMongoDBCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ExtMongoDBCache.php',
+ 'Doctrine\\Common\\Cache\\FileCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php',
+ 'Doctrine\\Common\\Cache\\FilesystemCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php',
+ 'Doctrine\\Common\\Cache\\FlushableCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php',
+ 'Doctrine\\Common\\Cache\\LegacyMongoDBCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/LegacyMongoDBCache.php',
+ 'Doctrine\\Common\\Cache\\MemcacheCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php',
+ 'Doctrine\\Common\\Cache\\MemcachedCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php',
+ 'Doctrine\\Common\\Cache\\MongoDBCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php',
+ 'Doctrine\\Common\\Cache\\MultiDeleteCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiDeleteCache.php',
+ 'Doctrine\\Common\\Cache\\MultiGetCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php',
+ 'Doctrine\\Common\\Cache\\MultiOperationCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiOperationCache.php',
+ 'Doctrine\\Common\\Cache\\MultiPutCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiPutCache.php',
+ 'Doctrine\\Common\\Cache\\PhpFileCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php',
+ 'Doctrine\\Common\\Cache\\PredisCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php',
+ 'Doctrine\\Common\\Cache\\RedisCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php',
+ 'Doctrine\\Common\\Cache\\RiakCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php',
+ 'Doctrine\\Common\\Cache\\SQLite3Cache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php',
+ 'Doctrine\\Common\\Cache\\Version' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/Version.php',
+ 'Doctrine\\Common\\Cache\\VoidCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php',
+ 'Doctrine\\Common\\Cache\\WinCacheCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php',
+ 'Doctrine\\Common\\Cache\\XcacheCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php',
+ 'Doctrine\\Common\\Cache\\ZendDataCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php',
+ 'Doctrine\\Instantiator\\Exception\\ExceptionInterface' => $vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php',
+ 'Doctrine\\Instantiator\\Exception\\InvalidArgumentException' => $vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php',
+ 'Doctrine\\Instantiator\\Exception\\UnexpectedValueException' => $vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php',
+ 'Doctrine\\Instantiator\\Instantiator' => $vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php',
+ 'Doctrine\\Instantiator\\InstantiatorInterface' => $vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php',
+ 'FastRoute\\BadRouteException' => $vendorDir . '/nikic/fast-route/src/BadRouteException.php',
+ 'FastRoute\\DataGenerator' => $vendorDir . '/nikic/fast-route/src/DataGenerator.php',
+ 'FastRoute\\DataGenerator\\CharCountBased' => $vendorDir . '/nikic/fast-route/src/DataGenerator/CharCountBased.php',
+ 'FastRoute\\DataGenerator\\GroupCountBased' => $vendorDir . '/nikic/fast-route/src/DataGenerator/GroupCountBased.php',
+ 'FastRoute\\DataGenerator\\GroupPosBased' => $vendorDir . '/nikic/fast-route/src/DataGenerator/GroupPosBased.php',
+ 'FastRoute\\DataGenerator\\MarkBased' => $vendorDir . '/nikic/fast-route/src/DataGenerator/MarkBased.php',
+ 'FastRoute\\DataGenerator\\RegexBasedAbstract' => $vendorDir . '/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php',
+ 'FastRoute\\Dispatcher' => $vendorDir . '/nikic/fast-route/src/Dispatcher.php',
+ 'FastRoute\\Dispatcher\\CharCountBased' => $vendorDir . '/nikic/fast-route/src/Dispatcher/CharCountBased.php',
+ 'FastRoute\\Dispatcher\\GroupCountBased' => $vendorDir . '/nikic/fast-route/src/Dispatcher/GroupCountBased.php',
+ 'FastRoute\\Dispatcher\\GroupPosBased' => $vendorDir . '/nikic/fast-route/src/Dispatcher/GroupPosBased.php',
+ 'FastRoute\\Dispatcher\\MarkBased' => $vendorDir . '/nikic/fast-route/src/Dispatcher/MarkBased.php',
+ 'FastRoute\\Dispatcher\\RegexBasedAbstract' => $vendorDir . '/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php',
+ 'FastRoute\\Route' => $vendorDir . '/nikic/fast-route/src/Route.php',
+ 'FastRoute\\RouteCollector' => $vendorDir . '/nikic/fast-route/src/RouteCollector.php',
+ 'FastRoute\\RouteParser' => $vendorDir . '/nikic/fast-route/src/RouteParser.php',
+ 'FastRoute\\RouteParser\\Std' => $vendorDir . '/nikic/fast-route/src/RouteParser/Std.php',
+ 'File_Iterator' => $vendorDir . '/phpunit/php-file-iterator/src/Iterator.php',
+ 'File_Iterator_Facade' => $vendorDir . '/phpunit/php-file-iterator/src/Facade.php',
+ 'File_Iterator_Factory' => $vendorDir . '/phpunit/php-file-iterator/src/Factory.php',
+ 'Firebase\\JWT\\BeforeValidException' => $vendorDir . '/firebase/php-jwt/src/BeforeValidException.php',
+ 'Firebase\\JWT\\ExpiredException' => $vendorDir . '/firebase/php-jwt/src/ExpiredException.php',
+ 'Firebase\\JWT\\JWT' => $vendorDir . '/firebase/php-jwt/src/JWT.php',
+ 'Firebase\\JWT\\SignatureInvalidException' => $vendorDir . '/firebase/php-jwt/src/SignatureInvalidException.php',
+ 'GuzzleHttp\\Client' => $vendorDir . '/guzzlehttp/guzzle/src/Client.php',
+ 'GuzzleHttp\\ClientInterface' => $vendorDir . '/guzzlehttp/guzzle/src/ClientInterface.php',
+ 'GuzzleHttp\\Cookie\\CookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/CookieJar.php',
+ 'GuzzleHttp\\Cookie\\CookieJarInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php',
+ 'GuzzleHttp\\Cookie\\FileCookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php',
+ 'GuzzleHttp\\Cookie\\SessionCookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php',
+ 'GuzzleHttp\\Cookie\\SetCookie' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/SetCookie.php',
+ 'GuzzleHttp\\Exception\\BadResponseException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/BadResponseException.php',
+ 'GuzzleHttp\\Exception\\ClientException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ClientException.php',
+ 'GuzzleHttp\\Exception\\ConnectException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ConnectException.php',
+ 'GuzzleHttp\\Exception\\GuzzleException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/GuzzleException.php',
+ 'GuzzleHttp\\Exception\\RequestException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/RequestException.php',
+ 'GuzzleHttp\\Exception\\SeekException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/SeekException.php',
+ 'GuzzleHttp\\Exception\\ServerException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ServerException.php',
+ 'GuzzleHttp\\Exception\\TooManyRedirectsException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php',
+ 'GuzzleHttp\\Exception\\TransferException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/TransferException.php',
+ 'GuzzleHttp\\HandlerStack' => $vendorDir . '/guzzlehttp/guzzle/src/HandlerStack.php',
+ 'GuzzleHttp\\Handler\\CurlFactory' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlFactory.php',
+ 'GuzzleHttp\\Handler\\CurlFactoryInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php',
+ 'GuzzleHttp\\Handler\\CurlHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlHandler.php',
+ 'GuzzleHttp\\Handler\\CurlMultiHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php',
+ 'GuzzleHttp\\Handler\\EasyHandle' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/EasyHandle.php',
+ 'GuzzleHttp\\Handler\\MockHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/MockHandler.php',
+ 'GuzzleHttp\\Handler\\Proxy' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/Proxy.php',
+ 'GuzzleHttp\\Handler\\StreamHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php',
+ 'GuzzleHttp\\MessageFormatter' => $vendorDir . '/guzzlehttp/guzzle/src/MessageFormatter.php',
+ 'GuzzleHttp\\Middleware' => $vendorDir . '/guzzlehttp/guzzle/src/Middleware.php',
+ 'GuzzleHttp\\Pool' => $vendorDir . '/guzzlehttp/guzzle/src/Pool.php',
+ 'GuzzleHttp\\PrepareBodyMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php',
+ 'GuzzleHttp\\Promise\\AggregateException' => $vendorDir . '/guzzlehttp/promises/src/AggregateException.php',
+ 'GuzzleHttp\\Promise\\CancellationException' => $vendorDir . '/guzzlehttp/promises/src/CancellationException.php',
+ 'GuzzleHttp\\Promise\\Coroutine' => $vendorDir . '/guzzlehttp/promises/src/Coroutine.php',
+ 'GuzzleHttp\\Promise\\EachPromise' => $vendorDir . '/guzzlehttp/promises/src/EachPromise.php',
+ 'GuzzleHttp\\Promise\\FulfilledPromise' => $vendorDir . '/guzzlehttp/promises/src/FulfilledPromise.php',
+ 'GuzzleHttp\\Promise\\Promise' => $vendorDir . '/guzzlehttp/promises/src/Promise.php',
+ 'GuzzleHttp\\Promise\\PromiseInterface' => $vendorDir . '/guzzlehttp/promises/src/PromiseInterface.php',
+ 'GuzzleHttp\\Promise\\PromisorInterface' => $vendorDir . '/guzzlehttp/promises/src/PromisorInterface.php',
+ 'GuzzleHttp\\Promise\\RejectedPromise' => $vendorDir . '/guzzlehttp/promises/src/RejectedPromise.php',
+ 'GuzzleHttp\\Promise\\RejectionException' => $vendorDir . '/guzzlehttp/promises/src/RejectionException.php',
+ 'GuzzleHttp\\Promise\\TaskQueue' => $vendorDir . '/guzzlehttp/promises/src/TaskQueue.php',
+ 'GuzzleHttp\\Promise\\TaskQueueInterface' => $vendorDir . '/guzzlehttp/promises/src/TaskQueueInterface.php',
+ 'GuzzleHttp\\Psr7\\AppendStream' => $vendorDir . '/guzzlehttp/psr7/src/AppendStream.php',
+ 'GuzzleHttp\\Psr7\\BufferStream' => $vendorDir . '/guzzlehttp/psr7/src/BufferStream.php',
+ 'GuzzleHttp\\Psr7\\CachingStream' => $vendorDir . '/guzzlehttp/psr7/src/CachingStream.php',
+ 'GuzzleHttp\\Psr7\\DroppingStream' => $vendorDir . '/guzzlehttp/psr7/src/DroppingStream.php',
+ 'GuzzleHttp\\Psr7\\FnStream' => $vendorDir . '/guzzlehttp/psr7/src/FnStream.php',
+ 'GuzzleHttp\\Psr7\\InflateStream' => $vendorDir . '/guzzlehttp/psr7/src/InflateStream.php',
+ 'GuzzleHttp\\Psr7\\LazyOpenStream' => $vendorDir . '/guzzlehttp/psr7/src/LazyOpenStream.php',
+ 'GuzzleHttp\\Psr7\\LimitStream' => $vendorDir . '/guzzlehttp/psr7/src/LimitStream.php',
+ 'GuzzleHttp\\Psr7\\MessageTrait' => $vendorDir . '/guzzlehttp/psr7/src/MessageTrait.php',
+ 'GuzzleHttp\\Psr7\\MultipartStream' => $vendorDir . '/guzzlehttp/psr7/src/MultipartStream.php',
+ 'GuzzleHttp\\Psr7\\NoSeekStream' => $vendorDir . '/guzzlehttp/psr7/src/NoSeekStream.php',
+ 'GuzzleHttp\\Psr7\\PumpStream' => $vendorDir . '/guzzlehttp/psr7/src/PumpStream.php',
+ 'GuzzleHttp\\Psr7\\Request' => $vendorDir . '/guzzlehttp/psr7/src/Request.php',
+ 'GuzzleHttp\\Psr7\\Response' => $vendorDir . '/guzzlehttp/psr7/src/Response.php',
+ 'GuzzleHttp\\Psr7\\ServerRequest' => $vendorDir . '/guzzlehttp/psr7/src/ServerRequest.php',
+ 'GuzzleHttp\\Psr7\\Stream' => $vendorDir . '/guzzlehttp/psr7/src/Stream.php',
+ 'GuzzleHttp\\Psr7\\StreamDecoratorTrait' => $vendorDir . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php',
+ 'GuzzleHttp\\Psr7\\StreamWrapper' => $vendorDir . '/guzzlehttp/psr7/src/StreamWrapper.php',
+ 'GuzzleHttp\\Psr7\\UploadedFile' => $vendorDir . '/guzzlehttp/psr7/src/UploadedFile.php',
+ 'GuzzleHttp\\Psr7\\Uri' => $vendorDir . '/guzzlehttp/psr7/src/Uri.php',
+ 'GuzzleHttp\\Psr7\\UriNormalizer' => $vendorDir . '/guzzlehttp/psr7/src/UriNormalizer.php',
+ 'GuzzleHttp\\Psr7\\UriResolver' => $vendorDir . '/guzzlehttp/psr7/src/UriResolver.php',
+ 'GuzzleHttp\\RedirectMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/RedirectMiddleware.php',
+ 'GuzzleHttp\\RequestOptions' => $vendorDir . '/guzzlehttp/guzzle/src/RequestOptions.php',
+ 'GuzzleHttp\\RetryMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/RetryMiddleware.php',
+ 'GuzzleHttp\\TransferStats' => $vendorDir . '/guzzlehttp/guzzle/src/TransferStats.php',
+ 'GuzzleHttp\\UriTemplate' => $vendorDir . '/guzzlehttp/guzzle/src/UriTemplate.php',
+ 'Interop\\Container\\ContainerInterface' => $vendorDir . '/container-interop/container-interop/src/Interop/Container/ContainerInterface.php',
+ 'Interop\\Container\\Exception\\ContainerException' => $vendorDir . '/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php',
+ 'Interop\\Container\\Exception\\NotFoundException' => $vendorDir . '/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php',
+ 'Intervention\\Image\\AbstractColor' => $vendorDir . '/intervention/image/src/Intervention/Image/AbstractColor.php',
+ 'Intervention\\Image\\AbstractDecoder' => $vendorDir . '/intervention/image/src/Intervention/Image/AbstractDecoder.php',
+ 'Intervention\\Image\\AbstractDriver' => $vendorDir . '/intervention/image/src/Intervention/Image/AbstractDriver.php',
+ 'Intervention\\Image\\AbstractEncoder' => $vendorDir . '/intervention/image/src/Intervention/Image/AbstractEncoder.php',
+ 'Intervention\\Image\\AbstractFont' => $vendorDir . '/intervention/image/src/Intervention/Image/AbstractFont.php',
+ 'Intervention\\Image\\AbstractShape' => $vendorDir . '/intervention/image/src/Intervention/Image/AbstractShape.php',
+ 'Intervention\\Image\\Commands\\AbstractCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Commands/AbstractCommand.php',
+ 'Intervention\\Image\\Commands\\Argument' => $vendorDir . '/intervention/image/src/Intervention/Image/Commands/Argument.php',
+ 'Intervention\\Image\\Commands\\ChecksumCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Commands/ChecksumCommand.php',
+ 'Intervention\\Image\\Commands\\CircleCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Commands/CircleCommand.php',
+ 'Intervention\\Image\\Commands\\EllipseCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Commands/EllipseCommand.php',
+ 'Intervention\\Image\\Commands\\ExifCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Commands/ExifCommand.php',
+ 'Intervention\\Image\\Commands\\IptcCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Commands/IptcCommand.php',
+ 'Intervention\\Image\\Commands\\LineCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Commands/LineCommand.php',
+ 'Intervention\\Image\\Commands\\OrientateCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Commands/OrientateCommand.php',
+ 'Intervention\\Image\\Commands\\PolygonCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Commands/PolygonCommand.php',
+ 'Intervention\\Image\\Commands\\PsrResponseCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Commands/PsrResponseCommand.php',
+ 'Intervention\\Image\\Commands\\RectangleCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Commands/RectangleCommand.php',
+ 'Intervention\\Image\\Commands\\ResponseCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Commands/ResponseCommand.php',
+ 'Intervention\\Image\\Commands\\StreamCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Commands/StreamCommand.php',
+ 'Intervention\\Image\\Commands\\TextCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Commands/TextCommand.php',
+ 'Intervention\\Image\\Constraint' => $vendorDir . '/intervention/image/src/Intervention/Image/Constraint.php',
+ 'Intervention\\Image\\Exception\\ImageException' => $vendorDir . '/intervention/image/src/Intervention/Image/Exception/ImageException.php',
+ 'Intervention\\Image\\Exception\\InvalidArgumentException' => $vendorDir . '/intervention/image/src/Intervention/Image/Exception/InvalidArgumentException.php',
+ 'Intervention\\Image\\Exception\\MissingDependencyException' => $vendorDir . '/intervention/image/src/Intervention/Image/Exception/MissingDependencyException.php',
+ 'Intervention\\Image\\Exception\\NotFoundException' => $vendorDir . '/intervention/image/src/Intervention/Image/Exception/NotFoundException.php',
+ 'Intervention\\Image\\Exception\\NotReadableException' => $vendorDir . '/intervention/image/src/Intervention/Image/Exception/NotReadableException.php',
+ 'Intervention\\Image\\Exception\\NotSupportedException' => $vendorDir . '/intervention/image/src/Intervention/Image/Exception/NotSupportedException.php',
+ 'Intervention\\Image\\Exception\\NotWritableException' => $vendorDir . '/intervention/image/src/Intervention/Image/Exception/NotWritableException.php',
+ 'Intervention\\Image\\Exception\\RuntimeException' => $vendorDir . '/intervention/image/src/Intervention/Image/Exception/RuntimeException.php',
+ 'Intervention\\Image\\Facades\\Image' => $vendorDir . '/intervention/image/src/Intervention/Image/Facades/Image.php',
+ 'Intervention\\Image\\File' => $vendorDir . '/intervention/image/src/Intervention/Image/File.php',
+ 'Intervention\\Image\\Filters\\DemoFilter' => $vendorDir . '/intervention/image/src/Intervention/Image/Filters/DemoFilter.php',
+ 'Intervention\\Image\\Filters\\FilterInterface' => $vendorDir . '/intervention/image/src/Intervention/Image/Filters/FilterInterface.php',
+ 'Intervention\\Image\\Gd\\Color' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Color.php',
+ 'Intervention\\Image\\Gd\\Commands\\BackupCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/BackupCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\BlurCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/BlurCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\BrightnessCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/BrightnessCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\ColorizeCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/ColorizeCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\ContrastCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/ContrastCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\CropCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/CropCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\DestroyCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/DestroyCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\FillCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/FillCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\FitCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/FitCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\FlipCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/FlipCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\GammaCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/GammaCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\GetSizeCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/GetSizeCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\GreyscaleCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/GreyscaleCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\HeightenCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/HeightenCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\InsertCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/InsertCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\InterlaceCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/InterlaceCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\InvertCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/InvertCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\LimitColorsCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/LimitColorsCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\MaskCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/MaskCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\OpacityCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/OpacityCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\PickColorCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/PickColorCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\PixelCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/PixelCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\PixelateCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/PixelateCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\ResetCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/ResetCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\ResizeCanvasCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/ResizeCanvasCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\ResizeCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/ResizeCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\RotateCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/RotateCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\SharpenCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/SharpenCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\TrimCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/TrimCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\WidenCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Commands/WidenCommand.php',
+ 'Intervention\\Image\\Gd\\Decoder' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Decoder.php',
+ 'Intervention\\Image\\Gd\\Driver' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Driver.php',
+ 'Intervention\\Image\\Gd\\Encoder' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Encoder.php',
+ 'Intervention\\Image\\Gd\\Font' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Font.php',
+ 'Intervention\\Image\\Gd\\Shapes\\CircleShape' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Shapes/CircleShape.php',
+ 'Intervention\\Image\\Gd\\Shapes\\EllipseShape' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Shapes/EllipseShape.php',
+ 'Intervention\\Image\\Gd\\Shapes\\LineShape' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Shapes/LineShape.php',
+ 'Intervention\\Image\\Gd\\Shapes\\PolygonShape' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Shapes/PolygonShape.php',
+ 'Intervention\\Image\\Gd\\Shapes\\RectangleShape' => $vendorDir . '/intervention/image/src/Intervention/Image/Gd/Shapes/RectangleShape.php',
+ 'Intervention\\Image\\Image' => $vendorDir . '/intervention/image/src/Intervention/Image/Image.php',
+ 'Intervention\\Image\\ImageManager' => $vendorDir . '/intervention/image/src/Intervention/Image/ImageManager.php',
+ 'Intervention\\Image\\ImageManagerStatic' => $vendorDir . '/intervention/image/src/Intervention/Image/ImageManagerStatic.php',
+ 'Intervention\\Image\\ImageServiceProvider' => $vendorDir . '/intervention/image/src/Intervention/Image/ImageServiceProvider.php',
+ 'Intervention\\Image\\ImageServiceProviderLaravel4' => $vendorDir . '/intervention/image/src/Intervention/Image/ImageServiceProviderLaravel4.php',
+ 'Intervention\\Image\\ImageServiceProviderLaravel5' => $vendorDir . '/intervention/image/src/Intervention/Image/ImageServiceProviderLaravel5.php',
+ 'Intervention\\Image\\ImageServiceProviderLeague' => $vendorDir . '/intervention/image/src/Intervention/Image/ImageServiceProviderLeague.php',
+ 'Intervention\\Image\\ImageServiceProviderLumen' => $vendorDir . '/intervention/image/src/Intervention/Image/ImageServiceProviderLumen.php',
+ 'Intervention\\Image\\Imagick\\Color' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Color.php',
+ 'Intervention\\Image\\Imagick\\Commands\\BackupCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/BackupCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\BlurCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/BlurCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\BrightnessCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/BrightnessCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\ColorizeCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/ColorizeCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\ContrastCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/ContrastCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\CropCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/CropCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\DestroyCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/DestroyCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\ExifCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/ExifCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\FillCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/FillCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\FitCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/FitCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\FlipCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/FlipCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\GammaCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/GammaCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\GetSizeCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/GetSizeCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\GreyscaleCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/GreyscaleCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\HeightenCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/HeightenCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\InsertCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/InsertCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\InterlaceCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/InterlaceCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\InvertCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/InvertCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\LimitColorsCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/LimitColorsCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\MaskCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/MaskCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\OpacityCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/OpacityCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\PickColorCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/PickColorCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\PixelCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/PixelCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\PixelateCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/PixelateCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\ResetCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/ResetCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\ResizeCanvasCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/ResizeCanvasCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\ResizeCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/ResizeCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\RotateCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/RotateCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\SharpenCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/SharpenCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\TrimCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/TrimCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\WidenCommand' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Commands/WidenCommand.php',
+ 'Intervention\\Image\\Imagick\\Decoder' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Decoder.php',
+ 'Intervention\\Image\\Imagick\\Driver' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Driver.php',
+ 'Intervention\\Image\\Imagick\\Encoder' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Encoder.php',
+ 'Intervention\\Image\\Imagick\\Font' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Font.php',
+ 'Intervention\\Image\\Imagick\\Shapes\\CircleShape' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Shapes/CircleShape.php',
+ 'Intervention\\Image\\Imagick\\Shapes\\EllipseShape' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Shapes/EllipseShape.php',
+ 'Intervention\\Image\\Imagick\\Shapes\\LineShape' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Shapes/LineShape.php',
+ 'Intervention\\Image\\Imagick\\Shapes\\PolygonShape' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Shapes/PolygonShape.php',
+ 'Intervention\\Image\\Imagick\\Shapes\\RectangleShape' => $vendorDir . '/intervention/image/src/Intervention/Image/Imagick/Shapes/RectangleShape.php',
+ 'Intervention\\Image\\Point' => $vendorDir . '/intervention/image/src/Intervention/Image/Point.php',
+ 'Intervention\\Image\\Response' => $vendorDir . '/intervention/image/src/Intervention/Image/Response.php',
+ 'Intervention\\Image\\Size' => $vendorDir . '/intervention/image/src/Intervention/Image/Size.php',
+ 'League\\Flysystem\\AdapterInterface' => $vendorDir . '/league/flysystem/src/AdapterInterface.php',
+ 'League\\Flysystem\\Adapter\\AbstractAdapter' => $vendorDir . '/league/flysystem/src/Adapter/AbstractAdapter.php',
+ 'League\\Flysystem\\Adapter\\AbstractFtpAdapter' => $vendorDir . '/league/flysystem/src/Adapter/AbstractFtpAdapter.php',
+ 'League\\Flysystem\\Adapter\\CanOverwriteFiles' => $vendorDir . '/league/flysystem/src/Adapter/CanOverwriteFiles.php',
+ 'League\\Flysystem\\Adapter\\Ftp' => $vendorDir . '/league/flysystem/src/Adapter/Ftp.php',
+ 'League\\Flysystem\\Adapter\\Ftpd' => $vendorDir . '/league/flysystem/src/Adapter/Ftpd.php',
+ 'League\\Flysystem\\Adapter\\Local' => $vendorDir . '/league/flysystem/src/Adapter/Local.php',
+ 'League\\Flysystem\\Adapter\\NullAdapter' => $vendorDir . '/league/flysystem/src/Adapter/NullAdapter.php',
+ 'League\\Flysystem\\Adapter\\Polyfill\\NotSupportingVisibilityTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php',
+ 'League\\Flysystem\\Adapter\\Polyfill\\StreamedCopyTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/StreamedCopyTrait.php',
+ 'League\\Flysystem\\Adapter\\Polyfill\\StreamedReadingTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php',
+ 'League\\Flysystem\\Adapter\\Polyfill\\StreamedTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php',
+ 'League\\Flysystem\\Adapter\\Polyfill\\StreamedWritingTrait' => $vendorDir . '/league/flysystem/src/Adapter/Polyfill/StreamedWritingTrait.php',
+ 'League\\Flysystem\\Adapter\\SynologyFtp' => $vendorDir . '/league/flysystem/src/Adapter/SynologyFtp.php',
+ 'League\\Flysystem\\Config' => $vendorDir . '/league/flysystem/src/Config.php',
+ 'League\\Flysystem\\ConfigAwareTrait' => $vendorDir . '/league/flysystem/src/ConfigAwareTrait.php',
+ 'League\\Flysystem\\Directory' => $vendorDir . '/league/flysystem/src/Directory.php',
+ 'League\\Flysystem\\Exception' => $vendorDir . '/league/flysystem/src/Exception.php',
+ 'League\\Flysystem\\File' => $vendorDir . '/league/flysystem/src/File.php',
+ 'League\\Flysystem\\FileExistsException' => $vendorDir . '/league/flysystem/src/FileExistsException.php',
+ 'League\\Flysystem\\FileNotFoundException' => $vendorDir . '/league/flysystem/src/FileNotFoundException.php',
+ 'League\\Flysystem\\Filesystem' => $vendorDir . '/league/flysystem/src/Filesystem.php',
+ 'League\\Flysystem\\FilesystemInterface' => $vendorDir . '/league/flysystem/src/FilesystemInterface.php',
+ 'League\\Flysystem\\FilesystemNotFoundException' => $vendorDir . '/league/flysystem/src/FilesystemNotFoundException.php',
+ 'League\\Flysystem\\Handler' => $vendorDir . '/league/flysystem/src/Handler.php',
+ 'League\\Flysystem\\MountManager' => $vendorDir . '/league/flysystem/src/MountManager.php',
+ 'League\\Flysystem\\NotSupportedException' => $vendorDir . '/league/flysystem/src/NotSupportedException.php',
+ 'League\\Flysystem\\PluginInterface' => $vendorDir . '/league/flysystem/src/PluginInterface.php',
+ 'League\\Flysystem\\Plugin\\AbstractPlugin' => $vendorDir . '/league/flysystem/src/Plugin/AbstractPlugin.php',
+ 'League\\Flysystem\\Plugin\\EmptyDir' => $vendorDir . '/league/flysystem/src/Plugin/EmptyDir.php',
+ 'League\\Flysystem\\Plugin\\ForcedCopy' => $vendorDir . '/league/flysystem/src/Plugin/ForcedCopy.php',
+ 'League\\Flysystem\\Plugin\\ForcedRename' => $vendorDir . '/league/flysystem/src/Plugin/ForcedRename.php',
+ 'League\\Flysystem\\Plugin\\GetWithMetadata' => $vendorDir . '/league/flysystem/src/Plugin/GetWithMetadata.php',
+ 'League\\Flysystem\\Plugin\\ListFiles' => $vendorDir . '/league/flysystem/src/Plugin/ListFiles.php',
+ 'League\\Flysystem\\Plugin\\ListPaths' => $vendorDir . '/league/flysystem/src/Plugin/ListPaths.php',
+ 'League\\Flysystem\\Plugin\\ListWith' => $vendorDir . '/league/flysystem/src/Plugin/ListWith.php',
+ 'League\\Flysystem\\Plugin\\PluggableTrait' => $vendorDir . '/league/flysystem/src/Plugin/PluggableTrait.php',
+ 'League\\Flysystem\\Plugin\\PluginNotFoundException' => $vendorDir . '/league/flysystem/src/Plugin/PluginNotFoundException.php',
+ 'League\\Flysystem\\ReadInterface' => $vendorDir . '/league/flysystem/src/ReadInterface.php',
+ 'League\\Flysystem\\RootViolationException' => $vendorDir . '/league/flysystem/src/RootViolationException.php',
+ 'League\\Flysystem\\SafeStorage' => $vendorDir . '/league/flysystem/src/SafeStorage.php',
+ 'League\\Flysystem\\UnreadableFileException' => $vendorDir . '/league/flysystem/src/UnreadableFileException.php',
+ 'League\\Flysystem\\Util' => $vendorDir . '/league/flysystem/src/Util.php',
+ 'League\\Flysystem\\Util\\ContentListingFormatter' => $vendorDir . '/league/flysystem/src/Util/ContentListingFormatter.php',
+ 'League\\Flysystem\\Util\\MimeType' => $vendorDir . '/league/flysystem/src/Util/MimeType.php',
+ 'League\\Flysystem\\Util\\StreamHasher' => $vendorDir . '/league/flysystem/src/Util/StreamHasher.php',
+ 'League\\OAuth1\\Client\\Credentials\\ClientCredentials' => $vendorDir . '/league/oauth1-client/src/Client/Credentials/ClientCredentials.php',
+ 'League\\OAuth1\\Client\\Credentials\\ClientCredentialsInterface' => $vendorDir . '/league/oauth1-client/src/Client/Credentials/ClientCredentialsInterface.php',
+ 'League\\OAuth1\\Client\\Credentials\\Credentials' => $vendorDir . '/league/oauth1-client/src/Client/Credentials/Credentials.php',
+ 'League\\OAuth1\\Client\\Credentials\\CredentialsException' => $vendorDir . '/league/oauth1-client/src/Client/Credentials/CredentialsException.php',
+ 'League\\OAuth1\\Client\\Credentials\\CredentialsInterface' => $vendorDir . '/league/oauth1-client/src/Client/Credentials/CredentialsInterface.php',
+ 'League\\OAuth1\\Client\\Credentials\\TemporaryCredentials' => $vendorDir . '/league/oauth1-client/src/Client/Credentials/TemporaryCredentials.php',
+ 'League\\OAuth1\\Client\\Credentials\\TokenCredentials' => $vendorDir . '/league/oauth1-client/src/Client/Credentials/TokenCredentials.php',
+ 'League\\OAuth1\\Client\\Server\\Bitbucket' => $vendorDir . '/league/oauth1-client/src/Client/Server/Bitbucket.php',
+ 'League\\OAuth1\\Client\\Server\\Magento' => $vendorDir . '/league/oauth1-client/src/Client/Server/Magento.php',
+ 'League\\OAuth1\\Client\\Server\\Server' => $vendorDir . '/league/oauth1-client/src/Client/Server/Server.php',
+ 'League\\OAuth1\\Client\\Server\\Trello' => $vendorDir . '/league/oauth1-client/src/Client/Server/Trello.php',
+ 'League\\OAuth1\\Client\\Server\\Tumblr' => $vendorDir . '/league/oauth1-client/src/Client/Server/Tumblr.php',
+ 'League\\OAuth1\\Client\\Server\\Twitter' => $vendorDir . '/league/oauth1-client/src/Client/Server/Twitter.php',
+ 'League\\OAuth1\\Client\\Server\\User' => $vendorDir . '/league/oauth1-client/src/Client/Server/User.php',
+ 'League\\OAuth1\\Client\\Server\\Uservoice' => $vendorDir . '/league/oauth1-client/src/Client/Server/Uservoice.php',
+ 'League\\OAuth1\\Client\\Server\\Xing' => $vendorDir . '/league/oauth1-client/src/Client/Server/Xing.php',
+ 'League\\OAuth1\\Client\\Signature\\HmacSha1Signature' => $vendorDir . '/league/oauth1-client/src/Client/Signature/HmacSha1Signature.php',
+ 'League\\OAuth1\\Client\\Signature\\PlainTextSignature' => $vendorDir . '/league/oauth1-client/src/Client/Signature/PlainTextSignature.php',
+ 'League\\OAuth1\\Client\\Signature\\Signature' => $vendorDir . '/league/oauth1-client/src/Client/Signature/Signature.php',
+ 'League\\OAuth1\\Client\\Signature\\SignatureInterface' => $vendorDir . '/league/oauth1-client/src/Client/Signature/SignatureInterface.php',
+ 'League\\OAuth2\\Client\\Exception\\HostedDomainException' => $vendorDir . '/league/oauth2-google/src/Exception/HostedDomainException.php',
+ 'League\\OAuth2\\Client\\Grant\\AbstractGrant' => $vendorDir . '/league/oauth2-client/src/Grant/AbstractGrant.php',
+ 'League\\OAuth2\\Client\\Grant\\AuthorizationCode' => $vendorDir . '/league/oauth2-client/src/Grant/AuthorizationCode.php',
+ 'League\\OAuth2\\Client\\Grant\\ClientCredentials' => $vendorDir . '/league/oauth2-client/src/Grant/ClientCredentials.php',
+ 'League\\OAuth2\\Client\\Grant\\Exception\\InvalidGrantException' => $vendorDir . '/league/oauth2-client/src/Grant/Exception/InvalidGrantException.php',
+ 'League\\OAuth2\\Client\\Grant\\FbExchangeToken' => $vendorDir . '/league/oauth2-facebook/src/Grant/FbExchangeToken.php',
+ 'League\\OAuth2\\Client\\Grant\\GrantFactory' => $vendorDir . '/league/oauth2-client/src/Grant/GrantFactory.php',
+ 'League\\OAuth2\\Client\\Grant\\Password' => $vendorDir . '/league/oauth2-client/src/Grant/Password.php',
+ 'League\\OAuth2\\Client\\Grant\\RefreshToken' => $vendorDir . '/league/oauth2-client/src/Grant/RefreshToken.php',
+ 'League\\OAuth2\\Client\\Provider\\AbstractProvider' => $vendorDir . '/league/oauth2-client/src/Provider/AbstractProvider.php',
+ 'League\\OAuth2\\Client\\Provider\\AppSecretProof' => $vendorDir . '/league/oauth2-facebook/src/Provider/AppSecretProof.php',
+ 'League\\OAuth2\\Client\\Provider\\Exception\\FacebookProviderException' => $vendorDir . '/league/oauth2-facebook/src/Provider/Exception/FacebookProviderException.php',
+ 'League\\OAuth2\\Client\\Provider\\Exception\\GithubIdentityProviderException' => $vendorDir . '/league/oauth2-github/src/Provider/Exception/GithubIdentityProviderException.php',
+ 'League\\OAuth2\\Client\\Provider\\Exception\\IdentityProviderException' => $vendorDir . '/league/oauth2-client/src/Provider/Exception/IdentityProviderException.php',
+ 'League\\OAuth2\\Client\\Provider\\Facebook' => $vendorDir . '/league/oauth2-facebook/src/Provider/Facebook.php',
+ 'League\\OAuth2\\Client\\Provider\\FacebookUser' => $vendorDir . '/league/oauth2-facebook/src/Provider/FacebookUser.php',
+ 'League\\OAuth2\\Client\\Provider\\GenericProvider' => $vendorDir . '/league/oauth2-client/src/Provider/GenericProvider.php',
+ 'League\\OAuth2\\Client\\Provider\\GenericResourceOwner' => $vendorDir . '/league/oauth2-client/src/Provider/GenericResourceOwner.php',
+ 'League\\OAuth2\\Client\\Provider\\Github' => $vendorDir . '/league/oauth2-github/src/Provider/Github.php',
+ 'League\\OAuth2\\Client\\Provider\\GithubResourceOwner' => $vendorDir . '/league/oauth2-github/src/Provider/GithubResourceOwner.php',
+ 'League\\OAuth2\\Client\\Provider\\Google' => $vendorDir . '/league/oauth2-google/src/Provider/Google.php',
+ 'League\\OAuth2\\Client\\Provider\\GoogleUser' => $vendorDir . '/league/oauth2-google/src/Provider/GoogleUser.php',
+ 'League\\OAuth2\\Client\\Provider\\ResourceOwnerInterface' => $vendorDir . '/league/oauth2-client/src/Provider/ResourceOwnerInterface.php',
+ 'League\\OAuth2\\Client\\Token\\AccessToken' => $vendorDir . '/league/oauth2-client/src/Token/AccessToken.php',
+ 'League\\OAuth2\\Client\\Tool\\ArrayAccessorTrait' => $vendorDir . '/league/oauth2-client/src/Tool/ArrayAccessorTrait.php',
+ 'League\\OAuth2\\Client\\Tool\\BearerAuthorizationTrait' => $vendorDir . '/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php',
+ 'League\\OAuth2\\Client\\Tool\\MacAuthorizationTrait' => $vendorDir . '/league/oauth2-client/src/Tool/MacAuthorizationTrait.php',
+ 'League\\OAuth2\\Client\\Tool\\ProviderRedirectTrait' => $vendorDir . '/league/oauth2-client/src/Tool/ProviderRedirectTrait.php',
+ 'League\\OAuth2\\Client\\Tool\\QueryBuilderTrait' => $vendorDir . '/league/oauth2-client/src/Tool/QueryBuilderTrait.php',
+ 'League\\OAuth2\\Client\\Tool\\RequestFactory' => $vendorDir . '/league/oauth2-client/src/Tool/RequestFactory.php',
+ 'League\\OAuth2\\Client\\Tool\\RequiredParameterTrait' => $vendorDir . '/league/oauth2-client/src/Tool/RequiredParameterTrait.php',
+ 'Monolog\\ErrorHandler' => $vendorDir . '/monolog/monolog/src/Monolog/ErrorHandler.php',
+ 'Monolog\\Formatter\\ChromePHPFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php',
+ 'Monolog\\Formatter\\ElasticaFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php',
+ 'Monolog\\Formatter\\FlowdockFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php',
+ 'Monolog\\Formatter\\FluentdFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php',
+ 'Monolog\\Formatter\\FormatterInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php',
+ 'Monolog\\Formatter\\GelfMessageFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php',
+ 'Monolog\\Formatter\\HtmlFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php',
+ 'Monolog\\Formatter\\JsonFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php',
+ 'Monolog\\Formatter\\LineFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LineFormatter.php',
+ 'Monolog\\Formatter\\LogglyFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php',
+ 'Monolog\\Formatter\\LogstashFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php',
+ 'Monolog\\Formatter\\MongoDBFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php',
+ 'Monolog\\Formatter\\NormalizerFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php',
+ 'Monolog\\Formatter\\ScalarFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php',
+ 'Monolog\\Formatter\\WildfireFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php',
+ 'Monolog\\Handler\\AbstractHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AbstractHandler.php',
+ 'Monolog\\Handler\\AbstractProcessingHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php',
+ 'Monolog\\Handler\\AbstractSyslogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php',
+ 'Monolog\\Handler\\AmqpHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AmqpHandler.php',
+ 'Monolog\\Handler\\BrowserConsoleHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php',
+ 'Monolog\\Handler\\BufferHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/BufferHandler.php',
+ 'Monolog\\Handler\\ChromePHPHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php',
+ 'Monolog\\Handler\\CouchDBHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php',
+ 'Monolog\\Handler\\CubeHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/CubeHandler.php',
+ 'Monolog\\Handler\\Curl\\Util' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/Curl/Util.php',
+ 'Monolog\\Handler\\DeduplicationHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php',
+ 'Monolog\\Handler\\DoctrineCouchDBHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php',
+ 'Monolog\\Handler\\DynamoDbHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php',
+ 'Monolog\\Handler\\ElasticSearchHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php',
+ 'Monolog\\Handler\\ErrorLogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php',
+ 'Monolog\\Handler\\FilterHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FilterHandler.php',
+ 'Monolog\\Handler\\FingersCrossedHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php',
+ 'Monolog\\Handler\\FingersCrossed\\ActivationStrategyInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php',
+ 'Monolog\\Handler\\FingersCrossed\\ChannelLevelActivationStrategy' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php',
+ 'Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php',
+ 'Monolog\\Handler\\FirePHPHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php',
+ 'Monolog\\Handler\\FleepHookHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php',
+ 'Monolog\\Handler\\FlowdockHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php',
+ 'Monolog\\Handler\\GelfHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/GelfHandler.php',
+ 'Monolog\\Handler\\GroupHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/GroupHandler.php',
+ 'Monolog\\Handler\\HandlerInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/HandlerInterface.php',
+ 'Monolog\\Handler\\HandlerWrapper' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php',
+ 'Monolog\\Handler\\HipChatHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/HipChatHandler.php',
+ 'Monolog\\Handler\\IFTTTHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php',
+ 'Monolog\\Handler\\LogEntriesHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php',
+ 'Monolog\\Handler\\LogglyHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/LogglyHandler.php',
+ 'Monolog\\Handler\\MailHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MailHandler.php',
+ 'Monolog\\Handler\\MandrillHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MandrillHandler.php',
+ 'Monolog\\Handler\\MissingExtensionException' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php',
+ 'Monolog\\Handler\\MongoDBHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php',
+ 'Monolog\\Handler\\NativeMailerHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php',
+ 'Monolog\\Handler\\NewRelicHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php',
+ 'Monolog\\Handler\\NullHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NullHandler.php',
+ 'Monolog\\Handler\\PHPConsoleHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php',
+ 'Monolog\\Handler\\PsrHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/PsrHandler.php',
+ 'Monolog\\Handler\\PushoverHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/PushoverHandler.php',
+ 'Monolog\\Handler\\RavenHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RavenHandler.php',
+ 'Monolog\\Handler\\RedisHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RedisHandler.php',
+ 'Monolog\\Handler\\RollbarHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RollbarHandler.php',
+ 'Monolog\\Handler\\RotatingFileHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php',
+ 'Monolog\\Handler\\SamplingHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SamplingHandler.php',
+ 'Monolog\\Handler\\SlackHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SlackHandler.php',
+ 'Monolog\\Handler\\SlackWebhookHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php',
+ 'Monolog\\Handler\\Slack\\SlackRecord' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php',
+ 'Monolog\\Handler\\SlackbotHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php',
+ 'Monolog\\Handler\\SocketHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SocketHandler.php',
+ 'Monolog\\Handler\\StreamHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/StreamHandler.php',
+ 'Monolog\\Handler\\SwiftMailerHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php',
+ 'Monolog\\Handler\\SyslogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogHandler.php',
+ 'Monolog\\Handler\\SyslogUdpHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php',
+ 'Monolog\\Handler\\SyslogUdp\\UdpSocket' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php',
+ 'Monolog\\Handler\\TestHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/TestHandler.php',
+ 'Monolog\\Handler\\WhatFailureGroupHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php',
+ 'Monolog\\Handler\\ZendMonitorHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php',
+ 'Monolog\\Logger' => $vendorDir . '/monolog/monolog/src/Monolog/Logger.php',
+ 'Monolog\\Processor\\GitProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/GitProcessor.php',
+ 'Monolog\\Processor\\IntrospectionProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php',
+ 'Monolog\\Processor\\MemoryPeakUsageProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php',
+ 'Monolog\\Processor\\MemoryProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php',
+ 'Monolog\\Processor\\MemoryUsageProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php',
+ 'Monolog\\Processor\\MercurialProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php',
+ 'Monolog\\Processor\\ProcessIdProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php',
+ 'Monolog\\Processor\\PsrLogMessageProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php',
+ 'Monolog\\Processor\\TagProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/TagProcessor.php',
+ 'Monolog\\Processor\\UidProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/UidProcessor.php',
+ 'Monolog\\Processor\\WebProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/WebProcessor.php',
+ 'Monolog\\Registry' => $vendorDir . '/monolog/monolog/src/Monolog/Registry.php',
+ 'PHPUnit\\Framework\\Assert' => $vendorDir . '/phpunit/phpunit/src/ForwardCompatibility/Assert.php',
+ 'PHPUnit\\Framework\\AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/ForwardCompatibility/AssertionFailedError.php',
+ 'PHPUnit\\Framework\\BaseTestListener' => $vendorDir . '/phpunit/phpunit/src/ForwardCompatibility/BaseTestListener.php',
+ 'PHPUnit\\Framework\\Test' => $vendorDir . '/phpunit/phpunit/src/ForwardCompatibility/Test.php',
+ 'PHPUnit\\Framework\\TestCase' => $vendorDir . '/phpunit/phpunit/src/ForwardCompatibility/TestCase.php',
+ 'PHPUnit\\Framework\\TestListener' => $vendorDir . '/phpunit/phpunit/src/ForwardCompatibility/TestListener.php',
+ 'PHPUnit\\Framework\\TestSuite' => $vendorDir . '/phpunit/phpunit/src/ForwardCompatibility/TestSuite.php',
+ 'PHPUnit_Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php',
+ 'PHPUnit_Extensions_GroupTestSuite' => $vendorDir . '/phpunit/phpunit/src/Extensions/GroupTestSuite.php',
+ 'PHPUnit_Extensions_PhptTestCase' => $vendorDir . '/phpunit/phpunit/src/Extensions/PhptTestCase.php',
+ 'PHPUnit_Extensions_PhptTestSuite' => $vendorDir . '/phpunit/phpunit/src/Extensions/PhptTestSuite.php',
+ 'PHPUnit_Extensions_RepeatedTest' => $vendorDir . '/phpunit/phpunit/src/Extensions/RepeatedTest.php',
+ 'PHPUnit_Extensions_TestDecorator' => $vendorDir . '/phpunit/phpunit/src/Extensions/TestDecorator.php',
+ 'PHPUnit_Extensions_TicketListener' => $vendorDir . '/phpunit/phpunit/src/Extensions/TicketListener.php',
+ 'PHPUnit_Framework_Assert' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert.php',
+ 'PHPUnit_Framework_AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/AssertionFailedError.php',
+ 'PHPUnit_Framework_BaseTestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/BaseTestListener.php',
+ 'PHPUnit_Framework_CodeCoverageException' => $vendorDir . '/phpunit/phpunit/src/Framework/CodeCoverageException.php',
+ 'PHPUnit_Framework_Constraint' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint.php',
+ 'PHPUnit_Framework_Constraint_And' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/And.php',
+ 'PHPUnit_Framework_Constraint_ArrayHasKey' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php',
+ 'PHPUnit_Framework_Constraint_ArraySubset' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php',
+ 'PHPUnit_Framework_Constraint_Attribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Attribute.php',
+ 'PHPUnit_Framework_Constraint_Callback' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Callback.php',
+ 'PHPUnit_Framework_Constraint_ClassHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php',
+ 'PHPUnit_Framework_Constraint_ClassHasStaticAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php',
+ 'PHPUnit_Framework_Constraint_Composite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Composite.php',
+ 'PHPUnit_Framework_Constraint_Count' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Count.php',
+ 'PHPUnit_Framework_Constraint_DirectoryExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php',
+ 'PHPUnit_Framework_Constraint_Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception.php',
+ 'PHPUnit_Framework_Constraint_ExceptionCode' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php',
+ 'PHPUnit_Framework_Constraint_ExceptionMessage' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php',
+ 'PHPUnit_Framework_Constraint_ExceptionMessageRegExp' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegExp.php',
+ 'PHPUnit_Framework_Constraint_FileExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php',
+ 'PHPUnit_Framework_Constraint_GreaterThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php',
+ 'PHPUnit_Framework_Constraint_IsAnything' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php',
+ 'PHPUnit_Framework_Constraint_IsEmpty' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php',
+ 'PHPUnit_Framework_Constraint_IsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php',
+ 'PHPUnit_Framework_Constraint_IsFalse' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php',
+ 'PHPUnit_Framework_Constraint_IsFinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsFinite.php',
+ 'PHPUnit_Framework_Constraint_IsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php',
+ 'PHPUnit_Framework_Constraint_IsInfinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php',
+ 'PHPUnit_Framework_Constraint_IsInstanceOf' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php',
+ 'PHPUnit_Framework_Constraint_IsJson' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php',
+ 'PHPUnit_Framework_Constraint_IsNan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsNan.php',
+ 'PHPUnit_Framework_Constraint_IsNull' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php',
+ 'PHPUnit_Framework_Constraint_IsReadable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsReadable.php',
+ 'PHPUnit_Framework_Constraint_IsTrue' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php',
+ 'PHPUnit_Framework_Constraint_IsType' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsType.php',
+ 'PHPUnit_Framework_Constraint_IsWritable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsWritable.php',
+ 'PHPUnit_Framework_Constraint_JsonMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php',
+ 'PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches/ErrorMessageProvider.php',
+ 'PHPUnit_Framework_Constraint_LessThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php',
+ 'PHPUnit_Framework_Constraint_Not' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Not.php',
+ 'PHPUnit_Framework_Constraint_ObjectHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php',
+ 'PHPUnit_Framework_Constraint_Or' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Or.php',
+ 'PHPUnit_Framework_Constraint_PCREMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/PCREMatch.php',
+ 'PHPUnit_Framework_Constraint_SameSize' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php',
+ 'PHPUnit_Framework_Constraint_StringContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php',
+ 'PHPUnit_Framework_Constraint_StringEndsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php',
+ 'PHPUnit_Framework_Constraint_StringMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringMatches.php',
+ 'PHPUnit_Framework_Constraint_StringStartsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php',
+ 'PHPUnit_Framework_Constraint_TraversableContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php',
+ 'PHPUnit_Framework_Constraint_TraversableContainsOnly' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php',
+ 'PHPUnit_Framework_Constraint_Xor' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Xor.php',
+ 'PHPUnit_Framework_CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/phpunit/src/Framework/CoveredCodeNotExecutedException.php',
+ 'PHPUnit_Framework_Error' => $vendorDir . '/phpunit/phpunit/src/Framework/Error.php',
+ 'PHPUnit_Framework_Error_Deprecated' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Deprecated.php',
+ 'PHPUnit_Framework_Error_Notice' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Notice.php',
+ 'PHPUnit_Framework_Error_Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Warning.php',
+ 'PHPUnit_Framework_Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception.php',
+ 'PHPUnit_Framework_ExceptionWrapper' => $vendorDir . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php',
+ 'PHPUnit_Framework_ExpectationFailedException' => $vendorDir . '/phpunit/phpunit/src/Framework/ExpectationFailedException.php',
+ 'PHPUnit_Framework_IncompleteTest' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTest.php',
+ 'PHPUnit_Framework_IncompleteTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php',
+ 'PHPUnit_Framework_IncompleteTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestError.php',
+ 'PHPUnit_Framework_InvalidCoversTargetException' => $vendorDir . '/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php',
+ 'PHPUnit_Framework_MissingCoversAnnotationException' => $vendorDir . '/phpunit/phpunit/src/Framework/MissingCoversAnnotationException.php',
+ 'PHPUnit_Framework_MockObject_BadMethodCallException' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/BadMethodCallException.php',
+ 'PHPUnit_Framework_MockObject_Builder_Identity' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Identity.php',
+ 'PHPUnit_Framework_MockObject_Builder_InvocationMocker' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/InvocationMocker.php',
+ 'PHPUnit_Framework_MockObject_Builder_Match' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Match.php',
+ 'PHPUnit_Framework_MockObject_Builder_MethodNameMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/MethodNameMatch.php',
+ 'PHPUnit_Framework_MockObject_Builder_Namespace' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Namespace.php',
+ 'PHPUnit_Framework_MockObject_Builder_ParametersMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/ParametersMatch.php',
+ 'PHPUnit_Framework_MockObject_Builder_Stub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Stub.php',
+ 'PHPUnit_Framework_MockObject_Exception' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/Exception.php',
+ 'PHPUnit_Framework_MockObject_Generator' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator.php',
+ 'PHPUnit_Framework_MockObject_Invocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation.php',
+ 'PHPUnit_Framework_MockObject_InvocationMocker' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/InvocationMocker.php',
+ 'PHPUnit_Framework_MockObject_Invocation_Object' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Object.php',
+ 'PHPUnit_Framework_MockObject_Invocation_Static' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Static.php',
+ 'PHPUnit_Framework_MockObject_Invokable' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invokable.php',
+ 'PHPUnit_Framework_MockObject_Matcher' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher.php',
+ 'PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyInvokedCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_AnyParameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyParameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/ConsecutiveParameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_Invocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Invocation.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtIndex.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastOnce.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtMostCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedRecorder' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedRecorder.php',
+ 'PHPUnit_Framework_MockObject_Matcher_MethodName' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/MethodName.php',
+ 'PHPUnit_Framework_MockObject_Matcher_Parameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Parameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_StatelessInvocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/StatelessInvocation.php',
+ 'PHPUnit_Framework_MockObject_MockBuilder' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockBuilder.php',
+ 'PHPUnit_Framework_MockObject_MockObject' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockObject.php',
+ 'PHPUnit_Framework_MockObject_RuntimeException' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/RuntimeException.php',
+ 'PHPUnit_Framework_MockObject_Stub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub.php',
+ 'PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ConsecutiveCalls.php',
+ 'PHPUnit_Framework_MockObject_Stub_Exception' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Exception.php',
+ 'PHPUnit_Framework_MockObject_Stub_MatcherCollection' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/MatcherCollection.php',
+ 'PHPUnit_Framework_MockObject_Stub_Return' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Return.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnArgument' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnArgument.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnCallback' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnCallback.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnReference' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnReference.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnSelf' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnSelf.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnValueMap' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnValueMap.php',
+ 'PHPUnit_Framework_MockObject_Verifiable' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Verifiable.php',
+ 'PHPUnit_Framework_OutputError' => $vendorDir . '/phpunit/phpunit/src/Framework/OutputError.php',
+ 'PHPUnit_Framework_RiskyTest' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTest.php',
+ 'PHPUnit_Framework_RiskyTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTestError.php',
+ 'PHPUnit_Framework_SelfDescribing' => $vendorDir . '/phpunit/phpunit/src/Framework/SelfDescribing.php',
+ 'PHPUnit_Framework_SkippedTest' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTest.php',
+ 'PHPUnit_Framework_SkippedTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestCase.php',
+ 'PHPUnit_Framework_SkippedTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestError.php',
+ 'PHPUnit_Framework_SkippedTestSuiteError' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestSuiteError.php',
+ 'PHPUnit_Framework_SyntheticError' => $vendorDir . '/phpunit/phpunit/src/Framework/SyntheticError.php',
+ 'PHPUnit_Framework_Test' => $vendorDir . '/phpunit/phpunit/src/Framework/Test.php',
+ 'PHPUnit_Framework_TestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/TestCase.php',
+ 'PHPUnit_Framework_TestFailure' => $vendorDir . '/phpunit/phpunit/src/Framework/TestFailure.php',
+ 'PHPUnit_Framework_TestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/TestListener.php',
+ 'PHPUnit_Framework_TestResult' => $vendorDir . '/phpunit/phpunit/src/Framework/TestResult.php',
+ 'PHPUnit_Framework_TestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite.php',
+ 'PHPUnit_Framework_TestSuite_DataProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite/DataProvider.php',
+ 'PHPUnit_Framework_UnintentionallyCoveredCodeError' => $vendorDir . '/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php',
+ 'PHPUnit_Framework_Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Warning.php',
+ 'PHPUnit_Framework_WarningTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/WarningTestCase.php',
+ 'PHPUnit_Runner_BaseTestRunner' => $vendorDir . '/phpunit/phpunit/src/Runner/BaseTestRunner.php',
+ 'PHPUnit_Runner_Exception' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception.php',
+ 'PHPUnit_Runner_Filter_Factory' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Factory.php',
+ 'PHPUnit_Runner_Filter_GroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group.php',
+ 'PHPUnit_Runner_Filter_Group_Exclude' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group/Exclude.php',
+ 'PHPUnit_Runner_Filter_Group_Include' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group/Include.php',
+ 'PHPUnit_Runner_Filter_Test' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Test.php',
+ 'PHPUnit_Runner_StandardTestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php',
+ 'PHPUnit_Runner_TestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php',
+ 'PHPUnit_Runner_Version' => $vendorDir . '/phpunit/phpunit/src/Runner/Version.php',
+ 'PHPUnit_TextUI_Command' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command.php',
+ 'PHPUnit_TextUI_ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/ResultPrinter.php',
+ 'PHPUnit_TextUI_TestRunner' => $vendorDir . '/phpunit/phpunit/src/TextUI/TestRunner.php',
+ 'PHPUnit_Util_Blacklist' => $vendorDir . '/phpunit/phpunit/src/Util/Blacklist.php',
+ 'PHPUnit_Util_Configuration' => $vendorDir . '/phpunit/phpunit/src/Util/Configuration.php',
+ 'PHPUnit_Util_ConfigurationGenerator' => $vendorDir . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php',
+ 'PHPUnit_Util_ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php',
+ 'PHPUnit_Util_Fileloader' => $vendorDir . '/phpunit/phpunit/src/Util/Fileloader.php',
+ 'PHPUnit_Util_Filesystem' => $vendorDir . '/phpunit/phpunit/src/Util/Filesystem.php',
+ 'PHPUnit_Util_Filter' => $vendorDir . '/phpunit/phpunit/src/Util/Filter.php',
+ 'PHPUnit_Util_Getopt' => $vendorDir . '/phpunit/phpunit/src/Util/Getopt.php',
+ 'PHPUnit_Util_GlobalState' => $vendorDir . '/phpunit/phpunit/src/Util/GlobalState.php',
+ 'PHPUnit_Util_InvalidArgumentHelper' => $vendorDir . '/phpunit/phpunit/src/Util/InvalidArgumentHelper.php',
+ 'PHPUnit_Util_Log_JSON' => $vendorDir . '/phpunit/phpunit/src/Util/Log/JSON.php',
+ 'PHPUnit_Util_Log_JUnit' => $vendorDir . '/phpunit/phpunit/src/Util/Log/JUnit.php',
+ 'PHPUnit_Util_Log_TAP' => $vendorDir . '/phpunit/phpunit/src/Util/Log/TAP.php',
+ 'PHPUnit_Util_Log_TeamCity' => $vendorDir . '/phpunit/phpunit/src/Util/Log/TeamCity.php',
+ 'PHPUnit_Util_PHP' => $vendorDir . '/phpunit/phpunit/src/Util/PHP.php',
+ 'PHPUnit_Util_PHP_Default' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/Default.php',
+ 'PHPUnit_Util_PHP_Windows' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/Windows.php',
+ 'PHPUnit_Util_Printer' => $vendorDir . '/phpunit/phpunit/src/Util/Printer.php',
+ 'PHPUnit_Util_Regex' => $vendorDir . '/phpunit/phpunit/src/Util/Regex.php',
+ 'PHPUnit_Util_String' => $vendorDir . '/phpunit/phpunit/src/Util/String.php',
+ 'PHPUnit_Util_Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php',
+ 'PHPUnit_Util_TestDox_NamePrettifier' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter_HTML' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/HTML.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter_Text' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/Text.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter_XML' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/XML.php',
+ 'PHPUnit_Util_TestSuiteIterator' => $vendorDir . '/phpunit/phpunit/src/Util/TestSuiteIterator.php',
+ 'PHPUnit_Util_Type' => $vendorDir . '/phpunit/phpunit/src/Util/Type.php',
+ 'PHPUnit_Util_XML' => $vendorDir . '/phpunit/phpunit/src/Util/XML.php',
+ 'PHP_Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php',
+ 'PHP_Token' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_TokenWithScope' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_TokenWithScopeAndVisibility' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ABSTRACT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AMPERSAND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AND_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ARRAY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ARRAY_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ASYNC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AWAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BACKTICK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BAD_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOLEAN_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOLEAN_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOL_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BREAK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CALLABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CARET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CASE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CATCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS_NAME_CONSTANT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLONE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COALESCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMMA' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMPILER_HALT_OFFSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONCAT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONSTANT_ENCAPSED_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONTINUE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CURLY_OPEN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DEC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DEFAULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIV' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIV_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOC_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOLLAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_QUOTES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELLIPSIS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELSE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELSEIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EMPTY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENCAPSED_AND_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDDECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDFOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDFOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDSWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDWHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_END_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENUM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EQUALS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EVAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXCLAMATION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXTENDS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FINAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FINALLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FUNC_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GLOBAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GOTO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_HALT_COMPILER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IMPLEMENTS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INCLUDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INCLUDE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INLINE_HTML' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INSTANCEOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INSTEADOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INTERFACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ISSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_GREATER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_NOT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_NOT_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_SMALLER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_Includes' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_JOIN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_CP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_OP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LINE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LIST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_XOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_METHOD_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MINUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MINUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MOD_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MUL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NAMESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NEW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NS_SEPARATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NULLSAFE_OBJECT_OPERATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NUM_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OBJECT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OBJECT_OPERATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ONUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_TAG_WITH_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PERCENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PIPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PLUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PLUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_POW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_POW_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PRINT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PRIVATE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PROTECTED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PUBLIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_QUESTION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_REQUIRE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_REQUIRE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_RETURN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SEMICOLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SHAPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SPACESHIP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_START_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STATIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING_VARNAME' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SUPER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_Stream' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream.php',
+ 'PHP_Token_Stream_CachingFactory' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php',
+ 'PHP_Token_THROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TILDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRAIT_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPELIST_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPELIST_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_UNSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_UNSET_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_USE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_USE_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_VAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_VARIABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHERE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_ATTRIBUTE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CATEGORY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CATEGORY_LABEL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CHILDREN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_LABEL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_REQUIRED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TAG_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TAG_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TEXT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XOR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_YIELD' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_YIELD_FROM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'Phinx\\Config\\Config' => $vendorDir . '/robmorgan/phinx/src/Phinx/Config/Config.php',
+ 'Phinx\\Config\\ConfigInterface' => $vendorDir . '/robmorgan/phinx/src/Phinx/Config/ConfigInterface.php',
+ 'Phinx\\Config\\NamespaceAwareInterface' => $vendorDir . '/robmorgan/phinx/src/Phinx/Config/NamespaceAwareInterface.php',
+ 'Phinx\\Config\\NamespaceAwareTrait' => $vendorDir . '/robmorgan/phinx/src/Phinx/Config/NamespaceAwareTrait.php',
+ 'Phinx\\Console\\Command\\AbstractCommand' => $vendorDir . '/robmorgan/phinx/src/Phinx/Console/Command/AbstractCommand.php',
+ 'Phinx\\Console\\Command\\Breakpoint' => $vendorDir . '/robmorgan/phinx/src/Phinx/Console/Command/Breakpoint.php',
+ 'Phinx\\Console\\Command\\Create' => $vendorDir . '/robmorgan/phinx/src/Phinx/Console/Command/Create.php',
+ 'Phinx\\Console\\Command\\Init' => $vendorDir . '/robmorgan/phinx/src/Phinx/Console/Command/Init.php',
+ 'Phinx\\Console\\Command\\Migrate' => $vendorDir . '/robmorgan/phinx/src/Phinx/Console/Command/Migrate.php',
+ 'Phinx\\Console\\Command\\Rollback' => $vendorDir . '/robmorgan/phinx/src/Phinx/Console/Command/Rollback.php',
+ 'Phinx\\Console\\Command\\SeedCreate' => $vendorDir . '/robmorgan/phinx/src/Phinx/Console/Command/SeedCreate.php',
+ 'Phinx\\Console\\Command\\SeedRun' => $vendorDir . '/robmorgan/phinx/src/Phinx/Console/Command/SeedRun.php',
+ 'Phinx\\Console\\Command\\Status' => $vendorDir . '/robmorgan/phinx/src/Phinx/Console/Command/Status.php',
+ 'Phinx\\Console\\Command\\Test' => $vendorDir . '/robmorgan/phinx/src/Phinx/Console/Command/Test.php',
+ 'Phinx\\Console\\PhinxApplication' => $vendorDir . '/robmorgan/phinx/src/Phinx/Console/PhinxApplication.php',
+ 'Phinx\\Db\\Adapter\\AbstractAdapter' => $vendorDir . '/robmorgan/phinx/src/Phinx/Db/Adapter/AbstractAdapter.php',
+ 'Phinx\\Db\\Adapter\\AdapterFactory' => $vendorDir . '/robmorgan/phinx/src/Phinx/Db/Adapter/AdapterFactory.php',
+ 'Phinx\\Db\\Adapter\\AdapterInterface' => $vendorDir . '/robmorgan/phinx/src/Phinx/Db/Adapter/AdapterInterface.php',
+ 'Phinx\\Db\\Adapter\\AdapterWrapper' => $vendorDir . '/robmorgan/phinx/src/Phinx/Db/Adapter/AdapterWrapper.php',
+ 'Phinx\\Db\\Adapter\\MysqlAdapter' => $vendorDir . '/robmorgan/phinx/src/Phinx/Db/Adapter/MysqlAdapter.php',
+ 'Phinx\\Db\\Adapter\\PdoAdapter' => $vendorDir . '/robmorgan/phinx/src/Phinx/Db/Adapter/PdoAdapter.php',
+ 'Phinx\\Db\\Adapter\\PostgresAdapter' => $vendorDir . '/robmorgan/phinx/src/Phinx/Db/Adapter/PostgresAdapter.php',
+ 'Phinx\\Db\\Adapter\\ProxyAdapter' => $vendorDir . '/robmorgan/phinx/src/Phinx/Db/Adapter/ProxyAdapter.php',
+ 'Phinx\\Db\\Adapter\\SQLiteAdapter' => $vendorDir . '/robmorgan/phinx/src/Phinx/Db/Adapter/SQLiteAdapter.php',
+ 'Phinx\\Db\\Adapter\\SqlServerAdapter' => $vendorDir . '/robmorgan/phinx/src/Phinx/Db/Adapter/SqlServerAdapter.php',
+ 'Phinx\\Db\\Adapter\\TablePrefixAdapter' => $vendorDir . '/robmorgan/phinx/src/Phinx/Db/Adapter/TablePrefixAdapter.php',
+ 'Phinx\\Db\\Adapter\\TimedOutputAdapter' => $vendorDir . '/robmorgan/phinx/src/Phinx/Db/Adapter/TimedOutputAdapter.php',
+ 'Phinx\\Db\\Adapter\\WrapperInterface' => $vendorDir . '/robmorgan/phinx/src/Phinx/Db/Adapter/WrapperInterface.php',
+ 'Phinx\\Db\\Table' => $vendorDir . '/robmorgan/phinx/src/Phinx/Db/Table.php',
+ 'Phinx\\Db\\Table\\Column' => $vendorDir . '/robmorgan/phinx/src/Phinx/Db/Table/Column.php',
+ 'Phinx\\Db\\Table\\ForeignKey' => $vendorDir . '/robmorgan/phinx/src/Phinx/Db/Table/ForeignKey.php',
+ 'Phinx\\Db\\Table\\Index' => $vendorDir . '/robmorgan/phinx/src/Phinx/Db/Table/Index.php',
+ 'Phinx\\Migration\\AbstractMigration' => $vendorDir . '/robmorgan/phinx/src/Phinx/Migration/AbstractMigration.php',
+ 'Phinx\\Migration\\AbstractTemplateCreation' => $vendorDir . '/robmorgan/phinx/src/Phinx/Migration/AbstractTemplateCreation.php',
+ 'Phinx\\Migration\\CreationInterface' => $vendorDir . '/robmorgan/phinx/src/Phinx/Migration/CreationInterface.php',
+ 'Phinx\\Migration\\IrreversibleMigrationException' => $vendorDir . '/robmorgan/phinx/src/Phinx/Migration/IrreversibleMigrationException.php',
+ 'Phinx\\Migration\\Manager' => $vendorDir . '/robmorgan/phinx/src/Phinx/Migration/Manager.php',
+ 'Phinx\\Migration\\Manager\\Environment' => $vendorDir . '/robmorgan/phinx/src/Phinx/Migration/Manager/Environment.php',
+ 'Phinx\\Migration\\MigrationInterface' => $vendorDir . '/robmorgan/phinx/src/Phinx/Migration/MigrationInterface.php',
+ 'Phinx\\Seed\\AbstractSeed' => $vendorDir . '/robmorgan/phinx/src/Phinx/Seed/AbstractSeed.php',
+ 'Phinx\\Seed\\SeedInterface' => $vendorDir . '/robmorgan/phinx/src/Phinx/Seed/SeedInterface.php',
+ 'Phinx\\Util\\Util' => $vendorDir . '/robmorgan/phinx/src/Phinx/Util/Util.php',
+ 'Phinx\\Wrapper\\TextWrapper' => $vendorDir . '/robmorgan/phinx/src/Phinx/Wrapper/TextWrapper.php',
+ 'Pimple\\Container' => $vendorDir . '/pimple/pimple/src/Pimple/Container.php',
+ 'Pimple\\Exception\\ExpectedInvokableException' => $vendorDir . '/pimple/pimple/src/Pimple/Exception/ExpectedInvokableException.php',
+ 'Pimple\\Exception\\FrozenServiceException' => $vendorDir . '/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php',
+ 'Pimple\\Exception\\InvalidServiceIdentifierException' => $vendorDir . '/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php',
+ 'Pimple\\Exception\\UnknownIdentifierException' => $vendorDir . '/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php',
+ 'Pimple\\Psr11\\Container' => $vendorDir . '/pimple/pimple/src/Pimple/Psr11/Container.php',
+ 'Pimple\\Psr11\\ServiceLocator' => $vendorDir . '/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php',
+ 'Pimple\\ServiceIterator' => $vendorDir . '/pimple/pimple/src/Pimple/ServiceIterator.php',
+ 'Pimple\\ServiceProviderInterface' => $vendorDir . '/pimple/pimple/src/Pimple/ServiceProviderInterface.php',
+ 'Pimple\\Tests\\Fixtures\\Invokable' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php',
+ 'Pimple\\Tests\\Fixtures\\NonInvokable' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php',
+ 'Pimple\\Tests\\Fixtures\\PimpleServiceProvider' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php',
+ 'Pimple\\Tests\\Fixtures\\Service' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php',
+ 'Pimple\\Tests\\PimpleServiceProviderInterfaceTest' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php',
+ 'Pimple\\Tests\\PimpleTest' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/PimpleTest.php',
+ 'Pimple\\Tests\\Psr11\\ContainerTest' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/Psr11/ContainerTest.php',
+ 'Pimple\\Tests\\Psr11\\ServiceLocatorTest' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/Psr11/ServiceLocatorTest.php',
+ 'Pimple\\Tests\\ServiceIteratorTest' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/ServiceIteratorTest.php',
+ 'Prophecy\\Argument' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument.php',
+ 'Prophecy\\Argument\\ArgumentsWildcard' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php',
+ 'Prophecy\\Argument\\Token\\AnyValueToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php',
+ 'Prophecy\\Argument\\Token\\AnyValuesToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php',
+ 'Prophecy\\Argument\\Token\\ApproximateValueToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php',
+ 'Prophecy\\Argument\\Token\\ArrayCountToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php',
+ 'Prophecy\\Argument\\Token\\ArrayEntryToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php',
+ 'Prophecy\\Argument\\Token\\ArrayEveryEntryToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php',
+ 'Prophecy\\Argument\\Token\\CallbackToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php',
+ 'Prophecy\\Argument\\Token\\ExactValueToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php',
+ 'Prophecy\\Argument\\Token\\IdenticalValueToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php',
+ 'Prophecy\\Argument\\Token\\LogicalAndToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php',
+ 'Prophecy\\Argument\\Token\\LogicalNotToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php',
+ 'Prophecy\\Argument\\Token\\ObjectStateToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php',
+ 'Prophecy\\Argument\\Token\\StringContainsToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php',
+ 'Prophecy\\Argument\\Token\\TokenInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php',
+ 'Prophecy\\Argument\\Token\\TypeToken' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php',
+ 'Prophecy\\Call\\Call' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Call/Call.php',
+ 'Prophecy\\Call\\CallCenter' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Call/CallCenter.php',
+ 'Prophecy\\Comparator\\ClosureComparator' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php',
+ 'Prophecy\\Comparator\\Factory' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Comparator/Factory.php',
+ 'Prophecy\\Comparator\\ProphecyComparator' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php',
+ 'Prophecy\\Doubler\\CachedDoubler' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php',
+ 'Prophecy\\Doubler\\ClassPatch\\ClassPatchInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php',
+ 'Prophecy\\Doubler\\ClassPatch\\DisableConstructorPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php',
+ 'Prophecy\\Doubler\\ClassPatch\\HhvmExceptionPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.php',
+ 'Prophecy\\Doubler\\ClassPatch\\KeywordPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php',
+ 'Prophecy\\Doubler\\ClassPatch\\MagicCallPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php',
+ 'Prophecy\\Doubler\\ClassPatch\\ProphecySubjectPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php',
+ 'Prophecy\\Doubler\\ClassPatch\\ReflectionClassNewInstancePatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php',
+ 'Prophecy\\Doubler\\ClassPatch\\SplFileInfoPatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php',
+ 'Prophecy\\Doubler\\ClassPatch\\TraversablePatch' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php',
+ 'Prophecy\\Doubler\\DoubleInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php',
+ 'Prophecy\\Doubler\\Doubler' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php',
+ 'Prophecy\\Doubler\\Generator\\ClassCodeGenerator' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php',
+ 'Prophecy\\Doubler\\Generator\\ClassCreator' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php',
+ 'Prophecy\\Doubler\\Generator\\ClassMirror' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php',
+ 'Prophecy\\Doubler\\Generator\\Node\\ArgumentNode' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php',
+ 'Prophecy\\Doubler\\Generator\\Node\\ClassNode' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php',
+ 'Prophecy\\Doubler\\Generator\\Node\\MethodNode' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php',
+ 'Prophecy\\Doubler\\Generator\\ReflectionInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php',
+ 'Prophecy\\Doubler\\Generator\\TypeHintReference' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php',
+ 'Prophecy\\Doubler\\LazyDouble' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php',
+ 'Prophecy\\Doubler\\NameGenerator' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php',
+ 'Prophecy\\Exception\\Call\\UnexpectedCallException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php',
+ 'Prophecy\\Exception\\Doubler\\ClassCreatorException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php',
+ 'Prophecy\\Exception\\Doubler\\ClassMirrorException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php',
+ 'Prophecy\\Exception\\Doubler\\ClassNotFoundException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php',
+ 'Prophecy\\Exception\\Doubler\\DoubleException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php',
+ 'Prophecy\\Exception\\Doubler\\DoublerException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php',
+ 'Prophecy\\Exception\\Doubler\\InterfaceNotFoundException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php',
+ 'Prophecy\\Exception\\Doubler\\MethodNotExtendableException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php',
+ 'Prophecy\\Exception\\Doubler\\MethodNotFoundException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php',
+ 'Prophecy\\Exception\\Doubler\\ReturnByReferenceException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php',
+ 'Prophecy\\Exception\\Exception' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Exception.php',
+ 'Prophecy\\Exception\\InvalidArgumentException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php',
+ 'Prophecy\\Exception\\Prediction\\AggregateException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php',
+ 'Prophecy\\Exception\\Prediction\\FailedPredictionException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php',
+ 'Prophecy\\Exception\\Prediction\\NoCallsException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php',
+ 'Prophecy\\Exception\\Prediction\\PredictionException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php',
+ 'Prophecy\\Exception\\Prediction\\UnexpectedCallsCountException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php',
+ 'Prophecy\\Exception\\Prediction\\UnexpectedCallsException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php',
+ 'Prophecy\\Exception\\Prophecy\\MethodProphecyException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php',
+ 'Prophecy\\Exception\\Prophecy\\ObjectProphecyException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php',
+ 'Prophecy\\Exception\\Prophecy\\ProphecyException' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php',
+ 'Prophecy\\PhpDocumentor\\ClassAndInterfaceTagRetriever' => $vendorDir . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php',
+ 'Prophecy\\PhpDocumentor\\ClassTagRetriever' => $vendorDir . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php',
+ 'Prophecy\\PhpDocumentor\\LegacyClassTagRetriever' => $vendorDir . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php',
+ 'Prophecy\\PhpDocumentor\\MethodTagRetrieverInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php',
+ 'Prophecy\\Prediction\\CallPrediction' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php',
+ 'Prophecy\\Prediction\\CallTimesPrediction' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php',
+ 'Prophecy\\Prediction\\CallbackPrediction' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php',
+ 'Prophecy\\Prediction\\NoCallsPrediction' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php',
+ 'Prophecy\\Prediction\\PredictionInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php',
+ 'Prophecy\\Promise\\CallbackPromise' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php',
+ 'Prophecy\\Promise\\PromiseInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php',
+ 'Prophecy\\Promise\\ReturnArgumentPromise' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php',
+ 'Prophecy\\Promise\\ReturnPromise' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php',
+ 'Prophecy\\Promise\\ThrowPromise' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php',
+ 'Prophecy\\Prophecy\\MethodProphecy' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php',
+ 'Prophecy\\Prophecy\\ObjectProphecy' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php',
+ 'Prophecy\\Prophecy\\ProphecyInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php',
+ 'Prophecy\\Prophecy\\ProphecySubjectInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php',
+ 'Prophecy\\Prophecy\\Revealer' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php',
+ 'Prophecy\\Prophecy\\RevealerInterface' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php',
+ 'Prophecy\\Prophet' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Prophet.php',
+ 'Prophecy\\Util\\ExportUtil' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php',
+ 'Prophecy\\Util\\StringUtil' => $vendorDir . '/phpspec/prophecy/src/Prophecy/Util/StringUtil.php',
+ 'Psr\\Cache\\CacheException' => $vendorDir . '/psr/cache/src/CacheException.php',
+ 'Psr\\Cache\\CacheItemInterface' => $vendorDir . '/psr/cache/src/CacheItemInterface.php',
+ 'Psr\\Cache\\CacheItemPoolInterface' => $vendorDir . '/psr/cache/src/CacheItemPoolInterface.php',
+ 'Psr\\Cache\\InvalidArgumentException' => $vendorDir . '/psr/cache/src/InvalidArgumentException.php',
+ 'Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php',
+ 'Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php',
+ 'Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php',
+ 'Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php',
+ 'Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php',
+ 'Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php',
+ 'Psr\\Http\\Message\\ServerRequestInterface' => $vendorDir . '/psr/http-message/src/ServerRequestInterface.php',
+ 'Psr\\Http\\Message\\StreamInterface' => $vendorDir . '/psr/http-message/src/StreamInterface.php',
+ 'Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php',
+ 'Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php',
+ 'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php',
+ 'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php',
+ 'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php',
+ 'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareInterface.php',
+ 'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareTrait.php',
+ 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php',
+ 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php',
+ 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php',
+ 'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
+ 'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
+ 'Psr\\SimpleCache\\CacheException' => $vendorDir . '/psr/simple-cache/src/CacheException.php',
+ 'Psr\\SimpleCache\\CacheInterface' => $vendorDir . '/psr/simple-cache/src/CacheInterface.php',
+ 'Psr\\SimpleCache\\InvalidArgumentException' => $vendorDir . '/psr/simple-cache/src/InvalidArgumentException.php',
+ 'RKA\\Middleware\\IpAddress' => $vendorDir . '/akrabat/rka-ip-address-middleware/src/IpAddress.php',
+ 'Ramsey\\Uuid\\BinaryUtils' => $vendorDir . '/ramsey/uuid/src/BinaryUtils.php',
+ 'Ramsey\\Uuid\\Builder\\DefaultUuidBuilder' => $vendorDir . '/ramsey/uuid/src/Builder/DefaultUuidBuilder.php',
+ 'Ramsey\\Uuid\\Builder\\DegradedUuidBuilder' => $vendorDir . '/ramsey/uuid/src/Builder/DegradedUuidBuilder.php',
+ 'Ramsey\\Uuid\\Builder\\UuidBuilderInterface' => $vendorDir . '/ramsey/uuid/src/Builder/UuidBuilderInterface.php',
+ 'Ramsey\\Uuid\\Codec\\CodecInterface' => $vendorDir . '/ramsey/uuid/src/Codec/CodecInterface.php',
+ 'Ramsey\\Uuid\\Codec\\GuidStringCodec' => $vendorDir . '/ramsey/uuid/src/Codec/GuidStringCodec.php',
+ 'Ramsey\\Uuid\\Codec\\OrderedTimeCodec' => $vendorDir . '/ramsey/uuid/src/Codec/OrderedTimeCodec.php',
+ 'Ramsey\\Uuid\\Codec\\StringCodec' => $vendorDir . '/ramsey/uuid/src/Codec/StringCodec.php',
+ 'Ramsey\\Uuid\\Codec\\TimestampFirstCombCodec' => $vendorDir . '/ramsey/uuid/src/Codec/TimestampFirstCombCodec.php',
+ 'Ramsey\\Uuid\\Codec\\TimestampLastCombCodec' => $vendorDir . '/ramsey/uuid/src/Codec/TimestampLastCombCodec.php',
+ 'Ramsey\\Uuid\\Converter\\NumberConverterInterface' => $vendorDir . '/ramsey/uuid/src/Converter/NumberConverterInterface.php',
+ 'Ramsey\\Uuid\\Converter\\Number\\BigNumberConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Number/BigNumberConverter.php',
+ 'Ramsey\\Uuid\\Converter\\Number\\DegradedNumberConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Number/DegradedNumberConverter.php',
+ 'Ramsey\\Uuid\\Converter\\TimeConverterInterface' => $vendorDir . '/ramsey/uuid/src/Converter/TimeConverterInterface.php',
+ 'Ramsey\\Uuid\\Converter\\Time\\BigNumberTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php',
+ 'Ramsey\\Uuid\\Converter\\Time\\DegradedTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.php',
+ 'Ramsey\\Uuid\\Converter\\Time\\PhpTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php',
+ 'Ramsey\\Uuid\\DegradedUuid' => $vendorDir . '/ramsey/uuid/src/DegradedUuid.php',
+ 'Ramsey\\Uuid\\Exception\\InvalidUuidStringException' => $vendorDir . '/ramsey/uuid/src/Exception/InvalidUuidStringException.php',
+ 'Ramsey\\Uuid\\Exception\\UnsatisfiedDependencyException' => $vendorDir . '/ramsey/uuid/src/Exception/UnsatisfiedDependencyException.php',
+ 'Ramsey\\Uuid\\Exception\\UnsupportedOperationException' => $vendorDir . '/ramsey/uuid/src/Exception/UnsupportedOperationException.php',
+ 'Ramsey\\Uuid\\FeatureSet' => $vendorDir . '/ramsey/uuid/src/FeatureSet.php',
+ 'Ramsey\\Uuid\\Generator\\CombGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/CombGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\DefaultTimeGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/DefaultTimeGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\MtRandGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/MtRandGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\OpenSslGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/OpenSslGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\PeclUuidRandomGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/PeclUuidRandomGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\PeclUuidTimeGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/PeclUuidTimeGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\RandomBytesGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/RandomBytesGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\RandomGeneratorFactory' => $vendorDir . '/ramsey/uuid/src/Generator/RandomGeneratorFactory.php',
+ 'Ramsey\\Uuid\\Generator\\RandomGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/RandomGeneratorInterface.php',
+ 'Ramsey\\Uuid\\Generator\\RandomLibAdapter' => $vendorDir . '/ramsey/uuid/src/Generator/RandomLibAdapter.php',
+ 'Ramsey\\Uuid\\Generator\\SodiumRandomGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/SodiumRandomGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\TimeGeneratorFactory' => $vendorDir . '/ramsey/uuid/src/Generator/TimeGeneratorFactory.php',
+ 'Ramsey\\Uuid\\Generator\\TimeGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/TimeGeneratorInterface.php',
+ 'Ramsey\\Uuid\\Provider\\NodeProviderInterface' => $vendorDir . '/ramsey/uuid/src/Provider/NodeProviderInterface.php',
+ 'Ramsey\\Uuid\\Provider\\Node\\FallbackNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\Node\\RandomNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/RandomNodeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\Node\\SystemNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\TimeProviderInterface' => $vendorDir . '/ramsey/uuid/src/Provider/TimeProviderInterface.php',
+ 'Ramsey\\Uuid\\Provider\\Time\\FixedTimeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\Time\\SystemTimeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Time/SystemTimeProvider.php',
+ 'Ramsey\\Uuid\\Uuid' => $vendorDir . '/ramsey/uuid/src/Uuid.php',
+ 'Ramsey\\Uuid\\UuidFactory' => $vendorDir . '/ramsey/uuid/src/UuidFactory.php',
+ 'Ramsey\\Uuid\\UuidFactoryInterface' => $vendorDir . '/ramsey/uuid/src/UuidFactoryInterface.php',
+ 'Ramsey\\Uuid\\UuidInterface' => $vendorDir . '/ramsey/uuid/src/UuidInterface.php',
+ 'RateLimit\\AbstractRateLimiter' => $vendorDir . '/wellingguzman/rate-limit/src/AbstractRateLimiter.php',
+ 'RateLimit\\Exception\\ExceptionInterface' => $vendorDir . '/wellingguzman/rate-limit/src/Exception/ExceptionInterface.php',
+ 'RateLimit\\Exception\\RateLimitExceededException' => $vendorDir . '/wellingguzman/rate-limit/src/Exception/RateLimitExceededException.php',
+ 'RateLimit\\InMemoryRateLimiter' => $vendorDir . '/wellingguzman/rate-limit/src/InMemoryRateLimiter.php',
+ 'RateLimit\\Middleware\\Identity\\AbstractIdentityResolver' => $vendorDir . '/wellingguzman/rate-limit/src/Middleware/Identity/AbstractIdentityResolver.php',
+ 'RateLimit\\Middleware\\Identity\\IdentityResolverInterface' => $vendorDir . '/wellingguzman/rate-limit/src/Middleware/Identity/IdentityResolverInterface.php',
+ 'RateLimit\\Middleware\\Identity\\IpAddressIdentityResolver' => $vendorDir . '/wellingguzman/rate-limit/src/Middleware/Identity/IpAddressIdentityResolver.php',
+ 'RateLimit\\Middleware\\Options' => $vendorDir . '/wellingguzman/rate-limit/src/Middleware/Options.php',
+ 'RateLimit\\Middleware\\RateLimitMiddleware' => $vendorDir . '/wellingguzman/rate-limit/src/Middleware/RateLimitMiddleware.php',
+ 'RateLimit\\RateLimiterFactory' => $vendorDir . '/wellingguzman/rate-limit/src/RateLimiterFactory.php',
+ 'RateLimit\\RateLimiterInterface' => $vendorDir . '/wellingguzman/rate-limit/src/RateLimiterInterface.php',
+ 'RateLimit\\RedisRateLimiter' => $vendorDir . '/wellingguzman/rate-limit/src/RedisRateLimiter.php',
+ 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php',
+ 'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php',
+ 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Driver.php',
+ 'SebastianBergmann\\CodeCoverage\\Driver\\HHVM' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/HHVM.php',
+ 'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php',
+ 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Xdebug.php',
+ 'SebastianBergmann\\CodeCoverage\\Exception' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/Exception.php',
+ 'SebastianBergmann\\CodeCoverage\\Filter' => $vendorDir . '/phpunit/php-code-coverage/src/Filter.php',
+ 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php',
+ 'SebastianBergmann\\CodeCoverage\\MissingCoversAnnotationException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => $vendorDir . '/phpunit/php-code-coverage/src/Node/AbstractNode.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Builder.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Directory.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Node/File.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Iterator.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Clover.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Crap4j.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Facade.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => $vendorDir . '/phpunit/php-code-coverage/src/Report/PHP.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Text' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Text.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/File.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Method.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Node.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Project.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Report.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php',
+ 'SebastianBergmann\\CodeCoverage\\RuntimeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/RuntimeException.php',
+ 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php',
+ 'SebastianBergmann\\CodeCoverage\\Util' => $vendorDir . '/phpunit/php-code-coverage/src/Util.php',
+ 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => $vendorDir . '/sebastian/code-unit-reverse-lookup/src/Wizard.php',
+ 'SebastianBergmann\\Comparator\\ArrayComparator' => $vendorDir . '/sebastian/comparator/src/ArrayComparator.php',
+ 'SebastianBergmann\\Comparator\\Comparator' => $vendorDir . '/sebastian/comparator/src/Comparator.php',
+ 'SebastianBergmann\\Comparator\\ComparisonFailure' => $vendorDir . '/sebastian/comparator/src/ComparisonFailure.php',
+ 'SebastianBergmann\\Comparator\\DOMNodeComparator' => $vendorDir . '/sebastian/comparator/src/DOMNodeComparator.php',
+ 'SebastianBergmann\\Comparator\\DateTimeComparator' => $vendorDir . '/sebastian/comparator/src/DateTimeComparator.php',
+ 'SebastianBergmann\\Comparator\\DoubleComparator' => $vendorDir . '/sebastian/comparator/src/DoubleComparator.php',
+ 'SebastianBergmann\\Comparator\\ExceptionComparator' => $vendorDir . '/sebastian/comparator/src/ExceptionComparator.php',
+ 'SebastianBergmann\\Comparator\\Factory' => $vendorDir . '/sebastian/comparator/src/Factory.php',
+ 'SebastianBergmann\\Comparator\\MockObjectComparator' => $vendorDir . '/sebastian/comparator/src/MockObjectComparator.php',
+ 'SebastianBergmann\\Comparator\\NumericComparator' => $vendorDir . '/sebastian/comparator/src/NumericComparator.php',
+ 'SebastianBergmann\\Comparator\\ObjectComparator' => $vendorDir . '/sebastian/comparator/src/ObjectComparator.php',
+ 'SebastianBergmann\\Comparator\\ResourceComparator' => $vendorDir . '/sebastian/comparator/src/ResourceComparator.php',
+ 'SebastianBergmann\\Comparator\\ScalarComparator' => $vendorDir . '/sebastian/comparator/src/ScalarComparator.php',
+ 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => $vendorDir . '/sebastian/comparator/src/SplObjectStorageComparator.php',
+ 'SebastianBergmann\\Comparator\\TypeComparator' => $vendorDir . '/sebastian/comparator/src/TypeComparator.php',
+ 'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php',
+ 'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php',
+ 'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php',
+ 'SebastianBergmann\\Diff\\LCS\\LongestCommonSubsequence' => $vendorDir . '/sebastian/diff/src/LCS/LongestCommonSubsequence.php',
+ 'SebastianBergmann\\Diff\\LCS\\MemoryEfficientImplementation' => $vendorDir . '/sebastian/diff/src/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php',
+ 'SebastianBergmann\\Diff\\LCS\\TimeEfficientImplementation' => $vendorDir . '/sebastian/diff/src/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php',
+ 'SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php',
+ 'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php',
+ 'SebastianBergmann\\Environment\\Console' => $vendorDir . '/sebastian/environment/src/Console.php',
+ 'SebastianBergmann\\Environment\\Runtime' => $vendorDir . '/sebastian/environment/src/Runtime.php',
+ 'SebastianBergmann\\Exporter\\Exporter' => $vendorDir . '/sebastian/exporter/src/Exporter.php',
+ 'SebastianBergmann\\GlobalState\\Blacklist' => $vendorDir . '/sebastian/global-state/src/Blacklist.php',
+ 'SebastianBergmann\\GlobalState\\CodeExporter' => $vendorDir . '/sebastian/global-state/src/CodeExporter.php',
+ 'SebastianBergmann\\GlobalState\\Exception' => $vendorDir . '/sebastian/global-state/src/Exception.php',
+ 'SebastianBergmann\\GlobalState\\Restorer' => $vendorDir . '/sebastian/global-state/src/Restorer.php',
+ 'SebastianBergmann\\GlobalState\\RuntimeException' => $vendorDir . '/sebastian/global-state/src/RuntimeException.php',
+ 'SebastianBergmann\\GlobalState\\Snapshot' => $vendorDir . '/sebastian/global-state/src/Snapshot.php',
+ 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => $vendorDir . '/sebastian/object-enumerator/src/Enumerator.php',
+ 'SebastianBergmann\\ObjectEnumerator\\Exception' => $vendorDir . '/sebastian/object-enumerator/src/Exception.php',
+ 'SebastianBergmann\\ObjectEnumerator\\InvalidArgumentException' => $vendorDir . '/sebastian/object-enumerator/src/InvalidArgumentException.php',
+ 'SebastianBergmann\\RecursionContext\\Context' => $vendorDir . '/sebastian/recursion-context/src/Context.php',
+ 'SebastianBergmann\\RecursionContext\\Exception' => $vendorDir . '/sebastian/recursion-context/src/Exception.php',
+ 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => $vendorDir . '/sebastian/recursion-context/src/InvalidArgumentException.php',
+ 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => $vendorDir . '/sebastian/resource-operations/src/ResourceOperations.php',
+ 'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php',
+ 'Slim\\App' => $vendorDir . '/slim/slim/Slim/App.php',
+ 'Slim\\CallableResolver' => $vendorDir . '/slim/slim/Slim/CallableResolver.php',
+ 'Slim\\CallableResolverAwareTrait' => $vendorDir . '/slim/slim/Slim/CallableResolverAwareTrait.php',
+ 'Slim\\Collection' => $vendorDir . '/slim/slim/Slim/Collection.php',
+ 'Slim\\Container' => $vendorDir . '/slim/slim/Slim/Container.php',
+ 'Slim\\DefaultServicesProvider' => $vendorDir . '/slim/slim/Slim/DefaultServicesProvider.php',
+ 'Slim\\DeferredCallable' => $vendorDir . '/slim/slim/Slim/DeferredCallable.php',
+ 'Slim\\Exception\\ContainerException' => $vendorDir . '/slim/slim/Slim/Exception/ContainerException.php',
+ 'Slim\\Exception\\ContainerValueNotFoundException' => $vendorDir . '/slim/slim/Slim/Exception/ContainerValueNotFoundException.php',
+ 'Slim\\Exception\\InvalidMethodException' => $vendorDir . '/slim/slim/Slim/Exception/InvalidMethodException.php',
+ 'Slim\\Exception\\MethodNotAllowedException' => $vendorDir . '/slim/slim/Slim/Exception/MethodNotAllowedException.php',
+ 'Slim\\Exception\\NotFoundException' => $vendorDir . '/slim/slim/Slim/Exception/NotFoundException.php',
+ 'Slim\\Exception\\SlimException' => $vendorDir . '/slim/slim/Slim/Exception/SlimException.php',
+ 'Slim\\Handlers\\AbstractError' => $vendorDir . '/slim/slim/Slim/Handlers/AbstractError.php',
+ 'Slim\\Handlers\\AbstractHandler' => $vendorDir . '/slim/slim/Slim/Handlers/AbstractHandler.php',
+ 'Slim\\Handlers\\Error' => $vendorDir . '/slim/slim/Slim/Handlers/Error.php',
+ 'Slim\\Handlers\\NotAllowed' => $vendorDir . '/slim/slim/Slim/Handlers/NotAllowed.php',
+ 'Slim\\Handlers\\NotFound' => $vendorDir . '/slim/slim/Slim/Handlers/NotFound.php',
+ 'Slim\\Handlers\\PhpError' => $vendorDir . '/slim/slim/Slim/Handlers/PhpError.php',
+ 'Slim\\Handlers\\Strategies\\RequestResponse' => $vendorDir . '/slim/slim/Slim/Handlers/Strategies/RequestResponse.php',
+ 'Slim\\Handlers\\Strategies\\RequestResponseArgs' => $vendorDir . '/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php',
+ 'Slim\\Http\\Body' => $vendorDir . '/slim/slim/Slim/Http/Body.php',
+ 'Slim\\Http\\Cookies' => $vendorDir . '/slim/slim/Slim/Http/Cookies.php',
+ 'Slim\\Http\\Environment' => $vendorDir . '/slim/slim/Slim/Http/Environment.php',
+ 'Slim\\Http\\Headers' => $vendorDir . '/slim/slim/Slim/Http/Headers.php',
+ 'Slim\\Http\\Message' => $vendorDir . '/slim/slim/Slim/Http/Message.php',
+ 'Slim\\Http\\Request' => $vendorDir . '/slim/slim/Slim/Http/Request.php',
+ 'Slim\\Http\\RequestBody' => $vendorDir . '/slim/slim/Slim/Http/RequestBody.php',
+ 'Slim\\Http\\Response' => $vendorDir . '/slim/slim/Slim/Http/Response.php',
+ 'Slim\\Http\\Stream' => $vendorDir . '/slim/slim/Slim/Http/Stream.php',
+ 'Slim\\Http\\UploadedFile' => $vendorDir . '/slim/slim/Slim/Http/UploadedFile.php',
+ 'Slim\\Http\\Uri' => $vendorDir . '/slim/slim/Slim/Http/Uri.php',
+ 'Slim\\Interfaces\\CallableResolverInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/CallableResolverInterface.php',
+ 'Slim\\Interfaces\\CollectionInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/CollectionInterface.php',
+ 'Slim\\Interfaces\\Http\\CookiesInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/Http/CookiesInterface.php',
+ 'Slim\\Interfaces\\Http\\EnvironmentInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php',
+ 'Slim\\Interfaces\\Http\\HeadersInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/Http/HeadersInterface.php',
+ 'Slim\\Interfaces\\InvocationStrategyInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php',
+ 'Slim\\Interfaces\\RouteGroupInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/RouteGroupInterface.php',
+ 'Slim\\Interfaces\\RouteInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/RouteInterface.php',
+ 'Slim\\Interfaces\\RouterInterface' => $vendorDir . '/slim/slim/Slim/Interfaces/RouterInterface.php',
+ 'Slim\\MiddlewareAwareTrait' => $vendorDir . '/slim/slim/Slim/MiddlewareAwareTrait.php',
+ 'Slim\\Routable' => $vendorDir . '/slim/slim/Slim/Routable.php',
+ 'Slim\\Route' => $vendorDir . '/slim/slim/Slim/Route.php',
+ 'Slim\\RouteGroup' => $vendorDir . '/slim/slim/Slim/RouteGroup.php',
+ 'Slim\\Router' => $vendorDir . '/slim/slim/Slim/Router.php',
+ 'Slim\\Views\\Twig' => $vendorDir . '/slim/twig-view/src/Twig.php',
+ 'Slim\\Views\\TwigExtension' => $vendorDir . '/slim/twig-view/src/TwigExtension.php',
+ 'Symfony\\Component\\Config\\ConfigCache' => $vendorDir . '/symfony/config/ConfigCache.php',
+ 'Symfony\\Component\\Config\\ConfigCacheFactory' => $vendorDir . '/symfony/config/ConfigCacheFactory.php',
+ 'Symfony\\Component\\Config\\ConfigCacheFactoryInterface' => $vendorDir . '/symfony/config/ConfigCacheFactoryInterface.php',
+ 'Symfony\\Component\\Config\\ConfigCacheInterface' => $vendorDir . '/symfony/config/ConfigCacheInterface.php',
+ 'Symfony\\Component\\Config\\Definition\\ArrayNode' => $vendorDir . '/symfony/config/Definition/ArrayNode.php',
+ 'Symfony\\Component\\Config\\Definition\\BaseNode' => $vendorDir . '/symfony/config/Definition/BaseNode.php',
+ 'Symfony\\Component\\Config\\Definition\\BooleanNode' => $vendorDir . '/symfony/config/Definition/BooleanNode.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\ArrayNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/ArrayNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\BooleanNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/BooleanNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\BuilderAwareInterface' => $vendorDir . '/symfony/config/Definition/Builder/BuilderAwareInterface.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\EnumNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/EnumNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\ExprBuilder' => $vendorDir . '/symfony/config/Definition/Builder/ExprBuilder.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\FloatNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/FloatNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\IntegerNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/IntegerNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\MergeBuilder' => $vendorDir . '/symfony/config/Definition/Builder/MergeBuilder.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\NodeBuilder' => $vendorDir . '/symfony/config/Definition/Builder/NodeBuilder.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/NodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\NodeParentInterface' => $vendorDir . '/symfony/config/Definition/Builder/NodeParentInterface.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\NormalizationBuilder' => $vendorDir . '/symfony/config/Definition/Builder/NormalizationBuilder.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\NumericNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/NumericNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\ParentNodeDefinitionInterface' => $vendorDir . '/symfony/config/Definition/Builder/ParentNodeDefinitionInterface.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\ScalarNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/ScalarNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder' => $vendorDir . '/symfony/config/Definition/Builder/TreeBuilder.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\ValidationBuilder' => $vendorDir . '/symfony/config/Definition/Builder/ValidationBuilder.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\VariableNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/VariableNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\ConfigurationInterface' => $vendorDir . '/symfony/config/Definition/ConfigurationInterface.php',
+ 'Symfony\\Component\\Config\\Definition\\Dumper\\XmlReferenceDumper' => $vendorDir . '/symfony/config/Definition/Dumper/XmlReferenceDumper.php',
+ 'Symfony\\Component\\Config\\Definition\\Dumper\\YamlReferenceDumper' => $vendorDir . '/symfony/config/Definition/Dumper/YamlReferenceDumper.php',
+ 'Symfony\\Component\\Config\\Definition\\EnumNode' => $vendorDir . '/symfony/config/Definition/EnumNode.php',
+ 'Symfony\\Component\\Config\\Definition\\Exception\\DuplicateKeyException' => $vendorDir . '/symfony/config/Definition/Exception/DuplicateKeyException.php',
+ 'Symfony\\Component\\Config\\Definition\\Exception\\Exception' => $vendorDir . '/symfony/config/Definition/Exception/Exception.php',
+ 'Symfony\\Component\\Config\\Definition\\Exception\\ForbiddenOverwriteException' => $vendorDir . '/symfony/config/Definition/Exception/ForbiddenOverwriteException.php',
+ 'Symfony\\Component\\Config\\Definition\\Exception\\InvalidConfigurationException' => $vendorDir . '/symfony/config/Definition/Exception/InvalidConfigurationException.php',
+ 'Symfony\\Component\\Config\\Definition\\Exception\\InvalidDefinitionException' => $vendorDir . '/symfony/config/Definition/Exception/InvalidDefinitionException.php',
+ 'Symfony\\Component\\Config\\Definition\\Exception\\InvalidTypeException' => $vendorDir . '/symfony/config/Definition/Exception/InvalidTypeException.php',
+ 'Symfony\\Component\\Config\\Definition\\Exception\\UnsetKeyException' => $vendorDir . '/symfony/config/Definition/Exception/UnsetKeyException.php',
+ 'Symfony\\Component\\Config\\Definition\\FloatNode' => $vendorDir . '/symfony/config/Definition/FloatNode.php',
+ 'Symfony\\Component\\Config\\Definition\\IntegerNode' => $vendorDir . '/symfony/config/Definition/IntegerNode.php',
+ 'Symfony\\Component\\Config\\Definition\\NodeInterface' => $vendorDir . '/symfony/config/Definition/NodeInterface.php',
+ 'Symfony\\Component\\Config\\Definition\\NumericNode' => $vendorDir . '/symfony/config/Definition/NumericNode.php',
+ 'Symfony\\Component\\Config\\Definition\\Processor' => $vendorDir . '/symfony/config/Definition/Processor.php',
+ 'Symfony\\Component\\Config\\Definition\\PrototypeNodeInterface' => $vendorDir . '/symfony/config/Definition/PrototypeNodeInterface.php',
+ 'Symfony\\Component\\Config\\Definition\\PrototypedArrayNode' => $vendorDir . '/symfony/config/Definition/PrototypedArrayNode.php',
+ 'Symfony\\Component\\Config\\Definition\\ScalarNode' => $vendorDir . '/symfony/config/Definition/ScalarNode.php',
+ 'Symfony\\Component\\Config\\Definition\\VariableNode' => $vendorDir . '/symfony/config/Definition/VariableNode.php',
+ 'Symfony\\Component\\Config\\Exception\\FileLoaderImportCircularReferenceException' => $vendorDir . '/symfony/config/Exception/FileLoaderImportCircularReferenceException.php',
+ 'Symfony\\Component\\Config\\Exception\\FileLoaderLoadException' => $vendorDir . '/symfony/config/Exception/FileLoaderLoadException.php',
+ 'Symfony\\Component\\Config\\Exception\\FileLocatorFileNotFoundException' => $vendorDir . '/symfony/config/Exception/FileLocatorFileNotFoundException.php',
+ 'Symfony\\Component\\Config\\FileLocator' => $vendorDir . '/symfony/config/FileLocator.php',
+ 'Symfony\\Component\\Config\\FileLocatorInterface' => $vendorDir . '/symfony/config/FileLocatorInterface.php',
+ 'Symfony\\Component\\Config\\Loader\\DelegatingLoader' => $vendorDir . '/symfony/config/Loader/DelegatingLoader.php',
+ 'Symfony\\Component\\Config\\Loader\\FileLoader' => $vendorDir . '/symfony/config/Loader/FileLoader.php',
+ 'Symfony\\Component\\Config\\Loader\\GlobFileLoader' => $vendorDir . '/symfony/config/Loader/GlobFileLoader.php',
+ 'Symfony\\Component\\Config\\Loader\\Loader' => $vendorDir . '/symfony/config/Loader/Loader.php',
+ 'Symfony\\Component\\Config\\Loader\\LoaderInterface' => $vendorDir . '/symfony/config/Loader/LoaderInterface.php',
+ 'Symfony\\Component\\Config\\Loader\\LoaderResolver' => $vendorDir . '/symfony/config/Loader/LoaderResolver.php',
+ 'Symfony\\Component\\Config\\Loader\\LoaderResolverInterface' => $vendorDir . '/symfony/config/Loader/LoaderResolverInterface.php',
+ 'Symfony\\Component\\Config\\ResourceCheckerConfigCache' => $vendorDir . '/symfony/config/ResourceCheckerConfigCache.php',
+ 'Symfony\\Component\\Config\\ResourceCheckerConfigCacheFactory' => $vendorDir . '/symfony/config/ResourceCheckerConfigCacheFactory.php',
+ 'Symfony\\Component\\Config\\ResourceCheckerInterface' => $vendorDir . '/symfony/config/ResourceCheckerInterface.php',
+ 'Symfony\\Component\\Config\\Resource\\ClassExistenceResource' => $vendorDir . '/symfony/config/Resource/ClassExistenceResource.php',
+ 'Symfony\\Component\\Config\\Resource\\ComposerResource' => $vendorDir . '/symfony/config/Resource/ComposerResource.php',
+ 'Symfony\\Component\\Config\\Resource\\DirectoryResource' => $vendorDir . '/symfony/config/Resource/DirectoryResource.php',
+ 'Symfony\\Component\\Config\\Resource\\FileExistenceResource' => $vendorDir . '/symfony/config/Resource/FileExistenceResource.php',
+ 'Symfony\\Component\\Config\\Resource\\FileResource' => $vendorDir . '/symfony/config/Resource/FileResource.php',
+ 'Symfony\\Component\\Config\\Resource\\GlobResource' => $vendorDir . '/symfony/config/Resource/GlobResource.php',
+ 'Symfony\\Component\\Config\\Resource\\ReflectionClassResource' => $vendorDir . '/symfony/config/Resource/ReflectionClassResource.php',
+ 'Symfony\\Component\\Config\\Resource\\ResourceInterface' => $vendorDir . '/symfony/config/Resource/ResourceInterface.php',
+ 'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceChecker' => $vendorDir . '/symfony/config/Resource/SelfCheckingResourceChecker.php',
+ 'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceInterface' => $vendorDir . '/symfony/config/Resource/SelfCheckingResourceInterface.php',
+ 'Symfony\\Component\\Config\\Util\\Exception\\InvalidXmlException' => $vendorDir . '/symfony/config/Util/Exception/InvalidXmlException.php',
+ 'Symfony\\Component\\Config\\Util\\Exception\\XmlParsingException' => $vendorDir . '/symfony/config/Util/Exception/XmlParsingException.php',
+ 'Symfony\\Component\\Config\\Util\\XmlUtils' => $vendorDir . '/symfony/config/Util/XmlUtils.php',
+ 'Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php',
+ 'Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => $vendorDir . '/symfony/console/CommandLoader/CommandLoaderInterface.php',
+ 'Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/ContainerCommandLoader.php',
+ 'Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/FactoryCommandLoader.php',
+ 'Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php',
+ 'Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php',
+ 'Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php',
+ 'Symfony\\Component\\Console\\Command\\LockableTrait' => $vendorDir . '/symfony/console/Command/LockableTrait.php',
+ 'Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/ConsoleEvents.php',
+ 'Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => $vendorDir . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php',
+ 'Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Descriptor/ApplicationDescription.php',
+ 'Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Descriptor/Descriptor.php',
+ 'Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => $vendorDir . '/symfony/console/Descriptor/DescriptorInterface.php',
+ 'Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/console/Descriptor/JsonDescriptor.php',
+ 'Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Descriptor/MarkdownDescriptor.php',
+ 'Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/console/Descriptor/TextDescriptor.php',
+ 'Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/console/Descriptor/XmlDescriptor.php',
+ 'Symfony\\Component\\Console\\EventListener\\ErrorListener' => $vendorDir . '/symfony/console/EventListener/ErrorListener.php',
+ 'Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => $vendorDir . '/symfony/console/Event/ConsoleCommandEvent.php',
+ 'Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => $vendorDir . '/symfony/console/Event/ConsoleErrorEvent.php',
+ 'Symfony\\Component\\Console\\Event\\ConsoleEvent' => $vendorDir . '/symfony/console/Event/ConsoleEvent.php',
+ 'Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => $vendorDir . '/symfony/console/Event/ConsoleTerminateEvent.php',
+ 'Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => $vendorDir . '/symfony/console/Exception/CommandNotFoundException.php',
+ 'Symfony\\Component\\Console\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/console/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/console/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\Console\\Exception\\InvalidOptionException' => $vendorDir . '/symfony/console/Exception/InvalidOptionException.php',
+ 'Symfony\\Component\\Console\\Exception\\LogicException' => $vendorDir . '/symfony/console/Exception/LogicException.php',
+ 'Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => $vendorDir . '/symfony/console/Exception/NamespaceNotFoundException.php',
+ 'Symfony\\Component\\Console\\Exception\\RuntimeException' => $vendorDir . '/symfony/console/Exception/RuntimeException.php',
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Formatter/OutputFormatter.php',
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterInterface.php',
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyle.php',
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleInterface.php',
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleStack.php',
+ 'Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php',
+ 'Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php',
+ 'Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php',
+ 'Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Helper/Helper.php',
+ 'Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Helper/HelperInterface.php',
+ 'Symfony\\Component\\Console\\Helper\\HelperSet' => $vendorDir . '/symfony/console/Helper/HelperSet.php',
+ 'Symfony\\Component\\Console\\Helper\\InputAwareHelper' => $vendorDir . '/symfony/console/Helper/InputAwareHelper.php',
+ 'Symfony\\Component\\Console\\Helper\\ProcessHelper' => $vendorDir . '/symfony/console/Helper/ProcessHelper.php',
+ 'Symfony\\Component\\Console\\Helper\\ProgressBar' => $vendorDir . '/symfony/console/Helper/ProgressBar.php',
+ 'Symfony\\Component\\Console\\Helper\\ProgressIndicator' => $vendorDir . '/symfony/console/Helper/ProgressIndicator.php',
+ 'Symfony\\Component\\Console\\Helper\\QuestionHelper' => $vendorDir . '/symfony/console/Helper/QuestionHelper.php',
+ 'Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => $vendorDir . '/symfony/console/Helper/SymfonyQuestionHelper.php',
+ 'Symfony\\Component\\Console\\Helper\\Table' => $vendorDir . '/symfony/console/Helper/Table.php',
+ 'Symfony\\Component\\Console\\Helper\\TableCell' => $vendorDir . '/symfony/console/Helper/TableCell.php',
+ 'Symfony\\Component\\Console\\Helper\\TableRows' => $vendorDir . '/symfony/console/Helper/TableRows.php',
+ 'Symfony\\Component\\Console\\Helper\\TableSeparator' => $vendorDir . '/symfony/console/Helper/TableSeparator.php',
+ 'Symfony\\Component\\Console\\Helper\\TableStyle' => $vendorDir . '/symfony/console/Helper/TableStyle.php',
+ 'Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Input/ArgvInput.php',
+ 'Symfony\\Component\\Console\\Input\\ArrayInput' => $vendorDir . '/symfony/console/Input/ArrayInput.php',
+ 'Symfony\\Component\\Console\\Input\\Input' => $vendorDir . '/symfony/console/Input/Input.php',
+ 'Symfony\\Component\\Console\\Input\\InputArgument' => $vendorDir . '/symfony/console/Input/InputArgument.php',
+ 'Symfony\\Component\\Console\\Input\\InputAwareInterface' => $vendorDir . '/symfony/console/Input/InputAwareInterface.php',
+ 'Symfony\\Component\\Console\\Input\\InputDefinition' => $vendorDir . '/symfony/console/Input/InputDefinition.php',
+ 'Symfony\\Component\\Console\\Input\\InputInterface' => $vendorDir . '/symfony/console/Input/InputInterface.php',
+ 'Symfony\\Component\\Console\\Input\\InputOption' => $vendorDir . '/symfony/console/Input/InputOption.php',
+ 'Symfony\\Component\\Console\\Input\\StreamableInputInterface' => $vendorDir . '/symfony/console/Input/StreamableInputInterface.php',
+ 'Symfony\\Component\\Console\\Input\\StringInput' => $vendorDir . '/symfony/console/Input/StringInput.php',
+ 'Symfony\\Component\\Console\\Logger\\ConsoleLogger' => $vendorDir . '/symfony/console/Logger/ConsoleLogger.php',
+ 'Symfony\\Component\\Console\\Output\\BufferedOutput' => $vendorDir . '/symfony/console/Output/BufferedOutput.php',
+ 'Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Output/ConsoleOutput.php',
+ 'Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Output/ConsoleOutputInterface.php',
+ 'Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => $vendorDir . '/symfony/console/Output/ConsoleSectionOutput.php',
+ 'Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Output/NullOutput.php',
+ 'Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Output/Output.php',
+ 'Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Output/OutputInterface.php',
+ 'Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Output/StreamOutput.php',
+ 'Symfony\\Component\\Console\\Question\\ChoiceQuestion' => $vendorDir . '/symfony/console/Question/ChoiceQuestion.php',
+ 'Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Question/ConfirmationQuestion.php',
+ 'Symfony\\Component\\Console\\Question\\Question' => $vendorDir . '/symfony/console/Question/Question.php',
+ 'Symfony\\Component\\Console\\Style\\OutputStyle' => $vendorDir . '/symfony/console/Style/OutputStyle.php',
+ 'Symfony\\Component\\Console\\Style\\StyleInterface' => $vendorDir . '/symfony/console/Style/StyleInterface.php',
+ 'Symfony\\Component\\Console\\Style\\SymfonyStyle' => $vendorDir . '/symfony/console/Style/SymfonyStyle.php',
+ 'Symfony\\Component\\Console\\Terminal' => $vendorDir . '/symfony/console/Terminal.php',
+ 'Symfony\\Component\\Console\\Tester\\ApplicationTester' => $vendorDir . '/symfony/console/Tester/ApplicationTester.php',
+ 'Symfony\\Component\\Console\\Tester\\CommandTester' => $vendorDir . '/symfony/console/Tester/CommandTester.php',
+ 'Symfony\\Component\\Console\\Tester\\TesterTrait' => $vendorDir . '/symfony/console/Tester/TesterTrait.php',
+ 'Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/filesystem/Exception/FileNotFoundException.php',
+ 'Symfony\\Component\\Filesystem\\Exception\\IOException' => $vendorDir . '/symfony/filesystem/Exception/IOException.php',
+ 'Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/IOExceptionInterface.php',
+ 'Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/filesystem/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\Filesystem\\Filesystem' => $vendorDir . '/symfony/filesystem/Filesystem.php',
+ 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => $vendorDir . '/symfony/translation/Catalogue/AbstractOperation.php',
+ 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => $vendorDir . '/symfony/translation/Catalogue/MergeOperation.php',
+ 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => $vendorDir . '/symfony/translation/Catalogue/OperationInterface.php',
+ 'Symfony\\Component\\Translation\\Catalogue\\TargetOperation' => $vendorDir . '/symfony/translation/Catalogue/TargetOperation.php',
+ 'Symfony\\Component\\Translation\\Command\\XliffLintCommand' => $vendorDir . '/symfony/translation/Command/XliffLintCommand.php',
+ 'Symfony\\Component\\Translation\\DataCollectorTranslator' => $vendorDir . '/symfony/translation/DataCollectorTranslator.php',
+ 'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => $vendorDir . '/symfony/translation/DataCollector/TranslationDataCollector.php',
+ 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationDumperPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslationDumperPass.php',
+ 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationExtractorPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslationExtractorPass.php',
+ 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslatorPass.php',
+ 'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => $vendorDir . '/symfony/translation/Dumper/CsvFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\DumperInterface' => $vendorDir . '/symfony/translation/Dumper/DumperInterface.php',
+ 'Symfony\\Component\\Translation\\Dumper\\FileDumper' => $vendorDir . '/symfony/translation/Dumper/FileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\IcuResFileDumper' => $vendorDir . '/symfony/translation/Dumper/IcuResFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\IniFileDumper' => $vendorDir . '/symfony/translation/Dumper/IniFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\JsonFileDumper' => $vendorDir . '/symfony/translation/Dumper/JsonFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\MoFileDumper' => $vendorDir . '/symfony/translation/Dumper/MoFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\PhpFileDumper' => $vendorDir . '/symfony/translation/Dumper/PhpFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\PoFileDumper' => $vendorDir . '/symfony/translation/Dumper/PoFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\QtFileDumper' => $vendorDir . '/symfony/translation/Dumper/QtFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\XliffFileDumper' => $vendorDir . '/symfony/translation/Dumper/XliffFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\YamlFileDumper' => $vendorDir . '/symfony/translation/Dumper/YamlFileDumper.php',
+ 'Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/translation/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Translation\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/translation/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => $vendorDir . '/symfony/translation/Exception/InvalidResourceException.php',
+ 'Symfony\\Component\\Translation\\Exception\\LogicException' => $vendorDir . '/symfony/translation/Exception/LogicException.php',
+ 'Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => $vendorDir . '/symfony/translation/Exception/NotFoundResourceException.php',
+ 'Symfony\\Component\\Translation\\Exception\\RuntimeException' => $vendorDir . '/symfony/translation/Exception/RuntimeException.php',
+ 'Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor' => $vendorDir . '/symfony/translation/Extractor/AbstractFileExtractor.php',
+ 'Symfony\\Component\\Translation\\Extractor\\ChainExtractor' => $vendorDir . '/symfony/translation/Extractor/ChainExtractor.php',
+ 'Symfony\\Component\\Translation\\Extractor\\ExtractorInterface' => $vendorDir . '/symfony/translation/Extractor/ExtractorInterface.php',
+ 'Symfony\\Component\\Translation\\Extractor\\PhpExtractor' => $vendorDir . '/symfony/translation/Extractor/PhpExtractor.php',
+ 'Symfony\\Component\\Translation\\Extractor\\PhpStringTokenParser' => $vendorDir . '/symfony/translation/Extractor/PhpStringTokenParser.php',
+ 'Symfony\\Component\\Translation\\Formatter\\ChoiceMessageFormatterInterface' => $vendorDir . '/symfony/translation/Formatter/ChoiceMessageFormatterInterface.php',
+ 'Symfony\\Component\\Translation\\Formatter\\MessageFormatter' => $vendorDir . '/symfony/translation/Formatter/MessageFormatter.php',
+ 'Symfony\\Component\\Translation\\Formatter\\MessageFormatterInterface' => $vendorDir . '/symfony/translation/Formatter/MessageFormatterInterface.php',
+ 'Symfony\\Component\\Translation\\IdentityTranslator' => $vendorDir . '/symfony/translation/IdentityTranslator.php',
+ 'Symfony\\Component\\Translation\\Interval' => $vendorDir . '/symfony/translation/Interval.php',
+ 'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => $vendorDir . '/symfony/translation/Loader/ArrayLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => $vendorDir . '/symfony/translation/Loader/CsvFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\FileLoader' => $vendorDir . '/symfony/translation/Loader/FileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuDatFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuResFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => $vendorDir . '/symfony/translation/Loader/IniFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\JsonFileLoader' => $vendorDir . '/symfony/translation/Loader/JsonFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\LoaderInterface' => $vendorDir . '/symfony/translation/Loader/LoaderInterface.php',
+ 'Symfony\\Component\\Translation\\Loader\\MoFileLoader' => $vendorDir . '/symfony/translation/Loader/MoFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/translation/Loader/PhpFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\PoFileLoader' => $vendorDir . '/symfony/translation/Loader/PoFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => $vendorDir . '/symfony/translation/Loader/QtFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => $vendorDir . '/symfony/translation/Loader/XliffFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/translation/Loader/YamlFileLoader.php',
+ 'Symfony\\Component\\Translation\\LoggingTranslator' => $vendorDir . '/symfony/translation/LoggingTranslator.php',
+ 'Symfony\\Component\\Translation\\MessageCatalogue' => $vendorDir . '/symfony/translation/MessageCatalogue.php',
+ 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => $vendorDir . '/symfony/translation/MessageCatalogueInterface.php',
+ 'Symfony\\Component\\Translation\\MessageSelector' => $vendorDir . '/symfony/translation/MessageSelector.php',
+ 'Symfony\\Component\\Translation\\MetadataAwareInterface' => $vendorDir . '/symfony/translation/MetadataAwareInterface.php',
+ 'Symfony\\Component\\Translation\\PluralizationRules' => $vendorDir . '/symfony/translation/PluralizationRules.php',
+ 'Symfony\\Component\\Translation\\Reader\\TranslationReader' => $vendorDir . '/symfony/translation/Reader/TranslationReader.php',
+ 'Symfony\\Component\\Translation\\Reader\\TranslationReaderInterface' => $vendorDir . '/symfony/translation/Reader/TranslationReaderInterface.php',
+ 'Symfony\\Component\\Translation\\Translator' => $vendorDir . '/symfony/translation/Translator.php',
+ 'Symfony\\Component\\Translation\\TranslatorBagInterface' => $vendorDir . '/symfony/translation/TranslatorBagInterface.php',
+ 'Symfony\\Component\\Translation\\TranslatorInterface' => $vendorDir . '/symfony/translation/TranslatorInterface.php',
+ 'Symfony\\Component\\Translation\\Util\\ArrayConverter' => $vendorDir . '/symfony/translation/Util/ArrayConverter.php',
+ 'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => $vendorDir . '/symfony/translation/Writer/TranslationWriter.php',
+ 'Symfony\\Component\\Translation\\Writer\\TranslationWriterInterface' => $vendorDir . '/symfony/translation/Writer/TranslationWriterInterface.php',
+ 'Symfony\\Component\\Validator\\Constraint' => $vendorDir . '/symfony/validator/Constraint.php',
+ 'Symfony\\Component\\Validator\\ConstraintValidator' => $vendorDir . '/symfony/validator/ConstraintValidator.php',
+ 'Symfony\\Component\\Validator\\ConstraintValidatorFactory' => $vendorDir . '/symfony/validator/ConstraintValidatorFactory.php',
+ 'Symfony\\Component\\Validator\\ConstraintValidatorFactoryInterface' => $vendorDir . '/symfony/validator/ConstraintValidatorFactoryInterface.php',
+ 'Symfony\\Component\\Validator\\ConstraintValidatorInterface' => $vendorDir . '/symfony/validator/ConstraintValidatorInterface.php',
+ 'Symfony\\Component\\Validator\\ConstraintViolation' => $vendorDir . '/symfony/validator/ConstraintViolation.php',
+ 'Symfony\\Component\\Validator\\ConstraintViolationInterface' => $vendorDir . '/symfony/validator/ConstraintViolationInterface.php',
+ 'Symfony\\Component\\Validator\\ConstraintViolationList' => $vendorDir . '/symfony/validator/ConstraintViolationList.php',
+ 'Symfony\\Component\\Validator\\ConstraintViolationListInterface' => $vendorDir . '/symfony/validator/ConstraintViolationListInterface.php',
+ 'Symfony\\Component\\Validator\\Constraints\\AbstractComparison' => $vendorDir . '/symfony/validator/Constraints/AbstractComparison.php',
+ 'Symfony\\Component\\Validator\\Constraints\\AbstractComparisonValidator' => $vendorDir . '/symfony/validator/Constraints/AbstractComparisonValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\All' => $vendorDir . '/symfony/validator/Constraints/All.php',
+ 'Symfony\\Component\\Validator\\Constraints\\AllValidator' => $vendorDir . '/symfony/validator/Constraints/AllValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Bic' => $vendorDir . '/symfony/validator/Constraints/Bic.php',
+ 'Symfony\\Component\\Validator\\Constraints\\BicValidator' => $vendorDir . '/symfony/validator/Constraints/BicValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Blank' => $vendorDir . '/symfony/validator/Constraints/Blank.php',
+ 'Symfony\\Component\\Validator\\Constraints\\BlankValidator' => $vendorDir . '/symfony/validator/Constraints/BlankValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Callback' => $vendorDir . '/symfony/validator/Constraints/Callback.php',
+ 'Symfony\\Component\\Validator\\Constraints\\CallbackValidator' => $vendorDir . '/symfony/validator/Constraints/CallbackValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\CardScheme' => $vendorDir . '/symfony/validator/Constraints/CardScheme.php',
+ 'Symfony\\Component\\Validator\\Constraints\\CardSchemeValidator' => $vendorDir . '/symfony/validator/Constraints/CardSchemeValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Choice' => $vendorDir . '/symfony/validator/Constraints/Choice.php',
+ 'Symfony\\Component\\Validator\\Constraints\\ChoiceValidator' => $vendorDir . '/symfony/validator/Constraints/ChoiceValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Collection' => $vendorDir . '/symfony/validator/Constraints/Collection.php',
+ 'Symfony\\Component\\Validator\\Constraints\\CollectionValidator' => $vendorDir . '/symfony/validator/Constraints/CollectionValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Composite' => $vendorDir . '/symfony/validator/Constraints/Composite.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Count' => $vendorDir . '/symfony/validator/Constraints/Count.php',
+ 'Symfony\\Component\\Validator\\Constraints\\CountValidator' => $vendorDir . '/symfony/validator/Constraints/CountValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Country' => $vendorDir . '/symfony/validator/Constraints/Country.php',
+ 'Symfony\\Component\\Validator\\Constraints\\CountryValidator' => $vendorDir . '/symfony/validator/Constraints/CountryValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Currency' => $vendorDir . '/symfony/validator/Constraints/Currency.php',
+ 'Symfony\\Component\\Validator\\Constraints\\CurrencyValidator' => $vendorDir . '/symfony/validator/Constraints/CurrencyValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Date' => $vendorDir . '/symfony/validator/Constraints/Date.php',
+ 'Symfony\\Component\\Validator\\Constraints\\DateTime' => $vendorDir . '/symfony/validator/Constraints/DateTime.php',
+ 'Symfony\\Component\\Validator\\Constraints\\DateTimeValidator' => $vendorDir . '/symfony/validator/Constraints/DateTimeValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\DateValidator' => $vendorDir . '/symfony/validator/Constraints/DateValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Email' => $vendorDir . '/symfony/validator/Constraints/Email.php',
+ 'Symfony\\Component\\Validator\\Constraints\\EmailValidator' => $vendorDir . '/symfony/validator/Constraints/EmailValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\EqualTo' => $vendorDir . '/symfony/validator/Constraints/EqualTo.php',
+ 'Symfony\\Component\\Validator\\Constraints\\EqualToValidator' => $vendorDir . '/symfony/validator/Constraints/EqualToValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Existence' => $vendorDir . '/symfony/validator/Constraints/Existence.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Expression' => $vendorDir . '/symfony/validator/Constraints/Expression.php',
+ 'Symfony\\Component\\Validator\\Constraints\\ExpressionValidator' => $vendorDir . '/symfony/validator/Constraints/ExpressionValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\File' => $vendorDir . '/symfony/validator/Constraints/File.php',
+ 'Symfony\\Component\\Validator\\Constraints\\FileValidator' => $vendorDir . '/symfony/validator/Constraints/FileValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\GreaterThan' => $vendorDir . '/symfony/validator/Constraints/GreaterThan.php',
+ 'Symfony\\Component\\Validator\\Constraints\\GreaterThanOrEqual' => $vendorDir . '/symfony/validator/Constraints/GreaterThanOrEqual.php',
+ 'Symfony\\Component\\Validator\\Constraints\\GreaterThanOrEqualValidator' => $vendorDir . '/symfony/validator/Constraints/GreaterThanOrEqualValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\GreaterThanValidator' => $vendorDir . '/symfony/validator/Constraints/GreaterThanValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\GroupSequence' => $vendorDir . '/symfony/validator/Constraints/GroupSequence.php',
+ 'Symfony\\Component\\Validator\\Constraints\\GroupSequenceProvider' => $vendorDir . '/symfony/validator/Constraints/GroupSequenceProvider.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Iban' => $vendorDir . '/symfony/validator/Constraints/Iban.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IbanValidator' => $vendorDir . '/symfony/validator/Constraints/IbanValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IdenticalTo' => $vendorDir . '/symfony/validator/Constraints/IdenticalTo.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IdenticalToValidator' => $vendorDir . '/symfony/validator/Constraints/IdenticalToValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Image' => $vendorDir . '/symfony/validator/Constraints/Image.php',
+ 'Symfony\\Component\\Validator\\Constraints\\ImageValidator' => $vendorDir . '/symfony/validator/Constraints/ImageValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Ip' => $vendorDir . '/symfony/validator/Constraints/Ip.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IpValidator' => $vendorDir . '/symfony/validator/Constraints/IpValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IsFalse' => $vendorDir . '/symfony/validator/Constraints/IsFalse.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IsFalseValidator' => $vendorDir . '/symfony/validator/Constraints/IsFalseValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IsNull' => $vendorDir . '/symfony/validator/Constraints/IsNull.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IsNullValidator' => $vendorDir . '/symfony/validator/Constraints/IsNullValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IsTrue' => $vendorDir . '/symfony/validator/Constraints/IsTrue.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IsTrueValidator' => $vendorDir . '/symfony/validator/Constraints/IsTrueValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Isbn' => $vendorDir . '/symfony/validator/Constraints/Isbn.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IsbnValidator' => $vendorDir . '/symfony/validator/Constraints/IsbnValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Issn' => $vendorDir . '/symfony/validator/Constraints/Issn.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IssnValidator' => $vendorDir . '/symfony/validator/Constraints/IssnValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Language' => $vendorDir . '/symfony/validator/Constraints/Language.php',
+ 'Symfony\\Component\\Validator\\Constraints\\LanguageValidator' => $vendorDir . '/symfony/validator/Constraints/LanguageValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Length' => $vendorDir . '/symfony/validator/Constraints/Length.php',
+ 'Symfony\\Component\\Validator\\Constraints\\LengthValidator' => $vendorDir . '/symfony/validator/Constraints/LengthValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\LessThan' => $vendorDir . '/symfony/validator/Constraints/LessThan.php',
+ 'Symfony\\Component\\Validator\\Constraints\\LessThanOrEqual' => $vendorDir . '/symfony/validator/Constraints/LessThanOrEqual.php',
+ 'Symfony\\Component\\Validator\\Constraints\\LessThanOrEqualValidator' => $vendorDir . '/symfony/validator/Constraints/LessThanOrEqualValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\LessThanValidator' => $vendorDir . '/symfony/validator/Constraints/LessThanValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Locale' => $vendorDir . '/symfony/validator/Constraints/Locale.php',
+ 'Symfony\\Component\\Validator\\Constraints\\LocaleValidator' => $vendorDir . '/symfony/validator/Constraints/LocaleValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Luhn' => $vendorDir . '/symfony/validator/Constraints/Luhn.php',
+ 'Symfony\\Component\\Validator\\Constraints\\LuhnValidator' => $vendorDir . '/symfony/validator/Constraints/LuhnValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\NotBlank' => $vendorDir . '/symfony/validator/Constraints/NotBlank.php',
+ 'Symfony\\Component\\Validator\\Constraints\\NotBlankValidator' => $vendorDir . '/symfony/validator/Constraints/NotBlankValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\NotEqualTo' => $vendorDir . '/symfony/validator/Constraints/NotEqualTo.php',
+ 'Symfony\\Component\\Validator\\Constraints\\NotEqualToValidator' => $vendorDir . '/symfony/validator/Constraints/NotEqualToValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\NotIdenticalTo' => $vendorDir . '/symfony/validator/Constraints/NotIdenticalTo.php',
+ 'Symfony\\Component\\Validator\\Constraints\\NotIdenticalToValidator' => $vendorDir . '/symfony/validator/Constraints/NotIdenticalToValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\NotNull' => $vendorDir . '/symfony/validator/Constraints/NotNull.php',
+ 'Symfony\\Component\\Validator\\Constraints\\NotNullValidator' => $vendorDir . '/symfony/validator/Constraints/NotNullValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Optional' => $vendorDir . '/symfony/validator/Constraints/Optional.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Range' => $vendorDir . '/symfony/validator/Constraints/Range.php',
+ 'Symfony\\Component\\Validator\\Constraints\\RangeValidator' => $vendorDir . '/symfony/validator/Constraints/RangeValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Regex' => $vendorDir . '/symfony/validator/Constraints/Regex.php',
+ 'Symfony\\Component\\Validator\\Constraints\\RegexValidator' => $vendorDir . '/symfony/validator/Constraints/RegexValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Required' => $vendorDir . '/symfony/validator/Constraints/Required.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Time' => $vendorDir . '/symfony/validator/Constraints/Time.php',
+ 'Symfony\\Component\\Validator\\Constraints\\TimeValidator' => $vendorDir . '/symfony/validator/Constraints/TimeValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Traverse' => $vendorDir . '/symfony/validator/Constraints/Traverse.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Type' => $vendorDir . '/symfony/validator/Constraints/Type.php',
+ 'Symfony\\Component\\Validator\\Constraints\\TypeValidator' => $vendorDir . '/symfony/validator/Constraints/TypeValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Url' => $vendorDir . '/symfony/validator/Constraints/Url.php',
+ 'Symfony\\Component\\Validator\\Constraints\\UrlValidator' => $vendorDir . '/symfony/validator/Constraints/UrlValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Uuid' => $vendorDir . '/symfony/validator/Constraints/Uuid.php',
+ 'Symfony\\Component\\Validator\\Constraints\\UuidValidator' => $vendorDir . '/symfony/validator/Constraints/UuidValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Valid' => $vendorDir . '/symfony/validator/Constraints/Valid.php',
+ 'Symfony\\Component\\Validator\\Constraints\\ValidValidator' => $vendorDir . '/symfony/validator/Constraints/ValidValidator.php',
+ 'Symfony\\Component\\Validator\\ContainerConstraintValidatorFactory' => $vendorDir . '/symfony/validator/ContainerConstraintValidatorFactory.php',
+ 'Symfony\\Component\\Validator\\Context\\ExecutionContext' => $vendorDir . '/symfony/validator/Context/ExecutionContext.php',
+ 'Symfony\\Component\\Validator\\Context\\ExecutionContextFactory' => $vendorDir . '/symfony/validator/Context/ExecutionContextFactory.php',
+ 'Symfony\\Component\\Validator\\Context\\ExecutionContextFactoryInterface' => $vendorDir . '/symfony/validator/Context/ExecutionContextFactoryInterface.php',
+ 'Symfony\\Component\\Validator\\Context\\ExecutionContextInterface' => $vendorDir . '/symfony/validator/Context/ExecutionContextInterface.php',
+ 'Symfony\\Component\\Validator\\DataCollector\\ValidatorDataCollector' => $vendorDir . '/symfony/validator/DataCollector/ValidatorDataCollector.php',
+ 'Symfony\\Component\\Validator\\DependencyInjection\\AddConstraintValidatorsPass' => $vendorDir . '/symfony/validator/DependencyInjection/AddConstraintValidatorsPass.php',
+ 'Symfony\\Component\\Validator\\DependencyInjection\\AddValidatorInitializersPass' => $vendorDir . '/symfony/validator/DependencyInjection/AddValidatorInitializersPass.php',
+ 'Symfony\\Component\\Validator\\Exception\\BadMethodCallException' => $vendorDir . '/symfony/validator/Exception/BadMethodCallException.php',
+ 'Symfony\\Component\\Validator\\Exception\\ConstraintDefinitionException' => $vendorDir . '/symfony/validator/Exception/ConstraintDefinitionException.php',
+ 'Symfony\\Component\\Validator\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/validator/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Validator\\Exception\\GroupDefinitionException' => $vendorDir . '/symfony/validator/Exception/GroupDefinitionException.php',
+ 'Symfony\\Component\\Validator\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/validator/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\Validator\\Exception\\InvalidOptionsException' => $vendorDir . '/symfony/validator/Exception/InvalidOptionsException.php',
+ 'Symfony\\Component\\Validator\\Exception\\MappingException' => $vendorDir . '/symfony/validator/Exception/MappingException.php',
+ 'Symfony\\Component\\Validator\\Exception\\MissingOptionsException' => $vendorDir . '/symfony/validator/Exception/MissingOptionsException.php',
+ 'Symfony\\Component\\Validator\\Exception\\NoSuchMetadataException' => $vendorDir . '/symfony/validator/Exception/NoSuchMetadataException.php',
+ 'Symfony\\Component\\Validator\\Exception\\OutOfBoundsException' => $vendorDir . '/symfony/validator/Exception/OutOfBoundsException.php',
+ 'Symfony\\Component\\Validator\\Exception\\RuntimeException' => $vendorDir . '/symfony/validator/Exception/RuntimeException.php',
+ 'Symfony\\Component\\Validator\\Exception\\UnexpectedTypeException' => $vendorDir . '/symfony/validator/Exception/UnexpectedTypeException.php',
+ 'Symfony\\Component\\Validator\\Exception\\UnsupportedMetadataException' => $vendorDir . '/symfony/validator/Exception/UnsupportedMetadataException.php',
+ 'Symfony\\Component\\Validator\\Exception\\ValidatorException' => $vendorDir . '/symfony/validator/Exception/ValidatorException.php',
+ 'Symfony\\Component\\Validator\\GroupSequenceProviderInterface' => $vendorDir . '/symfony/validator/GroupSequenceProviderInterface.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Cache\\CacheInterface' => $vendorDir . '/symfony/validator/Mapping/Cache/CacheInterface.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Cache\\DoctrineCache' => $vendorDir . '/symfony/validator/Mapping/Cache/DoctrineCache.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Cache\\Psr6Cache' => $vendorDir . '/symfony/validator/Mapping/Cache/Psr6Cache.php',
+ 'Symfony\\Component\\Validator\\Mapping\\CascadingStrategy' => $vendorDir . '/symfony/validator/Mapping/CascadingStrategy.php',
+ 'Symfony\\Component\\Validator\\Mapping\\ClassMetadata' => $vendorDir . '/symfony/validator/Mapping/ClassMetadata.php',
+ 'Symfony\\Component\\Validator\\Mapping\\ClassMetadataInterface' => $vendorDir . '/symfony/validator/Mapping/ClassMetadataInterface.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Factory\\BlackHoleMetadataFactory' => $vendorDir . '/symfony/validator/Mapping/Factory/BlackHoleMetadataFactory.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Factory\\LazyLoadingMetadataFactory' => $vendorDir . '/symfony/validator/Mapping/Factory/LazyLoadingMetadataFactory.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Factory\\MetadataFactoryInterface' => $vendorDir . '/symfony/validator/Mapping/Factory/MetadataFactoryInterface.php',
+ 'Symfony\\Component\\Validator\\Mapping\\GenericMetadata' => $vendorDir . '/symfony/validator/Mapping/GenericMetadata.php',
+ 'Symfony\\Component\\Validator\\Mapping\\GetterMetadata' => $vendorDir . '/symfony/validator/Mapping/GetterMetadata.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\AbstractLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/AbstractLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\AnnotationLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/AnnotationLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\FileLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/FileLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\FilesLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/FilesLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\LoaderChain' => $vendorDir . '/symfony/validator/Mapping/Loader/LoaderChain.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\LoaderInterface' => $vendorDir . '/symfony/validator/Mapping/Loader/LoaderInterface.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\StaticMethodLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/StaticMethodLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\XmlFileLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/XmlFileLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\XmlFilesLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/XmlFilesLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/YamlFileLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\YamlFilesLoader' => $vendorDir . '/symfony/validator/Mapping/Loader/YamlFilesLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\MemberMetadata' => $vendorDir . '/symfony/validator/Mapping/MemberMetadata.php',
+ 'Symfony\\Component\\Validator\\Mapping\\MetadataInterface' => $vendorDir . '/symfony/validator/Mapping/MetadataInterface.php',
+ 'Symfony\\Component\\Validator\\Mapping\\PropertyMetadata' => $vendorDir . '/symfony/validator/Mapping/PropertyMetadata.php',
+ 'Symfony\\Component\\Validator\\Mapping\\PropertyMetadataInterface' => $vendorDir . '/symfony/validator/Mapping/PropertyMetadataInterface.php',
+ 'Symfony\\Component\\Validator\\Mapping\\TraversalStrategy' => $vendorDir . '/symfony/validator/Mapping/TraversalStrategy.php',
+ 'Symfony\\Component\\Validator\\ObjectInitializerInterface' => $vendorDir . '/symfony/validator/ObjectInitializerInterface.php',
+ 'Symfony\\Component\\Validator\\Test\\ConstraintValidatorTestCase' => $vendorDir . '/symfony/validator/Test/ConstraintValidatorTestCase.php',
+ 'Symfony\\Component\\Validator\\Test\\ConstraintViolationAssertion' => $vendorDir . '/symfony/validator/Test/ConstraintValidatorTestCase.php',
+ 'Symfony\\Component\\Validator\\Util\\PropertyPath' => $vendorDir . '/symfony/validator/Util/PropertyPath.php',
+ 'Symfony\\Component\\Validator\\Validation' => $vendorDir . '/symfony/validator/Validation.php',
+ 'Symfony\\Component\\Validator\\ValidatorBuilder' => $vendorDir . '/symfony/validator/ValidatorBuilder.php',
+ 'Symfony\\Component\\Validator\\ValidatorBuilderInterface' => $vendorDir . '/symfony/validator/ValidatorBuilderInterface.php',
+ 'Symfony\\Component\\Validator\\Validator\\ContextualValidatorInterface' => $vendorDir . '/symfony/validator/Validator/ContextualValidatorInterface.php',
+ 'Symfony\\Component\\Validator\\Validator\\RecursiveContextualValidator' => $vendorDir . '/symfony/validator/Validator/RecursiveContextualValidator.php',
+ 'Symfony\\Component\\Validator\\Validator\\RecursiveValidator' => $vendorDir . '/symfony/validator/Validator/RecursiveValidator.php',
+ 'Symfony\\Component\\Validator\\Validator\\TraceableValidator' => $vendorDir . '/symfony/validator/Validator/TraceableValidator.php',
+ 'Symfony\\Component\\Validator\\Validator\\ValidatorInterface' => $vendorDir . '/symfony/validator/Validator/ValidatorInterface.php',
+ 'Symfony\\Component\\Validator\\Violation\\ConstraintViolationBuilder' => $vendorDir . '/symfony/validator/Violation/ConstraintViolationBuilder.php',
+ 'Symfony\\Component\\Validator\\Violation\\ConstraintViolationBuilderInterface' => $vendorDir . '/symfony/validator/Violation/ConstraintViolationBuilderInterface.php',
+ 'Symfony\\Component\\Yaml\\Command\\LintCommand' => $vendorDir . '/symfony/yaml/Command/LintCommand.php',
+ 'Symfony\\Component\\Yaml\\Dumper' => $vendorDir . '/symfony/yaml/Dumper.php',
+ 'Symfony\\Component\\Yaml\\Escaper' => $vendorDir . '/symfony/yaml/Escaper.php',
+ 'Symfony\\Component\\Yaml\\Exception\\DumpException' => $vendorDir . '/symfony/yaml/Exception/DumpException.php',
+ 'Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/yaml/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Yaml\\Exception\\ParseException' => $vendorDir . '/symfony/yaml/Exception/ParseException.php',
+ 'Symfony\\Component\\Yaml\\Exception\\RuntimeException' => $vendorDir . '/symfony/yaml/Exception/RuntimeException.php',
+ 'Symfony\\Component\\Yaml\\Inline' => $vendorDir . '/symfony/yaml/Inline.php',
+ 'Symfony\\Component\\Yaml\\Parser' => $vendorDir . '/symfony/yaml/Parser.php',
+ 'Symfony\\Component\\Yaml\\Tag\\TaggedValue' => $vendorDir . '/symfony/yaml/Tag/TaggedValue.php',
+ 'Symfony\\Component\\Yaml\\Unescaper' => $vendorDir . '/symfony/yaml/Unescaper.php',
+ 'Symfony\\Component\\Yaml\\Yaml' => $vendorDir . '/symfony/yaml/Yaml.php',
+ 'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php',
+ 'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php',
+ 'Text_Template' => $vendorDir . '/phpunit/php-text-template/src/Template.php',
+ 'Twig\\Cache\\CacheInterface' => $vendorDir . '/twig/twig/src/Cache/CacheInterface.php',
+ 'Twig\\Cache\\FilesystemCache' => $vendorDir . '/twig/twig/src/Cache/FilesystemCache.php',
+ 'Twig\\Cache\\NullCache' => $vendorDir . '/twig/twig/src/Cache/NullCache.php',
+ 'Twig\\Compiler' => $vendorDir . '/twig/twig/src/Compiler.php',
+ 'Twig\\Environment' => $vendorDir . '/twig/twig/src/Environment.php',
+ 'Twig\\Error\\Error' => $vendorDir . '/twig/twig/src/Error/Error.php',
+ 'Twig\\Error\\LoaderError' => $vendorDir . '/twig/twig/src/Error/LoaderError.php',
+ 'Twig\\Error\\RuntimeError' => $vendorDir . '/twig/twig/src/Error/RuntimeError.php',
+ 'Twig\\Error\\SyntaxError' => $vendorDir . '/twig/twig/src/Error/SyntaxError.php',
+ 'Twig\\ExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser.php',
+ 'Twig\\ExtensionSet' => $vendorDir . '/twig/twig/src/ExtensionSet.php',
+ 'Twig\\Extension\\AbstractExtension' => $vendorDir . '/twig/twig/src/Extension/AbstractExtension.php',
+ 'Twig\\Extension\\CoreExtension' => $vendorDir . '/twig/twig/src/Extension/CoreExtension.php',
+ 'Twig\\Extension\\DebugExtension' => $vendorDir . '/twig/twig/src/Extension/DebugExtension.php',
+ 'Twig\\Extension\\EscaperExtension' => $vendorDir . '/twig/twig/src/Extension/EscaperExtension.php',
+ 'Twig\\Extension\\ExtensionInterface' => $vendorDir . '/twig/twig/src/Extension/ExtensionInterface.php',
+ 'Twig\\Extension\\GlobalsInterface' => $vendorDir . '/twig/twig/src/Extension/GlobalsInterface.php',
+ 'Twig\\Extension\\InitRuntimeInterface' => $vendorDir . '/twig/twig/src/Extension/InitRuntimeInterface.php',
+ 'Twig\\Extension\\OptimizerExtension' => $vendorDir . '/twig/twig/src/Extension/OptimizerExtension.php',
+ 'Twig\\Extension\\ProfilerExtension' => $vendorDir . '/twig/twig/src/Extension/ProfilerExtension.php',
+ 'Twig\\Extension\\RuntimeExtensionInterface' => $vendorDir . '/twig/twig/src/Extension/RuntimeExtensionInterface.php',
+ 'Twig\\Extension\\SandboxExtension' => $vendorDir . '/twig/twig/src/Extension/SandboxExtension.php',
+ 'Twig\\Extension\\StagingExtension' => $vendorDir . '/twig/twig/src/Extension/StagingExtension.php',
+ 'Twig\\Extension\\StringLoaderExtension' => $vendorDir . '/twig/twig/src/Extension/StringLoaderExtension.php',
+ 'Twig\\FileExtensionEscapingStrategy' => $vendorDir . '/twig/twig/src/FileExtensionEscapingStrategy.php',
+ 'Twig\\Lexer' => $vendorDir . '/twig/twig/src/Lexer.php',
+ 'Twig\\Loader\\ArrayLoader' => $vendorDir . '/twig/twig/src/Loader/ArrayLoader.php',
+ 'Twig\\Loader\\ChainLoader' => $vendorDir . '/twig/twig/src/Loader/ChainLoader.php',
+ 'Twig\\Loader\\ExistsLoaderInterface' => $vendorDir . '/twig/twig/src/Loader/ExistsLoaderInterface.php',
+ 'Twig\\Loader\\FilesystemLoader' => $vendorDir . '/twig/twig/src/Loader/FilesystemLoader.php',
+ 'Twig\\Loader\\LoaderInterface' => $vendorDir . '/twig/twig/src/Loader/LoaderInterface.php',
+ 'Twig\\Loader\\SourceContextLoaderInterface' => $vendorDir . '/twig/twig/src/Loader/SourceContextLoaderInterface.php',
+ 'Twig\\Markup' => $vendorDir . '/twig/twig/src/Markup.php',
+ 'Twig\\NodeTraverser' => $vendorDir . '/twig/twig/src/NodeTraverser.php',
+ 'Twig\\NodeVisitor\\AbstractNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php',
+ 'Twig\\NodeVisitor\\EscaperNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php',
+ 'Twig\\NodeVisitor\\NodeVisitorInterface' => $vendorDir . '/twig/twig/src/NodeVisitor/NodeVisitorInterface.php',
+ 'Twig\\NodeVisitor\\OptimizerNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php',
+ 'Twig\\NodeVisitor\\SafeAnalysisNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php',
+ 'Twig\\NodeVisitor\\SandboxNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php',
+ 'Twig\\Node\\AutoEscapeNode' => $vendorDir . '/twig/twig/src/Node/AutoEscapeNode.php',
+ 'Twig\\Node\\BlockNode' => $vendorDir . '/twig/twig/src/Node/BlockNode.php',
+ 'Twig\\Node\\BlockReferenceNode' => $vendorDir . '/twig/twig/src/Node/BlockReferenceNode.php',
+ 'Twig\\Node\\BodyNode' => $vendorDir . '/twig/twig/src/Node/BodyNode.php',
+ 'Twig\\Node\\CheckSecurityNode' => $vendorDir . '/twig/twig/src/Node/CheckSecurityNode.php',
+ 'Twig\\Node\\DoNode' => $vendorDir . '/twig/twig/src/Node/DoNode.php',
+ 'Twig\\Node\\EmbedNode' => $vendorDir . '/twig/twig/src/Node/EmbedNode.php',
+ 'Twig\\Node\\Expression\\AbstractExpression' => $vendorDir . '/twig/twig/src/Node/Expression/AbstractExpression.php',
+ 'Twig\\Node\\Expression\\ArrayExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ArrayExpression.php',
+ 'Twig\\Node\\Expression\\AssignNameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/AssignNameExpression.php',
+ 'Twig\\Node\\Expression\\Binary\\AbstractBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AbstractBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\AddBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AddBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\AndBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AndBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\BitwiseAndBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\BitwiseOrBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\BitwiseXorBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\ConcatBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/ConcatBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\DivBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/DivBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\EndsWithBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\EqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/EqualBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\FloorDivBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\GreaterBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/GreaterBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\GreaterEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\InBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/InBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\LessBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/LessBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\LessEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\MatchesBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/MatchesBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\ModBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/ModBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\MulBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/MulBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\NotEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\NotInBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/NotInBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\OrBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/OrBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\PowerBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/PowerBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\RangeBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/RangeBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\StartsWithBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\SubBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/SubBinary.php',
+ 'Twig\\Node\\Expression\\BlockReferenceExpression' => $vendorDir . '/twig/twig/src/Node/Expression/BlockReferenceExpression.php',
+ 'Twig\\Node\\Expression\\CallExpression' => $vendorDir . '/twig/twig/src/Node/Expression/CallExpression.php',
+ 'Twig\\Node\\Expression\\ConditionalExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ConditionalExpression.php',
+ 'Twig\\Node\\Expression\\ConstantExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ConstantExpression.php',
+ 'Twig\\Node\\Expression\\FilterExpression' => $vendorDir . '/twig/twig/src/Node/Expression/FilterExpression.php',
+ 'Twig\\Node\\Expression\\Filter\\DefaultFilter' => $vendorDir . '/twig/twig/src/Node/Expression/Filter/DefaultFilter.php',
+ 'Twig\\Node\\Expression\\FunctionExpression' => $vendorDir . '/twig/twig/src/Node/Expression/FunctionExpression.php',
+ 'Twig\\Node\\Expression\\GetAttrExpression' => $vendorDir . '/twig/twig/src/Node/Expression/GetAttrExpression.php',
+ 'Twig\\Node\\Expression\\MethodCallExpression' => $vendorDir . '/twig/twig/src/Node/Expression/MethodCallExpression.php',
+ 'Twig\\Node\\Expression\\NameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/NameExpression.php',
+ 'Twig\\Node\\Expression\\NullCoalesceExpression' => $vendorDir . '/twig/twig/src/Node/Expression/NullCoalesceExpression.php',
+ 'Twig\\Node\\Expression\\ParentExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ParentExpression.php',
+ 'Twig\\Node\\Expression\\TempNameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/TempNameExpression.php',
+ 'Twig\\Node\\Expression\\TestExpression' => $vendorDir . '/twig/twig/src/Node/Expression/TestExpression.php',
+ 'Twig\\Node\\Expression\\Test\\ConstantTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/ConstantTest.php',
+ 'Twig\\Node\\Expression\\Test\\DefinedTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/DefinedTest.php',
+ 'Twig\\Node\\Expression\\Test\\DivisiblebyTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php',
+ 'Twig\\Node\\Expression\\Test\\EvenTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/EvenTest.php',
+ 'Twig\\Node\\Expression\\Test\\NullTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/NullTest.php',
+ 'Twig\\Node\\Expression\\Test\\OddTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/OddTest.php',
+ 'Twig\\Node\\Expression\\Test\\SameasTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/SameasTest.php',
+ 'Twig\\Node\\Expression\\Unary\\AbstractUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/AbstractUnary.php',
+ 'Twig\\Node\\Expression\\Unary\\NegUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/NegUnary.php',
+ 'Twig\\Node\\Expression\\Unary\\NotUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/NotUnary.php',
+ 'Twig\\Node\\Expression\\Unary\\PosUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/PosUnary.php',
+ 'Twig\\Node\\FlushNode' => $vendorDir . '/twig/twig/src/Node/FlushNode.php',
+ 'Twig\\Node\\ForLoopNode' => $vendorDir . '/twig/twig/src/Node/ForLoopNode.php',
+ 'Twig\\Node\\ForNode' => $vendorDir . '/twig/twig/src/Node/ForNode.php',
+ 'Twig\\Node\\IfNode' => $vendorDir . '/twig/twig/src/Node/IfNode.php',
+ 'Twig\\Node\\ImportNode' => $vendorDir . '/twig/twig/src/Node/ImportNode.php',
+ 'Twig\\Node\\IncludeNode' => $vendorDir . '/twig/twig/src/Node/IncludeNode.php',
+ 'Twig\\Node\\MacroNode' => $vendorDir . '/twig/twig/src/Node/MacroNode.php',
+ 'Twig\\Node\\ModuleNode' => $vendorDir . '/twig/twig/src/Node/ModuleNode.php',
+ 'Twig\\Node\\Node' => $vendorDir . '/twig/twig/src/Node/Node.php',
+ 'Twig\\Node\\NodeCaptureInterface' => $vendorDir . '/twig/twig/src/Node/NodeCaptureInterface.php',
+ 'Twig\\Node\\NodeOutputInterface' => $vendorDir . '/twig/twig/src/Node/NodeOutputInterface.php',
+ 'Twig\\Node\\PrintNode' => $vendorDir . '/twig/twig/src/Node/PrintNode.php',
+ 'Twig\\Node\\SandboxNode' => $vendorDir . '/twig/twig/src/Node/SandboxNode.php',
+ 'Twig\\Node\\SandboxedPrintNode' => $vendorDir . '/twig/twig/src/Node/SandboxedPrintNode.php',
+ 'Twig\\Node\\SetNode' => $vendorDir . '/twig/twig/src/Node/SetNode.php',
+ 'Twig\\Node\\SpacelessNode' => $vendorDir . '/twig/twig/src/Node/SpacelessNode.php',
+ 'Twig\\Node\\TextNode' => $vendorDir . '/twig/twig/src/Node/TextNode.php',
+ 'Twig\\Node\\WithNode' => $vendorDir . '/twig/twig/src/Node/WithNode.php',
+ 'Twig\\Parser' => $vendorDir . '/twig/twig/src/Parser.php',
+ 'Twig\\Profiler\\Dumper\\BaseDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/BaseDumper.php',
+ 'Twig\\Profiler\\Dumper\\BlackfireDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/BlackfireDumper.php',
+ 'Twig\\Profiler\\Dumper\\HtmlDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/HtmlDumper.php',
+ 'Twig\\Profiler\\Dumper\\TextDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/TextDumper.php',
+ 'Twig\\Profiler\\NodeVisitor\\ProfilerNodeVisitor' => $vendorDir . '/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php',
+ 'Twig\\Profiler\\Node\\EnterProfileNode' => $vendorDir . '/twig/twig/src/Profiler/Node/EnterProfileNode.php',
+ 'Twig\\Profiler\\Node\\LeaveProfileNode' => $vendorDir . '/twig/twig/src/Profiler/Node/LeaveProfileNode.php',
+ 'Twig\\Profiler\\Profile' => $vendorDir . '/twig/twig/src/Profiler/Profile.php',
+ 'Twig\\RuntimeLoader\\ContainerRuntimeLoader' => $vendorDir . '/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php',
+ 'Twig\\RuntimeLoader\\FactoryRuntimeLoader' => $vendorDir . '/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php',
+ 'Twig\\RuntimeLoader\\RuntimeLoaderInterface' => $vendorDir . '/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php',
+ 'Twig\\Sandbox\\SecurityError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityError.php',
+ 'Twig\\Sandbox\\SecurityNotAllowedFilterError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php',
+ 'Twig\\Sandbox\\SecurityNotAllowedFunctionError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php',
+ 'Twig\\Sandbox\\SecurityNotAllowedMethodError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php',
+ 'Twig\\Sandbox\\SecurityNotAllowedPropertyError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php',
+ 'Twig\\Sandbox\\SecurityNotAllowedTagError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php',
+ 'Twig\\Sandbox\\SecurityPolicy' => $vendorDir . '/twig/twig/src/Sandbox/SecurityPolicy.php',
+ 'Twig\\Sandbox\\SecurityPolicyInterface' => $vendorDir . '/twig/twig/src/Sandbox/SecurityPolicyInterface.php',
+ 'Twig\\Source' => $vendorDir . '/twig/twig/src/Source.php',
+ 'Twig\\Template' => $vendorDir . '/twig/twig/src/Template.php',
+ 'Twig\\TemplateWrapper' => $vendorDir . '/twig/twig/src/TemplateWrapper.php',
+ 'Twig\\Test\\IntegrationTestCase' => $vendorDir . '/twig/twig/src/Test/IntegrationTestCase.php',
+ 'Twig\\Test\\NodeTestCase' => $vendorDir . '/twig/twig/src/Test/NodeTestCase.php',
+ 'Twig\\Token' => $vendorDir . '/twig/twig/src/Token.php',
+ 'Twig\\TokenParser\\AbstractTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/AbstractTokenParser.php',
+ 'Twig\\TokenParser\\AutoEscapeTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/AutoEscapeTokenParser.php',
+ 'Twig\\TokenParser\\BlockTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/BlockTokenParser.php',
+ 'Twig\\TokenParser\\DoTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/DoTokenParser.php',
+ 'Twig\\TokenParser\\EmbedTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/EmbedTokenParser.php',
+ 'Twig\\TokenParser\\ExtendsTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ExtendsTokenParser.php',
+ 'Twig\\TokenParser\\FilterTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FilterTokenParser.php',
+ 'Twig\\TokenParser\\FlushTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FlushTokenParser.php',
+ 'Twig\\TokenParser\\ForTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ForTokenParser.php',
+ 'Twig\\TokenParser\\FromTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FromTokenParser.php',
+ 'Twig\\TokenParser\\IfTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/IfTokenParser.php',
+ 'Twig\\TokenParser\\ImportTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ImportTokenParser.php',
+ 'Twig\\TokenParser\\IncludeTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/IncludeTokenParser.php',
+ 'Twig\\TokenParser\\MacroTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/MacroTokenParser.php',
+ 'Twig\\TokenParser\\SandboxTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SandboxTokenParser.php',
+ 'Twig\\TokenParser\\SetTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SetTokenParser.php',
+ 'Twig\\TokenParser\\SpacelessTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SpacelessTokenParser.php',
+ 'Twig\\TokenParser\\TokenParserInterface' => $vendorDir . '/twig/twig/src/TokenParser/TokenParserInterface.php',
+ 'Twig\\TokenParser\\UseTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/UseTokenParser.php',
+ 'Twig\\TokenParser\\WithTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/WithTokenParser.php',
+ 'Twig\\TokenStream' => $vendorDir . '/twig/twig/src/TokenStream.php',
+ 'Twig\\TwigFilter' => $vendorDir . '/twig/twig/src/TwigFilter.php',
+ 'Twig\\TwigFunction' => $vendorDir . '/twig/twig/src/TwigFunction.php',
+ 'Twig\\TwigTest' => $vendorDir . '/twig/twig/src/TwigTest.php',
+ 'Twig\\Util\\DeprecationCollector' => $vendorDir . '/twig/twig/src/Util/DeprecationCollector.php',
+ 'Twig\\Util\\TemplateDirIterator' => $vendorDir . '/twig/twig/src/Util/TemplateDirIterator.php',
+ 'Twig_BaseNodeVisitor' => $vendorDir . '/twig/twig/lib/Twig/BaseNodeVisitor.php',
+ 'Twig_CacheInterface' => $vendorDir . '/twig/twig/lib/Twig/CacheInterface.php',
+ 'Twig_Cache_Filesystem' => $vendorDir . '/twig/twig/lib/Twig/Cache/Filesystem.php',
+ 'Twig_Cache_Null' => $vendorDir . '/twig/twig/lib/Twig/Cache/Null.php',
+ 'Twig_Compiler' => $vendorDir . '/twig/twig/lib/Twig/Compiler.php',
+ 'Twig_ContainerRuntimeLoader' => $vendorDir . '/twig/twig/lib/Twig/ContainerRuntimeLoader.php',
+ 'Twig_Environment' => $vendorDir . '/twig/twig/lib/Twig/Environment.php',
+ 'Twig_Error' => $vendorDir . '/twig/twig/lib/Twig/Error.php',
+ 'Twig_Error_Loader' => $vendorDir . '/twig/twig/lib/Twig/Error/Loader.php',
+ 'Twig_Error_Runtime' => $vendorDir . '/twig/twig/lib/Twig/Error/Runtime.php',
+ 'Twig_Error_Syntax' => $vendorDir . '/twig/twig/lib/Twig/Error/Syntax.php',
+ 'Twig_ExistsLoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/ExistsLoaderInterface.php',
+ 'Twig_ExpressionParser' => $vendorDir . '/twig/twig/lib/Twig/ExpressionParser.php',
+ 'Twig_Extension' => $vendorDir . '/twig/twig/lib/Twig/Extension.php',
+ 'Twig_ExtensionInterface' => $vendorDir . '/twig/twig/lib/Twig/ExtensionInterface.php',
+ 'Twig_ExtensionSet' => $vendorDir . '/twig/twig/lib/Twig/ExtensionSet.php',
+ 'Twig_Extension_Core' => $vendorDir . '/twig/twig/lib/Twig/Extension/Core.php',
+ 'Twig_Extension_Debug' => $vendorDir . '/twig/twig/lib/Twig/Extension/Debug.php',
+ 'Twig_Extension_Escaper' => $vendorDir . '/twig/twig/lib/Twig/Extension/Escaper.php',
+ 'Twig_Extension_GlobalsInterface' => $vendorDir . '/twig/twig/lib/Twig/Extension/GlobalsInterface.php',
+ 'Twig_Extension_InitRuntimeInterface' => $vendorDir . '/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php',
+ 'Twig_Extension_Optimizer' => $vendorDir . '/twig/twig/lib/Twig/Extension/Optimizer.php',
+ 'Twig_Extension_Profiler' => $vendorDir . '/twig/twig/lib/Twig/Extension/Profiler.php',
+ 'Twig_Extension_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/Extension/Sandbox.php',
+ 'Twig_Extension_Staging' => $vendorDir . '/twig/twig/lib/Twig/Extension/Staging.php',
+ 'Twig_Extension_StringLoader' => $vendorDir . '/twig/twig/lib/Twig/Extension/StringLoader.php',
+ 'Twig_FactoryRuntimeLoader' => $vendorDir . '/twig/twig/lib/Twig/FactoryRuntimeLoader.php',
+ 'Twig_FileExtensionEscapingStrategy' => $vendorDir . '/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php',
+ 'Twig_Filter' => $vendorDir . '/twig/twig/lib/Twig/Filter.php',
+ 'Twig_Function' => $vendorDir . '/twig/twig/lib/Twig/Function.php',
+ 'Twig_Lexer' => $vendorDir . '/twig/twig/lib/Twig/Lexer.php',
+ 'Twig_LoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/LoaderInterface.php',
+ 'Twig_Loader_Array' => $vendorDir . '/twig/twig/lib/Twig/Loader/Array.php',
+ 'Twig_Loader_Chain' => $vendorDir . '/twig/twig/lib/Twig/Loader/Chain.php',
+ 'Twig_Loader_Filesystem' => $vendorDir . '/twig/twig/lib/Twig/Loader/Filesystem.php',
+ 'Twig_Markup' => $vendorDir . '/twig/twig/lib/Twig/Markup.php',
+ 'Twig_Node' => $vendorDir . '/twig/twig/lib/Twig/Node.php',
+ 'Twig_NodeCaptureInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeCaptureInterface.php',
+ 'Twig_NodeOutputInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeOutputInterface.php',
+ 'Twig_NodeTraverser' => $vendorDir . '/twig/twig/lib/Twig/NodeTraverser.php',
+ 'Twig_NodeVisitorInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitorInterface.php',
+ 'Twig_NodeVisitor_Escaper' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/Escaper.php',
+ 'Twig_NodeVisitor_Optimizer' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/Optimizer.php',
+ 'Twig_NodeVisitor_SafeAnalysis' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php',
+ 'Twig_NodeVisitor_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/Sandbox.php',
+ 'Twig_Node_AutoEscape' => $vendorDir . '/twig/twig/lib/Twig/Node/AutoEscape.php',
+ 'Twig_Node_Block' => $vendorDir . '/twig/twig/lib/Twig/Node/Block.php',
+ 'Twig_Node_BlockReference' => $vendorDir . '/twig/twig/lib/Twig/Node/BlockReference.php',
+ 'Twig_Node_Body' => $vendorDir . '/twig/twig/lib/Twig/Node/Body.php',
+ 'Twig_Node_CheckSecurity' => $vendorDir . '/twig/twig/lib/Twig/Node/CheckSecurity.php',
+ 'Twig_Node_Do' => $vendorDir . '/twig/twig/lib/Twig/Node/Do.php',
+ 'Twig_Node_Embed' => $vendorDir . '/twig/twig/lib/Twig/Node/Embed.php',
+ 'Twig_Node_Expression' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression.php',
+ 'Twig_Node_Expression_Array' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Array.php',
+ 'Twig_Node_Expression_AssignName' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/AssignName.php',
+ 'Twig_Node_Expression_Binary' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary.php',
+ 'Twig_Node_Expression_Binary_Add' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Add.php',
+ 'Twig_Node_Expression_Binary_And' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/And.php',
+ 'Twig_Node_Expression_Binary_BitwiseAnd' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php',
+ 'Twig_Node_Expression_Binary_BitwiseOr' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php',
+ 'Twig_Node_Expression_Binary_BitwiseXor' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php',
+ 'Twig_Node_Expression_Binary_Concat' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php',
+ 'Twig_Node_Expression_Binary_Div' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Div.php',
+ 'Twig_Node_Expression_Binary_EndsWith' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php',
+ 'Twig_Node_Expression_Binary_Equal' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php',
+ 'Twig_Node_Expression_Binary_FloorDiv' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php',
+ 'Twig_Node_Expression_Binary_Greater' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php',
+ 'Twig_Node_Expression_Binary_GreaterEqual' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php',
+ 'Twig_Node_Expression_Binary_In' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/In.php',
+ 'Twig_Node_Expression_Binary_Less' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Less.php',
+ 'Twig_Node_Expression_Binary_LessEqual' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php',
+ 'Twig_Node_Expression_Binary_Matches' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php',
+ 'Twig_Node_Expression_Binary_Mod' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php',
+ 'Twig_Node_Expression_Binary_Mul' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php',
+ 'Twig_Node_Expression_Binary_NotEqual' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php',
+ 'Twig_Node_Expression_Binary_NotIn' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php',
+ 'Twig_Node_Expression_Binary_Or' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Or.php',
+ 'Twig_Node_Expression_Binary_Power' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Power.php',
+ 'Twig_Node_Expression_Binary_Range' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Range.php',
+ 'Twig_Node_Expression_Binary_StartsWith' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php',
+ 'Twig_Node_Expression_Binary_Sub' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php',
+ 'Twig_Node_Expression_BlockReference' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/BlockReference.php',
+ 'Twig_Node_Expression_Call' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Call.php',
+ 'Twig_Node_Expression_Conditional' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Conditional.php',
+ 'Twig_Node_Expression_Constant' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Constant.php',
+ 'Twig_Node_Expression_Filter' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Filter.php',
+ 'Twig_Node_Expression_Filter_Default' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Filter/Default.php',
+ 'Twig_Node_Expression_Function' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Function.php',
+ 'Twig_Node_Expression_GetAttr' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/GetAttr.php',
+ 'Twig_Node_Expression_MethodCall' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/MethodCall.php',
+ 'Twig_Node_Expression_Name' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Name.php',
+ 'Twig_Node_Expression_NullCoalesce' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php',
+ 'Twig_Node_Expression_Parent' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Parent.php',
+ 'Twig_Node_Expression_TempName' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/TempName.php',
+ 'Twig_Node_Expression_Test' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test.php',
+ 'Twig_Node_Expression_Test_Constant' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Constant.php',
+ 'Twig_Node_Expression_Test_Defined' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Defined.php',
+ 'Twig_Node_Expression_Test_Divisibleby' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php',
+ 'Twig_Node_Expression_Test_Even' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Even.php',
+ 'Twig_Node_Expression_Test_Null' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Null.php',
+ 'Twig_Node_Expression_Test_Odd' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Odd.php',
+ 'Twig_Node_Expression_Test_Sameas' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php',
+ 'Twig_Node_Expression_Unary' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary.php',
+ 'Twig_Node_Expression_Unary_Neg' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php',
+ 'Twig_Node_Expression_Unary_Not' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary/Not.php',
+ 'Twig_Node_Expression_Unary_Pos' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php',
+ 'Twig_Node_Flush' => $vendorDir . '/twig/twig/lib/Twig/Node/Flush.php',
+ 'Twig_Node_For' => $vendorDir . '/twig/twig/lib/Twig/Node/For.php',
+ 'Twig_Node_ForLoop' => $vendorDir . '/twig/twig/lib/Twig/Node/ForLoop.php',
+ 'Twig_Node_If' => $vendorDir . '/twig/twig/lib/Twig/Node/If.php',
+ 'Twig_Node_Import' => $vendorDir . '/twig/twig/lib/Twig/Node/Import.php',
+ 'Twig_Node_Include' => $vendorDir . '/twig/twig/lib/Twig/Node/Include.php',
+ 'Twig_Node_Macro' => $vendorDir . '/twig/twig/lib/Twig/Node/Macro.php',
+ 'Twig_Node_Module' => $vendorDir . '/twig/twig/lib/Twig/Node/Module.php',
+ 'Twig_Node_Print' => $vendorDir . '/twig/twig/lib/Twig/Node/Print.php',
+ 'Twig_Node_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/Node/Sandbox.php',
+ 'Twig_Node_SandboxedPrint' => $vendorDir . '/twig/twig/lib/Twig/Node/SandboxedPrint.php',
+ 'Twig_Node_Set' => $vendorDir . '/twig/twig/lib/Twig/Node/Set.php',
+ 'Twig_Node_Spaceless' => $vendorDir . '/twig/twig/lib/Twig/Node/Spaceless.php',
+ 'Twig_Node_Text' => $vendorDir . '/twig/twig/lib/Twig/Node/Text.php',
+ 'Twig_Node_With' => $vendorDir . '/twig/twig/lib/Twig/Node/With.php',
+ 'Twig_Parser' => $vendorDir . '/twig/twig/lib/Twig/Parser.php',
+ 'Twig_Profiler_Dumper_Base' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Dumper/Base.php',
+ 'Twig_Profiler_Dumper_Blackfire' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php',
+ 'Twig_Profiler_Dumper_Html' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Dumper/Html.php',
+ 'Twig_Profiler_Dumper_Text' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Dumper/Text.php',
+ 'Twig_Profiler_NodeVisitor_Profiler' => $vendorDir . '/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php',
+ 'Twig_Profiler_Node_EnterProfile' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php',
+ 'Twig_Profiler_Node_LeaveProfile' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php',
+ 'Twig_Profiler_Profile' => $vendorDir . '/twig/twig/lib/Twig/Profiler/Profile.php',
+ 'Twig_RuntimeLoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/RuntimeLoaderInterface.php',
+ 'Twig_Sandbox_SecurityError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityError.php',
+ 'Twig_Sandbox_SecurityNotAllowedFilterError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php',
+ 'Twig_Sandbox_SecurityNotAllowedFunctionError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php',
+ 'Twig_Sandbox_SecurityNotAllowedMethodError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php',
+ 'Twig_Sandbox_SecurityNotAllowedPropertyError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php',
+ 'Twig_Sandbox_SecurityNotAllowedTagError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php',
+ 'Twig_Sandbox_SecurityPolicy' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php',
+ 'Twig_Sandbox_SecurityPolicyInterface' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php',
+ 'Twig_SimpleFilter' => $vendorDir . '/twig/twig/lib/Twig/SimpleFilter.php',
+ 'Twig_SimpleFunction' => $vendorDir . '/twig/twig/lib/Twig/SimpleFunction.php',
+ 'Twig_SimpleTest' => $vendorDir . '/twig/twig/lib/Twig/SimpleTest.php',
+ 'Twig_Source' => $vendorDir . '/twig/twig/lib/Twig/Source.php',
+ 'Twig_SourceContextLoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/SourceContextLoaderInterface.php',
+ 'Twig_Template' => $vendorDir . '/twig/twig/lib/Twig/Template.php',
+ 'Twig_TemplateWrapper' => $vendorDir . '/twig/twig/lib/Twig/TemplateWrapper.php',
+ 'Twig_Test' => $vendorDir . '/twig/twig/lib/Twig/Test.php',
+ 'Twig_Test_IntegrationTestCase' => $vendorDir . '/twig/twig/lib/Twig/Test/IntegrationTestCase.php',
+ 'Twig_Test_NodeTestCase' => $vendorDir . '/twig/twig/lib/Twig/Test/NodeTestCase.php',
+ 'Twig_Token' => $vendorDir . '/twig/twig/lib/Twig/Token.php',
+ 'Twig_TokenParser' => $vendorDir . '/twig/twig/lib/Twig/TokenParser.php',
+ 'Twig_TokenParserInterface' => $vendorDir . '/twig/twig/lib/Twig/TokenParserInterface.php',
+ 'Twig_TokenParser_AutoEscape' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/AutoEscape.php',
+ 'Twig_TokenParser_Block' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Block.php',
+ 'Twig_TokenParser_Do' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Do.php',
+ 'Twig_TokenParser_Embed' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Embed.php',
+ 'Twig_TokenParser_Extends' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Extends.php',
+ 'Twig_TokenParser_Filter' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Filter.php',
+ 'Twig_TokenParser_Flush' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Flush.php',
+ 'Twig_TokenParser_For' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/For.php',
+ 'Twig_TokenParser_From' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/From.php',
+ 'Twig_TokenParser_If' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/If.php',
+ 'Twig_TokenParser_Import' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Import.php',
+ 'Twig_TokenParser_Include' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Include.php',
+ 'Twig_TokenParser_Macro' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Macro.php',
+ 'Twig_TokenParser_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Sandbox.php',
+ 'Twig_TokenParser_Set' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Set.php',
+ 'Twig_TokenParser_Spaceless' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Spaceless.php',
+ 'Twig_TokenParser_Use' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Use.php',
+ 'Twig_TokenParser_With' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/With.php',
+ 'Twig_TokenStream' => $vendorDir . '/twig/twig/lib/Twig/TokenStream.php',
+ 'Twig_Util_DeprecationCollector' => $vendorDir . '/twig/twig/lib/Twig/Util/DeprecationCollector.php',
+ 'Twig_Util_TemplateDirIterator' => $vendorDir . '/twig/twig/lib/Twig/Util/TemplateDirIterator.php',
+ 'Webmozart\\Assert\\Assert' => $vendorDir . '/webmozart/assert/src/Assert.php',
+ 'WellingGuzman\\OAuth2\\Client\\Provider\\Exception\\OktaIdentityProviderException' => $vendorDir . '/wellingguzman/oauth2-okta/src/Provider/Exception/OktaIdentityProviderException.php',
+ 'WellingGuzman\\OAuth2\\Client\\Provider\\Okta' => $vendorDir . '/wellingguzman/oauth2-okta/src/Provider/Okta.php',
+ 'WellingGuzman\\OAuth2\\Client\\Provider\\OktaResourceOwner' => $vendorDir . '/wellingguzman/oauth2-okta/src/Provider/OktaResourceOwner.php',
+ 'Zend\\Db\\Adapter\\Adapter' => $vendorDir . '/zendframework/zend-db/src/Adapter/Adapter.php',
+ 'Zend\\Db\\Adapter\\AdapterAbstractServiceFactory' => $vendorDir . '/zendframework/zend-db/src/Adapter/AdapterAbstractServiceFactory.php',
+ 'Zend\\Db\\Adapter\\AdapterAwareInterface' => $vendorDir . '/zendframework/zend-db/src/Adapter/AdapterAwareInterface.php',
+ 'Zend\\Db\\Adapter\\AdapterAwareTrait' => $vendorDir . '/zendframework/zend-db/src/Adapter/AdapterAwareTrait.php',
+ 'Zend\\Db\\Adapter\\AdapterInterface' => $vendorDir . '/zendframework/zend-db/src/Adapter/AdapterInterface.php',
+ 'Zend\\Db\\Adapter\\AdapterServiceFactory' => $vendorDir . '/zendframework/zend-db/src/Adapter/AdapterServiceFactory.php',
+ 'Zend\\Db\\Adapter\\Driver\\AbstractConnection' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/AbstractConnection.php',
+ 'Zend\\Db\\Adapter\\Driver\\ConnectionInterface' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/ConnectionInterface.php',
+ 'Zend\\Db\\Adapter\\Driver\\DriverInterface' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/DriverInterface.php',
+ 'Zend\\Db\\Adapter\\Driver\\Feature\\AbstractFeature' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Feature/AbstractFeature.php',
+ 'Zend\\Db\\Adapter\\Driver\\Feature\\DriverFeatureInterface' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Feature/DriverFeatureInterface.php',
+ 'Zend\\Db\\Adapter\\Driver\\IbmDb2\\Connection' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/IbmDb2/Connection.php',
+ 'Zend\\Db\\Adapter\\Driver\\IbmDb2\\IbmDb2' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/IbmDb2/IbmDb2.php',
+ 'Zend\\Db\\Adapter\\Driver\\IbmDb2\\Result' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/IbmDb2/Result.php',
+ 'Zend\\Db\\Adapter\\Driver\\IbmDb2\\Statement' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/IbmDb2/Statement.php',
+ 'Zend\\Db\\Adapter\\Driver\\Mysqli\\Connection' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Mysqli/Connection.php',
+ 'Zend\\Db\\Adapter\\Driver\\Mysqli\\Mysqli' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Mysqli/Mysqli.php',
+ 'Zend\\Db\\Adapter\\Driver\\Mysqli\\Result' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Mysqli/Result.php',
+ 'Zend\\Db\\Adapter\\Driver\\Mysqli\\Statement' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Mysqli/Statement.php',
+ 'Zend\\Db\\Adapter\\Driver\\Oci8\\Connection' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Oci8/Connection.php',
+ 'Zend\\Db\\Adapter\\Driver\\Oci8\\Feature\\RowCounter' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Oci8/Feature/RowCounter.php',
+ 'Zend\\Db\\Adapter\\Driver\\Oci8\\Oci8' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Oci8/Oci8.php',
+ 'Zend\\Db\\Adapter\\Driver\\Oci8\\Result' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Oci8/Result.php',
+ 'Zend\\Db\\Adapter\\Driver\\Oci8\\Statement' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Oci8/Statement.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pdo\\Connection' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Pdo/Connection.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pdo\\Feature\\OracleRowCounter' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Pdo/Feature/OracleRowCounter.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pdo\\Feature\\SqliteRowCounter' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Pdo/Feature/SqliteRowCounter.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pdo\\Pdo' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Pdo/Pdo.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pdo\\Result' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Pdo/Result.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pdo\\Statement' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Pdo/Statement.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pgsql\\Connection' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Pgsql/Connection.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pgsql\\Pgsql' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Pgsql/Pgsql.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pgsql\\Result' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Pgsql/Result.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pgsql\\Statement' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Pgsql/Statement.php',
+ 'Zend\\Db\\Adapter\\Driver\\ResultInterface' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/ResultInterface.php',
+ 'Zend\\Db\\Adapter\\Driver\\Sqlsrv\\Connection' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Sqlsrv/Connection.php',
+ 'Zend\\Db\\Adapter\\Driver\\Sqlsrv\\Exception\\ErrorException' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Sqlsrv/Exception/ErrorException.php',
+ 'Zend\\Db\\Adapter\\Driver\\Sqlsrv\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Sqlsrv/Exception/ExceptionInterface.php',
+ 'Zend\\Db\\Adapter\\Driver\\Sqlsrv\\Result' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Sqlsrv/Result.php',
+ 'Zend\\Db\\Adapter\\Driver\\Sqlsrv\\Sqlsrv' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Sqlsrv/Sqlsrv.php',
+ 'Zend\\Db\\Adapter\\Driver\\Sqlsrv\\Statement' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/Sqlsrv/Statement.php',
+ 'Zend\\Db\\Adapter\\Driver\\StatementInterface' => $vendorDir . '/zendframework/zend-db/src/Adapter/Driver/StatementInterface.php',
+ 'Zend\\Db\\Adapter\\Exception\\ErrorException' => $vendorDir . '/zendframework/zend-db/src/Adapter/Exception/ErrorException.php',
+ 'Zend\\Db\\Adapter\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-db/src/Adapter/Exception/ExceptionInterface.php',
+ 'Zend\\Db\\Adapter\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-db/src/Adapter/Exception/InvalidArgumentException.php',
+ 'Zend\\Db\\Adapter\\Exception\\InvalidConnectionParametersException' => $vendorDir . '/zendframework/zend-db/src/Adapter/Exception/InvalidConnectionParametersException.php',
+ 'Zend\\Db\\Adapter\\Exception\\InvalidQueryException' => $vendorDir . '/zendframework/zend-db/src/Adapter/Exception/InvalidQueryException.php',
+ 'Zend\\Db\\Adapter\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-db/src/Adapter/Exception/RuntimeException.php',
+ 'Zend\\Db\\Adapter\\Exception\\UnexpectedValueException' => $vendorDir . '/zendframework/zend-db/src/Adapter/Exception/UnexpectedValueException.php',
+ 'Zend\\Db\\Adapter\\ParameterContainer' => $vendorDir . '/zendframework/zend-db/src/Adapter/ParameterContainer.php',
+ 'Zend\\Db\\Adapter\\Platform\\AbstractPlatform' => $vendorDir . '/zendframework/zend-db/src/Adapter/Platform/AbstractPlatform.php',
+ 'Zend\\Db\\Adapter\\Platform\\IbmDb2' => $vendorDir . '/zendframework/zend-db/src/Adapter/Platform/IbmDb2.php',
+ 'Zend\\Db\\Adapter\\Platform\\Mysql' => $vendorDir . '/zendframework/zend-db/src/Adapter/Platform/Mysql.php',
+ 'Zend\\Db\\Adapter\\Platform\\Oracle' => $vendorDir . '/zendframework/zend-db/src/Adapter/Platform/Oracle.php',
+ 'Zend\\Db\\Adapter\\Platform\\PlatformInterface' => $vendorDir . '/zendframework/zend-db/src/Adapter/Platform/PlatformInterface.php',
+ 'Zend\\Db\\Adapter\\Platform\\Postgresql' => $vendorDir . '/zendframework/zend-db/src/Adapter/Platform/Postgresql.php',
+ 'Zend\\Db\\Adapter\\Platform\\Sql92' => $vendorDir . '/zendframework/zend-db/src/Adapter/Platform/Sql92.php',
+ 'Zend\\Db\\Adapter\\Platform\\SqlServer' => $vendorDir . '/zendframework/zend-db/src/Adapter/Platform/SqlServer.php',
+ 'Zend\\Db\\Adapter\\Platform\\Sqlite' => $vendorDir . '/zendframework/zend-db/src/Adapter/Platform/Sqlite.php',
+ 'Zend\\Db\\Adapter\\Profiler\\Profiler' => $vendorDir . '/zendframework/zend-db/src/Adapter/Profiler/Profiler.php',
+ 'Zend\\Db\\Adapter\\Profiler\\ProfilerAwareInterface' => $vendorDir . '/zendframework/zend-db/src/Adapter/Profiler/ProfilerAwareInterface.php',
+ 'Zend\\Db\\Adapter\\Profiler\\ProfilerInterface' => $vendorDir . '/zendframework/zend-db/src/Adapter/Profiler/ProfilerInterface.php',
+ 'Zend\\Db\\Adapter\\StatementContainer' => $vendorDir . '/zendframework/zend-db/src/Adapter/StatementContainer.php',
+ 'Zend\\Db\\Adapter\\StatementContainerInterface' => $vendorDir . '/zendframework/zend-db/src/Adapter/StatementContainerInterface.php',
+ 'Zend\\Db\\ConfigProvider' => $vendorDir . '/zendframework/zend-db/src/ConfigProvider.php',
+ 'Zend\\Db\\Exception\\ErrorException' => $vendorDir . '/zendframework/zend-db/src/Exception/ErrorException.php',
+ 'Zend\\Db\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-db/src/Exception/ExceptionInterface.php',
+ 'Zend\\Db\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-db/src/Exception/InvalidArgumentException.php',
+ 'Zend\\Db\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-db/src/Exception/RuntimeException.php',
+ 'Zend\\Db\\Exception\\UnexpectedValueException' => $vendorDir . '/zendframework/zend-db/src/Exception/UnexpectedValueException.php',
+ 'Zend\\Db\\Metadata\\Metadata' => $vendorDir . '/zendframework/zend-db/src/Metadata/Metadata.php',
+ 'Zend\\Db\\Metadata\\MetadataInterface' => $vendorDir . '/zendframework/zend-db/src/Metadata/MetadataInterface.php',
+ 'Zend\\Db\\Metadata\\Object\\AbstractTableObject' => $vendorDir . '/zendframework/zend-db/src/Metadata/Object/AbstractTableObject.php',
+ 'Zend\\Db\\Metadata\\Object\\ColumnObject' => $vendorDir . '/zendframework/zend-db/src/Metadata/Object/ColumnObject.php',
+ 'Zend\\Db\\Metadata\\Object\\ConstraintKeyObject' => $vendorDir . '/zendframework/zend-db/src/Metadata/Object/ConstraintKeyObject.php',
+ 'Zend\\Db\\Metadata\\Object\\ConstraintObject' => $vendorDir . '/zendframework/zend-db/src/Metadata/Object/ConstraintObject.php',
+ 'Zend\\Db\\Metadata\\Object\\TableObject' => $vendorDir . '/zendframework/zend-db/src/Metadata/Object/TableObject.php',
+ 'Zend\\Db\\Metadata\\Object\\TriggerObject' => $vendorDir . '/zendframework/zend-db/src/Metadata/Object/TriggerObject.php',
+ 'Zend\\Db\\Metadata\\Object\\ViewObject' => $vendorDir . '/zendframework/zend-db/src/Metadata/Object/ViewObject.php',
+ 'Zend\\Db\\Metadata\\Source\\AbstractSource' => $vendorDir . '/zendframework/zend-db/src/Metadata/Source/AbstractSource.php',
+ 'Zend\\Db\\Metadata\\Source\\Factory' => $vendorDir . '/zendframework/zend-db/src/Metadata/Source/Factory.php',
+ 'Zend\\Db\\Metadata\\Source\\MysqlMetadata' => $vendorDir . '/zendframework/zend-db/src/Metadata/Source/MysqlMetadata.php',
+ 'Zend\\Db\\Metadata\\Source\\OracleMetadata' => $vendorDir . '/zendframework/zend-db/src/Metadata/Source/OracleMetadata.php',
+ 'Zend\\Db\\Metadata\\Source\\PostgresqlMetadata' => $vendorDir . '/zendframework/zend-db/src/Metadata/Source/PostgresqlMetadata.php',
+ 'Zend\\Db\\Metadata\\Source\\SqlServerMetadata' => $vendorDir . '/zendframework/zend-db/src/Metadata/Source/SqlServerMetadata.php',
+ 'Zend\\Db\\Metadata\\Source\\SqliteMetadata' => $vendorDir . '/zendframework/zend-db/src/Metadata/Source/SqliteMetadata.php',
+ 'Zend\\Db\\Module' => $vendorDir . '/zendframework/zend-db/src/Module.php',
+ 'Zend\\Db\\ResultSet\\AbstractResultSet' => $vendorDir . '/zendframework/zend-db/src/ResultSet/AbstractResultSet.php',
+ 'Zend\\Db\\ResultSet\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-db/src/ResultSet/Exception/ExceptionInterface.php',
+ 'Zend\\Db\\ResultSet\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-db/src/ResultSet/Exception/InvalidArgumentException.php',
+ 'Zend\\Db\\ResultSet\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-db/src/ResultSet/Exception/RuntimeException.php',
+ 'Zend\\Db\\ResultSet\\HydratingResultSet' => $vendorDir . '/zendframework/zend-db/src/ResultSet/HydratingResultSet.php',
+ 'Zend\\Db\\ResultSet\\ResultSet' => $vendorDir . '/zendframework/zend-db/src/ResultSet/ResultSet.php',
+ 'Zend\\Db\\ResultSet\\ResultSetInterface' => $vendorDir . '/zendframework/zend-db/src/ResultSet/ResultSetInterface.php',
+ 'Zend\\Db\\RowGateway\\AbstractRowGateway' => $vendorDir . '/zendframework/zend-db/src/RowGateway/AbstractRowGateway.php',
+ 'Zend\\Db\\RowGateway\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-db/src/RowGateway/Exception/ExceptionInterface.php',
+ 'Zend\\Db\\RowGateway\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-db/src/RowGateway/Exception/InvalidArgumentException.php',
+ 'Zend\\Db\\RowGateway\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-db/src/RowGateway/Exception/RuntimeException.php',
+ 'Zend\\Db\\RowGateway\\Feature\\AbstractFeature' => $vendorDir . '/zendframework/zend-db/src/RowGateway/Feature/AbstractFeature.php',
+ 'Zend\\Db\\RowGateway\\Feature\\FeatureSet' => $vendorDir . '/zendframework/zend-db/src/RowGateway/Feature/FeatureSet.php',
+ 'Zend\\Db\\RowGateway\\RowGateway' => $vendorDir . '/zendframework/zend-db/src/RowGateway/RowGateway.php',
+ 'Zend\\Db\\RowGateway\\RowGatewayInterface' => $vendorDir . '/zendframework/zend-db/src/RowGateway/RowGatewayInterface.php',
+ 'Zend\\Db\\Sql\\AbstractExpression' => $vendorDir . '/zendframework/zend-db/src/Sql/AbstractExpression.php',
+ 'Zend\\Db\\Sql\\AbstractPreparableSql' => $vendorDir . '/zendframework/zend-db/src/Sql/AbstractPreparableSql.php',
+ 'Zend\\Db\\Sql\\AbstractSql' => $vendorDir . '/zendframework/zend-db/src/Sql/AbstractSql.php',
+ 'Zend\\Db\\Sql\\Combine' => $vendorDir . '/zendframework/zend-db/src/Sql/Combine.php',
+ 'Zend\\Db\\Sql\\Ddl\\AlterTable' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/AlterTable.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\AbstractLengthColumn' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/AbstractLengthColumn.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\AbstractPrecisionColumn' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/AbstractPrecisionColumn.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\AbstractTimestampColumn' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/AbstractTimestampColumn.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\BigInteger' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/BigInteger.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Binary' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/Binary.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Blob' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/Blob.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Boolean' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/Boolean.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Char' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/Char.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Column' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/Column.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\ColumnInterface' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/ColumnInterface.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Date' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/Date.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Datetime' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/Datetime.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Decimal' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/Decimal.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Float' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/Float.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Floating' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/Floating.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Integer' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/Integer.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Text' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/Text.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Time' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/Time.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Timestamp' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/Timestamp.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Varbinary' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/Varbinary.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Varchar' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Column/Varchar.php',
+ 'Zend\\Db\\Sql\\Ddl\\Constraint\\AbstractConstraint' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Constraint/AbstractConstraint.php',
+ 'Zend\\Db\\Sql\\Ddl\\Constraint\\Check' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Constraint/Check.php',
+ 'Zend\\Db\\Sql\\Ddl\\Constraint\\ConstraintInterface' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Constraint/ConstraintInterface.php',
+ 'Zend\\Db\\Sql\\Ddl\\Constraint\\ForeignKey' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Constraint/ForeignKey.php',
+ 'Zend\\Db\\Sql\\Ddl\\Constraint\\PrimaryKey' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Constraint/PrimaryKey.php',
+ 'Zend\\Db\\Sql\\Ddl\\Constraint\\UniqueKey' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Constraint/UniqueKey.php',
+ 'Zend\\Db\\Sql\\Ddl\\CreateTable' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/CreateTable.php',
+ 'Zend\\Db\\Sql\\Ddl\\DropTable' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/DropTable.php',
+ 'Zend\\Db\\Sql\\Ddl\\Index\\AbstractIndex' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Index/AbstractIndex.php',
+ 'Zend\\Db\\Sql\\Ddl\\Index\\Index' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/Index/Index.php',
+ 'Zend\\Db\\Sql\\Ddl\\SqlInterface' => $vendorDir . '/zendframework/zend-db/src/Sql/Ddl/SqlInterface.php',
+ 'Zend\\Db\\Sql\\Delete' => $vendorDir . '/zendframework/zend-db/src/Sql/Delete.php',
+ 'Zend\\Db\\Sql\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-db/src/Sql/Exception/ExceptionInterface.php',
+ 'Zend\\Db\\Sql\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-db/src/Sql/Exception/InvalidArgumentException.php',
+ 'Zend\\Db\\Sql\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-db/src/Sql/Exception/RuntimeException.php',
+ 'Zend\\Db\\Sql\\Expression' => $vendorDir . '/zendframework/zend-db/src/Sql/Expression.php',
+ 'Zend\\Db\\Sql\\ExpressionInterface' => $vendorDir . '/zendframework/zend-db/src/Sql/ExpressionInterface.php',
+ 'Zend\\Db\\Sql\\Having' => $vendorDir . '/zendframework/zend-db/src/Sql/Having.php',
+ 'Zend\\Db\\Sql\\Insert' => $vendorDir . '/zendframework/zend-db/src/Sql/Insert.php',
+ 'Zend\\Db\\Sql\\Join' => $vendorDir . '/zendframework/zend-db/src/Sql/Join.php',
+ 'Zend\\Db\\Sql\\Literal' => $vendorDir . '/zendframework/zend-db/src/Sql/Literal.php',
+ 'Zend\\Db\\Sql\\Platform\\AbstractPlatform' => $vendorDir . '/zendframework/zend-db/src/Sql/Platform/AbstractPlatform.php',
+ 'Zend\\Db\\Sql\\Platform\\IbmDb2\\IbmDb2' => $vendorDir . '/zendframework/zend-db/src/Sql/Platform/IbmDb2/IbmDb2.php',
+ 'Zend\\Db\\Sql\\Platform\\IbmDb2\\SelectDecorator' => $vendorDir . '/zendframework/zend-db/src/Sql/Platform/IbmDb2/SelectDecorator.php',
+ 'Zend\\Db\\Sql\\Platform\\Mysql\\Ddl\\AlterTableDecorator' => $vendorDir . '/zendframework/zend-db/src/Sql/Platform/Mysql/Ddl/AlterTableDecorator.php',
+ 'Zend\\Db\\Sql\\Platform\\Mysql\\Ddl\\CreateTableDecorator' => $vendorDir . '/zendframework/zend-db/src/Sql/Platform/Mysql/Ddl/CreateTableDecorator.php',
+ 'Zend\\Db\\Sql\\Platform\\Mysql\\Mysql' => $vendorDir . '/zendframework/zend-db/src/Sql/Platform/Mysql/Mysql.php',
+ 'Zend\\Db\\Sql\\Platform\\Mysql\\SelectDecorator' => $vendorDir . '/zendframework/zend-db/src/Sql/Platform/Mysql/SelectDecorator.php',
+ 'Zend\\Db\\Sql\\Platform\\Oracle\\Oracle' => $vendorDir . '/zendframework/zend-db/src/Sql/Platform/Oracle/Oracle.php',
+ 'Zend\\Db\\Sql\\Platform\\Oracle\\SelectDecorator' => $vendorDir . '/zendframework/zend-db/src/Sql/Platform/Oracle/SelectDecorator.php',
+ 'Zend\\Db\\Sql\\Platform\\Platform' => $vendorDir . '/zendframework/zend-db/src/Sql/Platform/Platform.php',
+ 'Zend\\Db\\Sql\\Platform\\PlatformDecoratorInterface' => $vendorDir . '/zendframework/zend-db/src/Sql/Platform/PlatformDecoratorInterface.php',
+ 'Zend\\Db\\Sql\\Platform\\SqlServer\\Ddl\\CreateTableDecorator' => $vendorDir . '/zendframework/zend-db/src/Sql/Platform/SqlServer/Ddl/CreateTableDecorator.php',
+ 'Zend\\Db\\Sql\\Platform\\SqlServer\\SelectDecorator' => $vendorDir . '/zendframework/zend-db/src/Sql/Platform/SqlServer/SelectDecorator.php',
+ 'Zend\\Db\\Sql\\Platform\\SqlServer\\SqlServer' => $vendorDir . '/zendframework/zend-db/src/Sql/Platform/SqlServer/SqlServer.php',
+ 'Zend\\Db\\Sql\\Platform\\Sqlite\\SelectDecorator' => $vendorDir . '/zendframework/zend-db/src/Sql/Platform/Sqlite/SelectDecorator.php',
+ 'Zend\\Db\\Sql\\Platform\\Sqlite\\Sqlite' => $vendorDir . '/zendframework/zend-db/src/Sql/Platform/Sqlite/Sqlite.php',
+ 'Zend\\Db\\Sql\\Predicate\\Between' => $vendorDir . '/zendframework/zend-db/src/Sql/Predicate/Between.php',
+ 'Zend\\Db\\Sql\\Predicate\\Expression' => $vendorDir . '/zendframework/zend-db/src/Sql/Predicate/Expression.php',
+ 'Zend\\Db\\Sql\\Predicate\\In' => $vendorDir . '/zendframework/zend-db/src/Sql/Predicate/In.php',
+ 'Zend\\Db\\Sql\\Predicate\\IsNotNull' => $vendorDir . '/zendframework/zend-db/src/Sql/Predicate/IsNotNull.php',
+ 'Zend\\Db\\Sql\\Predicate\\IsNull' => $vendorDir . '/zendframework/zend-db/src/Sql/Predicate/IsNull.php',
+ 'Zend\\Db\\Sql\\Predicate\\Like' => $vendorDir . '/zendframework/zend-db/src/Sql/Predicate/Like.php',
+ 'Zend\\Db\\Sql\\Predicate\\Literal' => $vendorDir . '/zendframework/zend-db/src/Sql/Predicate/Literal.php',
+ 'Zend\\Db\\Sql\\Predicate\\NotBetween' => $vendorDir . '/zendframework/zend-db/src/Sql/Predicate/NotBetween.php',
+ 'Zend\\Db\\Sql\\Predicate\\NotIn' => $vendorDir . '/zendframework/zend-db/src/Sql/Predicate/NotIn.php',
+ 'Zend\\Db\\Sql\\Predicate\\NotLike' => $vendorDir . '/zendframework/zend-db/src/Sql/Predicate/NotLike.php',
+ 'Zend\\Db\\Sql\\Predicate\\Operator' => $vendorDir . '/zendframework/zend-db/src/Sql/Predicate/Operator.php',
+ 'Zend\\Db\\Sql\\Predicate\\Predicate' => $vendorDir . '/zendframework/zend-db/src/Sql/Predicate/Predicate.php',
+ 'Zend\\Db\\Sql\\Predicate\\PredicateInterface' => $vendorDir . '/zendframework/zend-db/src/Sql/Predicate/PredicateInterface.php',
+ 'Zend\\Db\\Sql\\Predicate\\PredicateSet' => $vendorDir . '/zendframework/zend-db/src/Sql/Predicate/PredicateSet.php',
+ 'Zend\\Db\\Sql\\PreparableSqlInterface' => $vendorDir . '/zendframework/zend-db/src/Sql/PreparableSqlInterface.php',
+ 'Zend\\Db\\Sql\\Select' => $vendorDir . '/zendframework/zend-db/src/Sql/Select.php',
+ 'Zend\\Db\\Sql\\Sql' => $vendorDir . '/zendframework/zend-db/src/Sql/Sql.php',
+ 'Zend\\Db\\Sql\\SqlInterface' => $vendorDir . '/zendframework/zend-db/src/Sql/SqlInterface.php',
+ 'Zend\\Db\\Sql\\TableIdentifier' => $vendorDir . '/zendframework/zend-db/src/Sql/TableIdentifier.php',
+ 'Zend\\Db\\Sql\\Update' => $vendorDir . '/zendframework/zend-db/src/Sql/Update.php',
+ 'Zend\\Db\\Sql\\Where' => $vendorDir . '/zendframework/zend-db/src/Sql/Where.php',
+ 'Zend\\Db\\TableGateway\\AbstractTableGateway' => $vendorDir . '/zendframework/zend-db/src/TableGateway/AbstractTableGateway.php',
+ 'Zend\\Db\\TableGateway\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-db/src/TableGateway/Exception/ExceptionInterface.php',
+ 'Zend\\Db\\TableGateway\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-db/src/TableGateway/Exception/InvalidArgumentException.php',
+ 'Zend\\Db\\TableGateway\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-db/src/TableGateway/Exception/RuntimeException.php',
+ 'Zend\\Db\\TableGateway\\Feature\\AbstractFeature' => $vendorDir . '/zendframework/zend-db/src/TableGateway/Feature/AbstractFeature.php',
+ 'Zend\\Db\\TableGateway\\Feature\\EventFeature' => $vendorDir . '/zendframework/zend-db/src/TableGateway/Feature/EventFeature.php',
+ 'Zend\\Db\\TableGateway\\Feature\\EventFeatureEventsInterface' => $vendorDir . '/zendframework/zend-db/src/TableGateway/Feature/EventFeatureEventsInterface.php',
+ 'Zend\\Db\\TableGateway\\Feature\\EventFeature\\TableGatewayEvent' => $vendorDir . '/zendframework/zend-db/src/TableGateway/Feature/EventFeature/TableGatewayEvent.php',
+ 'Zend\\Db\\TableGateway\\Feature\\FeatureSet' => $vendorDir . '/zendframework/zend-db/src/TableGateway/Feature/FeatureSet.php',
+ 'Zend\\Db\\TableGateway\\Feature\\GlobalAdapterFeature' => $vendorDir . '/zendframework/zend-db/src/TableGateway/Feature/GlobalAdapterFeature.php',
+ 'Zend\\Db\\TableGateway\\Feature\\MasterSlaveFeature' => $vendorDir . '/zendframework/zend-db/src/TableGateway/Feature/MasterSlaveFeature.php',
+ 'Zend\\Db\\TableGateway\\Feature\\MetadataFeature' => $vendorDir . '/zendframework/zend-db/src/TableGateway/Feature/MetadataFeature.php',
+ 'Zend\\Db\\TableGateway\\Feature\\RowGatewayFeature' => $vendorDir . '/zendframework/zend-db/src/TableGateway/Feature/RowGatewayFeature.php',
+ 'Zend\\Db\\TableGateway\\Feature\\SequenceFeature' => $vendorDir . '/zendframework/zend-db/src/TableGateway/Feature/SequenceFeature.php',
+ 'Zend\\Db\\TableGateway\\TableGateway' => $vendorDir . '/zendframework/zend-db/src/TableGateway/TableGateway.php',
+ 'Zend\\Db\\TableGateway\\TableGatewayInterface' => $vendorDir . '/zendframework/zend-db/src/TableGateway/TableGatewayInterface.php',
+ 'Zend\\Stdlib\\AbstractOptions' => $vendorDir . '/zendframework/zend-stdlib/src/AbstractOptions.php',
+ 'Zend\\Stdlib\\ArrayObject' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayObject.php',
+ 'Zend\\Stdlib\\ArraySerializableInterface' => $vendorDir . '/zendframework/zend-stdlib/src/ArraySerializableInterface.php',
+ 'Zend\\Stdlib\\ArrayStack' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayStack.php',
+ 'Zend\\Stdlib\\ArrayUtils' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayUtils.php',
+ 'Zend\\Stdlib\\ArrayUtils\\MergeRemoveKey' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayUtils/MergeRemoveKey.php',
+ 'Zend\\Stdlib\\ArrayUtils\\MergeReplaceKey' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayUtils/MergeReplaceKey.php',
+ 'Zend\\Stdlib\\ArrayUtils\\MergeReplaceKeyInterface' => $vendorDir . '/zendframework/zend-stdlib/src/ArrayUtils/MergeReplaceKeyInterface.php',
+ 'Zend\\Stdlib\\ConsoleHelper' => $vendorDir . '/zendframework/zend-stdlib/src/ConsoleHelper.php',
+ 'Zend\\Stdlib\\DispatchableInterface' => $vendorDir . '/zendframework/zend-stdlib/src/DispatchableInterface.php',
+ 'Zend\\Stdlib\\ErrorHandler' => $vendorDir . '/zendframework/zend-stdlib/src/ErrorHandler.php',
+ 'Zend\\Stdlib\\Exception\\BadMethodCallException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/BadMethodCallException.php',
+ 'Zend\\Stdlib\\Exception\\DomainException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/DomainException.php',
+ 'Zend\\Stdlib\\Exception\\ExceptionInterface' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/ExceptionInterface.php',
+ 'Zend\\Stdlib\\Exception\\ExtensionNotLoadedException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/ExtensionNotLoadedException.php',
+ 'Zend\\Stdlib\\Exception\\InvalidArgumentException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/InvalidArgumentException.php',
+ 'Zend\\Stdlib\\Exception\\LogicException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/LogicException.php',
+ 'Zend\\Stdlib\\Exception\\RuntimeException' => $vendorDir . '/zendframework/zend-stdlib/src/Exception/RuntimeException.php',
+ 'Zend\\Stdlib\\FastPriorityQueue' => $vendorDir . '/zendframework/zend-stdlib/src/FastPriorityQueue.php',
+ 'Zend\\Stdlib\\Glob' => $vendorDir . '/zendframework/zend-stdlib/src/Glob.php',
+ 'Zend\\Stdlib\\Guard\\AllGuardsTrait' => $vendorDir . '/zendframework/zend-stdlib/src/Guard/AllGuardsTrait.php',
+ 'Zend\\Stdlib\\Guard\\ArrayOrTraversableGuardTrait' => $vendorDir . '/zendframework/zend-stdlib/src/Guard/ArrayOrTraversableGuardTrait.php',
+ 'Zend\\Stdlib\\Guard\\EmptyGuardTrait' => $vendorDir . '/zendframework/zend-stdlib/src/Guard/EmptyGuardTrait.php',
+ 'Zend\\Stdlib\\Guard\\NullGuardTrait' => $vendorDir . '/zendframework/zend-stdlib/src/Guard/NullGuardTrait.php',
+ 'Zend\\Stdlib\\InitializableInterface' => $vendorDir . '/zendframework/zend-stdlib/src/InitializableInterface.php',
+ 'Zend\\Stdlib\\JsonSerializable' => $vendorDir . '/zendframework/zend-stdlib/src/JsonSerializable.php',
+ 'Zend\\Stdlib\\Message' => $vendorDir . '/zendframework/zend-stdlib/src/Message.php',
+ 'Zend\\Stdlib\\MessageInterface' => $vendorDir . '/zendframework/zend-stdlib/src/MessageInterface.php',
+ 'Zend\\Stdlib\\ParameterObjectInterface' => $vendorDir . '/zendframework/zend-stdlib/src/ParameterObjectInterface.php',
+ 'Zend\\Stdlib\\Parameters' => $vendorDir . '/zendframework/zend-stdlib/src/Parameters.php',
+ 'Zend\\Stdlib\\ParametersInterface' => $vendorDir . '/zendframework/zend-stdlib/src/ParametersInterface.php',
+ 'Zend\\Stdlib\\PriorityList' => $vendorDir . '/zendframework/zend-stdlib/src/PriorityList.php',
+ 'Zend\\Stdlib\\PriorityQueue' => $vendorDir . '/zendframework/zend-stdlib/src/PriorityQueue.php',
+ 'Zend\\Stdlib\\Request' => $vendorDir . '/zendframework/zend-stdlib/src/Request.php',
+ 'Zend\\Stdlib\\RequestInterface' => $vendorDir . '/zendframework/zend-stdlib/src/RequestInterface.php',
+ 'Zend\\Stdlib\\Response' => $vendorDir . '/zendframework/zend-stdlib/src/Response.php',
+ 'Zend\\Stdlib\\ResponseInterface' => $vendorDir . '/zendframework/zend-stdlib/src/ResponseInterface.php',
+ 'Zend\\Stdlib\\SplPriorityQueue' => $vendorDir . '/zendframework/zend-stdlib/src/SplPriorityQueue.php',
+ 'Zend\\Stdlib\\SplQueue' => $vendorDir . '/zendframework/zend-stdlib/src/SplQueue.php',
+ 'Zend\\Stdlib\\SplStack' => $vendorDir . '/zendframework/zend-stdlib/src/SplStack.php',
+ 'Zend\\Stdlib\\StringUtils' => $vendorDir . '/zendframework/zend-stdlib/src/StringUtils.php',
+ 'Zend\\Stdlib\\StringWrapper\\AbstractStringWrapper' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/AbstractStringWrapper.php',
+ 'Zend\\Stdlib\\StringWrapper\\Iconv' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/Iconv.php',
+ 'Zend\\Stdlib\\StringWrapper\\Intl' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/Intl.php',
+ 'Zend\\Stdlib\\StringWrapper\\MbString' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/MbString.php',
+ 'Zend\\Stdlib\\StringWrapper\\Native' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/Native.php',
+ 'Zend\\Stdlib\\StringWrapper\\StringWrapperInterface' => $vendorDir . '/zendframework/zend-stdlib/src/StringWrapper/StringWrapperInterface.php',
+ 'phpDocumentor\\Reflection\\DocBlock' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock.php',
+ 'phpDocumentor\\Reflection\\DocBlockFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlockFactory.php',
+ 'phpDocumentor\\Reflection\\DocBlockFactoryInterface' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Description' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Description.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\DescriptionFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\ExampleFinder' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Serializer' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\StandardTagFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\TagFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Author' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\BaseTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Covers' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Deprecated' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Example' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\StaticMethod' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\Strategy' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/Strategy.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\AlignFormatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\PassthroughFormatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Generic' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Link' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Method' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Param' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Property' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyRead' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyWrite' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Fqsen' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Reference' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Url' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Return_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\See' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Since' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Source' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Throws' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Uses' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Var_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Version' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php',
+ 'phpDocumentor\\Reflection\\Element' => $vendorDir . '/phpdocumentor/reflection-common/src/Element.php',
+ 'phpDocumentor\\Reflection\\File' => $vendorDir . '/phpdocumentor/reflection-common/src/File.php',
+ 'phpDocumentor\\Reflection\\Fqsen' => $vendorDir . '/phpdocumentor/reflection-common/src/Fqsen.php',
+ 'phpDocumentor\\Reflection\\FqsenResolver' => $vendorDir . '/phpdocumentor/type-resolver/src/FqsenResolver.php',
+ 'phpDocumentor\\Reflection\\Location' => $vendorDir . '/phpdocumentor/reflection-common/src/Location.php',
+ 'phpDocumentor\\Reflection\\Project' => $vendorDir . '/phpdocumentor/reflection-common/src/Project.php',
+ 'phpDocumentor\\Reflection\\ProjectFactory' => $vendorDir . '/phpdocumentor/reflection-common/src/ProjectFactory.php',
+ 'phpDocumentor\\Reflection\\Type' => $vendorDir . '/phpdocumentor/type-resolver/src/Type.php',
+ 'phpDocumentor\\Reflection\\TypeResolver' => $vendorDir . '/phpdocumentor/type-resolver/src/TypeResolver.php',
+ 'phpDocumentor\\Reflection\\Types\\Array_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Array_.php',
+ 'phpDocumentor\\Reflection\\Types\\Boolean' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Boolean.php',
+ 'phpDocumentor\\Reflection\\Types\\Callable_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Callable_.php',
+ 'phpDocumentor\\Reflection\\Types\\Compound' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Compound.php',
+ 'phpDocumentor\\Reflection\\Types\\Context' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Context.php',
+ 'phpDocumentor\\Reflection\\Types\\ContextFactory' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ContextFactory.php',
+ 'phpDocumentor\\Reflection\\Types\\Float_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Float_.php',
+ 'phpDocumentor\\Reflection\\Types\\Integer' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Integer.php',
+ 'phpDocumentor\\Reflection\\Types\\Iterable_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Iterable_.php',
+ 'phpDocumentor\\Reflection\\Types\\Mixed_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Mixed_.php',
+ 'phpDocumentor\\Reflection\\Types\\Null_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Null_.php',
+ 'phpDocumentor\\Reflection\\Types\\Nullable' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Nullable.php',
+ 'phpDocumentor\\Reflection\\Types\\Object_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Object_.php',
+ 'phpDocumentor\\Reflection\\Types\\Parent_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Parent_.php',
+ 'phpDocumentor\\Reflection\\Types\\Resource_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Resource_.php',
+ 'phpDocumentor\\Reflection\\Types\\Scalar' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Scalar.php',
+ 'phpDocumentor\\Reflection\\Types\\Self_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Self_.php',
+ 'phpDocumentor\\Reflection\\Types\\Static_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Static_.php',
+ 'phpDocumentor\\Reflection\\Types\\String_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/String_.php',
+ 'phpDocumentor\\Reflection\\Types\\This' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/This.php',
+ 'phpDocumentor\\Reflection\\Types\\Void_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Void_.php',
+);
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
new file mode 100644
index 0000000000..5e176ab873
--- /dev/null
+++ b/vendor/composer/autoload_files.php
@@ -0,0 +1,19 @@
+ $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
+ '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
+ 'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
+ 'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
+ '5255c38a0faeba867671b61dfda6d864' => $vendorDir . '/paragonie/random_compat/lib/random.php',
+ '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
+ '253c157292f75eb38082b5acb06f3f01' => $vendorDir . '/nikic/fast-route/src/functions.php',
+ '2c102faa651ef8ea5874edb585946bce' => $vendorDir . '/swiftmailer/swiftmailer/lib/swift_required.php',
+ '6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
+ 'cf0c1b33f2c95076010ff23d7e02d3ac' => $baseDir . '/src/helpers/all.php',
+);
diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php
new file mode 100644
index 0000000000..88382927d4
--- /dev/null
+++ b/vendor/composer/autoload_namespaces.php
@@ -0,0 +1,12 @@
+ array($vendorDir . '/twig/twig/lib'),
+ 'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src'),
+ 'Pimple' => array($vendorDir . '/pimple/pimple/src'),
+);
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
new file mode 100644
index 0000000000..aa8c9ce1a6
--- /dev/null
+++ b/vendor/composer/autoload_psr4.php
@@ -0,0 +1,55 @@
+ array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/type-resolver/src', $vendorDir . '/phpdocumentor/reflection-docblock/src'),
+ 'Zend\\Stdlib\\' => array($vendorDir . '/zendframework/zend-stdlib/src'),
+ 'Zend\\Db\\' => array($vendorDir . '/zendframework/zend-db/src'),
+ 'WellingGuzman\\OAuth2\\Client\\' => array($vendorDir . '/wellingguzman/oauth2-okta/src'),
+ 'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'),
+ 'Twig\\' => array($vendorDir . '/twig/twig/src'),
+ 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
+ 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
+ 'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
+ 'Symfony\\Component\\Validator\\' => array($vendorDir . '/symfony/validator'),
+ 'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'),
+ 'Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'),
+ 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
+ 'Symfony\\Component\\Config\\' => array($vendorDir . '/symfony/config'),
+ 'Slim\\Views\\' => array($vendorDir . '/slim/twig-view/src'),
+ 'Slim\\' => array($vendorDir . '/slim/slim/Slim'),
+ 'RateLimit\\' => array($vendorDir . '/wellingguzman/rate-limit/src'),
+ 'Ramsey\\Uuid\\' => array($vendorDir . '/ramsey/uuid/src'),
+ 'RKA\\Middleware\\' => array($vendorDir . '/akrabat/rka-ip-address-middleware/src'),
+ 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
+ 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
+ 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
+ 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
+ 'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'),
+ 'Phinx\\' => array($vendorDir . '/robmorgan/phinx/src/Phinx'),
+ 'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
+ 'League\\OAuth2\\Client\\' => array($vendorDir . '/league/oauth2-client/src', $vendorDir . '/league/oauth2-github/src', $vendorDir . '/league/oauth2-google/src', $vendorDir . '/league/oauth2-facebook/src'),
+ 'League\\OAuth1\\' => array($vendorDir . '/league/oauth1-client/src'),
+ 'League\\Flysystem\\' => array($vendorDir . '/league/flysystem/src'),
+ 'Intervention\\Image\\' => array($vendorDir . '/intervention/image/src/Intervention/Image'),
+ 'Interop\\Container\\' => array($vendorDir . '/container-interop/container-interop/src/Interop/Container'),
+ 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
+ 'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
+ 'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
+ 'Firebase\\JWT\\' => array($vendorDir . '/firebase/php-jwt/src'),
+ 'FastRoute\\' => array($vendorDir . '/nikic/fast-route/src'),
+ 'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'),
+ 'Doctrine\\Common\\Cache\\' => array($vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache'),
+ 'Directus\\Custom\\Hooks\\' => array($baseDir . '/public/extensions/custom/hooks'),
+ 'Directus\\Custom\\Hasher\\' => array($baseDir . '/public/extensions/custom/hashers'),
+ 'Directus\\Custom\\Embed\\Provider\\' => array($baseDir . '/public/extensions/custom/embeds'),
+ 'Directus\\Authentication\\Sso\\Provider\\' => array($baseDir . '/public/extensions/core/auth'),
+ 'Directus\\Api\\Routes\\' => array($baseDir . '/src/endpoints'),
+ 'Directus\\' => array($baseDir . '/src/core/Directus'),
+ 'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'),
+ 'Cache\\' => array($vendorDir . '/cache/cache/src'),
+);
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
new file mode 100644
index 0000000000..2e751b132e
--- /dev/null
+++ b/vendor/composer/autoload_real.php
@@ -0,0 +1,61 @@
+= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
+ if ($useStaticLoader) {
+ require_once __DIR__ . '/autoload_static.php';
+
+ call_user_func(\Composer\Autoload\ComposerStaticInit989a4969ed6a6e584179ae2090c4eecd::getInitializer($loader));
+ } else {
+ $classMap = require __DIR__ . '/autoload_classmap.php';
+ if ($classMap) {
+ $loader->addClassMap($classMap);
+ }
+ }
+
+ $loader->setClassMapAuthoritative(true);
+ $loader->register(true);
+
+ if ($useStaticLoader) {
+ $includeFiles = Composer\Autoload\ComposerStaticInit989a4969ed6a6e584179ae2090c4eecd::$files;
+ } else {
+ $includeFiles = require __DIR__ . '/autoload_files.php';
+ }
+ foreach ($includeFiles as $fileIdentifier => $file) {
+ composerRequire989a4969ed6a6e584179ae2090c4eecd($fileIdentifier, $file);
+ }
+
+ return $loader;
+ }
+}
+
+function composerRequire989a4969ed6a6e584179ae2090c4eecd($fileIdentifier, $file)
+{
+ if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
+ require $file;
+
+ $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
+ }
+}
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
new file mode 100644
index 0000000000..c3da747294
--- /dev/null
+++ b/vendor/composer/autoload_static.php
@@ -0,0 +1,2950 @@
+ __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
+ '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
+ 'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
+ 'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
+ '5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php',
+ '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
+ '253c157292f75eb38082b5acb06f3f01' => __DIR__ . '/..' . '/nikic/fast-route/src/functions.php',
+ '2c102faa651ef8ea5874edb585946bce' => __DIR__ . '/..' . '/swiftmailer/swiftmailer/lib/swift_required.php',
+ '6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
+ 'cf0c1b33f2c95076010ff23d7e02d3ac' => __DIR__ . '/../..' . '/src/helpers/all.php',
+ );
+
+ public static $prefixLengthsPsr4 = array (
+ 'p' =>
+ array (
+ 'phpDocumentor\\Reflection\\' => 25,
+ ),
+ 'Z' =>
+ array (
+ 'Zend\\Stdlib\\' => 12,
+ 'Zend\\Db\\' => 8,
+ ),
+ 'W' =>
+ array (
+ 'WellingGuzman\\OAuth2\\Client\\' => 28,
+ 'Webmozart\\Assert\\' => 17,
+ ),
+ 'T' =>
+ array (
+ 'Twig\\' => 5,
+ ),
+ 'S' =>
+ array (
+ 'Symfony\\Polyfill\\Mbstring\\' => 26,
+ 'Symfony\\Polyfill\\Ctype\\' => 23,
+ 'Symfony\\Component\\Yaml\\' => 23,
+ 'Symfony\\Component\\Validator\\' => 28,
+ 'Symfony\\Component\\Translation\\' => 30,
+ 'Symfony\\Component\\Filesystem\\' => 29,
+ 'Symfony\\Component\\Console\\' => 26,
+ 'Symfony\\Component\\Config\\' => 25,
+ 'Slim\\Views\\' => 11,
+ 'Slim\\' => 5,
+ ),
+ 'R' =>
+ array (
+ 'RateLimit\\' => 10,
+ 'Ramsey\\Uuid\\' => 12,
+ 'RKA\\Middleware\\' => 15,
+ ),
+ 'P' =>
+ array (
+ 'Psr\\SimpleCache\\' => 16,
+ 'Psr\\Log\\' => 8,
+ 'Psr\\Http\\Message\\' => 17,
+ 'Psr\\Container\\' => 14,
+ 'Psr\\Cache\\' => 10,
+ 'Phinx\\' => 6,
+ ),
+ 'M' =>
+ array (
+ 'Monolog\\' => 8,
+ ),
+ 'L' =>
+ array (
+ 'League\\OAuth2\\Client\\' => 21,
+ 'League\\OAuth1\\' => 14,
+ 'League\\Flysystem\\' => 17,
+ ),
+ 'I' =>
+ array (
+ 'Intervention\\Image\\' => 19,
+ 'Interop\\Container\\' => 18,
+ ),
+ 'G' =>
+ array (
+ 'GuzzleHttp\\Psr7\\' => 16,
+ 'GuzzleHttp\\Promise\\' => 19,
+ 'GuzzleHttp\\' => 11,
+ ),
+ 'F' =>
+ array (
+ 'Firebase\\JWT\\' => 13,
+ 'FastRoute\\' => 10,
+ ),
+ 'D' =>
+ array (
+ 'Doctrine\\Instantiator\\' => 22,
+ 'Doctrine\\Common\\Cache\\' => 22,
+ 'Directus\\Custom\\Hooks\\' => 22,
+ 'Directus\\Custom\\Hasher\\' => 23,
+ 'Directus\\Custom\\Embed\\Provider\\' => 31,
+ 'Directus\\Authentication\\Sso\\Provider\\' => 37,
+ 'Directus\\Api\\Routes\\' => 20,
+ 'Directus\\' => 9,
+ 'DeepCopy\\' => 9,
+ ),
+ 'C' =>
+ array (
+ 'Cache\\' => 6,
+ ),
+ );
+
+ public static $prefixDirsPsr4 = array (
+ 'phpDocumentor\\Reflection\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src',
+ 1 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src',
+ 2 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src',
+ ),
+ 'Zend\\Stdlib\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/zendframework/zend-stdlib/src',
+ ),
+ 'Zend\\Db\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/zendframework/zend-db/src',
+ ),
+ 'WellingGuzman\\OAuth2\\Client\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/wellingguzman/oauth2-okta/src',
+ ),
+ 'Webmozart\\Assert\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/webmozart/assert/src',
+ ),
+ 'Twig\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/twig/twig/src',
+ ),
+ 'Symfony\\Polyfill\\Mbstring\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
+ ),
+ 'Symfony\\Polyfill\\Ctype\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
+ ),
+ 'Symfony\\Component\\Yaml\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/yaml',
+ ),
+ 'Symfony\\Component\\Validator\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/validator',
+ ),
+ 'Symfony\\Component\\Translation\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/translation',
+ ),
+ 'Symfony\\Component\\Filesystem\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/filesystem',
+ ),
+ 'Symfony\\Component\\Console\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/console',
+ ),
+ 'Symfony\\Component\\Config\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/config',
+ ),
+ 'Slim\\Views\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/slim/twig-view/src',
+ ),
+ 'Slim\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/slim/slim/Slim',
+ ),
+ 'RateLimit\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/wellingguzman/rate-limit/src',
+ ),
+ 'Ramsey\\Uuid\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/ramsey/uuid/src',
+ ),
+ 'RKA\\Middleware\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/akrabat/rka-ip-address-middleware/src',
+ ),
+ 'Psr\\SimpleCache\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/psr/simple-cache/src',
+ ),
+ 'Psr\\Log\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
+ ),
+ 'Psr\\Http\\Message\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/psr/http-message/src',
+ ),
+ 'Psr\\Container\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/psr/container/src',
+ ),
+ 'Psr\\Cache\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/psr/cache/src',
+ ),
+ 'Phinx\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx',
+ ),
+ 'Monolog\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog',
+ ),
+ 'League\\OAuth2\\Client\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/league/oauth2-client/src',
+ 1 => __DIR__ . '/..' . '/league/oauth2-github/src',
+ 2 => __DIR__ . '/..' . '/league/oauth2-google/src',
+ 3 => __DIR__ . '/..' . '/league/oauth2-facebook/src',
+ ),
+ 'League\\OAuth1\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/league/oauth1-client/src',
+ ),
+ 'League\\Flysystem\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/league/flysystem/src',
+ ),
+ 'Intervention\\Image\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image',
+ ),
+ 'Interop\\Container\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container',
+ ),
+ 'GuzzleHttp\\Psr7\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src',
+ ),
+ 'GuzzleHttp\\Promise\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/guzzlehttp/promises/src',
+ ),
+ 'GuzzleHttp\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src',
+ ),
+ 'Firebase\\JWT\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/firebase/php-jwt/src',
+ ),
+ 'FastRoute\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/nikic/fast-route/src',
+ ),
+ 'Doctrine\\Instantiator\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator',
+ ),
+ 'Doctrine\\Common\\Cache\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache',
+ ),
+ 'Directus\\Custom\\Hooks\\' =>
+ array (
+ 0 => __DIR__ . '/../..' . '/public/extensions/custom/hooks',
+ ),
+ 'Directus\\Custom\\Hasher\\' =>
+ array (
+ 0 => __DIR__ . '/../..' . '/public/extensions/custom/hashers',
+ ),
+ 'Directus\\Custom\\Embed\\Provider\\' =>
+ array (
+ 0 => __DIR__ . '/../..' . '/public/extensions/custom/embeds',
+ ),
+ 'Directus\\Authentication\\Sso\\Provider\\' =>
+ array (
+ 0 => __DIR__ . '/../..' . '/public/extensions/core/auth',
+ ),
+ 'Directus\\Api\\Routes\\' =>
+ array (
+ 0 => __DIR__ . '/../..' . '/src/endpoints',
+ ),
+ 'Directus\\' =>
+ array (
+ 0 => __DIR__ . '/../..' . '/src/core/Directus',
+ ),
+ 'DeepCopy\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy',
+ ),
+ 'Cache\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/cache/cache/src',
+ ),
+ );
+
+ public static $prefixesPsr0 = array (
+ 'T' =>
+ array (
+ 'Twig_' =>
+ array (
+ 0 => __DIR__ . '/..' . '/twig/twig/lib',
+ ),
+ ),
+ 'P' =>
+ array (
+ 'Prophecy\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/phpspec/prophecy/src',
+ ),
+ 'Pimple' =>
+ array (
+ 0 => __DIR__ . '/..' . '/pimple/pimple/src',
+ ),
+ ),
+ );
+
+ public static $classMap = array (
+ 'Cache\\Adapter\\Apc\\ApcCachePool' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Apc/ApcCachePool.php',
+ 'Cache\\Adapter\\Apcu\\ApcuCachePool' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Apcu/ApcuCachePool.php',
+ 'Cache\\Adapter\\Chain\\CachePoolChain' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Chain/CachePoolChain.php',
+ 'Cache\\Adapter\\Chain\\Exception\\NoPoolAvailableException' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Chain/Exception/NoPoolAvailableException.php',
+ 'Cache\\Adapter\\Chain\\Exception\\PoolFailedException' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Chain/Exception/PoolFailedException.php',
+ 'Cache\\Adapter\\Common\\AbstractCachePool' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Common/AbstractCachePool.php',
+ 'Cache\\Adapter\\Common\\CacheItem' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Common/CacheItem.php',
+ 'Cache\\Adapter\\Common\\Exception\\CacheException' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Common/Exception/CacheException.php',
+ 'Cache\\Adapter\\Common\\Exception\\CachePoolException' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Common/Exception/CachePoolException.php',
+ 'Cache\\Adapter\\Common\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Common/Exception/InvalidArgumentException.php',
+ 'Cache\\Adapter\\Common\\HasExpirationTimestampInterface' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Common/HasExpirationTimestampInterface.php',
+ 'Cache\\Adapter\\Common\\PhpCacheItem' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Common/PhpCacheItem.php',
+ 'Cache\\Adapter\\Common\\PhpCachePool' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Common/PhpCachePool.php',
+ 'Cache\\Adapter\\Common\\TagSupportWithArray' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Common/TagSupportWithArray.php',
+ 'Cache\\Adapter\\Doctrine\\DoctrineCachePool' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Doctrine/DoctrineCachePool.php',
+ 'Cache\\Adapter\\Filesystem\\FilesystemCachePool' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Filesystem/FilesystemCachePool.php',
+ 'Cache\\Adapter\\Illuminate\\IlluminateCachePool' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Illuminate/IlluminateCachePool.php',
+ 'Cache\\Adapter\\Memcache\\MemcacheCachePool' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Memcache/MemcacheCachePool.php',
+ 'Cache\\Adapter\\Memcached\\MemcachedCachePool' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Memcached/MemcachedCachePool.php',
+ 'Cache\\Adapter\\MongoDB\\MongoDBCachePool' => __DIR__ . '/..' . '/cache/cache/src/Adapter/MongoDB/MongoDBCachePool.php',
+ 'Cache\\Adapter\\PHPArray\\ArrayCachePool' => __DIR__ . '/..' . '/cache/cache/src/Adapter/PHPArray/ArrayCachePool.php',
+ 'Cache\\Adapter\\Predis\\PredisCachePool' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Predis/PredisCachePool.php',
+ 'Cache\\Adapter\\Redis\\RedisCachePool' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Redis/RedisCachePool.php',
+ 'Cache\\Adapter\\Void\\VoidCachePool' => __DIR__ . '/..' . '/cache/cache/src/Adapter/Void/VoidCachePool.php',
+ 'Cache\\Bridge\\Doctrine\\DoctrineCacheBridge' => __DIR__ . '/..' . '/cache/cache/src/Bridge/Doctrine/DoctrineCacheBridge.php',
+ 'Cache\\Bridge\\SimpleCache\\Exception\\CacheException' => __DIR__ . '/..' . '/cache/cache/src/Bridge/SimpleCache/Exception/CacheException.php',
+ 'Cache\\Bridge\\SimpleCache\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/cache/cache/src/Bridge/SimpleCache/Exception/InvalidArgumentException.php',
+ 'Cache\\Bridge\\SimpleCache\\SimpleCacheBridge' => __DIR__ . '/..' . '/cache/cache/src/Bridge/SimpleCache/SimpleCacheBridge.php',
+ 'Cache\\Encryption\\EncryptedCachePool' => __DIR__ . '/..' . '/cache/cache/src/Encryption/EncryptedCachePool.php',
+ 'Cache\\Encryption\\EncryptedItemDecorator' => __DIR__ . '/..' . '/cache/cache/src/Encryption/EncryptedItemDecorator.php',
+ 'Cache\\Hierarchy\\HierarchicalCachePoolTrait' => __DIR__ . '/..' . '/cache/cache/src/Hierarchy/HierarchicalCachePoolTrait.php',
+ 'Cache\\Hierarchy\\HierarchicalPoolInterface' => __DIR__ . '/..' . '/cache/cache/src/Hierarchy/HierarchicalPoolInterface.php',
+ 'Cache\\Namespaced\\NamespacedCachePool' => __DIR__ . '/..' . '/cache/cache/src/Namespaced/NamespacedCachePool.php',
+ 'Cache\\Prefixed\\PrefixedCachePool' => __DIR__ . '/..' . '/cache/cache/src/Prefixed/PrefixedCachePool.php',
+ 'Cache\\SessionHandler\\Psr6SessionHandler' => __DIR__ . '/..' . '/cache/cache/src/SessionHandler/Psr6SessionHandler.php',
+ 'Cache\\TagInterop\\TaggableCacheItemInterface' => __DIR__ . '/..' . '/cache/cache/src/TagInterop/TaggableCacheItemInterface.php',
+ 'Cache\\TagInterop\\TaggableCacheItemPoolInterface' => __DIR__ . '/..' . '/cache/cache/src/TagInterop/TaggableCacheItemPoolInterface.php',
+ 'Cache\\Taggable\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/cache/cache/src/Taggable/Exception/InvalidArgumentException.php',
+ 'Cache\\Taggable\\TaggablePSR6ItemAdapter' => __DIR__ . '/..' . '/cache/cache/src/Taggable/TaggablePSR6ItemAdapter.php',
+ 'Cache\\Taggable\\TaggablePSR6PoolAdapter' => __DIR__ . '/..' . '/cache/cache/src/Taggable/TaggablePSR6PoolAdapter.php',
+ 'DeepCopy\\DeepCopy' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/DeepCopy.php',
+ 'DeepCopy\\Exception\\CloneException' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php',
+ 'DeepCopy\\Exception\\PropertyException' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php',
+ 'DeepCopy\\Filter\\Doctrine\\DoctrineCollectionFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php',
+ 'DeepCopy\\Filter\\Doctrine\\DoctrineEmptyCollectionFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php',
+ 'DeepCopy\\Filter\\Doctrine\\DoctrineProxyFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php',
+ 'DeepCopy\\Filter\\Filter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php',
+ 'DeepCopy\\Filter\\KeepFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php',
+ 'DeepCopy\\Filter\\ReplaceFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php',
+ 'DeepCopy\\Filter\\SetNullFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php',
+ 'DeepCopy\\Matcher\\Doctrine\\DoctrineProxyMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php',
+ 'DeepCopy\\Matcher\\Matcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php',
+ 'DeepCopy\\Matcher\\PropertyMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php',
+ 'DeepCopy\\Matcher\\PropertyNameMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php',
+ 'DeepCopy\\Matcher\\PropertyTypeMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php',
+ 'DeepCopy\\Reflection\\ReflectionHelper' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php',
+ 'DeepCopy\\TypeFilter\\Date\\DateIntervalFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php',
+ 'DeepCopy\\TypeFilter\\ReplaceFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php',
+ 'DeepCopy\\TypeFilter\\ShallowCopyFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php',
+ 'DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedList' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php',
+ 'DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedListFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php',
+ 'DeepCopy\\TypeFilter\\TypeFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php',
+ 'DeepCopy\\TypeMatcher\\TypeMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php',
+ 'Directus\\Api\\Routes\\Activity' => __DIR__ . '/../..' . '/src/endpoints/Activity.php',
+ 'Directus\\Api\\Routes\\Auth' => __DIR__ . '/../..' . '/src/endpoints/Auth.php',
+ 'Directus\\Api\\Routes\\CollectionPresets' => __DIR__ . '/../..' . '/src/endpoints/CollectionPresets.php',
+ 'Directus\\Api\\Routes\\Collections' => __DIR__ . '/../..' . '/src/endpoints/Collections.php',
+ 'Directus\\Api\\Routes\\Fields' => __DIR__ . '/../..' . '/src/endpoints/Fields.php',
+ 'Directus\\Api\\Routes\\Files' => __DIR__ . '/../..' . '/src/endpoints/Files.php',
+ 'Directus\\Api\\Routes\\Home' => __DIR__ . '/../..' . '/src/endpoints/Home.php',
+ 'Directus\\Api\\Routes\\Interfaces' => __DIR__ . '/../..' . '/src/endpoints/Interfaces.php',
+ 'Directus\\Api\\Routes\\Items' => __DIR__ . '/../..' . '/src/endpoints/Items.php',
+ 'Directus\\Api\\Routes\\Listings' => __DIR__ . '/../..' . '/src/endpoints/Listings.php',
+ 'Directus\\Api\\Routes\\Pages' => __DIR__ . '/../..' . '/src/endpoints/Pages.php',
+ 'Directus\\Api\\Routes\\Permissions' => __DIR__ . '/../..' . '/src/endpoints/Permissions.php',
+ 'Directus\\Api\\Routes\\Relations' => __DIR__ . '/../..' . '/src/endpoints/Relations.php',
+ 'Directus\\Api\\Routes\\Revisions' => __DIR__ . '/../..' . '/src/endpoints/Revisions.php',
+ 'Directus\\Api\\Routes\\Roles' => __DIR__ . '/../..' . '/src/endpoints/Roles.php',
+ 'Directus\\Api\\Routes\\ScimTwo' => __DIR__ . '/../..' . '/src/endpoints/ScimTwo.php',
+ 'Directus\\Api\\Routes\\Server' => __DIR__ . '/../..' . '/src/endpoints/Server.php',
+ 'Directus\\Api\\Routes\\Settings' => __DIR__ . '/../..' . '/src/endpoints/Settings.php',
+ 'Directus\\Api\\Routes\\Types' => __DIR__ . '/../..' . '/src/endpoints/Types.php',
+ 'Directus\\Api\\Routes\\Users' => __DIR__ . '/../..' . '/src/endpoints/Users.php',
+ 'Directus\\Api\\Routes\\Utils' => __DIR__ . '/../..' . '/src/endpoints/Utils.php',
+ 'Directus\\Application\\Application' => __DIR__ . '/../..' . '/src/core/Directus/Application/Application.php',
+ 'Directus\\Application\\Container' => __DIR__ . '/../..' . '/src/core/Directus/Application/Container.php',
+ 'Directus\\Application\\CoreServicesProvider' => __DIR__ . '/../..' . '/src/core/Directus/Application/CoreServicesProvider.php',
+ 'Directus\\Application\\DefaultServicesProvider' => __DIR__ . '/../..' . '/src/core/Directus/Application/DefaultServicesProvider.php',
+ 'Directus\\Application\\ErrorHandlers\\ErrorHandler' => __DIR__ . '/../..' . '/src/core/Directus/Application/ErrorHandlers/ErrorHandler.php',
+ 'Directus\\Application\\ErrorHandlers\\MethodNotAllowedHandler' => __DIR__ . '/../..' . '/src/core/Directus/Application/ErrorHandlers/MethodNotAllowedHandler.php',
+ 'Directus\\Application\\ErrorHandlers\\NotFoundHandler' => __DIR__ . '/../..' . '/src/core/Directus/Application/ErrorHandlers/NotFoundHandler.php',
+ 'Directus\\Application\\Http\\Middleware\\AbstractMiddleware' => __DIR__ . '/../..' . '/src/core/Directus/Application/Http/Middleware/AbstractMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\AbstractRateLimitMiddleware' => __DIR__ . '/../..' . '/src/core/Directus/Application/Http/Middleware/AbstractRateLimitMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\AdminMiddleware' => __DIR__ . '/../..' . '/src/core/Directus/Application/Http/Middleware/AdminMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\AuthenticatedMiddleware' => __DIR__ . '/../..' . '/src/core/Directus/Application/Http/Middleware/AuthenticatedMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\AuthenticationMiddleware' => __DIR__ . '/../..' . '/src/core/Directus/Application/Http/Middleware/AuthenticationMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\CorsMiddleware' => __DIR__ . '/../..' . '/src/core/Directus/Application/Http/Middleware/CorsMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\IpRateLimitMiddleware' => __DIR__ . '/../..' . '/src/core/Directus/Application/Http/Middleware/IpRateLimitMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\RateLimit\\UserIdentityResolver' => __DIR__ . '/../..' . '/src/core/Directus/Application/Http/Middleware/RateLimit/UserIdentityResolver.php',
+ 'Directus\\Application\\Http\\Middleware\\ResponseCacheMiddleware' => __DIR__ . '/../..' . '/src/core/Directus/Application/Http/Middleware/ResponseCacheMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\TableGatewayMiddleware' => __DIR__ . '/../..' . '/src/core/Directus/Application/Http/Middleware/TableGatewayMiddleware.php',
+ 'Directus\\Application\\Http\\Middleware\\UserRateLimitMiddleware' => __DIR__ . '/../..' . '/src/core/Directus/Application/Http/Middleware/UserRateLimitMiddleware.php',
+ 'Directus\\Application\\Http\\Request' => __DIR__ . '/../..' . '/src/core/Directus/Application/Http/Request.php',
+ 'Directus\\Application\\Http\\Response' => __DIR__ . '/../..' . '/src/core/Directus/Application/Http/Response.php',
+ 'Directus\\Application\\Route' => __DIR__ . '/../..' . '/src/core/Directus/Application/Route.php',
+ 'Directus\\Authentication\\Exception\\ExpiredRequestTokenException' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Exception/ExpiredRequestTokenException.php',
+ 'Directus\\Authentication\\Exception\\ExpiredResetPasswordToken' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Exception/ExpiredResetPasswordToken.php',
+ 'Directus\\Authentication\\Exception\\ExpiredTokenException' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Exception/ExpiredTokenException.php',
+ 'Directus\\Authentication\\Exception\\InvalidInvitationCodeException' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Exception/InvalidInvitationCodeException.php',
+ 'Directus\\Authentication\\Exception\\InvalidRequestTokenException' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Exception/InvalidRequestTokenException.php',
+ 'Directus\\Authentication\\Exception\\InvalidResetPasswordTokenException' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Exception/InvalidResetPasswordTokenException.php',
+ 'Directus\\Authentication\\Exception\\InvalidTokenException' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Exception/InvalidTokenException.php',
+ 'Directus\\Authentication\\Exception\\InvalidUserCredentialsException' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Exception/InvalidUserCredentialsException.php',
+ 'Directus\\Authentication\\Exception\\UnknownUserAttributeException' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Exception/UnknownUserAttributeException.php',
+ 'Directus\\Authentication\\Exception\\UserAlreadyLoggedInException' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Exception/UserAlreadyLoggedInException.php',
+ 'Directus\\Authentication\\Exception\\UserInactiveException' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Exception/UserInactiveException.php',
+ 'Directus\\Authentication\\Exception\\UserNotAuthenticatedException' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Exception/UserNotAuthenticatedException.php',
+ 'Directus\\Authentication\\Exception\\UserNotFoundException' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Exception/UserNotFoundException.php',
+ 'Directus\\Authentication\\Exception\\UserWithEmailNotFoundException' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Exception/UserWithEmailNotFoundException.php',
+ 'Directus\\Authentication\\Provider' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Provider.php',
+ 'Directus\\Authentication\\Sso\\AbstractSocialProvider' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Sso/AbstractSocialProvider.php',
+ 'Directus\\Authentication\\Sso\\OneSocialProvider' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Sso/OneSocialProvider.php',
+ 'Directus\\Authentication\\Sso\\Provider\\facebook\\Provider' => __DIR__ . '/../..' . '/public/extensions/core/auth/facebook/Provider.php',
+ 'Directus\\Authentication\\Sso\\Provider\\github\\Provider' => __DIR__ . '/../..' . '/public/extensions/core/auth/github/Provider.php',
+ 'Directus\\Authentication\\Sso\\Provider\\google\\Provider' => __DIR__ . '/../..' . '/public/extensions/core/auth/google/Provider.php',
+ 'Directus\\Authentication\\Sso\\Provider\\okta\\Provider' => __DIR__ . '/../..' . '/public/extensions/core/auth/okta/Provider.php',
+ 'Directus\\Authentication\\Sso\\Provider\\twitter\\Provider' => __DIR__ . '/../..' . '/public/extensions/core/auth/twitter/Provider.php',
+ 'Directus\\Authentication\\Sso\\Social' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Sso/Social.php',
+ 'Directus\\Authentication\\Sso\\SocialProviderInterface' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Sso/SocialProviderInterface.php',
+ 'Directus\\Authentication\\Sso\\SocialUser' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Sso/SocialUser.php',
+ 'Directus\\Authentication\\Sso\\TwoSocialProvider' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/Sso/TwoSocialProvider.php',
+ 'Directus\\Authentication\\User\\Provider\\UserProviderInterface' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/User/Provider/UserProviderInterface.php',
+ 'Directus\\Authentication\\User\\Provider\\UserTableGatewayProvider' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/User/Provider/UserTableGatewayProvider.php',
+ 'Directus\\Authentication\\User\\User' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/User/User.php',
+ 'Directus\\Authentication\\User\\UserInterface' => __DIR__ . '/../..' . '/src/core/Directus/Authentication/User/UserInterface.php',
+ 'Directus\\Cache\\Cache' => __DIR__ . '/../..' . '/src/core/Directus/Cache/Cache.php',
+ 'Directus\\Cache\\Response' => __DIR__ . '/../..' . '/src/core/Directus/Cache/Response.php',
+ 'Directus\\Collection\\Arrayable' => __DIR__ . '/../..' . '/src/core/Directus/Collection/Arrayable.php',
+ 'Directus\\Collection\\Collection' => __DIR__ . '/../..' . '/src/core/Directus/Collection/Collection.php',
+ 'Directus\\Collection\\CollectionInterface' => __DIR__ . '/../..' . '/src/core/Directus/Collection/CollectionInterface.php',
+ 'Directus\\Config\\Config' => __DIR__ . '/../..' . '/src/core/Directus/Config/Config.php',
+ 'Directus\\Config\\ConfigInterface' => __DIR__ . '/../..' . '/src/core/Directus/Config/ConfigInterface.php',
+ 'Directus\\Config\\Exception\\InvalidStatusException' => __DIR__ . '/../..' . '/src/core/Directus/Config/Exception/InvalidStatusException.php',
+ 'Directus\\Config\\Exception\\InvalidValueException' => __DIR__ . '/../..' . '/src/core/Directus/Config/Exception/InvalidValueException.php',
+ 'Directus\\Config\\StatusItem' => __DIR__ . '/../..' . '/src/core/Directus/Config/StatusItem.php',
+ 'Directus\\Config\\StatusMapping' => __DIR__ . '/../..' . '/src/core/Directus/Config/StatusMapping.php',
+ 'Directus\\Console\\Cli' => __DIR__ . '/../..' . '/src/core/Directus/Console/Cli.php',
+ 'Directus\\Console\\Common\\Exception\\PasswordChangeException' => __DIR__ . '/../..' . '/src/core/Directus/Console/Common/Exception/PasswordChangeException.php',
+ 'Directus\\Console\\Common\\Exception\\SettingUpdateException' => __DIR__ . '/../..' . '/src/core/Directus/Console/Common/Exception/SettingUpdateException.php',
+ 'Directus\\Console\\Common\\Exception\\UserUpdateException' => __DIR__ . '/../..' . '/src/core/Directus/Console/Common/Exception/UserUpdateException.php',
+ 'Directus\\Console\\Common\\Setting' => __DIR__ . '/../..' . '/src/core/Directus/Console/Common/Setting.php',
+ 'Directus\\Console\\Common\\User' => __DIR__ . '/../..' . '/src/core/Directus/Console/Common/User.php',
+ 'Directus\\Console\\Exception\\CommandFailedException' => __DIR__ . '/../..' . '/src/core/Directus/Console/Exception/CommandFailedException.php',
+ 'Directus\\Console\\Exception\\UnsupportedCommandException' => __DIR__ . '/../..' . '/src/core/Directus/Console/Exception/UnsupportedCommandException.php',
+ 'Directus\\Console\\Exception\\WrongArgumentsException' => __DIR__ . '/../..' . '/src/core/Directus/Console/Exception/WrongArgumentsException.php',
+ 'Directus\\Console\\Modules\\CacheModule' => __DIR__ . '/../..' . '/src/core/Directus/Console/Modules/CacheModule.php',
+ 'Directus\\Console\\Modules\\DatabaseModule' => __DIR__ . '/../..' . '/src/core/Directus/Console/Modules/DatabaseModule.php',
+ 'Directus\\Console\\Modules\\InstallModule' => __DIR__ . '/../..' . '/src/core/Directus/Console/Modules/InstallModule.php',
+ 'Directus\\Console\\Modules\\ModuleBase' => __DIR__ . '/../..' . '/src/core/Directus/Console/Modules/ModuleBase.php',
+ 'Directus\\Console\\Modules\\ModuleInterface' => __DIR__ . '/../..' . '/src/core/Directus/Console/Modules/ModuleInterface.php',
+ 'Directus\\Console\\Modules\\UserModule' => __DIR__ . '/../..' . '/src/core/Directus/Console/Modules/UserModule.php',
+ 'Directus\\Container\\Container' => __DIR__ . '/../..' . '/src/core/Directus/Container/Container.php',
+ 'Directus\\Container\\Exception\\ValueNotFoundException' => __DIR__ . '/../..' . '/src/core/Directus/Container/Exception/ValueNotFoundException.php',
+ 'Directus\\Custom\\Hasher\\CustomHasher' => __DIR__ . '/../..' . '/public/extensions/custom/hashers/_CustomHasher.php',
+ 'Directus\\Custom\\Hooks\\Products\\BeforeInsertProducts' => __DIR__ . '/../..' . '/public/extensions/custom/hooks/_products/BeforeInsertProducts.php',
+ 'Directus\\Database\\Connection' => __DIR__ . '/../..' . '/src/core/Directus/Database/Connection.php',
+ 'Directus\\Database\\Ddl\\Column\\Bit' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/Bit.php',
+ 'Directus\\Database\\Ddl\\Column\\Boolean' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/Boolean.php',
+ 'Directus\\Database\\Ddl\\Column\\CollectionLength' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/CollectionLength.php',
+ 'Directus\\Database\\Ddl\\Column\\Custom' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/Custom.php',
+ 'Directus\\Database\\Ddl\\Column\\Double' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/Double.php',
+ 'Directus\\Database\\Ddl\\Column\\Enum' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/Enum.php',
+ 'Directus\\Database\\Ddl\\Column\\File' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/File.php',
+ 'Directus\\Database\\Ddl\\Column\\LongBlob' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/LongBlob.php',
+ 'Directus\\Database\\Ddl\\Column\\LongText' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/LongText.php',
+ 'Directus\\Database\\Ddl\\Column\\MediumBlob' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/MediumBlob.php',
+ 'Directus\\Database\\Ddl\\Column\\MediumInteger' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/MediumInteger.php',
+ 'Directus\\Database\\Ddl\\Column\\MediumText' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/MediumText.php',
+ 'Directus\\Database\\Ddl\\Column\\Numeric' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/Numeric.php',
+ 'Directus\\Database\\Ddl\\Column\\Real' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/Real.php',
+ 'Directus\\Database\\Ddl\\Column\\Serial' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/Serial.php',
+ 'Directus\\Database\\Ddl\\Column\\Set' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/Set.php',
+ 'Directus\\Database\\Ddl\\Column\\SmallInteger' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/SmallInteger.php',
+ 'Directus\\Database\\Ddl\\Column\\TinyBlob' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/TinyBlob.php',
+ 'Directus\\Database\\Ddl\\Column\\TinyInteger' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/TinyInteger.php',
+ 'Directus\\Database\\Ddl\\Column\\TinyText' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/TinyText.php',
+ 'Directus\\Database\\Ddl\\Column\\Uuid' => __DIR__ . '/../..' . '/src/core/Directus/Database/Ddl/Column/Uuid.php',
+ 'Directus\\Database\\Exception\\CollectionAlreadyExistsException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/CollectionAlreadyExistsException.php',
+ 'Directus\\Database\\Exception\\CollectionHasNotStatusInterfaceException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/CollectionHasNotStatusInterfaceException.php',
+ 'Directus\\Database\\Exception\\CollectionNotFoundException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/CollectionNotFoundException.php',
+ 'Directus\\Database\\Exception\\CollectionNotManagedException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/CollectionNotManagedException.php',
+ 'Directus\\Database\\Exception\\ConnectionFailedException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/ConnectionFailedException.php',
+ 'Directus\\Database\\Exception\\CustomUiValidationError' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/CustomUiValidationError.php',
+ 'Directus\\Database\\Exception\\DbException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/DbException.php',
+ 'Directus\\Database\\Exception\\DuplicateItemException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/DuplicateItemException.php',
+ 'Directus\\Database\\Exception\\FieldAlreadyExistsException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/FieldAlreadyExistsException.php',
+ 'Directus\\Database\\Exception\\FieldAlreadyHasUniqueKeyException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/FieldAlreadyHasUniqueKeyException.php',
+ 'Directus\\Database\\Exception\\FieldNotFoundException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/FieldNotFoundException.php',
+ 'Directus\\Database\\Exception\\FieldNotManagedException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/FieldNotManagedException.php',
+ 'Directus\\Database\\Exception\\ForbiddenSystemTableDirectAccessException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/ForbiddenSystemTableDirectAccessException.php',
+ 'Directus\\Database\\Exception\\InvalidFieldException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/InvalidFieldException.php',
+ 'Directus\\Database\\Exception\\InvalidQueryException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/InvalidQueryException.php',
+ 'Directus\\Database\\Exception\\ItemNotFoundException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/ItemNotFoundException.php',
+ 'Directus\\Database\\Exception\\RelationshipMetadataException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/RelationshipMetadataException.php',
+ 'Directus\\Database\\Exception\\RevisionInvalidDeltaException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/RevisionInvalidDeltaException.php',
+ 'Directus\\Database\\Exception\\RevisionNotFoundException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/RevisionNotFoundException.php',
+ 'Directus\\Database\\Exception\\StatusMappingEmptyException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/StatusMappingEmptyException.php',
+ 'Directus\\Database\\Exception\\StatusMappingWrongValueTypeException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/StatusMappingWrongValueTypeException.php',
+ 'Directus\\Database\\Exception\\SuppliedArrayAsColumnValue' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/SuppliedArrayAsColumnValue.php',
+ 'Directus\\Database\\Exception\\UnknownDataTypeException' => __DIR__ . '/../..' . '/src/core/Directus/Database/Exception/UnknownDataTypeException.php',
+ 'Directus\\Database\\Filters\\Filter' => __DIR__ . '/../..' . '/src/core/Directus/Database/Filters/Filter.php',
+ 'Directus\\Database\\Filters\\In' => __DIR__ . '/../..' . '/src/core/Directus/Database/Filters/In.php',
+ 'Directus\\Database\\Query\\Builder' => __DIR__ . '/../..' . '/src/core/Directus/Database/Query/Builder.php',
+ 'Directus\\Database\\Query\\Relations\\ManyToManyRelation' => __DIR__ . '/../..' . '/src/core/Directus/Database/Query/Relations/ManyToManyRelation.php',
+ 'Directus\\Database\\Query\\Relations\\ManyToOneRelation' => __DIR__ . '/../..' . '/src/core/Directus/Database/Query/Relations/ManyToOneRelation.php',
+ 'Directus\\Database\\Query\\Relations\\OneToManyRelation' => __DIR__ . '/../..' . '/src/core/Directus/Database/Query/Relations/OneToManyRelation.php',
+ 'Directus\\Database\\Repositories\\AbstractRepository' => __DIR__ . '/../..' . '/src/core/Directus/Database/Repositories/AbstractRepository.php',
+ 'Directus\\Database\\Repositories\\Repository' => __DIR__ . '/../..' . '/src/core/Directus/Database/Repositories/Repository.php',
+ 'Directus\\Database\\Repositories\\RepositoryFactory' => __DIR__ . '/../..' . '/src/core/Directus/Database/Repositories/RepositoryFactory.php',
+ 'Directus\\Database\\Repositories\\RepositoryInterface' => __DIR__ . '/../..' . '/src/core/Directus/Database/Repositories/RepositoryInterface.php',
+ 'Directus\\Database\\ResultItem' => __DIR__ . '/../..' . '/src/core/Directus/Database/ResultItem.php',
+ 'Directus\\Database\\ResultSet' => __DIR__ . '/../..' . '/src/core/Directus/Database/ResultSet.php',
+ 'Directus\\Database\\RowGateway\\BaseRowGateway' => __DIR__ . '/../..' . '/src/core/Directus/Database/RowGateway/BaseRowGateway.php',
+ 'Directus\\Database\\RowGateway\\DirectusFilesRowGateway' => __DIR__ . '/../..' . '/src/core/Directus/Database/RowGateway/DirectusMediaRowGateway.php',
+ 'Directus\\Database\\RowGateway\\DirectusUsersRowGateway' => __DIR__ . '/../..' . '/src/core/Directus/Database/RowGateway/DirectusUsersRowGateway.php',
+ 'Directus\\Database\\SchemaService' => __DIR__ . '/../..' . '/src/core/Directus/Database/SchemaService.php',
+ 'Directus\\Database\\Schema\\DataTypes' => __DIR__ . '/../..' . '/src/core/Directus/Database/Schema/DataTypes.php',
+ 'Directus\\Database\\Schema\\Object\\AbstractObject' => __DIR__ . '/../..' . '/src/core/Directus/Database/Schema/Object/AbstractObject.php',
+ 'Directus\\Database\\Schema\\Object\\Collection' => __DIR__ . '/../..' . '/src/core/Directus/Database/Schema/Object/Collection.php',
+ 'Directus\\Database\\Schema\\Object\\Field' => __DIR__ . '/../..' . '/src/core/Directus/Database/Schema/Object/Field.php',
+ 'Directus\\Database\\Schema\\Object\\FieldRelationship' => __DIR__ . '/../..' . '/src/core/Directus/Database/Schema/Object/FieldRelationship.php',
+ 'Directus\\Database\\Schema\\SchemaFactory' => __DIR__ . '/../..' . '/src/core/Directus/Database/Schema/SchemaFactory.php',
+ 'Directus\\Database\\Schema\\SchemaManager' => __DIR__ . '/../..' . '/src/core/Directus/Database/Schema/SchemaManager.php',
+ 'Directus\\Database\\Schema\\Sources\\AbstractSchema' => __DIR__ . '/../..' . '/src/core/Directus/Database/Schema/Sources/AbstractSchema.php',
+ 'Directus\\Database\\Schema\\Sources\\MySQLSchema' => __DIR__ . '/../..' . '/src/core/Directus/Database/Schema/Sources/MySQLSchema.php',
+ 'Directus\\Database\\Schema\\Sources\\SQLiteSchema' => __DIR__ . '/../..' . '/src/core/Directus/Database/Schema/Sources/SQLiteSchema.php',
+ 'Directus\\Database\\Schema\\Sources\\SchemaInterface' => __DIR__ . '/../..' . '/src/core/Directus/Database/Schema/Sources/SchemaInterface.php',
+ 'Directus\\Database\\TableGatewayFactory' => __DIR__ . '/../..' . '/src/core/Directus/Database/TableGatewayFactory.php',
+ 'Directus\\Database\\TableGateway\\BaseTableGateway' => __DIR__ . '/../..' . '/src/core/Directus/Database/TableGateway/BaseTableGateway.php',
+ 'Directus\\Database\\TableGateway\\DirectusActivityTableGateway' => __DIR__ . '/../..' . '/src/core/Directus/Database/TableGateway/DirectusActivityTableGateway.php',
+ 'Directus\\Database\\TableGateway\\DirectusCollectionPresetsTableGateway' => __DIR__ . '/../..' . '/src/core/Directus/Database/TableGateway/DirectusCollectionPresetsTableGateway.php',
+ 'Directus\\Database\\TableGateway\\DirectusCollectionsTableGateway' => __DIR__ . '/../..' . '/src/core/Directus/Database/TableGateway/DirectusCollectionsTableGateway.php',
+ 'Directus\\Database\\TableGateway\\DirectusPermissionsTableGateway' => __DIR__ . '/../..' . '/src/core/Directus/Database/TableGateway/DirectusPermissionsTableGateway.php',
+ 'Directus\\Database\\TableGateway\\DirectusRolesTableGateway' => __DIR__ . '/../..' . '/src/core/Directus/Database/TableGateway/DirectusRolesTableGateway.php',
+ 'Directus\\Database\\TableGateway\\DirectusSettingsTableGateway' => __DIR__ . '/../..' . '/src/core/Directus/Database/TableGateway/DirectusSettingsTableGateway.php',
+ 'Directus\\Database\\TableGateway\\DirectusUsersTableGateway' => __DIR__ . '/../..' . '/src/core/Directus/Database/TableGateway/DirectusUsersTableGateway.php',
+ 'Directus\\Database\\TableGateway\\RelationalTableGateway' => __DIR__ . '/../..' . '/src/core/Directus/Database/TableGateway/RelationalTableGateway.php',
+ 'Directus\\Embed\\EmbedManager' => __DIR__ . '/../..' . '/src/core/Directus/Embed/EmbedManager.php',
+ 'Directus\\Embed\\Provider\\AbstractProvider' => __DIR__ . '/../..' . '/src/core/Directus/Embed/Provider/AbstractProvider.php',
+ 'Directus\\Embed\\Provider\\ProviderInterface' => __DIR__ . '/../..' . '/src/core/Directus/Embed/Provider/ProviderInterface.php',
+ 'Directus\\Embed\\Provider\\VimeoProvider' => __DIR__ . '/../..' . '/src/core/Directus/Embed/Provider/VimeoProvider.php',
+ 'Directus\\Embed\\Provider\\YoutubeProvider' => __DIR__ . '/../..' . '/src/core/Directus/Embed/Provider/YoutubeProvider.php',
+ 'Directus\\Exception\\BadRequestException' => __DIR__ . '/../..' . '/src/core/Directus/Exception/BadRequestException.php',
+ 'Directus\\Exception\\BadRequestExceptionInterface' => __DIR__ . '/../..' . '/src/core/Directus/Exception/BadRequestExceptionInterface.php',
+ 'Directus\\Exception\\ConflictExceptionInterface' => __DIR__ . '/../..' . '/src/core/Directus/Exception/ConflictExceptionInterface.php',
+ 'Directus\\Exception\\ErrorException' => __DIR__ . '/../..' . '/src/core/Directus/Exception/ErrorException.php',
+ 'Directus\\Exception\\ErrorExceptionInterface' => __DIR__ . '/../..' . '/src/core/Directus/Exception/ErrorExceptionInterface.php',
+ 'Directus\\Exception\\Exception' => __DIR__ . '/../..' . '/src/core/Directus/Exception/Exception.php',
+ 'Directus\\Exception\\ForbiddenException' => __DIR__ . '/../..' . '/src/core/Directus/Exception/ForbiddenException.php',
+ 'Directus\\Exception\\ForbiddenExceptionInterface' => __DIR__ . '/../..' . '/src/core/Directus/Exception/ForbiddenExceptionInterface.php',
+ 'Directus\\Exception\\Http\\Auth\\ForbiddenException' => __DIR__ . '/../..' . '/src/core/Directus/Exception/Http/Auth/ForbiddenException.php',
+ 'Directus\\Exception\\Http\\BadRequestException' => __DIR__ . '/../..' . '/src/core/Directus/Exception/Http/BadRequestException.php',
+ 'Directus\\Exception\\Http\\NotFoundException' => __DIR__ . '/../..' . '/src/core/Directus/Exception/Http/NotFoundException.php',
+ 'Directus\\Exception\\MethodNotAllowedException' => __DIR__ . '/../..' . '/src/core/Directus/Exception/MethodNotAllowedException.php',
+ 'Directus\\Exception\\NotFoundException' => __DIR__ . '/../..' . '/src/core/Directus/Exception/NotFoundException.php',
+ 'Directus\\Exception\\NotFoundExceptionInterface' => __DIR__ . '/../..' . '/src/core/Directus/Exception/NotFoundExceptionInterface.php',
+ 'Directus\\Exception\\RuntimeException' => __DIR__ . '/../..' . '/src/core/Directus/Exception/RuntimeException.php',
+ 'Directus\\Exception\\UnauthorizedException' => __DIR__ . '/../..' . '/src/core/Directus/Exception/UnauthorizedException.php',
+ 'Directus\\Exception\\UnauthorizedExceptionInterface' => __DIR__ . '/../..' . '/src/core/Directus/Exception/UnauthorizedExceptionInterface.php',
+ 'Directus\\Exception\\UnprocessableEntityExceptionInterface' => __DIR__ . '/../..' . '/src/core/Directus/Exception/UnprocessableEntityExceptionInterface.php',
+ 'Directus\\Filesystem\\Exception\\FailedUploadException' => __DIR__ . '/../..' . '/src/core/Directus/Filesystem/Exception/FailedUploadException.php',
+ 'Directus\\Filesystem\\Exception\\FilesystemException' => __DIR__ . '/../..' . '/src/core/Directus/Filesystem/Exception/FilesystemException.php',
+ 'Directus\\Filesystem\\Exception\\ForbiddenException' => __DIR__ . '/../..' . '/src/core/Directus/Filesystem/Exception/ForbiddenException.php',
+ 'Directus\\Filesystem\\Files' => __DIR__ . '/../..' . '/src/core/Directus/Filesystem/Files.php',
+ 'Directus\\Filesystem\\Filesystem' => __DIR__ . '/../..' . '/src/core/Directus/Filesystem/Filesystem.php',
+ 'Directus\\Filesystem\\FilesystemFactory' => __DIR__ . '/../..' . '/src/core/Directus/Filesystem/FilesystemFactory.php',
+ 'Directus\\Filesystem\\Thumbnail' => __DIR__ . '/../..' . '/src/core/Directus/Filesystem/Thumbnail.php',
+ 'Directus\\Filesystem\\Thumbnailer' => __DIR__ . '/../..' . '/src/core/Directus/Filesystem/Thumbnailer.php',
+ 'Directus\\Hash\\Exception\\HasherNotFoundException' => __DIR__ . '/../..' . '/src/core/Directus/Hash/Exception/HasherNotFoundException.php',
+ 'Directus\\Hash\\HashManager' => __DIR__ . '/../..' . '/src/core/Directus/Hash/HashManager.php',
+ 'Directus\\Hash\\Hasher\\AbstractHashHasher' => __DIR__ . '/../..' . '/src/core/Directus/Hash/Hasher/AbstractHashHasher.php',
+ 'Directus\\Hash\\Hasher\\BCryptHasher' => __DIR__ . '/../..' . '/src/core/Directus/Hash/Hasher/BCryptHasher.php',
+ 'Directus\\Hash\\Hasher\\CoreHasher' => __DIR__ . '/../..' . '/src/core/Directus/Hash/Hasher/CoreHasher.php',
+ 'Directus\\Hash\\Hasher\\HasherInterface' => __DIR__ . '/../..' . '/src/core/Directus/Hash/Hasher/HasherInterface.php',
+ 'Directus\\Hash\\Hasher\\MD5Hasher' => __DIR__ . '/../..' . '/src/core/Directus/Hash/Hasher/MD5Hasher.php',
+ 'Directus\\Hash\\Hasher\\Sha1Hasher' => __DIR__ . '/../..' . '/src/core/Directus/Hash/Hasher/Sha1Hasher.php',
+ 'Directus\\Hash\\Hasher\\Sha224Hasher' => __DIR__ . '/../..' . '/src/core/Directus/Hash/Hasher/Sha224Hasher.php',
+ 'Directus\\Hash\\Hasher\\Sha256Hasher' => __DIR__ . '/../..' . '/src/core/Directus/Hash/Hasher/Sha256Hasher.php',
+ 'Directus\\Hash\\Hasher\\Sha384Hasher' => __DIR__ . '/../..' . '/src/core/Directus/Hash/Hasher/Sha384Hasher.php',
+ 'Directus\\Hash\\Hasher\\Sha512Hasher' => __DIR__ . '/../..' . '/src/core/Directus/Hash/Hasher/Sha512Hasher.php',
+ 'Directus\\Hook\\Emitter' => __DIR__ . '/../..' . '/src/core/Directus/Hook/Emitter.php',
+ 'Directus\\Hook\\HookInterface' => __DIR__ . '/../..' . '/src/core/Directus/Hook/HookInterface.php',
+ 'Directus\\Hook\\Payload' => __DIR__ . '/../..' . '/src/core/Directus/Hook/Payload.php',
+ 'Directus\\Mail\\Exception\\InvalidTransportException' => __DIR__ . '/../..' . '/src/core/Directus/Mail/Exception/InvalidTransportException.php',
+ 'Directus\\Mail\\Exception\\InvalidTransportObjectException' => __DIR__ . '/../..' . '/src/core/Directus/Mail/Exception/InvalidTransportObjectException.php',
+ 'Directus\\Mail\\Exception\\TransportNotFoundException' => __DIR__ . '/../..' . '/src/core/Directus/Mail/Exception/TransportNotFoundException.php',
+ 'Directus\\Mail\\Mailer' => __DIR__ . '/../..' . '/src/core/Directus/Mail/Mailer.php',
+ 'Directus\\Mail\\Message' => __DIR__ . '/../..' . '/src/core/Directus/Mail/Message.php',
+ 'Directus\\Mail\\TransportManager' => __DIR__ . '/../..' . '/src/core/Directus/Mail/TransportManager.php',
+ 'Directus\\Mail\\Transports\\AbstractTransport' => __DIR__ . '/../..' . '/src/core/Directus/Mail/Transports/AbstractTransport.php',
+ 'Directus\\Mail\\Transports\\SendMailTransport' => __DIR__ . '/../..' . '/src/core/Directus/Mail/Transports/SendMailTransport.php',
+ 'Directus\\Mail\\Transports\\SimpleFileTransport' => __DIR__ . '/../..' . '/src/core/Directus/Mail/Transports/SimpleFileTransport.php',
+ 'Directus\\Mail\\Transports\\SmtpTransport' => __DIR__ . '/../..' . '/src/core/Directus/Mail/Transports/SmtpTransport.php',
+ 'Directus\\Permissions\\Acl' => __DIR__ . '/../..' . '/src/core/Directus/Permissions/Acl.php',
+ 'Directus\\Permissions\\Exception\\ForbiddenCollectionAlterException' => __DIR__ . '/../..' . '/src/core/Directus/Permissions/Exception/ForbiddenCollectionAlterException.php',
+ 'Directus\\Permissions\\Exception\\ForbiddenCollectionCreateException' => __DIR__ . '/../..' . '/src/core/Directus/Permissions/Exception/ForbiddenCollectionCreateException.php',
+ 'Directus\\Permissions\\Exception\\ForbiddenCollectionDeleteException' => __DIR__ . '/../..' . '/src/core/Directus/Permissions/Exception/ForbiddenCollectionDeleteException.php',
+ 'Directus\\Permissions\\Exception\\ForbiddenCollectionReadException' => __DIR__ . '/../..' . '/src/core/Directus/Permissions/Exception/ForbiddenCollectionReadException.php',
+ 'Directus\\Permissions\\Exception\\ForbiddenCollectionUpdateException' => __DIR__ . '/../..' . '/src/core/Directus/Permissions/Exception/ForbiddenCollectionUpdateException.php',
+ 'Directus\\Permissions\\Exception\\ForbiddenException' => __DIR__ . '/../..' . '/src/core/Directus/Permissions/Exception/ForbiddenException.php',
+ 'Directus\\Permissions\\Exception\\ForbiddenFieldReadException' => __DIR__ . '/../..' . '/src/core/Directus/Permissions/Exception/ForbiddenFieldReadException.php',
+ 'Directus\\Permissions\\Exception\\ForbiddenFieldWriteException' => __DIR__ . '/../..' . '/src/core/Directus/Permissions/Exception/ForbiddenFieldWriteException.php',
+ 'Directus\\Permissions\\Exception\\PermissionException' => __DIR__ . '/../..' . '/src/core/Directus/Permissions/Exception/PermissionException.php',
+ 'Directus\\Services\\AbstractExtensionsController' => __DIR__ . '/../..' . '/src/core/Directus/Services/AbstractExtensionsController.php',
+ 'Directus\\Services\\AbstractService' => __DIR__ . '/../..' . '/src/core/Directus/Services/AbstractService.php',
+ 'Directus\\Services\\ActivityService' => __DIR__ . '/../..' . '/src/core/Directus/Services/ActivityService.php',
+ 'Directus\\Services\\AuthService' => __DIR__ . '/../..' . '/src/core/Directus/Services/AuthService.php',
+ 'Directus\\Services\\CollectionPresetsService' => __DIR__ . '/../..' . '/src/core/Directus/Services/CollectionPresetsService.php',
+ 'Directus\\Services\\FilesServices' => __DIR__ . '/../..' . '/src/core/Directus/Services/FilesServices.php',
+ 'Directus\\Services\\InterfacesService' => __DIR__ . '/../..' . '/src/core/Directus/Services/InterfacesService.php',
+ 'Directus\\Services\\ItemsService' => __DIR__ . '/../..' . '/src/core/Directus/Services/ItemsService.php',
+ 'Directus\\Services\\ListingsService' => __DIR__ . '/../..' . '/src/core/Directus/Services/ListingsService.php',
+ 'Directus\\Services\\PagesService' => __DIR__ . '/../..' . '/src/core/Directus/Services/PagesService.php',
+ 'Directus\\Services\\PermissionsService' => __DIR__ . '/../..' . '/src/core/Directus/Services/PermissionsService.php',
+ 'Directus\\Services\\RelationsService' => __DIR__ . '/../..' . '/src/core/Directus/Services/RelationsService.php',
+ 'Directus\\Services\\RevisionsService' => __DIR__ . '/../..' . '/src/core/Directus/Services/RevisionsService.php',
+ 'Directus\\Services\\RolesService' => __DIR__ . '/../..' . '/src/core/Directus/Services/RolesService.php',
+ 'Directus\\Services\\ScimService' => __DIR__ . '/../..' . '/src/core/Directus/Services/ScimService.php',
+ 'Directus\\Services\\ServerService' => __DIR__ . '/../..' . '/src/core/Directus/Services/ServerService.php',
+ 'Directus\\Services\\SettingsService' => __DIR__ . '/../..' . '/src/core/Directus/Services/SettingsService.php',
+ 'Directus\\Services\\TablesService' => __DIR__ . '/../..' . '/src/core/Directus/Services/TablesService.php',
+ 'Directus\\Services\\UsersService' => __DIR__ . '/../..' . '/src/core/Directus/Services/UsersService.php',
+ 'Directus\\Services\\UtilsService' => __DIR__ . '/../..' . '/src/core/Directus/Services/UtilsService.php',
+ 'Directus\\Session\\Session' => __DIR__ . '/../..' . '/src/core/Directus/Session/Session.php',
+ 'Directus\\Session\\Storage\\ArraySessionStorage' => __DIR__ . '/../..' . '/src/core/Directus/Session/Storage/ArraySessionStorage.php',
+ 'Directus\\Session\\Storage\\NativeSessionStorage' => __DIR__ . '/../..' . '/src/core/Directus/Session/Storage/NativeSessionStorage.php',
+ 'Directus\\Session\\Storage\\SessionStorageInterface' => __DIR__ . '/../..' . '/src/core/Directus/Session/Storage/SessionStorageInterface.php',
+ 'Directus\\Slim\\Middleware' => __DIR__ . '/../..' . '/src/core/Directus/Application/Http/Middleware/Middleware.php',
+ 'Directus\\Util\\ArrayUtils' => __DIR__ . '/../..' . '/src/core/Directus/Util/ArrayUtils.php',
+ 'Directus\\Util\\DateTimeUtils' => __DIR__ . '/../..' . '/src/core/Directus/Util/DateTimeUtils.php',
+ 'Directus\\Util\\Formatting' => __DIR__ . '/../..' . '/src/core/Directus/Util/Formatting.php',
+ 'Directus\\Util\\Git' => __DIR__ . '/../..' . '/src/core/Directus/Util/Git.php',
+ 'Directus\\Util\\Installation\\InstallerUtils' => __DIR__ . '/../..' . '/src/core/Directus/Util/Installation/InstallerUtils.php',
+ 'Directus\\Util\\JWTUtils' => __DIR__ . '/../..' . '/src/core/Directus/Util/JWTUtils.php',
+ 'Directus\\Util\\SchemaUtils' => __DIR__ . '/../..' . '/src/core/Directus/Util/SchemaUtils.php',
+ 'Directus\\Util\\StringUtils' => __DIR__ . '/../..' . '/src/core/Directus/Util/StringUtils.php',
+ 'Directus\\Validator\\Constraints\\Required' => __DIR__ . '/../..' . '/src/core/Directus/Validator/Constraints/Required.php',
+ 'Directus\\Validator\\Constraints\\RequiredValidator' => __DIR__ . '/../..' . '/src/core/Directus/Validator/Constraints/RequiredValidator.php',
+ 'Directus\\Validator\\Exception\\InvalidRequestException' => __DIR__ . '/../..' . '/src/core/Directus/Validator/Exception/InvalidRequestException.php',
+ 'Directus\\Validator\\Exception\\UnknownConstraintException' => __DIR__ . '/../..' . '/src/core/Directus/Validator/Exception/UnknownConstraintException.php',
+ 'Directus\\Validator\\Validator' => __DIR__ . '/../..' . '/src/core/Directus/Validator/Validator.php',
+ 'Doctrine\\Common\\Cache\\ApcCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php',
+ 'Doctrine\\Common\\Cache\\ApcuCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ApcuCache.php',
+ 'Doctrine\\Common\\Cache\\ArrayCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php',
+ 'Doctrine\\Common\\Cache\\Cache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php',
+ 'Doctrine\\Common\\Cache\\CacheProvider' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php',
+ 'Doctrine\\Common\\Cache\\ChainCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php',
+ 'Doctrine\\Common\\Cache\\ClearableCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php',
+ 'Doctrine\\Common\\Cache\\CouchbaseCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php',
+ 'Doctrine\\Common\\Cache\\ExtMongoDBCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ExtMongoDBCache.php',
+ 'Doctrine\\Common\\Cache\\FileCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php',
+ 'Doctrine\\Common\\Cache\\FilesystemCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php',
+ 'Doctrine\\Common\\Cache\\FlushableCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php',
+ 'Doctrine\\Common\\Cache\\LegacyMongoDBCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/LegacyMongoDBCache.php',
+ 'Doctrine\\Common\\Cache\\MemcacheCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php',
+ 'Doctrine\\Common\\Cache\\MemcachedCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php',
+ 'Doctrine\\Common\\Cache\\MongoDBCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php',
+ 'Doctrine\\Common\\Cache\\MultiDeleteCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiDeleteCache.php',
+ 'Doctrine\\Common\\Cache\\MultiGetCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php',
+ 'Doctrine\\Common\\Cache\\MultiOperationCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiOperationCache.php',
+ 'Doctrine\\Common\\Cache\\MultiPutCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/MultiPutCache.php',
+ 'Doctrine\\Common\\Cache\\PhpFileCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php',
+ 'Doctrine\\Common\\Cache\\PredisCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php',
+ 'Doctrine\\Common\\Cache\\RedisCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php',
+ 'Doctrine\\Common\\Cache\\RiakCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php',
+ 'Doctrine\\Common\\Cache\\SQLite3Cache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php',
+ 'Doctrine\\Common\\Cache\\Version' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/Version.php',
+ 'Doctrine\\Common\\Cache\\VoidCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php',
+ 'Doctrine\\Common\\Cache\\WinCacheCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php',
+ 'Doctrine\\Common\\Cache\\XcacheCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php',
+ 'Doctrine\\Common\\Cache\\ZendDataCache' => __DIR__ . '/..' . '/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php',
+ 'Doctrine\\Instantiator\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php',
+ 'Doctrine\\Instantiator\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php',
+ 'Doctrine\\Instantiator\\Exception\\UnexpectedValueException' => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php',
+ 'Doctrine\\Instantiator\\Instantiator' => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php',
+ 'Doctrine\\Instantiator\\InstantiatorInterface' => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php',
+ 'FastRoute\\BadRouteException' => __DIR__ . '/..' . '/nikic/fast-route/src/BadRouteException.php',
+ 'FastRoute\\DataGenerator' => __DIR__ . '/..' . '/nikic/fast-route/src/DataGenerator.php',
+ 'FastRoute\\DataGenerator\\CharCountBased' => __DIR__ . '/..' . '/nikic/fast-route/src/DataGenerator/CharCountBased.php',
+ 'FastRoute\\DataGenerator\\GroupCountBased' => __DIR__ . '/..' . '/nikic/fast-route/src/DataGenerator/GroupCountBased.php',
+ 'FastRoute\\DataGenerator\\GroupPosBased' => __DIR__ . '/..' . '/nikic/fast-route/src/DataGenerator/GroupPosBased.php',
+ 'FastRoute\\DataGenerator\\MarkBased' => __DIR__ . '/..' . '/nikic/fast-route/src/DataGenerator/MarkBased.php',
+ 'FastRoute\\DataGenerator\\RegexBasedAbstract' => __DIR__ . '/..' . '/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php',
+ 'FastRoute\\Dispatcher' => __DIR__ . '/..' . '/nikic/fast-route/src/Dispatcher.php',
+ 'FastRoute\\Dispatcher\\CharCountBased' => __DIR__ . '/..' . '/nikic/fast-route/src/Dispatcher/CharCountBased.php',
+ 'FastRoute\\Dispatcher\\GroupCountBased' => __DIR__ . '/..' . '/nikic/fast-route/src/Dispatcher/GroupCountBased.php',
+ 'FastRoute\\Dispatcher\\GroupPosBased' => __DIR__ . '/..' . '/nikic/fast-route/src/Dispatcher/GroupPosBased.php',
+ 'FastRoute\\Dispatcher\\MarkBased' => __DIR__ . '/..' . '/nikic/fast-route/src/Dispatcher/MarkBased.php',
+ 'FastRoute\\Dispatcher\\RegexBasedAbstract' => __DIR__ . '/..' . '/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php',
+ 'FastRoute\\Route' => __DIR__ . '/..' . '/nikic/fast-route/src/Route.php',
+ 'FastRoute\\RouteCollector' => __DIR__ . '/..' . '/nikic/fast-route/src/RouteCollector.php',
+ 'FastRoute\\RouteParser' => __DIR__ . '/..' . '/nikic/fast-route/src/RouteParser.php',
+ 'FastRoute\\RouteParser\\Std' => __DIR__ . '/..' . '/nikic/fast-route/src/RouteParser/Std.php',
+ 'File_Iterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Iterator.php',
+ 'File_Iterator_Facade' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Facade.php',
+ 'File_Iterator_Factory' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Factory.php',
+ 'Firebase\\JWT\\BeforeValidException' => __DIR__ . '/..' . '/firebase/php-jwt/src/BeforeValidException.php',
+ 'Firebase\\JWT\\ExpiredException' => __DIR__ . '/..' . '/firebase/php-jwt/src/ExpiredException.php',
+ 'Firebase\\JWT\\JWT' => __DIR__ . '/..' . '/firebase/php-jwt/src/JWT.php',
+ 'Firebase\\JWT\\SignatureInvalidException' => __DIR__ . '/..' . '/firebase/php-jwt/src/SignatureInvalidException.php',
+ 'GuzzleHttp\\Client' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Client.php',
+ 'GuzzleHttp\\ClientInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/ClientInterface.php',
+ 'GuzzleHttp\\Cookie\\CookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/CookieJar.php',
+ 'GuzzleHttp\\Cookie\\CookieJarInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php',
+ 'GuzzleHttp\\Cookie\\FileCookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php',
+ 'GuzzleHttp\\Cookie\\SessionCookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php',
+ 'GuzzleHttp\\Cookie\\SetCookie' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/SetCookie.php',
+ 'GuzzleHttp\\Exception\\BadResponseException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/BadResponseException.php',
+ 'GuzzleHttp\\Exception\\ClientException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ClientException.php',
+ 'GuzzleHttp\\Exception\\ConnectException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ConnectException.php',
+ 'GuzzleHttp\\Exception\\GuzzleException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/GuzzleException.php',
+ 'GuzzleHttp\\Exception\\RequestException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/RequestException.php',
+ 'GuzzleHttp\\Exception\\SeekException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/SeekException.php',
+ 'GuzzleHttp\\Exception\\ServerException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ServerException.php',
+ 'GuzzleHttp\\Exception\\TooManyRedirectsException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php',
+ 'GuzzleHttp\\Exception\\TransferException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/TransferException.php',
+ 'GuzzleHttp\\HandlerStack' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/HandlerStack.php',
+ 'GuzzleHttp\\Handler\\CurlFactory' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlFactory.php',
+ 'GuzzleHttp\\Handler\\CurlFactoryInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php',
+ 'GuzzleHttp\\Handler\\CurlHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlHandler.php',
+ 'GuzzleHttp\\Handler\\CurlMultiHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php',
+ 'GuzzleHttp\\Handler\\EasyHandle' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/EasyHandle.php',
+ 'GuzzleHttp\\Handler\\MockHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/MockHandler.php',
+ 'GuzzleHttp\\Handler\\Proxy' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/Proxy.php',
+ 'GuzzleHttp\\Handler\\StreamHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php',
+ 'GuzzleHttp\\MessageFormatter' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/MessageFormatter.php',
+ 'GuzzleHttp\\Middleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Middleware.php',
+ 'GuzzleHttp\\Pool' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Pool.php',
+ 'GuzzleHttp\\PrepareBodyMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php',
+ 'GuzzleHttp\\Promise\\AggregateException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/AggregateException.php',
+ 'GuzzleHttp\\Promise\\CancellationException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/CancellationException.php',
+ 'GuzzleHttp\\Promise\\Coroutine' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Coroutine.php',
+ 'GuzzleHttp\\Promise\\EachPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/EachPromise.php',
+ 'GuzzleHttp\\Promise\\FulfilledPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/FulfilledPromise.php',
+ 'GuzzleHttp\\Promise\\Promise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Promise.php',
+ 'GuzzleHttp\\Promise\\PromiseInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/PromiseInterface.php',
+ 'GuzzleHttp\\Promise\\PromisorInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/PromisorInterface.php',
+ 'GuzzleHttp\\Promise\\RejectedPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/RejectedPromise.php',
+ 'GuzzleHttp\\Promise\\RejectionException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/RejectionException.php',
+ 'GuzzleHttp\\Promise\\TaskQueue' => __DIR__ . '/..' . '/guzzlehttp/promises/src/TaskQueue.php',
+ 'GuzzleHttp\\Promise\\TaskQueueInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/TaskQueueInterface.php',
+ 'GuzzleHttp\\Psr7\\AppendStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/AppendStream.php',
+ 'GuzzleHttp\\Psr7\\BufferStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/BufferStream.php',
+ 'GuzzleHttp\\Psr7\\CachingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/CachingStream.php',
+ 'GuzzleHttp\\Psr7\\DroppingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/DroppingStream.php',
+ 'GuzzleHttp\\Psr7\\FnStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/FnStream.php',
+ 'GuzzleHttp\\Psr7\\InflateStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/InflateStream.php',
+ 'GuzzleHttp\\Psr7\\LazyOpenStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/LazyOpenStream.php',
+ 'GuzzleHttp\\Psr7\\LimitStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/LimitStream.php',
+ 'GuzzleHttp\\Psr7\\MessageTrait' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MessageTrait.php',
+ 'GuzzleHttp\\Psr7\\MultipartStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MultipartStream.php',
+ 'GuzzleHttp\\Psr7\\NoSeekStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/NoSeekStream.php',
+ 'GuzzleHttp\\Psr7\\PumpStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/PumpStream.php',
+ 'GuzzleHttp\\Psr7\\Request' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Request.php',
+ 'GuzzleHttp\\Psr7\\Response' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Response.php',
+ 'GuzzleHttp\\Psr7\\ServerRequest' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/ServerRequest.php',
+ 'GuzzleHttp\\Psr7\\Stream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Stream.php',
+ 'GuzzleHttp\\Psr7\\StreamDecoratorTrait' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php',
+ 'GuzzleHttp\\Psr7\\StreamWrapper' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamWrapper.php',
+ 'GuzzleHttp\\Psr7\\UploadedFile' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UploadedFile.php',
+ 'GuzzleHttp\\Psr7\\Uri' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Uri.php',
+ 'GuzzleHttp\\Psr7\\UriNormalizer' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriNormalizer.php',
+ 'GuzzleHttp\\Psr7\\UriResolver' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriResolver.php',
+ 'GuzzleHttp\\RedirectMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RedirectMiddleware.php',
+ 'GuzzleHttp\\RequestOptions' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RequestOptions.php',
+ 'GuzzleHttp\\RetryMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RetryMiddleware.php',
+ 'GuzzleHttp\\TransferStats' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/TransferStats.php',
+ 'GuzzleHttp\\UriTemplate' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/UriTemplate.php',
+ 'Interop\\Container\\ContainerInterface' => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container/ContainerInterface.php',
+ 'Interop\\Container\\Exception\\ContainerException' => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php',
+ 'Interop\\Container\\Exception\\NotFoundException' => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php',
+ 'Intervention\\Image\\AbstractColor' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/AbstractColor.php',
+ 'Intervention\\Image\\AbstractDecoder' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/AbstractDecoder.php',
+ 'Intervention\\Image\\AbstractDriver' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/AbstractDriver.php',
+ 'Intervention\\Image\\AbstractEncoder' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/AbstractEncoder.php',
+ 'Intervention\\Image\\AbstractFont' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/AbstractFont.php',
+ 'Intervention\\Image\\AbstractShape' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/AbstractShape.php',
+ 'Intervention\\Image\\Commands\\AbstractCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Commands/AbstractCommand.php',
+ 'Intervention\\Image\\Commands\\Argument' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Commands/Argument.php',
+ 'Intervention\\Image\\Commands\\ChecksumCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Commands/ChecksumCommand.php',
+ 'Intervention\\Image\\Commands\\CircleCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Commands/CircleCommand.php',
+ 'Intervention\\Image\\Commands\\EllipseCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Commands/EllipseCommand.php',
+ 'Intervention\\Image\\Commands\\ExifCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Commands/ExifCommand.php',
+ 'Intervention\\Image\\Commands\\IptcCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Commands/IptcCommand.php',
+ 'Intervention\\Image\\Commands\\LineCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Commands/LineCommand.php',
+ 'Intervention\\Image\\Commands\\OrientateCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Commands/OrientateCommand.php',
+ 'Intervention\\Image\\Commands\\PolygonCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Commands/PolygonCommand.php',
+ 'Intervention\\Image\\Commands\\PsrResponseCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Commands/PsrResponseCommand.php',
+ 'Intervention\\Image\\Commands\\RectangleCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Commands/RectangleCommand.php',
+ 'Intervention\\Image\\Commands\\ResponseCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Commands/ResponseCommand.php',
+ 'Intervention\\Image\\Commands\\StreamCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Commands/StreamCommand.php',
+ 'Intervention\\Image\\Commands\\TextCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Commands/TextCommand.php',
+ 'Intervention\\Image\\Constraint' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Constraint.php',
+ 'Intervention\\Image\\Exception\\ImageException' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Exception/ImageException.php',
+ 'Intervention\\Image\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Exception/InvalidArgumentException.php',
+ 'Intervention\\Image\\Exception\\MissingDependencyException' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Exception/MissingDependencyException.php',
+ 'Intervention\\Image\\Exception\\NotFoundException' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Exception/NotFoundException.php',
+ 'Intervention\\Image\\Exception\\NotReadableException' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Exception/NotReadableException.php',
+ 'Intervention\\Image\\Exception\\NotSupportedException' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Exception/NotSupportedException.php',
+ 'Intervention\\Image\\Exception\\NotWritableException' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Exception/NotWritableException.php',
+ 'Intervention\\Image\\Exception\\RuntimeException' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Exception/RuntimeException.php',
+ 'Intervention\\Image\\Facades\\Image' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Facades/Image.php',
+ 'Intervention\\Image\\File' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/File.php',
+ 'Intervention\\Image\\Filters\\DemoFilter' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Filters/DemoFilter.php',
+ 'Intervention\\Image\\Filters\\FilterInterface' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Filters/FilterInterface.php',
+ 'Intervention\\Image\\Gd\\Color' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Color.php',
+ 'Intervention\\Image\\Gd\\Commands\\BackupCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/BackupCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\BlurCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/BlurCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\BrightnessCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/BrightnessCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\ColorizeCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/ColorizeCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\ContrastCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/ContrastCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\CropCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/CropCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\DestroyCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/DestroyCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\FillCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/FillCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\FitCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/FitCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\FlipCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/FlipCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\GammaCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/GammaCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\GetSizeCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/GetSizeCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\GreyscaleCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/GreyscaleCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\HeightenCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/HeightenCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\InsertCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/InsertCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\InterlaceCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/InterlaceCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\InvertCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/InvertCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\LimitColorsCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/LimitColorsCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\MaskCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/MaskCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\OpacityCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/OpacityCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\PickColorCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/PickColorCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\PixelCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/PixelCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\PixelateCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/PixelateCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\ResetCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/ResetCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\ResizeCanvasCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/ResizeCanvasCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\ResizeCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/ResizeCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\RotateCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/RotateCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\SharpenCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/SharpenCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\TrimCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/TrimCommand.php',
+ 'Intervention\\Image\\Gd\\Commands\\WidenCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Commands/WidenCommand.php',
+ 'Intervention\\Image\\Gd\\Decoder' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Decoder.php',
+ 'Intervention\\Image\\Gd\\Driver' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Driver.php',
+ 'Intervention\\Image\\Gd\\Encoder' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Encoder.php',
+ 'Intervention\\Image\\Gd\\Font' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Font.php',
+ 'Intervention\\Image\\Gd\\Shapes\\CircleShape' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Shapes/CircleShape.php',
+ 'Intervention\\Image\\Gd\\Shapes\\EllipseShape' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Shapes/EllipseShape.php',
+ 'Intervention\\Image\\Gd\\Shapes\\LineShape' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Shapes/LineShape.php',
+ 'Intervention\\Image\\Gd\\Shapes\\PolygonShape' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Shapes/PolygonShape.php',
+ 'Intervention\\Image\\Gd\\Shapes\\RectangleShape' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Gd/Shapes/RectangleShape.php',
+ 'Intervention\\Image\\Image' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Image.php',
+ 'Intervention\\Image\\ImageManager' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/ImageManager.php',
+ 'Intervention\\Image\\ImageManagerStatic' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/ImageManagerStatic.php',
+ 'Intervention\\Image\\ImageServiceProvider' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/ImageServiceProvider.php',
+ 'Intervention\\Image\\ImageServiceProviderLaravel4' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/ImageServiceProviderLaravel4.php',
+ 'Intervention\\Image\\ImageServiceProviderLaravel5' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/ImageServiceProviderLaravel5.php',
+ 'Intervention\\Image\\ImageServiceProviderLeague' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/ImageServiceProviderLeague.php',
+ 'Intervention\\Image\\ImageServiceProviderLumen' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/ImageServiceProviderLumen.php',
+ 'Intervention\\Image\\Imagick\\Color' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Color.php',
+ 'Intervention\\Image\\Imagick\\Commands\\BackupCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/BackupCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\BlurCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/BlurCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\BrightnessCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/BrightnessCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\ColorizeCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/ColorizeCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\ContrastCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/ContrastCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\CropCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/CropCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\DestroyCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/DestroyCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\ExifCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/ExifCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\FillCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/FillCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\FitCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/FitCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\FlipCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/FlipCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\GammaCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/GammaCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\GetSizeCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/GetSizeCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\GreyscaleCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/GreyscaleCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\HeightenCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/HeightenCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\InsertCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/InsertCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\InterlaceCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/InterlaceCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\InvertCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/InvertCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\LimitColorsCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/LimitColorsCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\MaskCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/MaskCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\OpacityCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/OpacityCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\PickColorCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/PickColorCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\PixelCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/PixelCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\PixelateCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/PixelateCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\ResetCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/ResetCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\ResizeCanvasCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/ResizeCanvasCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\ResizeCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/ResizeCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\RotateCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/RotateCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\SharpenCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/SharpenCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\TrimCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/TrimCommand.php',
+ 'Intervention\\Image\\Imagick\\Commands\\WidenCommand' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Commands/WidenCommand.php',
+ 'Intervention\\Image\\Imagick\\Decoder' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Decoder.php',
+ 'Intervention\\Image\\Imagick\\Driver' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Driver.php',
+ 'Intervention\\Image\\Imagick\\Encoder' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Encoder.php',
+ 'Intervention\\Image\\Imagick\\Font' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Font.php',
+ 'Intervention\\Image\\Imagick\\Shapes\\CircleShape' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Shapes/CircleShape.php',
+ 'Intervention\\Image\\Imagick\\Shapes\\EllipseShape' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Shapes/EllipseShape.php',
+ 'Intervention\\Image\\Imagick\\Shapes\\LineShape' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Shapes/LineShape.php',
+ 'Intervention\\Image\\Imagick\\Shapes\\PolygonShape' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Shapes/PolygonShape.php',
+ 'Intervention\\Image\\Imagick\\Shapes\\RectangleShape' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Imagick/Shapes/RectangleShape.php',
+ 'Intervention\\Image\\Point' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Point.php',
+ 'Intervention\\Image\\Response' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Response.php',
+ 'Intervention\\Image\\Size' => __DIR__ . '/..' . '/intervention/image/src/Intervention/Image/Size.php',
+ 'League\\Flysystem\\AdapterInterface' => __DIR__ . '/..' . '/league/flysystem/src/AdapterInterface.php',
+ 'League\\Flysystem\\Adapter\\AbstractAdapter' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/AbstractAdapter.php',
+ 'League\\Flysystem\\Adapter\\AbstractFtpAdapter' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/AbstractFtpAdapter.php',
+ 'League\\Flysystem\\Adapter\\CanOverwriteFiles' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/CanOverwriteFiles.php',
+ 'League\\Flysystem\\Adapter\\Ftp' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Ftp.php',
+ 'League\\Flysystem\\Adapter\\Ftpd' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Ftpd.php',
+ 'League\\Flysystem\\Adapter\\Local' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Local.php',
+ 'League\\Flysystem\\Adapter\\NullAdapter' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/NullAdapter.php',
+ 'League\\Flysystem\\Adapter\\Polyfill\\NotSupportingVisibilityTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php',
+ 'League\\Flysystem\\Adapter\\Polyfill\\StreamedCopyTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/StreamedCopyTrait.php',
+ 'League\\Flysystem\\Adapter\\Polyfill\\StreamedReadingTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php',
+ 'League\\Flysystem\\Adapter\\Polyfill\\StreamedTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php',
+ 'League\\Flysystem\\Adapter\\Polyfill\\StreamedWritingTrait' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/Polyfill/StreamedWritingTrait.php',
+ 'League\\Flysystem\\Adapter\\SynologyFtp' => __DIR__ . '/..' . '/league/flysystem/src/Adapter/SynologyFtp.php',
+ 'League\\Flysystem\\Config' => __DIR__ . '/..' . '/league/flysystem/src/Config.php',
+ 'League\\Flysystem\\ConfigAwareTrait' => __DIR__ . '/..' . '/league/flysystem/src/ConfigAwareTrait.php',
+ 'League\\Flysystem\\Directory' => __DIR__ . '/..' . '/league/flysystem/src/Directory.php',
+ 'League\\Flysystem\\Exception' => __DIR__ . '/..' . '/league/flysystem/src/Exception.php',
+ 'League\\Flysystem\\File' => __DIR__ . '/..' . '/league/flysystem/src/File.php',
+ 'League\\Flysystem\\FileExistsException' => __DIR__ . '/..' . '/league/flysystem/src/FileExistsException.php',
+ 'League\\Flysystem\\FileNotFoundException' => __DIR__ . '/..' . '/league/flysystem/src/FileNotFoundException.php',
+ 'League\\Flysystem\\Filesystem' => __DIR__ . '/..' . '/league/flysystem/src/Filesystem.php',
+ 'League\\Flysystem\\FilesystemInterface' => __DIR__ . '/..' . '/league/flysystem/src/FilesystemInterface.php',
+ 'League\\Flysystem\\FilesystemNotFoundException' => __DIR__ . '/..' . '/league/flysystem/src/FilesystemNotFoundException.php',
+ 'League\\Flysystem\\Handler' => __DIR__ . '/..' . '/league/flysystem/src/Handler.php',
+ 'League\\Flysystem\\MountManager' => __DIR__ . '/..' . '/league/flysystem/src/MountManager.php',
+ 'League\\Flysystem\\NotSupportedException' => __DIR__ . '/..' . '/league/flysystem/src/NotSupportedException.php',
+ 'League\\Flysystem\\PluginInterface' => __DIR__ . '/..' . '/league/flysystem/src/PluginInterface.php',
+ 'League\\Flysystem\\Plugin\\AbstractPlugin' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/AbstractPlugin.php',
+ 'League\\Flysystem\\Plugin\\EmptyDir' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/EmptyDir.php',
+ 'League\\Flysystem\\Plugin\\ForcedCopy' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ForcedCopy.php',
+ 'League\\Flysystem\\Plugin\\ForcedRename' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ForcedRename.php',
+ 'League\\Flysystem\\Plugin\\GetWithMetadata' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/GetWithMetadata.php',
+ 'League\\Flysystem\\Plugin\\ListFiles' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ListFiles.php',
+ 'League\\Flysystem\\Plugin\\ListPaths' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ListPaths.php',
+ 'League\\Flysystem\\Plugin\\ListWith' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/ListWith.php',
+ 'League\\Flysystem\\Plugin\\PluggableTrait' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/PluggableTrait.php',
+ 'League\\Flysystem\\Plugin\\PluginNotFoundException' => __DIR__ . '/..' . '/league/flysystem/src/Plugin/PluginNotFoundException.php',
+ 'League\\Flysystem\\ReadInterface' => __DIR__ . '/..' . '/league/flysystem/src/ReadInterface.php',
+ 'League\\Flysystem\\RootViolationException' => __DIR__ . '/..' . '/league/flysystem/src/RootViolationException.php',
+ 'League\\Flysystem\\SafeStorage' => __DIR__ . '/..' . '/league/flysystem/src/SafeStorage.php',
+ 'League\\Flysystem\\UnreadableFileException' => __DIR__ . '/..' . '/league/flysystem/src/UnreadableFileException.php',
+ 'League\\Flysystem\\Util' => __DIR__ . '/..' . '/league/flysystem/src/Util.php',
+ 'League\\Flysystem\\Util\\ContentListingFormatter' => __DIR__ . '/..' . '/league/flysystem/src/Util/ContentListingFormatter.php',
+ 'League\\Flysystem\\Util\\MimeType' => __DIR__ . '/..' . '/league/flysystem/src/Util/MimeType.php',
+ 'League\\Flysystem\\Util\\StreamHasher' => __DIR__ . '/..' . '/league/flysystem/src/Util/StreamHasher.php',
+ 'League\\OAuth1\\Client\\Credentials\\ClientCredentials' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Credentials/ClientCredentials.php',
+ 'League\\OAuth1\\Client\\Credentials\\ClientCredentialsInterface' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Credentials/ClientCredentialsInterface.php',
+ 'League\\OAuth1\\Client\\Credentials\\Credentials' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Credentials/Credentials.php',
+ 'League\\OAuth1\\Client\\Credentials\\CredentialsException' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Credentials/CredentialsException.php',
+ 'League\\OAuth1\\Client\\Credentials\\CredentialsInterface' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Credentials/CredentialsInterface.php',
+ 'League\\OAuth1\\Client\\Credentials\\TemporaryCredentials' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Credentials/TemporaryCredentials.php',
+ 'League\\OAuth1\\Client\\Credentials\\TokenCredentials' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Credentials/TokenCredentials.php',
+ 'League\\OAuth1\\Client\\Server\\Bitbucket' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Server/Bitbucket.php',
+ 'League\\OAuth1\\Client\\Server\\Magento' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Server/Magento.php',
+ 'League\\OAuth1\\Client\\Server\\Server' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Server/Server.php',
+ 'League\\OAuth1\\Client\\Server\\Trello' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Server/Trello.php',
+ 'League\\OAuth1\\Client\\Server\\Tumblr' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Server/Tumblr.php',
+ 'League\\OAuth1\\Client\\Server\\Twitter' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Server/Twitter.php',
+ 'League\\OAuth1\\Client\\Server\\User' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Server/User.php',
+ 'League\\OAuth1\\Client\\Server\\Uservoice' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Server/Uservoice.php',
+ 'League\\OAuth1\\Client\\Server\\Xing' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Server/Xing.php',
+ 'League\\OAuth1\\Client\\Signature\\HmacSha1Signature' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Signature/HmacSha1Signature.php',
+ 'League\\OAuth1\\Client\\Signature\\PlainTextSignature' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Signature/PlainTextSignature.php',
+ 'League\\OAuth1\\Client\\Signature\\Signature' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Signature/Signature.php',
+ 'League\\OAuth1\\Client\\Signature\\SignatureInterface' => __DIR__ . '/..' . '/league/oauth1-client/src/Client/Signature/SignatureInterface.php',
+ 'League\\OAuth2\\Client\\Exception\\HostedDomainException' => __DIR__ . '/..' . '/league/oauth2-google/src/Exception/HostedDomainException.php',
+ 'League\\OAuth2\\Client\\Grant\\AbstractGrant' => __DIR__ . '/..' . '/league/oauth2-client/src/Grant/AbstractGrant.php',
+ 'League\\OAuth2\\Client\\Grant\\AuthorizationCode' => __DIR__ . '/..' . '/league/oauth2-client/src/Grant/AuthorizationCode.php',
+ 'League\\OAuth2\\Client\\Grant\\ClientCredentials' => __DIR__ . '/..' . '/league/oauth2-client/src/Grant/ClientCredentials.php',
+ 'League\\OAuth2\\Client\\Grant\\Exception\\InvalidGrantException' => __DIR__ . '/..' . '/league/oauth2-client/src/Grant/Exception/InvalidGrantException.php',
+ 'League\\OAuth2\\Client\\Grant\\FbExchangeToken' => __DIR__ . '/..' . '/league/oauth2-facebook/src/Grant/FbExchangeToken.php',
+ 'League\\OAuth2\\Client\\Grant\\GrantFactory' => __DIR__ . '/..' . '/league/oauth2-client/src/Grant/GrantFactory.php',
+ 'League\\OAuth2\\Client\\Grant\\Password' => __DIR__ . '/..' . '/league/oauth2-client/src/Grant/Password.php',
+ 'League\\OAuth2\\Client\\Grant\\RefreshToken' => __DIR__ . '/..' . '/league/oauth2-client/src/Grant/RefreshToken.php',
+ 'League\\OAuth2\\Client\\Provider\\AbstractProvider' => __DIR__ . '/..' . '/league/oauth2-client/src/Provider/AbstractProvider.php',
+ 'League\\OAuth2\\Client\\Provider\\AppSecretProof' => __DIR__ . '/..' . '/league/oauth2-facebook/src/Provider/AppSecretProof.php',
+ 'League\\OAuth2\\Client\\Provider\\Exception\\FacebookProviderException' => __DIR__ . '/..' . '/league/oauth2-facebook/src/Provider/Exception/FacebookProviderException.php',
+ 'League\\OAuth2\\Client\\Provider\\Exception\\GithubIdentityProviderException' => __DIR__ . '/..' . '/league/oauth2-github/src/Provider/Exception/GithubIdentityProviderException.php',
+ 'League\\OAuth2\\Client\\Provider\\Exception\\IdentityProviderException' => __DIR__ . '/..' . '/league/oauth2-client/src/Provider/Exception/IdentityProviderException.php',
+ 'League\\OAuth2\\Client\\Provider\\Facebook' => __DIR__ . '/..' . '/league/oauth2-facebook/src/Provider/Facebook.php',
+ 'League\\OAuth2\\Client\\Provider\\FacebookUser' => __DIR__ . '/..' . '/league/oauth2-facebook/src/Provider/FacebookUser.php',
+ 'League\\OAuth2\\Client\\Provider\\GenericProvider' => __DIR__ . '/..' . '/league/oauth2-client/src/Provider/GenericProvider.php',
+ 'League\\OAuth2\\Client\\Provider\\GenericResourceOwner' => __DIR__ . '/..' . '/league/oauth2-client/src/Provider/GenericResourceOwner.php',
+ 'League\\OAuth2\\Client\\Provider\\Github' => __DIR__ . '/..' . '/league/oauth2-github/src/Provider/Github.php',
+ 'League\\OAuth2\\Client\\Provider\\GithubResourceOwner' => __DIR__ . '/..' . '/league/oauth2-github/src/Provider/GithubResourceOwner.php',
+ 'League\\OAuth2\\Client\\Provider\\Google' => __DIR__ . '/..' . '/league/oauth2-google/src/Provider/Google.php',
+ 'League\\OAuth2\\Client\\Provider\\GoogleUser' => __DIR__ . '/..' . '/league/oauth2-google/src/Provider/GoogleUser.php',
+ 'League\\OAuth2\\Client\\Provider\\ResourceOwnerInterface' => __DIR__ . '/..' . '/league/oauth2-client/src/Provider/ResourceOwnerInterface.php',
+ 'League\\OAuth2\\Client\\Token\\AccessToken' => __DIR__ . '/..' . '/league/oauth2-client/src/Token/AccessToken.php',
+ 'League\\OAuth2\\Client\\Tool\\ArrayAccessorTrait' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/ArrayAccessorTrait.php',
+ 'League\\OAuth2\\Client\\Tool\\BearerAuthorizationTrait' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php',
+ 'League\\OAuth2\\Client\\Tool\\MacAuthorizationTrait' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/MacAuthorizationTrait.php',
+ 'League\\OAuth2\\Client\\Tool\\ProviderRedirectTrait' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/ProviderRedirectTrait.php',
+ 'League\\OAuth2\\Client\\Tool\\QueryBuilderTrait' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/QueryBuilderTrait.php',
+ 'League\\OAuth2\\Client\\Tool\\RequestFactory' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/RequestFactory.php',
+ 'League\\OAuth2\\Client\\Tool\\RequiredParameterTrait' => __DIR__ . '/..' . '/league/oauth2-client/src/Tool/RequiredParameterTrait.php',
+ 'Monolog\\ErrorHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/ErrorHandler.php',
+ 'Monolog\\Formatter\\ChromePHPFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php',
+ 'Monolog\\Formatter\\ElasticaFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php',
+ 'Monolog\\Formatter\\FlowdockFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php',
+ 'Monolog\\Formatter\\FluentdFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php',
+ 'Monolog\\Formatter\\FormatterInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php',
+ 'Monolog\\Formatter\\GelfMessageFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php',
+ 'Monolog\\Formatter\\HtmlFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php',
+ 'Monolog\\Formatter\\JsonFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php',
+ 'Monolog\\Formatter\\LineFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LineFormatter.php',
+ 'Monolog\\Formatter\\LogglyFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php',
+ 'Monolog\\Formatter\\LogstashFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php',
+ 'Monolog\\Formatter\\MongoDBFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php',
+ 'Monolog\\Formatter\\NormalizerFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php',
+ 'Monolog\\Formatter\\ScalarFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php',
+ 'Monolog\\Formatter\\WildfireFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php',
+ 'Monolog\\Handler\\AbstractHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AbstractHandler.php',
+ 'Monolog\\Handler\\AbstractProcessingHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php',
+ 'Monolog\\Handler\\AbstractSyslogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php',
+ 'Monolog\\Handler\\AmqpHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AmqpHandler.php',
+ 'Monolog\\Handler\\BrowserConsoleHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php',
+ 'Monolog\\Handler\\BufferHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/BufferHandler.php',
+ 'Monolog\\Handler\\ChromePHPHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php',
+ 'Monolog\\Handler\\CouchDBHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php',
+ 'Monolog\\Handler\\CubeHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/CubeHandler.php',
+ 'Monolog\\Handler\\Curl\\Util' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/Curl/Util.php',
+ 'Monolog\\Handler\\DeduplicationHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php',
+ 'Monolog\\Handler\\DoctrineCouchDBHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php',
+ 'Monolog\\Handler\\DynamoDbHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php',
+ 'Monolog\\Handler\\ElasticSearchHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php',
+ 'Monolog\\Handler\\ErrorLogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php',
+ 'Monolog\\Handler\\FilterHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FilterHandler.php',
+ 'Monolog\\Handler\\FingersCrossedHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php',
+ 'Monolog\\Handler\\FingersCrossed\\ActivationStrategyInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php',
+ 'Monolog\\Handler\\FingersCrossed\\ChannelLevelActivationStrategy' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php',
+ 'Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php',
+ 'Monolog\\Handler\\FirePHPHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php',
+ 'Monolog\\Handler\\FleepHookHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php',
+ 'Monolog\\Handler\\FlowdockHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php',
+ 'Monolog\\Handler\\GelfHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/GelfHandler.php',
+ 'Monolog\\Handler\\GroupHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/GroupHandler.php',
+ 'Monolog\\Handler\\HandlerInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/HandlerInterface.php',
+ 'Monolog\\Handler\\HandlerWrapper' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php',
+ 'Monolog\\Handler\\HipChatHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/HipChatHandler.php',
+ 'Monolog\\Handler\\IFTTTHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php',
+ 'Monolog\\Handler\\LogEntriesHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php',
+ 'Monolog\\Handler\\LogglyHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/LogglyHandler.php',
+ 'Monolog\\Handler\\MailHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MailHandler.php',
+ 'Monolog\\Handler\\MandrillHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MandrillHandler.php',
+ 'Monolog\\Handler\\MissingExtensionException' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php',
+ 'Monolog\\Handler\\MongoDBHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php',
+ 'Monolog\\Handler\\NativeMailerHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php',
+ 'Monolog\\Handler\\NewRelicHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php',
+ 'Monolog\\Handler\\NullHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NullHandler.php',
+ 'Monolog\\Handler\\PHPConsoleHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php',
+ 'Monolog\\Handler\\PsrHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/PsrHandler.php',
+ 'Monolog\\Handler\\PushoverHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/PushoverHandler.php',
+ 'Monolog\\Handler\\RavenHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RavenHandler.php',
+ 'Monolog\\Handler\\RedisHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RedisHandler.php',
+ 'Monolog\\Handler\\RollbarHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RollbarHandler.php',
+ 'Monolog\\Handler\\RotatingFileHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php',
+ 'Monolog\\Handler\\SamplingHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SamplingHandler.php',
+ 'Monolog\\Handler\\SlackHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SlackHandler.php',
+ 'Monolog\\Handler\\SlackWebhookHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php',
+ 'Monolog\\Handler\\Slack\\SlackRecord' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php',
+ 'Monolog\\Handler\\SlackbotHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php',
+ 'Monolog\\Handler\\SocketHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SocketHandler.php',
+ 'Monolog\\Handler\\StreamHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/StreamHandler.php',
+ 'Monolog\\Handler\\SwiftMailerHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php',
+ 'Monolog\\Handler\\SyslogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogHandler.php',
+ 'Monolog\\Handler\\SyslogUdpHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php',
+ 'Monolog\\Handler\\SyslogUdp\\UdpSocket' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php',
+ 'Monolog\\Handler\\TestHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/TestHandler.php',
+ 'Monolog\\Handler\\WhatFailureGroupHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php',
+ 'Monolog\\Handler\\ZendMonitorHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php',
+ 'Monolog\\Logger' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Logger.php',
+ 'Monolog\\Processor\\GitProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/GitProcessor.php',
+ 'Monolog\\Processor\\IntrospectionProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php',
+ 'Monolog\\Processor\\MemoryPeakUsageProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php',
+ 'Monolog\\Processor\\MemoryProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php',
+ 'Monolog\\Processor\\MemoryUsageProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php',
+ 'Monolog\\Processor\\MercurialProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php',
+ 'Monolog\\Processor\\ProcessIdProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php',
+ 'Monolog\\Processor\\PsrLogMessageProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php',
+ 'Monolog\\Processor\\TagProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/TagProcessor.php',
+ 'Monolog\\Processor\\UidProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/UidProcessor.php',
+ 'Monolog\\Processor\\WebProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/WebProcessor.php',
+ 'Monolog\\Registry' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Registry.php',
+ 'PHPUnit\\Framework\\Assert' => __DIR__ . '/..' . '/phpunit/phpunit/src/ForwardCompatibility/Assert.php',
+ 'PHPUnit\\Framework\\AssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/ForwardCompatibility/AssertionFailedError.php',
+ 'PHPUnit\\Framework\\BaseTestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/ForwardCompatibility/BaseTestListener.php',
+ 'PHPUnit\\Framework\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/ForwardCompatibility/Test.php',
+ 'PHPUnit\\Framework\\TestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/ForwardCompatibility/TestCase.php',
+ 'PHPUnit\\Framework\\TestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/ForwardCompatibility/TestListener.php',
+ 'PHPUnit\\Framework\\TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/ForwardCompatibility/TestSuite.php',
+ 'PHPUnit_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Exception.php',
+ 'PHPUnit_Extensions_GroupTestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/GroupTestSuite.php',
+ 'PHPUnit_Extensions_PhptTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/PhptTestCase.php',
+ 'PHPUnit_Extensions_PhptTestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/PhptTestSuite.php',
+ 'PHPUnit_Extensions_RepeatedTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/RepeatedTest.php',
+ 'PHPUnit_Extensions_TestDecorator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/TestDecorator.php',
+ 'PHPUnit_Extensions_TicketListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/TicketListener.php',
+ 'PHPUnit_Framework_Assert' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert.php',
+ 'PHPUnit_Framework_AssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/AssertionFailedError.php',
+ 'PHPUnit_Framework_BaseTestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/BaseTestListener.php',
+ 'PHPUnit_Framework_CodeCoverageException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/CodeCoverageException.php',
+ 'PHPUnit_Framework_Constraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint.php',
+ 'PHPUnit_Framework_Constraint_And' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/And.php',
+ 'PHPUnit_Framework_Constraint_ArrayHasKey' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php',
+ 'PHPUnit_Framework_Constraint_ArraySubset' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php',
+ 'PHPUnit_Framework_Constraint_Attribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Attribute.php',
+ 'PHPUnit_Framework_Constraint_Callback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Callback.php',
+ 'PHPUnit_Framework_Constraint_ClassHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php',
+ 'PHPUnit_Framework_Constraint_ClassHasStaticAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php',
+ 'PHPUnit_Framework_Constraint_Composite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Composite.php',
+ 'PHPUnit_Framework_Constraint_Count' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Count.php',
+ 'PHPUnit_Framework_Constraint_DirectoryExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php',
+ 'PHPUnit_Framework_Constraint_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception.php',
+ 'PHPUnit_Framework_Constraint_ExceptionCode' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php',
+ 'PHPUnit_Framework_Constraint_ExceptionMessage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php',
+ 'PHPUnit_Framework_Constraint_ExceptionMessageRegExp' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegExp.php',
+ 'PHPUnit_Framework_Constraint_FileExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php',
+ 'PHPUnit_Framework_Constraint_GreaterThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php',
+ 'PHPUnit_Framework_Constraint_IsAnything' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php',
+ 'PHPUnit_Framework_Constraint_IsEmpty' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php',
+ 'PHPUnit_Framework_Constraint_IsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php',
+ 'PHPUnit_Framework_Constraint_IsFalse' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php',
+ 'PHPUnit_Framework_Constraint_IsFinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsFinite.php',
+ 'PHPUnit_Framework_Constraint_IsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php',
+ 'PHPUnit_Framework_Constraint_IsInfinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php',
+ 'PHPUnit_Framework_Constraint_IsInstanceOf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php',
+ 'PHPUnit_Framework_Constraint_IsJson' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php',
+ 'PHPUnit_Framework_Constraint_IsNan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsNan.php',
+ 'PHPUnit_Framework_Constraint_IsNull' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php',
+ 'PHPUnit_Framework_Constraint_IsReadable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsReadable.php',
+ 'PHPUnit_Framework_Constraint_IsTrue' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php',
+ 'PHPUnit_Framework_Constraint_IsType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsType.php',
+ 'PHPUnit_Framework_Constraint_IsWritable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsWritable.php',
+ 'PHPUnit_Framework_Constraint_JsonMatches' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php',
+ 'PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches/ErrorMessageProvider.php',
+ 'PHPUnit_Framework_Constraint_LessThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php',
+ 'PHPUnit_Framework_Constraint_Not' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Not.php',
+ 'PHPUnit_Framework_Constraint_ObjectHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php',
+ 'PHPUnit_Framework_Constraint_Or' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Or.php',
+ 'PHPUnit_Framework_Constraint_PCREMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/PCREMatch.php',
+ 'PHPUnit_Framework_Constraint_SameSize' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php',
+ 'PHPUnit_Framework_Constraint_StringContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php',
+ 'PHPUnit_Framework_Constraint_StringEndsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php',
+ 'PHPUnit_Framework_Constraint_StringMatches' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringMatches.php',
+ 'PHPUnit_Framework_Constraint_StringStartsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php',
+ 'PHPUnit_Framework_Constraint_TraversableContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php',
+ 'PHPUnit_Framework_Constraint_TraversableContainsOnly' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php',
+ 'PHPUnit_Framework_Constraint_Xor' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Xor.php',
+ 'PHPUnit_Framework_CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/CoveredCodeNotExecutedException.php',
+ 'PHPUnit_Framework_Error' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error.php',
+ 'PHPUnit_Framework_Error_Deprecated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Deprecated.php',
+ 'PHPUnit_Framework_Error_Notice' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Notice.php',
+ 'PHPUnit_Framework_Error_Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Warning.php',
+ 'PHPUnit_Framework_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception.php',
+ 'PHPUnit_Framework_ExceptionWrapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php',
+ 'PHPUnit_Framework_ExpectationFailedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExpectationFailedException.php',
+ 'PHPUnit_Framework_IncompleteTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTest.php',
+ 'PHPUnit_Framework_IncompleteTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php',
+ 'PHPUnit_Framework_IncompleteTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestError.php',
+ 'PHPUnit_Framework_InvalidCoversTargetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php',
+ 'PHPUnit_Framework_MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MissingCoversAnnotationException.php',
+ 'PHPUnit_Framework_MockObject_BadMethodCallException' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/BadMethodCallException.php',
+ 'PHPUnit_Framework_MockObject_Builder_Identity' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Identity.php',
+ 'PHPUnit_Framework_MockObject_Builder_InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/InvocationMocker.php',
+ 'PHPUnit_Framework_MockObject_Builder_Match' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Match.php',
+ 'PHPUnit_Framework_MockObject_Builder_MethodNameMatch' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/MethodNameMatch.php',
+ 'PHPUnit_Framework_MockObject_Builder_Namespace' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Namespace.php',
+ 'PHPUnit_Framework_MockObject_Builder_ParametersMatch' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/ParametersMatch.php',
+ 'PHPUnit_Framework_MockObject_Builder_Stub' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Stub.php',
+ 'PHPUnit_Framework_MockObject_Exception' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/Exception.php',
+ 'PHPUnit_Framework_MockObject_Generator' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator.php',
+ 'PHPUnit_Framework_MockObject_Invocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation.php',
+ 'PHPUnit_Framework_MockObject_InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/InvocationMocker.php',
+ 'PHPUnit_Framework_MockObject_Invocation_Object' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Object.php',
+ 'PHPUnit_Framework_MockObject_Invocation_Static' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Static.php',
+ 'PHPUnit_Framework_MockObject_Invokable' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invokable.php',
+ 'PHPUnit_Framework_MockObject_Matcher' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher.php',
+ 'PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyInvokedCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_AnyParameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyParameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/ConsecutiveParameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_Invocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Invocation.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtIndex.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastOnce.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtMostCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedRecorder' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedRecorder.php',
+ 'PHPUnit_Framework_MockObject_Matcher_MethodName' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/MethodName.php',
+ 'PHPUnit_Framework_MockObject_Matcher_Parameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Parameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_StatelessInvocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/StatelessInvocation.php',
+ 'PHPUnit_Framework_MockObject_MockBuilder' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockBuilder.php',
+ 'PHPUnit_Framework_MockObject_MockObject' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockObject.php',
+ 'PHPUnit_Framework_MockObject_RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/RuntimeException.php',
+ 'PHPUnit_Framework_MockObject_Stub' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub.php',
+ 'PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ConsecutiveCalls.php',
+ 'PHPUnit_Framework_MockObject_Stub_Exception' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Exception.php',
+ 'PHPUnit_Framework_MockObject_Stub_MatcherCollection' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/MatcherCollection.php',
+ 'PHPUnit_Framework_MockObject_Stub_Return' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Return.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnArgument' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnArgument.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnCallback' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnCallback.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnReference' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnReference.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnSelf' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnSelf.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnValueMap' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnValueMap.php',
+ 'PHPUnit_Framework_MockObject_Verifiable' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Verifiable.php',
+ 'PHPUnit_Framework_OutputError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/OutputError.php',
+ 'PHPUnit_Framework_RiskyTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/RiskyTest.php',
+ 'PHPUnit_Framework_RiskyTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/RiskyTestError.php',
+ 'PHPUnit_Framework_SelfDescribing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SelfDescribing.php',
+ 'PHPUnit_Framework_SkippedTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTest.php',
+ 'PHPUnit_Framework_SkippedTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestCase.php',
+ 'PHPUnit_Framework_SkippedTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestError.php',
+ 'PHPUnit_Framework_SkippedTestSuiteError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestSuiteError.php',
+ 'PHPUnit_Framework_SyntheticError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SyntheticError.php',
+ 'PHPUnit_Framework_Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Test.php',
+ 'PHPUnit_Framework_TestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestCase.php',
+ 'PHPUnit_Framework_TestFailure' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestFailure.php',
+ 'PHPUnit_Framework_TestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestListener.php',
+ 'PHPUnit_Framework_TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestResult.php',
+ 'PHPUnit_Framework_TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuite.php',
+ 'PHPUnit_Framework_TestSuite_DataProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuite/DataProvider.php',
+ 'PHPUnit_Framework_UnintentionallyCoveredCodeError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php',
+ 'PHPUnit_Framework_Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Warning.php',
+ 'PHPUnit_Framework_WarningTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/WarningTestCase.php',
+ 'PHPUnit_Runner_BaseTestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/BaseTestRunner.php',
+ 'PHPUnit_Runner_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception.php',
+ 'PHPUnit_Runner_Filter_Factory' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Factory.php',
+ 'PHPUnit_Runner_Filter_GroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Group.php',
+ 'PHPUnit_Runner_Filter_Group_Exclude' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Group/Exclude.php',
+ 'PHPUnit_Runner_Filter_Group_Include' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Group/Include.php',
+ 'PHPUnit_Runner_Filter_Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Test.php',
+ 'PHPUnit_Runner_StandardTestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php',
+ 'PHPUnit_Runner_TestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php',
+ 'PHPUnit_Runner_Version' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Version.php',
+ 'PHPUnit_TextUI_Command' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command.php',
+ 'PHPUnit_TextUI_ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/ResultPrinter.php',
+ 'PHPUnit_TextUI_TestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/TestRunner.php',
+ 'PHPUnit_Util_Blacklist' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Blacklist.php',
+ 'PHPUnit_Util_Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Configuration.php',
+ 'PHPUnit_Util_ConfigurationGenerator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php',
+ 'PHPUnit_Util_ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ErrorHandler.php',
+ 'PHPUnit_Util_Fileloader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Fileloader.php',
+ 'PHPUnit_Util_Filesystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filesystem.php',
+ 'PHPUnit_Util_Filter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filter.php',
+ 'PHPUnit_Util_Getopt' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Getopt.php',
+ 'PHPUnit_Util_GlobalState' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/GlobalState.php',
+ 'PHPUnit_Util_InvalidArgumentHelper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/InvalidArgumentHelper.php',
+ 'PHPUnit_Util_Log_JSON' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/JSON.php',
+ 'PHPUnit_Util_Log_JUnit' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/JUnit.php',
+ 'PHPUnit_Util_Log_TAP' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/TAP.php',
+ 'PHPUnit_Util_Log_TeamCity' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/TeamCity.php',
+ 'PHPUnit_Util_PHP' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP.php',
+ 'PHPUnit_Util_PHP_Default' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/Default.php',
+ 'PHPUnit_Util_PHP_Windows' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/Windows.php',
+ 'PHPUnit_Util_Printer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Printer.php',
+ 'PHPUnit_Util_Regex' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Regex.php',
+ 'PHPUnit_Util_String' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/String.php',
+ 'PHPUnit_Util_Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Test.php',
+ 'PHPUnit_Util_TestDox_NamePrettifier' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter_HTML' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/HTML.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter_Text' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/Text.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter_XML' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/XML.php',
+ 'PHPUnit_Util_TestSuiteIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestSuiteIterator.php',
+ 'PHPUnit_Util_Type' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Type.php',
+ 'PHPUnit_Util_XML' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XML.php',
+ 'PHP_Timer' => __DIR__ . '/..' . '/phpunit/php-timer/src/Timer.php',
+ 'PHP_Token' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_TokenWithScope' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_TokenWithScopeAndVisibility' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ABSTRACT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AMPERSAND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AND_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ARRAY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ARRAY_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ASYNC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AWAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BACKTICK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BAD_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOLEAN_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOLEAN_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOL_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BREAK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CALLABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CARET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CASE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CATCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS_NAME_CONSTANT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLONE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COALESCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMMA' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMPILER_HALT_OFFSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONCAT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONSTANT_ENCAPSED_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONTINUE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CURLY_OPEN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DEC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DEFAULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIV' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIV_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOC_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOLLAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_ARROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_QUOTES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELLIPSIS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELSE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELSEIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EMPTY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENCAPSED_AND_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDDECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDFOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDFOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDSWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDWHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_END_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENUM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EQUALS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EVAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXCLAMATION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXTENDS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FINAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FINALLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FUNC_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GLOBAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GOTO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_HALT_COMPILER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IMPLEMENTS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INCLUDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INCLUDE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INLINE_HTML' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INSTANCEOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INSTEADOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INTERFACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ISSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_GREATER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_NOT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_NOT_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_SMALLER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_Includes' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_JOIN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_ARROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_CP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_OP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LINE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LIST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_XOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_METHOD_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MINUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MINUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MOD_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MUL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NAMESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NEW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NS_SEPARATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NULLSAFE_OBJECT_OPERATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NUM_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OBJECT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OBJECT_OPERATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ONUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_TAG_WITH_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PERCENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PIPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PLUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PLUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_POW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_POW_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PRINT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PRIVATE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PROTECTED' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PUBLIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_QUESTION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_REQUIRE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_REQUIRE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_RETURN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SEMICOLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SHAPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SPACESHIP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_START_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STATIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING_VARNAME' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SUPER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_Stream' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream.php',
+ 'PHP_Token_Stream_CachingFactory' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php',
+ 'PHP_Token_THROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TILDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRAIT_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPELIST_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPELIST_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_UNSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_UNSET_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_USE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_USE_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_VAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_VARIABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHERE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_ATTRIBUTE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CATEGORY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CATEGORY_LABEL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CHILDREN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_LABEL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_REQUIRED' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TAG_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TAG_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TEXT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XOR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_YIELD' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_YIELD_FROM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'Phinx\\Config\\Config' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Config/Config.php',
+ 'Phinx\\Config\\ConfigInterface' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Config/ConfigInterface.php',
+ 'Phinx\\Config\\NamespaceAwareInterface' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Config/NamespaceAwareInterface.php',
+ 'Phinx\\Config\\NamespaceAwareTrait' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Config/NamespaceAwareTrait.php',
+ 'Phinx\\Console\\Command\\AbstractCommand' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Console/Command/AbstractCommand.php',
+ 'Phinx\\Console\\Command\\Breakpoint' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Console/Command/Breakpoint.php',
+ 'Phinx\\Console\\Command\\Create' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Console/Command/Create.php',
+ 'Phinx\\Console\\Command\\Init' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Console/Command/Init.php',
+ 'Phinx\\Console\\Command\\Migrate' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Console/Command/Migrate.php',
+ 'Phinx\\Console\\Command\\Rollback' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Console/Command/Rollback.php',
+ 'Phinx\\Console\\Command\\SeedCreate' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Console/Command/SeedCreate.php',
+ 'Phinx\\Console\\Command\\SeedRun' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Console/Command/SeedRun.php',
+ 'Phinx\\Console\\Command\\Status' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Console/Command/Status.php',
+ 'Phinx\\Console\\Command\\Test' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Console/Command/Test.php',
+ 'Phinx\\Console\\PhinxApplication' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Console/PhinxApplication.php',
+ 'Phinx\\Db\\Adapter\\AbstractAdapter' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Db/Adapter/AbstractAdapter.php',
+ 'Phinx\\Db\\Adapter\\AdapterFactory' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Db/Adapter/AdapterFactory.php',
+ 'Phinx\\Db\\Adapter\\AdapterInterface' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Db/Adapter/AdapterInterface.php',
+ 'Phinx\\Db\\Adapter\\AdapterWrapper' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Db/Adapter/AdapterWrapper.php',
+ 'Phinx\\Db\\Adapter\\MysqlAdapter' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Db/Adapter/MysqlAdapter.php',
+ 'Phinx\\Db\\Adapter\\PdoAdapter' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Db/Adapter/PdoAdapter.php',
+ 'Phinx\\Db\\Adapter\\PostgresAdapter' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Db/Adapter/PostgresAdapter.php',
+ 'Phinx\\Db\\Adapter\\ProxyAdapter' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Db/Adapter/ProxyAdapter.php',
+ 'Phinx\\Db\\Adapter\\SQLiteAdapter' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Db/Adapter/SQLiteAdapter.php',
+ 'Phinx\\Db\\Adapter\\SqlServerAdapter' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Db/Adapter/SqlServerAdapter.php',
+ 'Phinx\\Db\\Adapter\\TablePrefixAdapter' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Db/Adapter/TablePrefixAdapter.php',
+ 'Phinx\\Db\\Adapter\\TimedOutputAdapter' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Db/Adapter/TimedOutputAdapter.php',
+ 'Phinx\\Db\\Adapter\\WrapperInterface' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Db/Adapter/WrapperInterface.php',
+ 'Phinx\\Db\\Table' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Db/Table.php',
+ 'Phinx\\Db\\Table\\Column' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Db/Table/Column.php',
+ 'Phinx\\Db\\Table\\ForeignKey' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Db/Table/ForeignKey.php',
+ 'Phinx\\Db\\Table\\Index' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Db/Table/Index.php',
+ 'Phinx\\Migration\\AbstractMigration' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Migration/AbstractMigration.php',
+ 'Phinx\\Migration\\AbstractTemplateCreation' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Migration/AbstractTemplateCreation.php',
+ 'Phinx\\Migration\\CreationInterface' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Migration/CreationInterface.php',
+ 'Phinx\\Migration\\IrreversibleMigrationException' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Migration/IrreversibleMigrationException.php',
+ 'Phinx\\Migration\\Manager' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Migration/Manager.php',
+ 'Phinx\\Migration\\Manager\\Environment' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Migration/Manager/Environment.php',
+ 'Phinx\\Migration\\MigrationInterface' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Migration/MigrationInterface.php',
+ 'Phinx\\Seed\\AbstractSeed' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Seed/AbstractSeed.php',
+ 'Phinx\\Seed\\SeedInterface' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Seed/SeedInterface.php',
+ 'Phinx\\Util\\Util' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Util/Util.php',
+ 'Phinx\\Wrapper\\TextWrapper' => __DIR__ . '/..' . '/robmorgan/phinx/src/Phinx/Wrapper/TextWrapper.php',
+ 'Pimple\\Container' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Container.php',
+ 'Pimple\\Exception\\ExpectedInvokableException' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Exception/ExpectedInvokableException.php',
+ 'Pimple\\Exception\\FrozenServiceException' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php',
+ 'Pimple\\Exception\\InvalidServiceIdentifierException' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php',
+ 'Pimple\\Exception\\UnknownIdentifierException' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php',
+ 'Pimple\\Psr11\\Container' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Psr11/Container.php',
+ 'Pimple\\Psr11\\ServiceLocator' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php',
+ 'Pimple\\ServiceIterator' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/ServiceIterator.php',
+ 'Pimple\\ServiceProviderInterface' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/ServiceProviderInterface.php',
+ 'Pimple\\Tests\\Fixtures\\Invokable' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php',
+ 'Pimple\\Tests\\Fixtures\\NonInvokable' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php',
+ 'Pimple\\Tests\\Fixtures\\PimpleServiceProvider' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php',
+ 'Pimple\\Tests\\Fixtures\\Service' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php',
+ 'Pimple\\Tests\\PimpleServiceProviderInterfaceTest' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php',
+ 'Pimple\\Tests\\PimpleTest' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/PimpleTest.php',
+ 'Pimple\\Tests\\Psr11\\ContainerTest' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/Psr11/ContainerTest.php',
+ 'Pimple\\Tests\\Psr11\\ServiceLocatorTest' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/Psr11/ServiceLocatorTest.php',
+ 'Pimple\\Tests\\ServiceIteratorTest' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/ServiceIteratorTest.php',
+ 'Prophecy\\Argument' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument.php',
+ 'Prophecy\\Argument\\ArgumentsWildcard' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php',
+ 'Prophecy\\Argument\\Token\\AnyValueToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php',
+ 'Prophecy\\Argument\\Token\\AnyValuesToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php',
+ 'Prophecy\\Argument\\Token\\ApproximateValueToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php',
+ 'Prophecy\\Argument\\Token\\ArrayCountToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php',
+ 'Prophecy\\Argument\\Token\\ArrayEntryToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php',
+ 'Prophecy\\Argument\\Token\\ArrayEveryEntryToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php',
+ 'Prophecy\\Argument\\Token\\CallbackToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php',
+ 'Prophecy\\Argument\\Token\\ExactValueToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php',
+ 'Prophecy\\Argument\\Token\\IdenticalValueToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php',
+ 'Prophecy\\Argument\\Token\\LogicalAndToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php',
+ 'Prophecy\\Argument\\Token\\LogicalNotToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php',
+ 'Prophecy\\Argument\\Token\\ObjectStateToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php',
+ 'Prophecy\\Argument\\Token\\StringContainsToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php',
+ 'Prophecy\\Argument\\Token\\TokenInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php',
+ 'Prophecy\\Argument\\Token\\TypeToken' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php',
+ 'Prophecy\\Call\\Call' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Call/Call.php',
+ 'Prophecy\\Call\\CallCenter' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Call/CallCenter.php',
+ 'Prophecy\\Comparator\\ClosureComparator' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php',
+ 'Prophecy\\Comparator\\Factory' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Comparator/Factory.php',
+ 'Prophecy\\Comparator\\ProphecyComparator' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php',
+ 'Prophecy\\Doubler\\CachedDoubler' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php',
+ 'Prophecy\\Doubler\\ClassPatch\\ClassPatchInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php',
+ 'Prophecy\\Doubler\\ClassPatch\\DisableConstructorPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php',
+ 'Prophecy\\Doubler\\ClassPatch\\HhvmExceptionPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.php',
+ 'Prophecy\\Doubler\\ClassPatch\\KeywordPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php',
+ 'Prophecy\\Doubler\\ClassPatch\\MagicCallPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php',
+ 'Prophecy\\Doubler\\ClassPatch\\ProphecySubjectPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php',
+ 'Prophecy\\Doubler\\ClassPatch\\ReflectionClassNewInstancePatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php',
+ 'Prophecy\\Doubler\\ClassPatch\\SplFileInfoPatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php',
+ 'Prophecy\\Doubler\\ClassPatch\\TraversablePatch' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php',
+ 'Prophecy\\Doubler\\DoubleInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php',
+ 'Prophecy\\Doubler\\Doubler' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php',
+ 'Prophecy\\Doubler\\Generator\\ClassCodeGenerator' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php',
+ 'Prophecy\\Doubler\\Generator\\ClassCreator' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php',
+ 'Prophecy\\Doubler\\Generator\\ClassMirror' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php',
+ 'Prophecy\\Doubler\\Generator\\Node\\ArgumentNode' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php',
+ 'Prophecy\\Doubler\\Generator\\Node\\ClassNode' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php',
+ 'Prophecy\\Doubler\\Generator\\Node\\MethodNode' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php',
+ 'Prophecy\\Doubler\\Generator\\ReflectionInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php',
+ 'Prophecy\\Doubler\\Generator\\TypeHintReference' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php',
+ 'Prophecy\\Doubler\\LazyDouble' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php',
+ 'Prophecy\\Doubler\\NameGenerator' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php',
+ 'Prophecy\\Exception\\Call\\UnexpectedCallException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php',
+ 'Prophecy\\Exception\\Doubler\\ClassCreatorException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php',
+ 'Prophecy\\Exception\\Doubler\\ClassMirrorException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php',
+ 'Prophecy\\Exception\\Doubler\\ClassNotFoundException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php',
+ 'Prophecy\\Exception\\Doubler\\DoubleException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php',
+ 'Prophecy\\Exception\\Doubler\\DoublerException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php',
+ 'Prophecy\\Exception\\Doubler\\InterfaceNotFoundException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php',
+ 'Prophecy\\Exception\\Doubler\\MethodNotExtendableException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php',
+ 'Prophecy\\Exception\\Doubler\\MethodNotFoundException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php',
+ 'Prophecy\\Exception\\Doubler\\ReturnByReferenceException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php',
+ 'Prophecy\\Exception\\Exception' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Exception.php',
+ 'Prophecy\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php',
+ 'Prophecy\\Exception\\Prediction\\AggregateException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php',
+ 'Prophecy\\Exception\\Prediction\\FailedPredictionException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php',
+ 'Prophecy\\Exception\\Prediction\\NoCallsException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php',
+ 'Prophecy\\Exception\\Prediction\\PredictionException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php',
+ 'Prophecy\\Exception\\Prediction\\UnexpectedCallsCountException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php',
+ 'Prophecy\\Exception\\Prediction\\UnexpectedCallsException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php',
+ 'Prophecy\\Exception\\Prophecy\\MethodProphecyException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php',
+ 'Prophecy\\Exception\\Prophecy\\ObjectProphecyException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php',
+ 'Prophecy\\Exception\\Prophecy\\ProphecyException' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php',
+ 'Prophecy\\PhpDocumentor\\ClassAndInterfaceTagRetriever' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php',
+ 'Prophecy\\PhpDocumentor\\ClassTagRetriever' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php',
+ 'Prophecy\\PhpDocumentor\\LegacyClassTagRetriever' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php',
+ 'Prophecy\\PhpDocumentor\\MethodTagRetrieverInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php',
+ 'Prophecy\\Prediction\\CallPrediction' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php',
+ 'Prophecy\\Prediction\\CallTimesPrediction' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php',
+ 'Prophecy\\Prediction\\CallbackPrediction' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php',
+ 'Prophecy\\Prediction\\NoCallsPrediction' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php',
+ 'Prophecy\\Prediction\\PredictionInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php',
+ 'Prophecy\\Promise\\CallbackPromise' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php',
+ 'Prophecy\\Promise\\PromiseInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php',
+ 'Prophecy\\Promise\\ReturnArgumentPromise' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php',
+ 'Prophecy\\Promise\\ReturnPromise' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php',
+ 'Prophecy\\Promise\\ThrowPromise' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php',
+ 'Prophecy\\Prophecy\\MethodProphecy' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php',
+ 'Prophecy\\Prophecy\\ObjectProphecy' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php',
+ 'Prophecy\\Prophecy\\ProphecyInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php',
+ 'Prophecy\\Prophecy\\ProphecySubjectInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php',
+ 'Prophecy\\Prophecy\\Revealer' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php',
+ 'Prophecy\\Prophecy\\RevealerInterface' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php',
+ 'Prophecy\\Prophet' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Prophet.php',
+ 'Prophecy\\Util\\ExportUtil' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php',
+ 'Prophecy\\Util\\StringUtil' => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy/Util/StringUtil.php',
+ 'Psr\\Cache\\CacheException' => __DIR__ . '/..' . '/psr/cache/src/CacheException.php',
+ 'Psr\\Cache\\CacheItemInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemInterface.php',
+ 'Psr\\Cache\\CacheItemPoolInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemPoolInterface.php',
+ 'Psr\\Cache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/cache/src/InvalidArgumentException.php',
+ 'Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php',
+ 'Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php',
+ 'Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php',
+ 'Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php',
+ 'Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php',
+ 'Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php',
+ 'Psr\\Http\\Message\\ServerRequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/ServerRequestInterface.php',
+ 'Psr\\Http\\Message\\StreamInterface' => __DIR__ . '/..' . '/psr/http-message/src/StreamInterface.php',
+ 'Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php',
+ 'Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php',
+ 'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php',
+ 'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php',
+ 'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php',
+ 'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareInterface.php',
+ 'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareTrait.php',
+ 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php',
+ 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php',
+ 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php',
+ 'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
+ 'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
+ 'Psr\\SimpleCache\\CacheException' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheException.php',
+ 'Psr\\SimpleCache\\CacheInterface' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheInterface.php',
+ 'Psr\\SimpleCache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/simple-cache/src/InvalidArgumentException.php',
+ 'RKA\\Middleware\\IpAddress' => __DIR__ . '/..' . '/akrabat/rka-ip-address-middleware/src/IpAddress.php',
+ 'Ramsey\\Uuid\\BinaryUtils' => __DIR__ . '/..' . '/ramsey/uuid/src/BinaryUtils.php',
+ 'Ramsey\\Uuid\\Builder\\DefaultUuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/DefaultUuidBuilder.php',
+ 'Ramsey\\Uuid\\Builder\\DegradedUuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/DegradedUuidBuilder.php',
+ 'Ramsey\\Uuid\\Builder\\UuidBuilderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/UuidBuilderInterface.php',
+ 'Ramsey\\Uuid\\Codec\\CodecInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/CodecInterface.php',
+ 'Ramsey\\Uuid\\Codec\\GuidStringCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/GuidStringCodec.php',
+ 'Ramsey\\Uuid\\Codec\\OrderedTimeCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/OrderedTimeCodec.php',
+ 'Ramsey\\Uuid\\Codec\\StringCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/StringCodec.php',
+ 'Ramsey\\Uuid\\Codec\\TimestampFirstCombCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/TimestampFirstCombCodec.php',
+ 'Ramsey\\Uuid\\Codec\\TimestampLastCombCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/TimestampLastCombCodec.php',
+ 'Ramsey\\Uuid\\Converter\\NumberConverterInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/NumberConverterInterface.php',
+ 'Ramsey\\Uuid\\Converter\\Number\\BigNumberConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Number/BigNumberConverter.php',
+ 'Ramsey\\Uuid\\Converter\\Number\\DegradedNumberConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Number/DegradedNumberConverter.php',
+ 'Ramsey\\Uuid\\Converter\\TimeConverterInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/TimeConverterInterface.php',
+ 'Ramsey\\Uuid\\Converter\\Time\\BigNumberTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php',
+ 'Ramsey\\Uuid\\Converter\\Time\\DegradedTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.php',
+ 'Ramsey\\Uuid\\Converter\\Time\\PhpTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php',
+ 'Ramsey\\Uuid\\DegradedUuid' => __DIR__ . '/..' . '/ramsey/uuid/src/DegradedUuid.php',
+ 'Ramsey\\Uuid\\Exception\\InvalidUuidStringException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/InvalidUuidStringException.php',
+ 'Ramsey\\Uuid\\Exception\\UnsatisfiedDependencyException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/UnsatisfiedDependencyException.php',
+ 'Ramsey\\Uuid\\Exception\\UnsupportedOperationException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/UnsupportedOperationException.php',
+ 'Ramsey\\Uuid\\FeatureSet' => __DIR__ . '/..' . '/ramsey/uuid/src/FeatureSet.php',
+ 'Ramsey\\Uuid\\Generator\\CombGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/CombGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\DefaultTimeGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/DefaultTimeGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\MtRandGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/MtRandGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\OpenSslGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/OpenSslGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\PeclUuidRandomGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/PeclUuidRandomGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\PeclUuidTimeGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/PeclUuidTimeGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\RandomBytesGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomBytesGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\RandomGeneratorFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomGeneratorFactory.php',
+ 'Ramsey\\Uuid\\Generator\\RandomGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomGeneratorInterface.php',
+ 'Ramsey\\Uuid\\Generator\\RandomLibAdapter' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomLibAdapter.php',
+ 'Ramsey\\Uuid\\Generator\\SodiumRandomGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/SodiumRandomGenerator.php',
+ 'Ramsey\\Uuid\\Generator\\TimeGeneratorFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/TimeGeneratorFactory.php',
+ 'Ramsey\\Uuid\\Generator\\TimeGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/TimeGeneratorInterface.php',
+ 'Ramsey\\Uuid\\Provider\\NodeProviderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/NodeProviderInterface.php',
+ 'Ramsey\\Uuid\\Provider\\Node\\FallbackNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\Node\\RandomNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/RandomNodeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\Node\\SystemNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\TimeProviderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/TimeProviderInterface.php',
+ 'Ramsey\\Uuid\\Provider\\Time\\FixedTimeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php',
+ 'Ramsey\\Uuid\\Provider\\Time\\SystemTimeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Time/SystemTimeProvider.php',
+ 'Ramsey\\Uuid\\Uuid' => __DIR__ . '/..' . '/ramsey/uuid/src/Uuid.php',
+ 'Ramsey\\Uuid\\UuidFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/UuidFactory.php',
+ 'Ramsey\\Uuid\\UuidFactoryInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/UuidFactoryInterface.php',
+ 'Ramsey\\Uuid\\UuidInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/UuidInterface.php',
+ 'RateLimit\\AbstractRateLimiter' => __DIR__ . '/..' . '/wellingguzman/rate-limit/src/AbstractRateLimiter.php',
+ 'RateLimit\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/wellingguzman/rate-limit/src/Exception/ExceptionInterface.php',
+ 'RateLimit\\Exception\\RateLimitExceededException' => __DIR__ . '/..' . '/wellingguzman/rate-limit/src/Exception/RateLimitExceededException.php',
+ 'RateLimit\\InMemoryRateLimiter' => __DIR__ . '/..' . '/wellingguzman/rate-limit/src/InMemoryRateLimiter.php',
+ 'RateLimit\\Middleware\\Identity\\AbstractIdentityResolver' => __DIR__ . '/..' . '/wellingguzman/rate-limit/src/Middleware/Identity/AbstractIdentityResolver.php',
+ 'RateLimit\\Middleware\\Identity\\IdentityResolverInterface' => __DIR__ . '/..' . '/wellingguzman/rate-limit/src/Middleware/Identity/IdentityResolverInterface.php',
+ 'RateLimit\\Middleware\\Identity\\IpAddressIdentityResolver' => __DIR__ . '/..' . '/wellingguzman/rate-limit/src/Middleware/Identity/IpAddressIdentityResolver.php',
+ 'RateLimit\\Middleware\\Options' => __DIR__ . '/..' . '/wellingguzman/rate-limit/src/Middleware/Options.php',
+ 'RateLimit\\Middleware\\RateLimitMiddleware' => __DIR__ . '/..' . '/wellingguzman/rate-limit/src/Middleware/RateLimitMiddleware.php',
+ 'RateLimit\\RateLimiterFactory' => __DIR__ . '/..' . '/wellingguzman/rate-limit/src/RateLimiterFactory.php',
+ 'RateLimit\\RateLimiterInterface' => __DIR__ . '/..' . '/wellingguzman/rate-limit/src/RateLimiterInterface.php',
+ 'RateLimit\\RedisRateLimiter' => __DIR__ . '/..' . '/wellingguzman/rate-limit/src/RedisRateLimiter.php',
+ 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage.php',
+ 'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php',
+ 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Driver.php',
+ 'SebastianBergmann\\CodeCoverage\\Driver\\HHVM' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/HHVM.php',
+ 'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php',
+ 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Xdebug.php',
+ 'SebastianBergmann\\CodeCoverage\\Exception' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/Exception.php',
+ 'SebastianBergmann\\CodeCoverage\\Filter' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Filter.php',
+ 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php',
+ 'SebastianBergmann\\CodeCoverage\\MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/AbstractNode.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Builder.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Directory.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/File.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Iterator.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Clover.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Crap4j.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Facade.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/PHP.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Text' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Text.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/File.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Method.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Node.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Project.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Report.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php',
+ 'SebastianBergmann\\CodeCoverage\\RuntimeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/RuntimeException.php',
+ 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php',
+ 'SebastianBergmann\\CodeCoverage\\Util' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Util.php',
+ 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => __DIR__ . '/..' . '/sebastian/code-unit-reverse-lookup/src/Wizard.php',
+ 'SebastianBergmann\\Comparator\\ArrayComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ArrayComparator.php',
+ 'SebastianBergmann\\Comparator\\Comparator' => __DIR__ . '/..' . '/sebastian/comparator/src/Comparator.php',
+ 'SebastianBergmann\\Comparator\\ComparisonFailure' => __DIR__ . '/..' . '/sebastian/comparator/src/ComparisonFailure.php',
+ 'SebastianBergmann\\Comparator\\DOMNodeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DOMNodeComparator.php',
+ 'SebastianBergmann\\Comparator\\DateTimeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DateTimeComparator.php',
+ 'SebastianBergmann\\Comparator\\DoubleComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DoubleComparator.php',
+ 'SebastianBergmann\\Comparator\\ExceptionComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ExceptionComparator.php',
+ 'SebastianBergmann\\Comparator\\Factory' => __DIR__ . '/..' . '/sebastian/comparator/src/Factory.php',
+ 'SebastianBergmann\\Comparator\\MockObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/MockObjectComparator.php',
+ 'SebastianBergmann\\Comparator\\NumericComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/NumericComparator.php',
+ 'SebastianBergmann\\Comparator\\ObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ObjectComparator.php',
+ 'SebastianBergmann\\Comparator\\ResourceComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ResourceComparator.php',
+ 'SebastianBergmann\\Comparator\\ScalarComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ScalarComparator.php',
+ 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/SplObjectStorageComparator.php',
+ 'SebastianBergmann\\Comparator\\TypeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/TypeComparator.php',
+ 'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php',
+ 'SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php',
+ 'SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php',
+ 'SebastianBergmann\\Diff\\LCS\\LongestCommonSubsequence' => __DIR__ . '/..' . '/sebastian/diff/src/LCS/LongestCommonSubsequence.php',
+ 'SebastianBergmann\\Diff\\LCS\\MemoryEfficientImplementation' => __DIR__ . '/..' . '/sebastian/diff/src/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php',
+ 'SebastianBergmann\\Diff\\LCS\\TimeEfficientImplementation' => __DIR__ . '/..' . '/sebastian/diff/src/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php',
+ 'SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php',
+ 'SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php',
+ 'SebastianBergmann\\Environment\\Console' => __DIR__ . '/..' . '/sebastian/environment/src/Console.php',
+ 'SebastianBergmann\\Environment\\Runtime' => __DIR__ . '/..' . '/sebastian/environment/src/Runtime.php',
+ 'SebastianBergmann\\Exporter\\Exporter' => __DIR__ . '/..' . '/sebastian/exporter/src/Exporter.php',
+ 'SebastianBergmann\\GlobalState\\Blacklist' => __DIR__ . '/..' . '/sebastian/global-state/src/Blacklist.php',
+ 'SebastianBergmann\\GlobalState\\CodeExporter' => __DIR__ . '/..' . '/sebastian/global-state/src/CodeExporter.php',
+ 'SebastianBergmann\\GlobalState\\Exception' => __DIR__ . '/..' . '/sebastian/global-state/src/Exception.php',
+ 'SebastianBergmann\\GlobalState\\Restorer' => __DIR__ . '/..' . '/sebastian/global-state/src/Restorer.php',
+ 'SebastianBergmann\\GlobalState\\RuntimeException' => __DIR__ . '/..' . '/sebastian/global-state/src/RuntimeException.php',
+ 'SebastianBergmann\\GlobalState\\Snapshot' => __DIR__ . '/..' . '/sebastian/global-state/src/Snapshot.php',
+ 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Enumerator.php',
+ 'SebastianBergmann\\ObjectEnumerator\\Exception' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Exception.php',
+ 'SebastianBergmann\\ObjectEnumerator\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/InvalidArgumentException.php',
+ 'SebastianBergmann\\RecursionContext\\Context' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Context.php',
+ 'SebastianBergmann\\RecursionContext\\Exception' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Exception.php',
+ 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/recursion-context/src/InvalidArgumentException.php',
+ 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => __DIR__ . '/..' . '/sebastian/resource-operations/src/ResourceOperations.php',
+ 'SebastianBergmann\\Version' => __DIR__ . '/..' . '/sebastian/version/src/Version.php',
+ 'Slim\\App' => __DIR__ . '/..' . '/slim/slim/Slim/App.php',
+ 'Slim\\CallableResolver' => __DIR__ . '/..' . '/slim/slim/Slim/CallableResolver.php',
+ 'Slim\\CallableResolverAwareTrait' => __DIR__ . '/..' . '/slim/slim/Slim/CallableResolverAwareTrait.php',
+ 'Slim\\Collection' => __DIR__ . '/..' . '/slim/slim/Slim/Collection.php',
+ 'Slim\\Container' => __DIR__ . '/..' . '/slim/slim/Slim/Container.php',
+ 'Slim\\DefaultServicesProvider' => __DIR__ . '/..' . '/slim/slim/Slim/DefaultServicesProvider.php',
+ 'Slim\\DeferredCallable' => __DIR__ . '/..' . '/slim/slim/Slim/DeferredCallable.php',
+ 'Slim\\Exception\\ContainerException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/ContainerException.php',
+ 'Slim\\Exception\\ContainerValueNotFoundException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/ContainerValueNotFoundException.php',
+ 'Slim\\Exception\\InvalidMethodException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/InvalidMethodException.php',
+ 'Slim\\Exception\\MethodNotAllowedException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/MethodNotAllowedException.php',
+ 'Slim\\Exception\\NotFoundException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/NotFoundException.php',
+ 'Slim\\Exception\\SlimException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/SlimException.php',
+ 'Slim\\Handlers\\AbstractError' => __DIR__ . '/..' . '/slim/slim/Slim/Handlers/AbstractError.php',
+ 'Slim\\Handlers\\AbstractHandler' => __DIR__ . '/..' . '/slim/slim/Slim/Handlers/AbstractHandler.php',
+ 'Slim\\Handlers\\Error' => __DIR__ . '/..' . '/slim/slim/Slim/Handlers/Error.php',
+ 'Slim\\Handlers\\NotAllowed' => __DIR__ . '/..' . '/slim/slim/Slim/Handlers/NotAllowed.php',
+ 'Slim\\Handlers\\NotFound' => __DIR__ . '/..' . '/slim/slim/Slim/Handlers/NotFound.php',
+ 'Slim\\Handlers\\PhpError' => __DIR__ . '/..' . '/slim/slim/Slim/Handlers/PhpError.php',
+ 'Slim\\Handlers\\Strategies\\RequestResponse' => __DIR__ . '/..' . '/slim/slim/Slim/Handlers/Strategies/RequestResponse.php',
+ 'Slim\\Handlers\\Strategies\\RequestResponseArgs' => __DIR__ . '/..' . '/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php',
+ 'Slim\\Http\\Body' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Body.php',
+ 'Slim\\Http\\Cookies' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Cookies.php',
+ 'Slim\\Http\\Environment' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Environment.php',
+ 'Slim\\Http\\Headers' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Headers.php',
+ 'Slim\\Http\\Message' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Message.php',
+ 'Slim\\Http\\Request' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Request.php',
+ 'Slim\\Http\\RequestBody' => __DIR__ . '/..' . '/slim/slim/Slim/Http/RequestBody.php',
+ 'Slim\\Http\\Response' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Response.php',
+ 'Slim\\Http\\Stream' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Stream.php',
+ 'Slim\\Http\\UploadedFile' => __DIR__ . '/..' . '/slim/slim/Slim/Http/UploadedFile.php',
+ 'Slim\\Http\\Uri' => __DIR__ . '/..' . '/slim/slim/Slim/Http/Uri.php',
+ 'Slim\\Interfaces\\CallableResolverInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/CallableResolverInterface.php',
+ 'Slim\\Interfaces\\CollectionInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/CollectionInterface.php',
+ 'Slim\\Interfaces\\Http\\CookiesInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/Http/CookiesInterface.php',
+ 'Slim\\Interfaces\\Http\\EnvironmentInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php',
+ 'Slim\\Interfaces\\Http\\HeadersInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/Http/HeadersInterface.php',
+ 'Slim\\Interfaces\\InvocationStrategyInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php',
+ 'Slim\\Interfaces\\RouteGroupInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/RouteGroupInterface.php',
+ 'Slim\\Interfaces\\RouteInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/RouteInterface.php',
+ 'Slim\\Interfaces\\RouterInterface' => __DIR__ . '/..' . '/slim/slim/Slim/Interfaces/RouterInterface.php',
+ 'Slim\\MiddlewareAwareTrait' => __DIR__ . '/..' . '/slim/slim/Slim/MiddlewareAwareTrait.php',
+ 'Slim\\Routable' => __DIR__ . '/..' . '/slim/slim/Slim/Routable.php',
+ 'Slim\\Route' => __DIR__ . '/..' . '/slim/slim/Slim/Route.php',
+ 'Slim\\RouteGroup' => __DIR__ . '/..' . '/slim/slim/Slim/RouteGroup.php',
+ 'Slim\\Router' => __DIR__ . '/..' . '/slim/slim/Slim/Router.php',
+ 'Slim\\Views\\Twig' => __DIR__ . '/..' . '/slim/twig-view/src/Twig.php',
+ 'Slim\\Views\\TwigExtension' => __DIR__ . '/..' . '/slim/twig-view/src/TwigExtension.php',
+ 'Symfony\\Component\\Config\\ConfigCache' => __DIR__ . '/..' . '/symfony/config/ConfigCache.php',
+ 'Symfony\\Component\\Config\\ConfigCacheFactory' => __DIR__ . '/..' . '/symfony/config/ConfigCacheFactory.php',
+ 'Symfony\\Component\\Config\\ConfigCacheFactoryInterface' => __DIR__ . '/..' . '/symfony/config/ConfigCacheFactoryInterface.php',
+ 'Symfony\\Component\\Config\\ConfigCacheInterface' => __DIR__ . '/..' . '/symfony/config/ConfigCacheInterface.php',
+ 'Symfony\\Component\\Config\\Definition\\ArrayNode' => __DIR__ . '/..' . '/symfony/config/Definition/ArrayNode.php',
+ 'Symfony\\Component\\Config\\Definition\\BaseNode' => __DIR__ . '/..' . '/symfony/config/Definition/BaseNode.php',
+ 'Symfony\\Component\\Config\\Definition\\BooleanNode' => __DIR__ . '/..' . '/symfony/config/Definition/BooleanNode.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\ArrayNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ArrayNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\BooleanNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/BooleanNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\BuilderAwareInterface' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/BuilderAwareInterface.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\EnumNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/EnumNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\ExprBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ExprBuilder.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\FloatNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/FloatNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\IntegerNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/IntegerNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\MergeBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/MergeBuilder.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\NodeBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NodeBuilder.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\NodeParentInterface' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NodeParentInterface.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\NormalizationBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NormalizationBuilder.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\NumericNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NumericNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\ParentNodeDefinitionInterface' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ParentNodeDefinitionInterface.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\ScalarNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ScalarNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/TreeBuilder.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\ValidationBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ValidationBuilder.php',
+ 'Symfony\\Component\\Config\\Definition\\Builder\\VariableNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/VariableNodeDefinition.php',
+ 'Symfony\\Component\\Config\\Definition\\ConfigurationInterface' => __DIR__ . '/..' . '/symfony/config/Definition/ConfigurationInterface.php',
+ 'Symfony\\Component\\Config\\Definition\\Dumper\\XmlReferenceDumper' => __DIR__ . '/..' . '/symfony/config/Definition/Dumper/XmlReferenceDumper.php',
+ 'Symfony\\Component\\Config\\Definition\\Dumper\\YamlReferenceDumper' => __DIR__ . '/..' . '/symfony/config/Definition/Dumper/YamlReferenceDumper.php',
+ 'Symfony\\Component\\Config\\Definition\\EnumNode' => __DIR__ . '/..' . '/symfony/config/Definition/EnumNode.php',
+ 'Symfony\\Component\\Config\\Definition\\Exception\\DuplicateKeyException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/DuplicateKeyException.php',
+ 'Symfony\\Component\\Config\\Definition\\Exception\\Exception' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/Exception.php',
+ 'Symfony\\Component\\Config\\Definition\\Exception\\ForbiddenOverwriteException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/ForbiddenOverwriteException.php',
+ 'Symfony\\Component\\Config\\Definition\\Exception\\InvalidConfigurationException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/InvalidConfigurationException.php',
+ 'Symfony\\Component\\Config\\Definition\\Exception\\InvalidDefinitionException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/InvalidDefinitionException.php',
+ 'Symfony\\Component\\Config\\Definition\\Exception\\InvalidTypeException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/InvalidTypeException.php',
+ 'Symfony\\Component\\Config\\Definition\\Exception\\UnsetKeyException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/UnsetKeyException.php',
+ 'Symfony\\Component\\Config\\Definition\\FloatNode' => __DIR__ . '/..' . '/symfony/config/Definition/FloatNode.php',
+ 'Symfony\\Component\\Config\\Definition\\IntegerNode' => __DIR__ . '/..' . '/symfony/config/Definition/IntegerNode.php',
+ 'Symfony\\Component\\Config\\Definition\\NodeInterface' => __DIR__ . '/..' . '/symfony/config/Definition/NodeInterface.php',
+ 'Symfony\\Component\\Config\\Definition\\NumericNode' => __DIR__ . '/..' . '/symfony/config/Definition/NumericNode.php',
+ 'Symfony\\Component\\Config\\Definition\\Processor' => __DIR__ . '/..' . '/symfony/config/Definition/Processor.php',
+ 'Symfony\\Component\\Config\\Definition\\PrototypeNodeInterface' => __DIR__ . '/..' . '/symfony/config/Definition/PrototypeNodeInterface.php',
+ 'Symfony\\Component\\Config\\Definition\\PrototypedArrayNode' => __DIR__ . '/..' . '/symfony/config/Definition/PrototypedArrayNode.php',
+ 'Symfony\\Component\\Config\\Definition\\ScalarNode' => __DIR__ . '/..' . '/symfony/config/Definition/ScalarNode.php',
+ 'Symfony\\Component\\Config\\Definition\\VariableNode' => __DIR__ . '/..' . '/symfony/config/Definition/VariableNode.php',
+ 'Symfony\\Component\\Config\\Exception\\FileLoaderImportCircularReferenceException' => __DIR__ . '/..' . '/symfony/config/Exception/FileLoaderImportCircularReferenceException.php',
+ 'Symfony\\Component\\Config\\Exception\\FileLoaderLoadException' => __DIR__ . '/..' . '/symfony/config/Exception/FileLoaderLoadException.php',
+ 'Symfony\\Component\\Config\\Exception\\FileLocatorFileNotFoundException' => __DIR__ . '/..' . '/symfony/config/Exception/FileLocatorFileNotFoundException.php',
+ 'Symfony\\Component\\Config\\FileLocator' => __DIR__ . '/..' . '/symfony/config/FileLocator.php',
+ 'Symfony\\Component\\Config\\FileLocatorInterface' => __DIR__ . '/..' . '/symfony/config/FileLocatorInterface.php',
+ 'Symfony\\Component\\Config\\Loader\\DelegatingLoader' => __DIR__ . '/..' . '/symfony/config/Loader/DelegatingLoader.php',
+ 'Symfony\\Component\\Config\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/config/Loader/FileLoader.php',
+ 'Symfony\\Component\\Config\\Loader\\GlobFileLoader' => __DIR__ . '/..' . '/symfony/config/Loader/GlobFileLoader.php',
+ 'Symfony\\Component\\Config\\Loader\\Loader' => __DIR__ . '/..' . '/symfony/config/Loader/Loader.php',
+ 'Symfony\\Component\\Config\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/symfony/config/Loader/LoaderInterface.php',
+ 'Symfony\\Component\\Config\\Loader\\LoaderResolver' => __DIR__ . '/..' . '/symfony/config/Loader/LoaderResolver.php',
+ 'Symfony\\Component\\Config\\Loader\\LoaderResolverInterface' => __DIR__ . '/..' . '/symfony/config/Loader/LoaderResolverInterface.php',
+ 'Symfony\\Component\\Config\\ResourceCheckerConfigCache' => __DIR__ . '/..' . '/symfony/config/ResourceCheckerConfigCache.php',
+ 'Symfony\\Component\\Config\\ResourceCheckerConfigCacheFactory' => __DIR__ . '/..' . '/symfony/config/ResourceCheckerConfigCacheFactory.php',
+ 'Symfony\\Component\\Config\\ResourceCheckerInterface' => __DIR__ . '/..' . '/symfony/config/ResourceCheckerInterface.php',
+ 'Symfony\\Component\\Config\\Resource\\ClassExistenceResource' => __DIR__ . '/..' . '/symfony/config/Resource/ClassExistenceResource.php',
+ 'Symfony\\Component\\Config\\Resource\\ComposerResource' => __DIR__ . '/..' . '/symfony/config/Resource/ComposerResource.php',
+ 'Symfony\\Component\\Config\\Resource\\DirectoryResource' => __DIR__ . '/..' . '/symfony/config/Resource/DirectoryResource.php',
+ 'Symfony\\Component\\Config\\Resource\\FileExistenceResource' => __DIR__ . '/..' . '/symfony/config/Resource/FileExistenceResource.php',
+ 'Symfony\\Component\\Config\\Resource\\FileResource' => __DIR__ . '/..' . '/symfony/config/Resource/FileResource.php',
+ 'Symfony\\Component\\Config\\Resource\\GlobResource' => __DIR__ . '/..' . '/symfony/config/Resource/GlobResource.php',
+ 'Symfony\\Component\\Config\\Resource\\ReflectionClassResource' => __DIR__ . '/..' . '/symfony/config/Resource/ReflectionClassResource.php',
+ 'Symfony\\Component\\Config\\Resource\\ResourceInterface' => __DIR__ . '/..' . '/symfony/config/Resource/ResourceInterface.php',
+ 'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceChecker' => __DIR__ . '/..' . '/symfony/config/Resource/SelfCheckingResourceChecker.php',
+ 'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceInterface' => __DIR__ . '/..' . '/symfony/config/Resource/SelfCheckingResourceInterface.php',
+ 'Symfony\\Component\\Config\\Util\\Exception\\InvalidXmlException' => __DIR__ . '/..' . '/symfony/config/Util/Exception/InvalidXmlException.php',
+ 'Symfony\\Component\\Config\\Util\\Exception\\XmlParsingException' => __DIR__ . '/..' . '/symfony/config/Util/Exception/XmlParsingException.php',
+ 'Symfony\\Component\\Config\\Util\\XmlUtils' => __DIR__ . '/..' . '/symfony/config/Util/XmlUtils.php',
+ 'Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php',
+ 'Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => __DIR__ . '/..' . '/symfony/console/CommandLoader/CommandLoaderInterface.php',
+ 'Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/ContainerCommandLoader.php',
+ 'Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/FactoryCommandLoader.php',
+ 'Symfony\\Component\\Console\\Command\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php',
+ 'Symfony\\Component\\Console\\Command\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php',
+ 'Symfony\\Component\\Console\\Command\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php',
+ 'Symfony\\Component\\Console\\Command\\LockableTrait' => __DIR__ . '/..' . '/symfony/console/Command/LockableTrait.php',
+ 'Symfony\\Component\\Console\\ConsoleEvents' => __DIR__ . '/..' . '/symfony/console/ConsoleEvents.php',
+ 'Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => __DIR__ . '/..' . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php',
+ 'Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => __DIR__ . '/..' . '/symfony/console/Descriptor/ApplicationDescription.php',
+ 'Symfony\\Component\\Console\\Descriptor\\Descriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/Descriptor.php',
+ 'Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => __DIR__ . '/..' . '/symfony/console/Descriptor/DescriptorInterface.php',
+ 'Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/JsonDescriptor.php',
+ 'Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/MarkdownDescriptor.php',
+ 'Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/TextDescriptor.php',
+ 'Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/XmlDescriptor.php',
+ 'Symfony\\Component\\Console\\EventListener\\ErrorListener' => __DIR__ . '/..' . '/symfony/console/EventListener/ErrorListener.php',
+ 'Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleCommandEvent.php',
+ 'Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleErrorEvent.php',
+ 'Symfony\\Component\\Console\\Event\\ConsoleEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleEvent.php',
+ 'Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleTerminateEvent.php',
+ 'Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/CommandNotFoundException.php',
+ 'Symfony\\Component\\Console\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/console/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\Console\\Exception\\InvalidOptionException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidOptionException.php',
+ 'Symfony\\Component\\Console\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/console/Exception/LogicException.php',
+ 'Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/NamespaceNotFoundException.php',
+ 'Symfony\\Component\\Console\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/console/Exception/RuntimeException.php',
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatter.php',
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterInterface.php',
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyle.php',
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleInterface.php',
+ 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleStack.php',
+ 'Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DebugFormatterHelper.php',
+ 'Symfony\\Component\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DescriptorHelper.php',
+ 'Symfony\\Component\\Console\\Helper\\FormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/FormatterHelper.php',
+ 'Symfony\\Component\\Console\\Helper\\Helper' => __DIR__ . '/..' . '/symfony/console/Helper/Helper.php',
+ 'Symfony\\Component\\Console\\Helper\\HelperInterface' => __DIR__ . '/..' . '/symfony/console/Helper/HelperInterface.php',
+ 'Symfony\\Component\\Console\\Helper\\HelperSet' => __DIR__ . '/..' . '/symfony/console/Helper/HelperSet.php',
+ 'Symfony\\Component\\Console\\Helper\\InputAwareHelper' => __DIR__ . '/..' . '/symfony/console/Helper/InputAwareHelper.php',
+ 'Symfony\\Component\\Console\\Helper\\ProcessHelper' => __DIR__ . '/..' . '/symfony/console/Helper/ProcessHelper.php',
+ 'Symfony\\Component\\Console\\Helper\\ProgressBar' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressBar.php',
+ 'Symfony\\Component\\Console\\Helper\\ProgressIndicator' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressIndicator.php',
+ 'Symfony\\Component\\Console\\Helper\\QuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/QuestionHelper.php',
+ 'Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/SymfonyQuestionHelper.php',
+ 'Symfony\\Component\\Console\\Helper\\Table' => __DIR__ . '/..' . '/symfony/console/Helper/Table.php',
+ 'Symfony\\Component\\Console\\Helper\\TableCell' => __DIR__ . '/..' . '/symfony/console/Helper/TableCell.php',
+ 'Symfony\\Component\\Console\\Helper\\TableRows' => __DIR__ . '/..' . '/symfony/console/Helper/TableRows.php',
+ 'Symfony\\Component\\Console\\Helper\\TableSeparator' => __DIR__ . '/..' . '/symfony/console/Helper/TableSeparator.php',
+ 'Symfony\\Component\\Console\\Helper\\TableStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableStyle.php',
+ 'Symfony\\Component\\Console\\Input\\ArgvInput' => __DIR__ . '/..' . '/symfony/console/Input/ArgvInput.php',
+ 'Symfony\\Component\\Console\\Input\\ArrayInput' => __DIR__ . '/..' . '/symfony/console/Input/ArrayInput.php',
+ 'Symfony\\Component\\Console\\Input\\Input' => __DIR__ . '/..' . '/symfony/console/Input/Input.php',
+ 'Symfony\\Component\\Console\\Input\\InputArgument' => __DIR__ . '/..' . '/symfony/console/Input/InputArgument.php',
+ 'Symfony\\Component\\Console\\Input\\InputAwareInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputAwareInterface.php',
+ 'Symfony\\Component\\Console\\Input\\InputDefinition' => __DIR__ . '/..' . '/symfony/console/Input/InputDefinition.php',
+ 'Symfony\\Component\\Console\\Input\\InputInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputInterface.php',
+ 'Symfony\\Component\\Console\\Input\\InputOption' => __DIR__ . '/..' . '/symfony/console/Input/InputOption.php',
+ 'Symfony\\Component\\Console\\Input\\StreamableInputInterface' => __DIR__ . '/..' . '/symfony/console/Input/StreamableInputInterface.php',
+ 'Symfony\\Component\\Console\\Input\\StringInput' => __DIR__ . '/..' . '/symfony/console/Input/StringInput.php',
+ 'Symfony\\Component\\Console\\Logger\\ConsoleLogger' => __DIR__ . '/..' . '/symfony/console/Logger/ConsoleLogger.php',
+ 'Symfony\\Component\\Console\\Output\\BufferedOutput' => __DIR__ . '/..' . '/symfony/console/Output/BufferedOutput.php',
+ 'Symfony\\Component\\Console\\Output\\ConsoleOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutput.php',
+ 'Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutputInterface.php',
+ 'Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleSectionOutput.php',
+ 'Symfony\\Component\\Console\\Output\\NullOutput' => __DIR__ . '/..' . '/symfony/console/Output/NullOutput.php',
+ 'Symfony\\Component\\Console\\Output\\Output' => __DIR__ . '/..' . '/symfony/console/Output/Output.php',
+ 'Symfony\\Component\\Console\\Output\\OutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/OutputInterface.php',
+ 'Symfony\\Component\\Console\\Output\\StreamOutput' => __DIR__ . '/..' . '/symfony/console/Output/StreamOutput.php',
+ 'Symfony\\Component\\Console\\Question\\ChoiceQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ChoiceQuestion.php',
+ 'Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ConfirmationQuestion.php',
+ 'Symfony\\Component\\Console\\Question\\Question' => __DIR__ . '/..' . '/symfony/console/Question/Question.php',
+ 'Symfony\\Component\\Console\\Style\\OutputStyle' => __DIR__ . '/..' . '/symfony/console/Style/OutputStyle.php',
+ 'Symfony\\Component\\Console\\Style\\StyleInterface' => __DIR__ . '/..' . '/symfony/console/Style/StyleInterface.php',
+ 'Symfony\\Component\\Console\\Style\\SymfonyStyle' => __DIR__ . '/..' . '/symfony/console/Style/SymfonyStyle.php',
+ 'Symfony\\Component\\Console\\Terminal' => __DIR__ . '/..' . '/symfony/console/Terminal.php',
+ 'Symfony\\Component\\Console\\Tester\\ApplicationTester' => __DIR__ . '/..' . '/symfony/console/Tester/ApplicationTester.php',
+ 'Symfony\\Component\\Console\\Tester\\CommandTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandTester.php',
+ 'Symfony\\Component\\Console\\Tester\\TesterTrait' => __DIR__ . '/..' . '/symfony/console/Tester/TesterTrait.php',
+ 'Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/FileNotFoundException.php',
+ 'Symfony\\Component\\Filesystem\\Exception\\IOException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOException.php',
+ 'Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOExceptionInterface.php',
+ 'Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/symfony/filesystem/Filesystem.php',
+ 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/AbstractOperation.php',
+ 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/MergeOperation.php',
+ 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => __DIR__ . '/..' . '/symfony/translation/Catalogue/OperationInterface.php',
+ 'Symfony\\Component\\Translation\\Catalogue\\TargetOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/TargetOperation.php',
+ 'Symfony\\Component\\Translation\\Command\\XliffLintCommand' => __DIR__ . '/..' . '/symfony/translation/Command/XliffLintCommand.php',
+ 'Symfony\\Component\\Translation\\DataCollectorTranslator' => __DIR__ . '/..' . '/symfony/translation/DataCollectorTranslator.php',
+ 'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => __DIR__ . '/..' . '/symfony/translation/DataCollector/TranslationDataCollector.php',
+ 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationDumperPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslationDumperPass.php',
+ 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationExtractorPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslationExtractorPass.php',
+ 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslatorPass.php',
+ 'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/CsvFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\DumperInterface' => __DIR__ . '/..' . '/symfony/translation/Dumper/DumperInterface.php',
+ 'Symfony\\Component\\Translation\\Dumper\\FileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/FileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\IcuResFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/IcuResFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\IniFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/IniFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\JsonFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/JsonFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\MoFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/MoFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\PhpFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/PhpFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\PoFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/PoFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\QtFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/QtFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\XliffFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/XliffFileDumper.php',
+ 'Symfony\\Component\\Translation\\Dumper\\YamlFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/YamlFileDumper.php',
+ 'Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/translation/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Translation\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/translation/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => __DIR__ . '/..' . '/symfony/translation/Exception/InvalidResourceException.php',
+ 'Symfony\\Component\\Translation\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/translation/Exception/LogicException.php',
+ 'Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => __DIR__ . '/..' . '/symfony/translation/Exception/NotFoundResourceException.php',
+ 'Symfony\\Component\\Translation\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/translation/Exception/RuntimeException.php',
+ 'Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/AbstractFileExtractor.php',
+ 'Symfony\\Component\\Translation\\Extractor\\ChainExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/ChainExtractor.php',
+ 'Symfony\\Component\\Translation\\Extractor\\ExtractorInterface' => __DIR__ . '/..' . '/symfony/translation/Extractor/ExtractorInterface.php',
+ 'Symfony\\Component\\Translation\\Extractor\\PhpExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/PhpExtractor.php',
+ 'Symfony\\Component\\Translation\\Extractor\\PhpStringTokenParser' => __DIR__ . '/..' . '/symfony/translation/Extractor/PhpStringTokenParser.php',
+ 'Symfony\\Component\\Translation\\Formatter\\ChoiceMessageFormatterInterface' => __DIR__ . '/..' . '/symfony/translation/Formatter/ChoiceMessageFormatterInterface.php',
+ 'Symfony\\Component\\Translation\\Formatter\\MessageFormatter' => __DIR__ . '/..' . '/symfony/translation/Formatter/MessageFormatter.php',
+ 'Symfony\\Component\\Translation\\Formatter\\MessageFormatterInterface' => __DIR__ . '/..' . '/symfony/translation/Formatter/MessageFormatterInterface.php',
+ 'Symfony\\Component\\Translation\\IdentityTranslator' => __DIR__ . '/..' . '/symfony/translation/IdentityTranslator.php',
+ 'Symfony\\Component\\Translation\\Interval' => __DIR__ . '/..' . '/symfony/translation/Interval.php',
+ 'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/ArrayLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/CsvFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/FileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IcuDatFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IcuResFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IniFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\JsonFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/JsonFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/symfony/translation/Loader/LoaderInterface.php',
+ 'Symfony\\Component\\Translation\\Loader\\MoFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/MoFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\PhpFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/PhpFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\PoFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/PoFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/QtFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/XliffFileLoader.php',
+ 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/YamlFileLoader.php',
+ 'Symfony\\Component\\Translation\\LoggingTranslator' => __DIR__ . '/..' . '/symfony/translation/LoggingTranslator.php',
+ 'Symfony\\Component\\Translation\\MessageCatalogue' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogue.php',
+ 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogueInterface.php',
+ 'Symfony\\Component\\Translation\\MessageSelector' => __DIR__ . '/..' . '/symfony/translation/MessageSelector.php',
+ 'Symfony\\Component\\Translation\\MetadataAwareInterface' => __DIR__ . '/..' . '/symfony/translation/MetadataAwareInterface.php',
+ 'Symfony\\Component\\Translation\\PluralizationRules' => __DIR__ . '/..' . '/symfony/translation/PluralizationRules.php',
+ 'Symfony\\Component\\Translation\\Reader\\TranslationReader' => __DIR__ . '/..' . '/symfony/translation/Reader/TranslationReader.php',
+ 'Symfony\\Component\\Translation\\Reader\\TranslationReaderInterface' => __DIR__ . '/..' . '/symfony/translation/Reader/TranslationReaderInterface.php',
+ 'Symfony\\Component\\Translation\\Translator' => __DIR__ . '/..' . '/symfony/translation/Translator.php',
+ 'Symfony\\Component\\Translation\\TranslatorBagInterface' => __DIR__ . '/..' . '/symfony/translation/TranslatorBagInterface.php',
+ 'Symfony\\Component\\Translation\\TranslatorInterface' => __DIR__ . '/..' . '/symfony/translation/TranslatorInterface.php',
+ 'Symfony\\Component\\Translation\\Util\\ArrayConverter' => __DIR__ . '/..' . '/symfony/translation/Util/ArrayConverter.php',
+ 'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => __DIR__ . '/..' . '/symfony/translation/Writer/TranslationWriter.php',
+ 'Symfony\\Component\\Translation\\Writer\\TranslationWriterInterface' => __DIR__ . '/..' . '/symfony/translation/Writer/TranslationWriterInterface.php',
+ 'Symfony\\Component\\Validator\\Constraint' => __DIR__ . '/..' . '/symfony/validator/Constraint.php',
+ 'Symfony\\Component\\Validator\\ConstraintValidator' => __DIR__ . '/..' . '/symfony/validator/ConstraintValidator.php',
+ 'Symfony\\Component\\Validator\\ConstraintValidatorFactory' => __DIR__ . '/..' . '/symfony/validator/ConstraintValidatorFactory.php',
+ 'Symfony\\Component\\Validator\\ConstraintValidatorFactoryInterface' => __DIR__ . '/..' . '/symfony/validator/ConstraintValidatorFactoryInterface.php',
+ 'Symfony\\Component\\Validator\\ConstraintValidatorInterface' => __DIR__ . '/..' . '/symfony/validator/ConstraintValidatorInterface.php',
+ 'Symfony\\Component\\Validator\\ConstraintViolation' => __DIR__ . '/..' . '/symfony/validator/ConstraintViolation.php',
+ 'Symfony\\Component\\Validator\\ConstraintViolationInterface' => __DIR__ . '/..' . '/symfony/validator/ConstraintViolationInterface.php',
+ 'Symfony\\Component\\Validator\\ConstraintViolationList' => __DIR__ . '/..' . '/symfony/validator/ConstraintViolationList.php',
+ 'Symfony\\Component\\Validator\\ConstraintViolationListInterface' => __DIR__ . '/..' . '/symfony/validator/ConstraintViolationListInterface.php',
+ 'Symfony\\Component\\Validator\\Constraints\\AbstractComparison' => __DIR__ . '/..' . '/symfony/validator/Constraints/AbstractComparison.php',
+ 'Symfony\\Component\\Validator\\Constraints\\AbstractComparisonValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/AbstractComparisonValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\All' => __DIR__ . '/..' . '/symfony/validator/Constraints/All.php',
+ 'Symfony\\Component\\Validator\\Constraints\\AllValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/AllValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Bic' => __DIR__ . '/..' . '/symfony/validator/Constraints/Bic.php',
+ 'Symfony\\Component\\Validator\\Constraints\\BicValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/BicValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Blank' => __DIR__ . '/..' . '/symfony/validator/Constraints/Blank.php',
+ 'Symfony\\Component\\Validator\\Constraints\\BlankValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/BlankValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Callback' => __DIR__ . '/..' . '/symfony/validator/Constraints/Callback.php',
+ 'Symfony\\Component\\Validator\\Constraints\\CallbackValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CallbackValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\CardScheme' => __DIR__ . '/..' . '/symfony/validator/Constraints/CardScheme.php',
+ 'Symfony\\Component\\Validator\\Constraints\\CardSchemeValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CardSchemeValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Choice' => __DIR__ . '/..' . '/symfony/validator/Constraints/Choice.php',
+ 'Symfony\\Component\\Validator\\Constraints\\ChoiceValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/ChoiceValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Collection' => __DIR__ . '/..' . '/symfony/validator/Constraints/Collection.php',
+ 'Symfony\\Component\\Validator\\Constraints\\CollectionValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CollectionValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Composite' => __DIR__ . '/..' . '/symfony/validator/Constraints/Composite.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Count' => __DIR__ . '/..' . '/symfony/validator/Constraints/Count.php',
+ 'Symfony\\Component\\Validator\\Constraints\\CountValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CountValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Country' => __DIR__ . '/..' . '/symfony/validator/Constraints/Country.php',
+ 'Symfony\\Component\\Validator\\Constraints\\CountryValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CountryValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Currency' => __DIR__ . '/..' . '/symfony/validator/Constraints/Currency.php',
+ 'Symfony\\Component\\Validator\\Constraints\\CurrencyValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/CurrencyValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Date' => __DIR__ . '/..' . '/symfony/validator/Constraints/Date.php',
+ 'Symfony\\Component\\Validator\\Constraints\\DateTime' => __DIR__ . '/..' . '/symfony/validator/Constraints/DateTime.php',
+ 'Symfony\\Component\\Validator\\Constraints\\DateTimeValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/DateTimeValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\DateValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/DateValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Email' => __DIR__ . '/..' . '/symfony/validator/Constraints/Email.php',
+ 'Symfony\\Component\\Validator\\Constraints\\EmailValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/EmailValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\EqualTo' => __DIR__ . '/..' . '/symfony/validator/Constraints/EqualTo.php',
+ 'Symfony\\Component\\Validator\\Constraints\\EqualToValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/EqualToValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Existence' => __DIR__ . '/..' . '/symfony/validator/Constraints/Existence.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Expression' => __DIR__ . '/..' . '/symfony/validator/Constraints/Expression.php',
+ 'Symfony\\Component\\Validator\\Constraints\\ExpressionValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/ExpressionValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\File' => __DIR__ . '/..' . '/symfony/validator/Constraints/File.php',
+ 'Symfony\\Component\\Validator\\Constraints\\FileValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/FileValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\GreaterThan' => __DIR__ . '/..' . '/symfony/validator/Constraints/GreaterThan.php',
+ 'Symfony\\Component\\Validator\\Constraints\\GreaterThanOrEqual' => __DIR__ . '/..' . '/symfony/validator/Constraints/GreaterThanOrEqual.php',
+ 'Symfony\\Component\\Validator\\Constraints\\GreaterThanOrEqualValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/GreaterThanOrEqualValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\GreaterThanValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/GreaterThanValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\GroupSequence' => __DIR__ . '/..' . '/symfony/validator/Constraints/GroupSequence.php',
+ 'Symfony\\Component\\Validator\\Constraints\\GroupSequenceProvider' => __DIR__ . '/..' . '/symfony/validator/Constraints/GroupSequenceProvider.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Iban' => __DIR__ . '/..' . '/symfony/validator/Constraints/Iban.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IbanValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IbanValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IdenticalTo' => __DIR__ . '/..' . '/symfony/validator/Constraints/IdenticalTo.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IdenticalToValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IdenticalToValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Image' => __DIR__ . '/..' . '/symfony/validator/Constraints/Image.php',
+ 'Symfony\\Component\\Validator\\Constraints\\ImageValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/ImageValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Ip' => __DIR__ . '/..' . '/symfony/validator/Constraints/Ip.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IpValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IpValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IsFalse' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsFalse.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IsFalseValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsFalseValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IsNull' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsNull.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IsNullValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsNullValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IsTrue' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsTrue.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IsTrueValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsTrueValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Isbn' => __DIR__ . '/..' . '/symfony/validator/Constraints/Isbn.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IsbnValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IsbnValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Issn' => __DIR__ . '/..' . '/symfony/validator/Constraints/Issn.php',
+ 'Symfony\\Component\\Validator\\Constraints\\IssnValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/IssnValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Language' => __DIR__ . '/..' . '/symfony/validator/Constraints/Language.php',
+ 'Symfony\\Component\\Validator\\Constraints\\LanguageValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LanguageValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Length' => __DIR__ . '/..' . '/symfony/validator/Constraints/Length.php',
+ 'Symfony\\Component\\Validator\\Constraints\\LengthValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LengthValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\LessThan' => __DIR__ . '/..' . '/symfony/validator/Constraints/LessThan.php',
+ 'Symfony\\Component\\Validator\\Constraints\\LessThanOrEqual' => __DIR__ . '/..' . '/symfony/validator/Constraints/LessThanOrEqual.php',
+ 'Symfony\\Component\\Validator\\Constraints\\LessThanOrEqualValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LessThanOrEqualValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\LessThanValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LessThanValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Locale' => __DIR__ . '/..' . '/symfony/validator/Constraints/Locale.php',
+ 'Symfony\\Component\\Validator\\Constraints\\LocaleValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LocaleValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Luhn' => __DIR__ . '/..' . '/symfony/validator/Constraints/Luhn.php',
+ 'Symfony\\Component\\Validator\\Constraints\\LuhnValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/LuhnValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\NotBlank' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotBlank.php',
+ 'Symfony\\Component\\Validator\\Constraints\\NotBlankValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotBlankValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\NotEqualTo' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotEqualTo.php',
+ 'Symfony\\Component\\Validator\\Constraints\\NotEqualToValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotEqualToValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\NotIdenticalTo' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotIdenticalTo.php',
+ 'Symfony\\Component\\Validator\\Constraints\\NotIdenticalToValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotIdenticalToValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\NotNull' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotNull.php',
+ 'Symfony\\Component\\Validator\\Constraints\\NotNullValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/NotNullValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Optional' => __DIR__ . '/..' . '/symfony/validator/Constraints/Optional.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Range' => __DIR__ . '/..' . '/symfony/validator/Constraints/Range.php',
+ 'Symfony\\Component\\Validator\\Constraints\\RangeValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/RangeValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Regex' => __DIR__ . '/..' . '/symfony/validator/Constraints/Regex.php',
+ 'Symfony\\Component\\Validator\\Constraints\\RegexValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/RegexValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Required' => __DIR__ . '/..' . '/symfony/validator/Constraints/Required.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Time' => __DIR__ . '/..' . '/symfony/validator/Constraints/Time.php',
+ 'Symfony\\Component\\Validator\\Constraints\\TimeValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/TimeValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Traverse' => __DIR__ . '/..' . '/symfony/validator/Constraints/Traverse.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Type' => __DIR__ . '/..' . '/symfony/validator/Constraints/Type.php',
+ 'Symfony\\Component\\Validator\\Constraints\\TypeValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/TypeValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Url' => __DIR__ . '/..' . '/symfony/validator/Constraints/Url.php',
+ 'Symfony\\Component\\Validator\\Constraints\\UrlValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/UrlValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Uuid' => __DIR__ . '/..' . '/symfony/validator/Constraints/Uuid.php',
+ 'Symfony\\Component\\Validator\\Constraints\\UuidValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/UuidValidator.php',
+ 'Symfony\\Component\\Validator\\Constraints\\Valid' => __DIR__ . '/..' . '/symfony/validator/Constraints/Valid.php',
+ 'Symfony\\Component\\Validator\\Constraints\\ValidValidator' => __DIR__ . '/..' . '/symfony/validator/Constraints/ValidValidator.php',
+ 'Symfony\\Component\\Validator\\ContainerConstraintValidatorFactory' => __DIR__ . '/..' . '/symfony/validator/ContainerConstraintValidatorFactory.php',
+ 'Symfony\\Component\\Validator\\Context\\ExecutionContext' => __DIR__ . '/..' . '/symfony/validator/Context/ExecutionContext.php',
+ 'Symfony\\Component\\Validator\\Context\\ExecutionContextFactory' => __DIR__ . '/..' . '/symfony/validator/Context/ExecutionContextFactory.php',
+ 'Symfony\\Component\\Validator\\Context\\ExecutionContextFactoryInterface' => __DIR__ . '/..' . '/symfony/validator/Context/ExecutionContextFactoryInterface.php',
+ 'Symfony\\Component\\Validator\\Context\\ExecutionContextInterface' => __DIR__ . '/..' . '/symfony/validator/Context/ExecutionContextInterface.php',
+ 'Symfony\\Component\\Validator\\DataCollector\\ValidatorDataCollector' => __DIR__ . '/..' . '/symfony/validator/DataCollector/ValidatorDataCollector.php',
+ 'Symfony\\Component\\Validator\\DependencyInjection\\AddConstraintValidatorsPass' => __DIR__ . '/..' . '/symfony/validator/DependencyInjection/AddConstraintValidatorsPass.php',
+ 'Symfony\\Component\\Validator\\DependencyInjection\\AddValidatorInitializersPass' => __DIR__ . '/..' . '/symfony/validator/DependencyInjection/AddValidatorInitializersPass.php',
+ 'Symfony\\Component\\Validator\\Exception\\BadMethodCallException' => __DIR__ . '/..' . '/symfony/validator/Exception/BadMethodCallException.php',
+ 'Symfony\\Component\\Validator\\Exception\\ConstraintDefinitionException' => __DIR__ . '/..' . '/symfony/validator/Exception/ConstraintDefinitionException.php',
+ 'Symfony\\Component\\Validator\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/validator/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Validator\\Exception\\GroupDefinitionException' => __DIR__ . '/..' . '/symfony/validator/Exception/GroupDefinitionException.php',
+ 'Symfony\\Component\\Validator\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/validator/Exception/InvalidArgumentException.php',
+ 'Symfony\\Component\\Validator\\Exception\\InvalidOptionsException' => __DIR__ . '/..' . '/symfony/validator/Exception/InvalidOptionsException.php',
+ 'Symfony\\Component\\Validator\\Exception\\MappingException' => __DIR__ . '/..' . '/symfony/validator/Exception/MappingException.php',
+ 'Symfony\\Component\\Validator\\Exception\\MissingOptionsException' => __DIR__ . '/..' . '/symfony/validator/Exception/MissingOptionsException.php',
+ 'Symfony\\Component\\Validator\\Exception\\NoSuchMetadataException' => __DIR__ . '/..' . '/symfony/validator/Exception/NoSuchMetadataException.php',
+ 'Symfony\\Component\\Validator\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/symfony/validator/Exception/OutOfBoundsException.php',
+ 'Symfony\\Component\\Validator\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/validator/Exception/RuntimeException.php',
+ 'Symfony\\Component\\Validator\\Exception\\UnexpectedTypeException' => __DIR__ . '/..' . '/symfony/validator/Exception/UnexpectedTypeException.php',
+ 'Symfony\\Component\\Validator\\Exception\\UnsupportedMetadataException' => __DIR__ . '/..' . '/symfony/validator/Exception/UnsupportedMetadataException.php',
+ 'Symfony\\Component\\Validator\\Exception\\ValidatorException' => __DIR__ . '/..' . '/symfony/validator/Exception/ValidatorException.php',
+ 'Symfony\\Component\\Validator\\GroupSequenceProviderInterface' => __DIR__ . '/..' . '/symfony/validator/GroupSequenceProviderInterface.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Cache\\CacheInterface' => __DIR__ . '/..' . '/symfony/validator/Mapping/Cache/CacheInterface.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Cache\\DoctrineCache' => __DIR__ . '/..' . '/symfony/validator/Mapping/Cache/DoctrineCache.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Cache\\Psr6Cache' => __DIR__ . '/..' . '/symfony/validator/Mapping/Cache/Psr6Cache.php',
+ 'Symfony\\Component\\Validator\\Mapping\\CascadingStrategy' => __DIR__ . '/..' . '/symfony/validator/Mapping/CascadingStrategy.php',
+ 'Symfony\\Component\\Validator\\Mapping\\ClassMetadata' => __DIR__ . '/..' . '/symfony/validator/Mapping/ClassMetadata.php',
+ 'Symfony\\Component\\Validator\\Mapping\\ClassMetadataInterface' => __DIR__ . '/..' . '/symfony/validator/Mapping/ClassMetadataInterface.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Factory\\BlackHoleMetadataFactory' => __DIR__ . '/..' . '/symfony/validator/Mapping/Factory/BlackHoleMetadataFactory.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Factory\\LazyLoadingMetadataFactory' => __DIR__ . '/..' . '/symfony/validator/Mapping/Factory/LazyLoadingMetadataFactory.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Factory\\MetadataFactoryInterface' => __DIR__ . '/..' . '/symfony/validator/Mapping/Factory/MetadataFactoryInterface.php',
+ 'Symfony\\Component\\Validator\\Mapping\\GenericMetadata' => __DIR__ . '/..' . '/symfony/validator/Mapping/GenericMetadata.php',
+ 'Symfony\\Component\\Validator\\Mapping\\GetterMetadata' => __DIR__ . '/..' . '/symfony/validator/Mapping/GetterMetadata.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\AbstractLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/AbstractLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\AnnotationLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/AnnotationLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/FileLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\FilesLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/FilesLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\LoaderChain' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/LoaderChain.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/LoaderInterface.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\StaticMethodLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/StaticMethodLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\XmlFileLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/XmlFileLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\XmlFilesLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/XmlFilesLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/YamlFileLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\Loader\\YamlFilesLoader' => __DIR__ . '/..' . '/symfony/validator/Mapping/Loader/YamlFilesLoader.php',
+ 'Symfony\\Component\\Validator\\Mapping\\MemberMetadata' => __DIR__ . '/..' . '/symfony/validator/Mapping/MemberMetadata.php',
+ 'Symfony\\Component\\Validator\\Mapping\\MetadataInterface' => __DIR__ . '/..' . '/symfony/validator/Mapping/MetadataInterface.php',
+ 'Symfony\\Component\\Validator\\Mapping\\PropertyMetadata' => __DIR__ . '/..' . '/symfony/validator/Mapping/PropertyMetadata.php',
+ 'Symfony\\Component\\Validator\\Mapping\\PropertyMetadataInterface' => __DIR__ . '/..' . '/symfony/validator/Mapping/PropertyMetadataInterface.php',
+ 'Symfony\\Component\\Validator\\Mapping\\TraversalStrategy' => __DIR__ . '/..' . '/symfony/validator/Mapping/TraversalStrategy.php',
+ 'Symfony\\Component\\Validator\\ObjectInitializerInterface' => __DIR__ . '/..' . '/symfony/validator/ObjectInitializerInterface.php',
+ 'Symfony\\Component\\Validator\\Test\\ConstraintValidatorTestCase' => __DIR__ . '/..' . '/symfony/validator/Test/ConstraintValidatorTestCase.php',
+ 'Symfony\\Component\\Validator\\Test\\ConstraintViolationAssertion' => __DIR__ . '/..' . '/symfony/validator/Test/ConstraintValidatorTestCase.php',
+ 'Symfony\\Component\\Validator\\Util\\PropertyPath' => __DIR__ . '/..' . '/symfony/validator/Util/PropertyPath.php',
+ 'Symfony\\Component\\Validator\\Validation' => __DIR__ . '/..' . '/symfony/validator/Validation.php',
+ 'Symfony\\Component\\Validator\\ValidatorBuilder' => __DIR__ . '/..' . '/symfony/validator/ValidatorBuilder.php',
+ 'Symfony\\Component\\Validator\\ValidatorBuilderInterface' => __DIR__ . '/..' . '/symfony/validator/ValidatorBuilderInterface.php',
+ 'Symfony\\Component\\Validator\\Validator\\ContextualValidatorInterface' => __DIR__ . '/..' . '/symfony/validator/Validator/ContextualValidatorInterface.php',
+ 'Symfony\\Component\\Validator\\Validator\\RecursiveContextualValidator' => __DIR__ . '/..' . '/symfony/validator/Validator/RecursiveContextualValidator.php',
+ 'Symfony\\Component\\Validator\\Validator\\RecursiveValidator' => __DIR__ . '/..' . '/symfony/validator/Validator/RecursiveValidator.php',
+ 'Symfony\\Component\\Validator\\Validator\\TraceableValidator' => __DIR__ . '/..' . '/symfony/validator/Validator/TraceableValidator.php',
+ 'Symfony\\Component\\Validator\\Validator\\ValidatorInterface' => __DIR__ . '/..' . '/symfony/validator/Validator/ValidatorInterface.php',
+ 'Symfony\\Component\\Validator\\Violation\\ConstraintViolationBuilder' => __DIR__ . '/..' . '/symfony/validator/Violation/ConstraintViolationBuilder.php',
+ 'Symfony\\Component\\Validator\\Violation\\ConstraintViolationBuilderInterface' => __DIR__ . '/..' . '/symfony/validator/Violation/ConstraintViolationBuilderInterface.php',
+ 'Symfony\\Component\\Yaml\\Command\\LintCommand' => __DIR__ . '/..' . '/symfony/yaml/Command/LintCommand.php',
+ 'Symfony\\Component\\Yaml\\Dumper' => __DIR__ . '/..' . '/symfony/yaml/Dumper.php',
+ 'Symfony\\Component\\Yaml\\Escaper' => __DIR__ . '/..' . '/symfony/yaml/Escaper.php',
+ 'Symfony\\Component\\Yaml\\Exception\\DumpException' => __DIR__ . '/..' . '/symfony/yaml/Exception/DumpException.php',
+ 'Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/yaml/Exception/ExceptionInterface.php',
+ 'Symfony\\Component\\Yaml\\Exception\\ParseException' => __DIR__ . '/..' . '/symfony/yaml/Exception/ParseException.php',
+ 'Symfony\\Component\\Yaml\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/yaml/Exception/RuntimeException.php',
+ 'Symfony\\Component\\Yaml\\Inline' => __DIR__ . '/..' . '/symfony/yaml/Inline.php',
+ 'Symfony\\Component\\Yaml\\Parser' => __DIR__ . '/..' . '/symfony/yaml/Parser.php',
+ 'Symfony\\Component\\Yaml\\Tag\\TaggedValue' => __DIR__ . '/..' . '/symfony/yaml/Tag/TaggedValue.php',
+ 'Symfony\\Component\\Yaml\\Unescaper' => __DIR__ . '/..' . '/symfony/yaml/Unescaper.php',
+ 'Symfony\\Component\\Yaml\\Yaml' => __DIR__ . '/..' . '/symfony/yaml/Yaml.php',
+ 'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php',
+ 'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php',
+ 'Text_Template' => __DIR__ . '/..' . '/phpunit/php-text-template/src/Template.php',
+ 'Twig\\Cache\\CacheInterface' => __DIR__ . '/..' . '/twig/twig/src/Cache/CacheInterface.php',
+ 'Twig\\Cache\\FilesystemCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/FilesystemCache.php',
+ 'Twig\\Cache\\NullCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/NullCache.php',
+ 'Twig\\Compiler' => __DIR__ . '/..' . '/twig/twig/src/Compiler.php',
+ 'Twig\\Environment' => __DIR__ . '/..' . '/twig/twig/src/Environment.php',
+ 'Twig\\Error\\Error' => __DIR__ . '/..' . '/twig/twig/src/Error/Error.php',
+ 'Twig\\Error\\LoaderError' => __DIR__ . '/..' . '/twig/twig/src/Error/LoaderError.php',
+ 'Twig\\Error\\RuntimeError' => __DIR__ . '/..' . '/twig/twig/src/Error/RuntimeError.php',
+ 'Twig\\Error\\SyntaxError' => __DIR__ . '/..' . '/twig/twig/src/Error/SyntaxError.php',
+ 'Twig\\ExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser.php',
+ 'Twig\\ExtensionSet' => __DIR__ . '/..' . '/twig/twig/src/ExtensionSet.php',
+ 'Twig\\Extension\\AbstractExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/AbstractExtension.php',
+ 'Twig\\Extension\\CoreExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/CoreExtension.php',
+ 'Twig\\Extension\\DebugExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/DebugExtension.php',
+ 'Twig\\Extension\\EscaperExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/EscaperExtension.php',
+ 'Twig\\Extension\\ExtensionInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/ExtensionInterface.php',
+ 'Twig\\Extension\\GlobalsInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/GlobalsInterface.php',
+ 'Twig\\Extension\\InitRuntimeInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/InitRuntimeInterface.php',
+ 'Twig\\Extension\\OptimizerExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/OptimizerExtension.php',
+ 'Twig\\Extension\\ProfilerExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/ProfilerExtension.php',
+ 'Twig\\Extension\\RuntimeExtensionInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/RuntimeExtensionInterface.php',
+ 'Twig\\Extension\\SandboxExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/SandboxExtension.php',
+ 'Twig\\Extension\\StagingExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/StagingExtension.php',
+ 'Twig\\Extension\\StringLoaderExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/StringLoaderExtension.php',
+ 'Twig\\FileExtensionEscapingStrategy' => __DIR__ . '/..' . '/twig/twig/src/FileExtensionEscapingStrategy.php',
+ 'Twig\\Lexer' => __DIR__ . '/..' . '/twig/twig/src/Lexer.php',
+ 'Twig\\Loader\\ArrayLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/ArrayLoader.php',
+ 'Twig\\Loader\\ChainLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/ChainLoader.php',
+ 'Twig\\Loader\\ExistsLoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/Loader/ExistsLoaderInterface.php',
+ 'Twig\\Loader\\FilesystemLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/FilesystemLoader.php',
+ 'Twig\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/Loader/LoaderInterface.php',
+ 'Twig\\Loader\\SourceContextLoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/Loader/SourceContextLoaderInterface.php',
+ 'Twig\\Markup' => __DIR__ . '/..' . '/twig/twig/src/Markup.php',
+ 'Twig\\NodeTraverser' => __DIR__ . '/..' . '/twig/twig/src/NodeTraverser.php',
+ 'Twig\\NodeVisitor\\AbstractNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php',
+ 'Twig\\NodeVisitor\\EscaperNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php',
+ 'Twig\\NodeVisitor\\NodeVisitorInterface' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/NodeVisitorInterface.php',
+ 'Twig\\NodeVisitor\\OptimizerNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php',
+ 'Twig\\NodeVisitor\\SafeAnalysisNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php',
+ 'Twig\\NodeVisitor\\SandboxNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php',
+ 'Twig\\Node\\AutoEscapeNode' => __DIR__ . '/..' . '/twig/twig/src/Node/AutoEscapeNode.php',
+ 'Twig\\Node\\BlockNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BlockNode.php',
+ 'Twig\\Node\\BlockReferenceNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BlockReferenceNode.php',
+ 'Twig\\Node\\BodyNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BodyNode.php',
+ 'Twig\\Node\\CheckSecurityNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CheckSecurityNode.php',
+ 'Twig\\Node\\DoNode' => __DIR__ . '/..' . '/twig/twig/src/Node/DoNode.php',
+ 'Twig\\Node\\EmbedNode' => __DIR__ . '/..' . '/twig/twig/src/Node/EmbedNode.php',
+ 'Twig\\Node\\Expression\\AbstractExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/AbstractExpression.php',
+ 'Twig\\Node\\Expression\\ArrayExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ArrayExpression.php',
+ 'Twig\\Node\\Expression\\AssignNameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/AssignNameExpression.php',
+ 'Twig\\Node\\Expression\\Binary\\AbstractBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AbstractBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\AddBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AddBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\AndBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AndBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\BitwiseAndBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\BitwiseOrBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\BitwiseXorBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\ConcatBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/ConcatBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\DivBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/DivBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\EndsWithBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\EqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/EqualBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\FloorDivBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\GreaterBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/GreaterBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\GreaterEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\InBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/InBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\LessBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/LessBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\LessEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\MatchesBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/MatchesBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\ModBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/ModBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\MulBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/MulBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\NotEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\NotInBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/NotInBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\OrBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/OrBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\PowerBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/PowerBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\RangeBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/RangeBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\StartsWithBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php',
+ 'Twig\\Node\\Expression\\Binary\\SubBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/SubBinary.php',
+ 'Twig\\Node\\Expression\\BlockReferenceExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/BlockReferenceExpression.php',
+ 'Twig\\Node\\Expression\\CallExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/CallExpression.php',
+ 'Twig\\Node\\Expression\\ConditionalExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ConditionalExpression.php',
+ 'Twig\\Node\\Expression\\ConstantExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ConstantExpression.php',
+ 'Twig\\Node\\Expression\\FilterExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/FilterExpression.php',
+ 'Twig\\Node\\Expression\\Filter\\DefaultFilter' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Filter/DefaultFilter.php',
+ 'Twig\\Node\\Expression\\FunctionExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/FunctionExpression.php',
+ 'Twig\\Node\\Expression\\GetAttrExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/GetAttrExpression.php',
+ 'Twig\\Node\\Expression\\MethodCallExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/MethodCallExpression.php',
+ 'Twig\\Node\\Expression\\NameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/NameExpression.php',
+ 'Twig\\Node\\Expression\\NullCoalesceExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/NullCoalesceExpression.php',
+ 'Twig\\Node\\Expression\\ParentExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ParentExpression.php',
+ 'Twig\\Node\\Expression\\TempNameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/TempNameExpression.php',
+ 'Twig\\Node\\Expression\\TestExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/TestExpression.php',
+ 'Twig\\Node\\Expression\\Test\\ConstantTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/ConstantTest.php',
+ 'Twig\\Node\\Expression\\Test\\DefinedTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/DefinedTest.php',
+ 'Twig\\Node\\Expression\\Test\\DivisiblebyTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php',
+ 'Twig\\Node\\Expression\\Test\\EvenTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/EvenTest.php',
+ 'Twig\\Node\\Expression\\Test\\NullTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/NullTest.php',
+ 'Twig\\Node\\Expression\\Test\\OddTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/OddTest.php',
+ 'Twig\\Node\\Expression\\Test\\SameasTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/SameasTest.php',
+ 'Twig\\Node\\Expression\\Unary\\AbstractUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/AbstractUnary.php',
+ 'Twig\\Node\\Expression\\Unary\\NegUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/NegUnary.php',
+ 'Twig\\Node\\Expression\\Unary\\NotUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/NotUnary.php',
+ 'Twig\\Node\\Expression\\Unary\\PosUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/PosUnary.php',
+ 'Twig\\Node\\FlushNode' => __DIR__ . '/..' . '/twig/twig/src/Node/FlushNode.php',
+ 'Twig\\Node\\ForLoopNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ForLoopNode.php',
+ 'Twig\\Node\\ForNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ForNode.php',
+ 'Twig\\Node\\IfNode' => __DIR__ . '/..' . '/twig/twig/src/Node/IfNode.php',
+ 'Twig\\Node\\ImportNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ImportNode.php',
+ 'Twig\\Node\\IncludeNode' => __DIR__ . '/..' . '/twig/twig/src/Node/IncludeNode.php',
+ 'Twig\\Node\\MacroNode' => __DIR__ . '/..' . '/twig/twig/src/Node/MacroNode.php',
+ 'Twig\\Node\\ModuleNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ModuleNode.php',
+ 'Twig\\Node\\Node' => __DIR__ . '/..' . '/twig/twig/src/Node/Node.php',
+ 'Twig\\Node\\NodeCaptureInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/NodeCaptureInterface.php',
+ 'Twig\\Node\\NodeOutputInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/NodeOutputInterface.php',
+ 'Twig\\Node\\PrintNode' => __DIR__ . '/..' . '/twig/twig/src/Node/PrintNode.php',
+ 'Twig\\Node\\SandboxNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SandboxNode.php',
+ 'Twig\\Node\\SandboxedPrintNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SandboxedPrintNode.php',
+ 'Twig\\Node\\SetNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SetNode.php',
+ 'Twig\\Node\\SpacelessNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SpacelessNode.php',
+ 'Twig\\Node\\TextNode' => __DIR__ . '/..' . '/twig/twig/src/Node/TextNode.php',
+ 'Twig\\Node\\WithNode' => __DIR__ . '/..' . '/twig/twig/src/Node/WithNode.php',
+ 'Twig\\Parser' => __DIR__ . '/..' . '/twig/twig/src/Parser.php',
+ 'Twig\\Profiler\\Dumper\\BaseDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/BaseDumper.php',
+ 'Twig\\Profiler\\Dumper\\BlackfireDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/BlackfireDumper.php',
+ 'Twig\\Profiler\\Dumper\\HtmlDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/HtmlDumper.php',
+ 'Twig\\Profiler\\Dumper\\TextDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/TextDumper.php',
+ 'Twig\\Profiler\\NodeVisitor\\ProfilerNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php',
+ 'Twig\\Profiler\\Node\\EnterProfileNode' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Node/EnterProfileNode.php',
+ 'Twig\\Profiler\\Node\\LeaveProfileNode' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Node/LeaveProfileNode.php',
+ 'Twig\\Profiler\\Profile' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Profile.php',
+ 'Twig\\RuntimeLoader\\ContainerRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php',
+ 'Twig\\RuntimeLoader\\FactoryRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php',
+ 'Twig\\RuntimeLoader\\RuntimeLoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php',
+ 'Twig\\Sandbox\\SecurityError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityError.php',
+ 'Twig\\Sandbox\\SecurityNotAllowedFilterError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php',
+ 'Twig\\Sandbox\\SecurityNotAllowedFunctionError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php',
+ 'Twig\\Sandbox\\SecurityNotAllowedMethodError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php',
+ 'Twig\\Sandbox\\SecurityNotAllowedPropertyError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php',
+ 'Twig\\Sandbox\\SecurityNotAllowedTagError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php',
+ 'Twig\\Sandbox\\SecurityPolicy' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityPolicy.php',
+ 'Twig\\Sandbox\\SecurityPolicyInterface' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityPolicyInterface.php',
+ 'Twig\\Source' => __DIR__ . '/..' . '/twig/twig/src/Source.php',
+ 'Twig\\Template' => __DIR__ . '/..' . '/twig/twig/src/Template.php',
+ 'Twig\\TemplateWrapper' => __DIR__ . '/..' . '/twig/twig/src/TemplateWrapper.php',
+ 'Twig\\Test\\IntegrationTestCase' => __DIR__ . '/..' . '/twig/twig/src/Test/IntegrationTestCase.php',
+ 'Twig\\Test\\NodeTestCase' => __DIR__ . '/..' . '/twig/twig/src/Test/NodeTestCase.php',
+ 'Twig\\Token' => __DIR__ . '/..' . '/twig/twig/src/Token.php',
+ 'Twig\\TokenParser\\AbstractTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/AbstractTokenParser.php',
+ 'Twig\\TokenParser\\AutoEscapeTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/AutoEscapeTokenParser.php',
+ 'Twig\\TokenParser\\BlockTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/BlockTokenParser.php',
+ 'Twig\\TokenParser\\DoTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/DoTokenParser.php',
+ 'Twig\\TokenParser\\EmbedTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/EmbedTokenParser.php',
+ 'Twig\\TokenParser\\ExtendsTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ExtendsTokenParser.php',
+ 'Twig\\TokenParser\\FilterTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FilterTokenParser.php',
+ 'Twig\\TokenParser\\FlushTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FlushTokenParser.php',
+ 'Twig\\TokenParser\\ForTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ForTokenParser.php',
+ 'Twig\\TokenParser\\FromTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FromTokenParser.php',
+ 'Twig\\TokenParser\\IfTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/IfTokenParser.php',
+ 'Twig\\TokenParser\\ImportTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ImportTokenParser.php',
+ 'Twig\\TokenParser\\IncludeTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/IncludeTokenParser.php',
+ 'Twig\\TokenParser\\MacroTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/MacroTokenParser.php',
+ 'Twig\\TokenParser\\SandboxTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SandboxTokenParser.php',
+ 'Twig\\TokenParser\\SetTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SetTokenParser.php',
+ 'Twig\\TokenParser\\SpacelessTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SpacelessTokenParser.php',
+ 'Twig\\TokenParser\\TokenParserInterface' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/TokenParserInterface.php',
+ 'Twig\\TokenParser\\UseTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/UseTokenParser.php',
+ 'Twig\\TokenParser\\WithTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/WithTokenParser.php',
+ 'Twig\\TokenStream' => __DIR__ . '/..' . '/twig/twig/src/TokenStream.php',
+ 'Twig\\TwigFilter' => __DIR__ . '/..' . '/twig/twig/src/TwigFilter.php',
+ 'Twig\\TwigFunction' => __DIR__ . '/..' . '/twig/twig/src/TwigFunction.php',
+ 'Twig\\TwigTest' => __DIR__ . '/..' . '/twig/twig/src/TwigTest.php',
+ 'Twig\\Util\\DeprecationCollector' => __DIR__ . '/..' . '/twig/twig/src/Util/DeprecationCollector.php',
+ 'Twig\\Util\\TemplateDirIterator' => __DIR__ . '/..' . '/twig/twig/src/Util/TemplateDirIterator.php',
+ 'Twig_BaseNodeVisitor' => __DIR__ . '/..' . '/twig/twig/lib/Twig/BaseNodeVisitor.php',
+ 'Twig_CacheInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/CacheInterface.php',
+ 'Twig_Cache_Filesystem' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Cache/Filesystem.php',
+ 'Twig_Cache_Null' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Cache/Null.php',
+ 'Twig_Compiler' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Compiler.php',
+ 'Twig_ContainerRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ContainerRuntimeLoader.php',
+ 'Twig_Environment' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Environment.php',
+ 'Twig_Error' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Error.php',
+ 'Twig_Error_Loader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Error/Loader.php',
+ 'Twig_Error_Runtime' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Error/Runtime.php',
+ 'Twig_Error_Syntax' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Error/Syntax.php',
+ 'Twig_ExistsLoaderInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ExistsLoaderInterface.php',
+ 'Twig_ExpressionParser' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ExpressionParser.php',
+ 'Twig_Extension' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension.php',
+ 'Twig_ExtensionInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ExtensionInterface.php',
+ 'Twig_ExtensionSet' => __DIR__ . '/..' . '/twig/twig/lib/Twig/ExtensionSet.php',
+ 'Twig_Extension_Core' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Core.php',
+ 'Twig_Extension_Debug' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Debug.php',
+ 'Twig_Extension_Escaper' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Escaper.php',
+ 'Twig_Extension_GlobalsInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/GlobalsInterface.php',
+ 'Twig_Extension_InitRuntimeInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php',
+ 'Twig_Extension_Optimizer' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Optimizer.php',
+ 'Twig_Extension_Profiler' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Profiler.php',
+ 'Twig_Extension_Sandbox' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Sandbox.php',
+ 'Twig_Extension_Staging' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/Staging.php',
+ 'Twig_Extension_StringLoader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Extension/StringLoader.php',
+ 'Twig_FactoryRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FactoryRuntimeLoader.php',
+ 'Twig_FileExtensionEscapingStrategy' => __DIR__ . '/..' . '/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php',
+ 'Twig_Filter' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Filter.php',
+ 'Twig_Function' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Function.php',
+ 'Twig_Lexer' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Lexer.php',
+ 'Twig_LoaderInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/LoaderInterface.php',
+ 'Twig_Loader_Array' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Loader/Array.php',
+ 'Twig_Loader_Chain' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Loader/Chain.php',
+ 'Twig_Loader_Filesystem' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Loader/Filesystem.php',
+ 'Twig_Markup' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Markup.php',
+ 'Twig_Node' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node.php',
+ 'Twig_NodeCaptureInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeCaptureInterface.php',
+ 'Twig_NodeOutputInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeOutputInterface.php',
+ 'Twig_NodeTraverser' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeTraverser.php',
+ 'Twig_NodeVisitorInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitorInterface.php',
+ 'Twig_NodeVisitor_Escaper' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitor/Escaper.php',
+ 'Twig_NodeVisitor_Optimizer' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitor/Optimizer.php',
+ 'Twig_NodeVisitor_SafeAnalysis' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php',
+ 'Twig_NodeVisitor_Sandbox' => __DIR__ . '/..' . '/twig/twig/lib/Twig/NodeVisitor/Sandbox.php',
+ 'Twig_Node_AutoEscape' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/AutoEscape.php',
+ 'Twig_Node_Block' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Block.php',
+ 'Twig_Node_BlockReference' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/BlockReference.php',
+ 'Twig_Node_Body' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Body.php',
+ 'Twig_Node_CheckSecurity' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/CheckSecurity.php',
+ 'Twig_Node_Do' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Do.php',
+ 'Twig_Node_Embed' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Embed.php',
+ 'Twig_Node_Expression' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression.php',
+ 'Twig_Node_Expression_Array' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Array.php',
+ 'Twig_Node_Expression_AssignName' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/AssignName.php',
+ 'Twig_Node_Expression_Binary' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary.php',
+ 'Twig_Node_Expression_Binary_Add' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Add.php',
+ 'Twig_Node_Expression_Binary_And' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/And.php',
+ 'Twig_Node_Expression_Binary_BitwiseAnd' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php',
+ 'Twig_Node_Expression_Binary_BitwiseOr' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php',
+ 'Twig_Node_Expression_Binary_BitwiseXor' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php',
+ 'Twig_Node_Expression_Binary_Concat' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php',
+ 'Twig_Node_Expression_Binary_Div' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Div.php',
+ 'Twig_Node_Expression_Binary_EndsWith' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php',
+ 'Twig_Node_Expression_Binary_Equal' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php',
+ 'Twig_Node_Expression_Binary_FloorDiv' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php',
+ 'Twig_Node_Expression_Binary_Greater' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php',
+ 'Twig_Node_Expression_Binary_GreaterEqual' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php',
+ 'Twig_Node_Expression_Binary_In' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/In.php',
+ 'Twig_Node_Expression_Binary_Less' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Less.php',
+ 'Twig_Node_Expression_Binary_LessEqual' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php',
+ 'Twig_Node_Expression_Binary_Matches' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php',
+ 'Twig_Node_Expression_Binary_Mod' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php',
+ 'Twig_Node_Expression_Binary_Mul' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php',
+ 'Twig_Node_Expression_Binary_NotEqual' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php',
+ 'Twig_Node_Expression_Binary_NotIn' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php',
+ 'Twig_Node_Expression_Binary_Or' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Or.php',
+ 'Twig_Node_Expression_Binary_Power' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Power.php',
+ 'Twig_Node_Expression_Binary_Range' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Range.php',
+ 'Twig_Node_Expression_Binary_StartsWith' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php',
+ 'Twig_Node_Expression_Binary_Sub' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php',
+ 'Twig_Node_Expression_BlockReference' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/BlockReference.php',
+ 'Twig_Node_Expression_Call' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Call.php',
+ 'Twig_Node_Expression_Conditional' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Conditional.php',
+ 'Twig_Node_Expression_Constant' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Constant.php',
+ 'Twig_Node_Expression_Filter' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Filter.php',
+ 'Twig_Node_Expression_Filter_Default' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Filter/Default.php',
+ 'Twig_Node_Expression_Function' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Function.php',
+ 'Twig_Node_Expression_GetAttr' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/GetAttr.php',
+ 'Twig_Node_Expression_MethodCall' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/MethodCall.php',
+ 'Twig_Node_Expression_Name' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Name.php',
+ 'Twig_Node_Expression_NullCoalesce' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php',
+ 'Twig_Node_Expression_Parent' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Parent.php',
+ 'Twig_Node_Expression_TempName' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/TempName.php',
+ 'Twig_Node_Expression_Test' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test.php',
+ 'Twig_Node_Expression_Test_Constant' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Constant.php',
+ 'Twig_Node_Expression_Test_Defined' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Defined.php',
+ 'Twig_Node_Expression_Test_Divisibleby' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php',
+ 'Twig_Node_Expression_Test_Even' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Even.php',
+ 'Twig_Node_Expression_Test_Null' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Null.php',
+ 'Twig_Node_Expression_Test_Odd' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Odd.php',
+ 'Twig_Node_Expression_Test_Sameas' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php',
+ 'Twig_Node_Expression_Unary' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Unary.php',
+ 'Twig_Node_Expression_Unary_Neg' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php',
+ 'Twig_Node_Expression_Unary_Not' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Unary/Not.php',
+ 'Twig_Node_Expression_Unary_Pos' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php',
+ 'Twig_Node_Flush' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Flush.php',
+ 'Twig_Node_For' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/For.php',
+ 'Twig_Node_ForLoop' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/ForLoop.php',
+ 'Twig_Node_If' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/If.php',
+ 'Twig_Node_Import' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Import.php',
+ 'Twig_Node_Include' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Include.php',
+ 'Twig_Node_Macro' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Macro.php',
+ 'Twig_Node_Module' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Module.php',
+ 'Twig_Node_Print' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Print.php',
+ 'Twig_Node_Sandbox' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Sandbox.php',
+ 'Twig_Node_SandboxedPrint' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/SandboxedPrint.php',
+ 'Twig_Node_Set' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Set.php',
+ 'Twig_Node_Spaceless' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Spaceless.php',
+ 'Twig_Node_Text' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/Text.php',
+ 'Twig_Node_With' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Node/With.php',
+ 'Twig_Parser' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Parser.php',
+ 'Twig_Profiler_Dumper_Base' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Dumper/Base.php',
+ 'Twig_Profiler_Dumper_Blackfire' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php',
+ 'Twig_Profiler_Dumper_Html' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Dumper/Html.php',
+ 'Twig_Profiler_Dumper_Text' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Dumper/Text.php',
+ 'Twig_Profiler_NodeVisitor_Profiler' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php',
+ 'Twig_Profiler_Node_EnterProfile' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php',
+ 'Twig_Profiler_Node_LeaveProfile' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php',
+ 'Twig_Profiler_Profile' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Profiler/Profile.php',
+ 'Twig_RuntimeLoaderInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/RuntimeLoaderInterface.php',
+ 'Twig_Sandbox_SecurityError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityError.php',
+ 'Twig_Sandbox_SecurityNotAllowedFilterError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php',
+ 'Twig_Sandbox_SecurityNotAllowedFunctionError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php',
+ 'Twig_Sandbox_SecurityNotAllowedMethodError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php',
+ 'Twig_Sandbox_SecurityNotAllowedPropertyError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php',
+ 'Twig_Sandbox_SecurityNotAllowedTagError' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php',
+ 'Twig_Sandbox_SecurityPolicy' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php',
+ 'Twig_Sandbox_SecurityPolicyInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php',
+ 'Twig_SimpleFilter' => __DIR__ . '/..' . '/twig/twig/lib/Twig/SimpleFilter.php',
+ 'Twig_SimpleFunction' => __DIR__ . '/..' . '/twig/twig/lib/Twig/SimpleFunction.php',
+ 'Twig_SimpleTest' => __DIR__ . '/..' . '/twig/twig/lib/Twig/SimpleTest.php',
+ 'Twig_Source' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Source.php',
+ 'Twig_SourceContextLoaderInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/SourceContextLoaderInterface.php',
+ 'Twig_Template' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Template.php',
+ 'Twig_TemplateWrapper' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TemplateWrapper.php',
+ 'Twig_Test' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Test.php',
+ 'Twig_Test_IntegrationTestCase' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Test/IntegrationTestCase.php',
+ 'Twig_Test_NodeTestCase' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Test/NodeTestCase.php',
+ 'Twig_Token' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Token.php',
+ 'Twig_TokenParser' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser.php',
+ 'Twig_TokenParserInterface' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParserInterface.php',
+ 'Twig_TokenParser_AutoEscape' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/AutoEscape.php',
+ 'Twig_TokenParser_Block' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Block.php',
+ 'Twig_TokenParser_Do' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Do.php',
+ 'Twig_TokenParser_Embed' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Embed.php',
+ 'Twig_TokenParser_Extends' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Extends.php',
+ 'Twig_TokenParser_Filter' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Filter.php',
+ 'Twig_TokenParser_Flush' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Flush.php',
+ 'Twig_TokenParser_For' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/For.php',
+ 'Twig_TokenParser_From' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/From.php',
+ 'Twig_TokenParser_If' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/If.php',
+ 'Twig_TokenParser_Import' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Import.php',
+ 'Twig_TokenParser_Include' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Include.php',
+ 'Twig_TokenParser_Macro' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Macro.php',
+ 'Twig_TokenParser_Sandbox' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Sandbox.php',
+ 'Twig_TokenParser_Set' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Set.php',
+ 'Twig_TokenParser_Spaceless' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Spaceless.php',
+ 'Twig_TokenParser_Use' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/Use.php',
+ 'Twig_TokenParser_With' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenParser/With.php',
+ 'Twig_TokenStream' => __DIR__ . '/..' . '/twig/twig/lib/Twig/TokenStream.php',
+ 'Twig_Util_DeprecationCollector' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Util/DeprecationCollector.php',
+ 'Twig_Util_TemplateDirIterator' => __DIR__ . '/..' . '/twig/twig/lib/Twig/Util/TemplateDirIterator.php',
+ 'Webmozart\\Assert\\Assert' => __DIR__ . '/..' . '/webmozart/assert/src/Assert.php',
+ 'WellingGuzman\\OAuth2\\Client\\Provider\\Exception\\OktaIdentityProviderException' => __DIR__ . '/..' . '/wellingguzman/oauth2-okta/src/Provider/Exception/OktaIdentityProviderException.php',
+ 'WellingGuzman\\OAuth2\\Client\\Provider\\Okta' => __DIR__ . '/..' . '/wellingguzman/oauth2-okta/src/Provider/Okta.php',
+ 'WellingGuzman\\OAuth2\\Client\\Provider\\OktaResourceOwner' => __DIR__ . '/..' . '/wellingguzman/oauth2-okta/src/Provider/OktaResourceOwner.php',
+ 'Zend\\Db\\Adapter\\Adapter' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Adapter.php',
+ 'Zend\\Db\\Adapter\\AdapterAbstractServiceFactory' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/AdapterAbstractServiceFactory.php',
+ 'Zend\\Db\\Adapter\\AdapterAwareInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/AdapterAwareInterface.php',
+ 'Zend\\Db\\Adapter\\AdapterAwareTrait' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/AdapterAwareTrait.php',
+ 'Zend\\Db\\Adapter\\AdapterInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/AdapterInterface.php',
+ 'Zend\\Db\\Adapter\\AdapterServiceFactory' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/AdapterServiceFactory.php',
+ 'Zend\\Db\\Adapter\\Driver\\AbstractConnection' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/AbstractConnection.php',
+ 'Zend\\Db\\Adapter\\Driver\\ConnectionInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/ConnectionInterface.php',
+ 'Zend\\Db\\Adapter\\Driver\\DriverInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/DriverInterface.php',
+ 'Zend\\Db\\Adapter\\Driver\\Feature\\AbstractFeature' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Feature/AbstractFeature.php',
+ 'Zend\\Db\\Adapter\\Driver\\Feature\\DriverFeatureInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Feature/DriverFeatureInterface.php',
+ 'Zend\\Db\\Adapter\\Driver\\IbmDb2\\Connection' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/IbmDb2/Connection.php',
+ 'Zend\\Db\\Adapter\\Driver\\IbmDb2\\IbmDb2' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/IbmDb2/IbmDb2.php',
+ 'Zend\\Db\\Adapter\\Driver\\IbmDb2\\Result' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/IbmDb2/Result.php',
+ 'Zend\\Db\\Adapter\\Driver\\IbmDb2\\Statement' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/IbmDb2/Statement.php',
+ 'Zend\\Db\\Adapter\\Driver\\Mysqli\\Connection' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Mysqli/Connection.php',
+ 'Zend\\Db\\Adapter\\Driver\\Mysqli\\Mysqli' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Mysqli/Mysqli.php',
+ 'Zend\\Db\\Adapter\\Driver\\Mysqli\\Result' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Mysqli/Result.php',
+ 'Zend\\Db\\Adapter\\Driver\\Mysqli\\Statement' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Mysqli/Statement.php',
+ 'Zend\\Db\\Adapter\\Driver\\Oci8\\Connection' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Oci8/Connection.php',
+ 'Zend\\Db\\Adapter\\Driver\\Oci8\\Feature\\RowCounter' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Oci8/Feature/RowCounter.php',
+ 'Zend\\Db\\Adapter\\Driver\\Oci8\\Oci8' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Oci8/Oci8.php',
+ 'Zend\\Db\\Adapter\\Driver\\Oci8\\Result' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Oci8/Result.php',
+ 'Zend\\Db\\Adapter\\Driver\\Oci8\\Statement' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Oci8/Statement.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pdo\\Connection' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Pdo/Connection.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pdo\\Feature\\OracleRowCounter' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Pdo/Feature/OracleRowCounter.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pdo\\Feature\\SqliteRowCounter' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Pdo/Feature/SqliteRowCounter.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pdo\\Pdo' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Pdo/Pdo.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pdo\\Result' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Pdo/Result.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pdo\\Statement' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Pdo/Statement.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pgsql\\Connection' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Pgsql/Connection.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pgsql\\Pgsql' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Pgsql/Pgsql.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pgsql\\Result' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Pgsql/Result.php',
+ 'Zend\\Db\\Adapter\\Driver\\Pgsql\\Statement' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Pgsql/Statement.php',
+ 'Zend\\Db\\Adapter\\Driver\\ResultInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/ResultInterface.php',
+ 'Zend\\Db\\Adapter\\Driver\\Sqlsrv\\Connection' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Sqlsrv/Connection.php',
+ 'Zend\\Db\\Adapter\\Driver\\Sqlsrv\\Exception\\ErrorException' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Sqlsrv/Exception/ErrorException.php',
+ 'Zend\\Db\\Adapter\\Driver\\Sqlsrv\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Sqlsrv/Exception/ExceptionInterface.php',
+ 'Zend\\Db\\Adapter\\Driver\\Sqlsrv\\Result' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Sqlsrv/Result.php',
+ 'Zend\\Db\\Adapter\\Driver\\Sqlsrv\\Sqlsrv' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Sqlsrv/Sqlsrv.php',
+ 'Zend\\Db\\Adapter\\Driver\\Sqlsrv\\Statement' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/Sqlsrv/Statement.php',
+ 'Zend\\Db\\Adapter\\Driver\\StatementInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Driver/StatementInterface.php',
+ 'Zend\\Db\\Adapter\\Exception\\ErrorException' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Exception/ErrorException.php',
+ 'Zend\\Db\\Adapter\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Exception/ExceptionInterface.php',
+ 'Zend\\Db\\Adapter\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Exception/InvalidArgumentException.php',
+ 'Zend\\Db\\Adapter\\Exception\\InvalidConnectionParametersException' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Exception/InvalidConnectionParametersException.php',
+ 'Zend\\Db\\Adapter\\Exception\\InvalidQueryException' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Exception/InvalidQueryException.php',
+ 'Zend\\Db\\Adapter\\Exception\\RuntimeException' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Exception/RuntimeException.php',
+ 'Zend\\Db\\Adapter\\Exception\\UnexpectedValueException' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Exception/UnexpectedValueException.php',
+ 'Zend\\Db\\Adapter\\ParameterContainer' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/ParameterContainer.php',
+ 'Zend\\Db\\Adapter\\Platform\\AbstractPlatform' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Platform/AbstractPlatform.php',
+ 'Zend\\Db\\Adapter\\Platform\\IbmDb2' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Platform/IbmDb2.php',
+ 'Zend\\Db\\Adapter\\Platform\\Mysql' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Platform/Mysql.php',
+ 'Zend\\Db\\Adapter\\Platform\\Oracle' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Platform/Oracle.php',
+ 'Zend\\Db\\Adapter\\Platform\\PlatformInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Platform/PlatformInterface.php',
+ 'Zend\\Db\\Adapter\\Platform\\Postgresql' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Platform/Postgresql.php',
+ 'Zend\\Db\\Adapter\\Platform\\Sql92' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Platform/Sql92.php',
+ 'Zend\\Db\\Adapter\\Platform\\SqlServer' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Platform/SqlServer.php',
+ 'Zend\\Db\\Adapter\\Platform\\Sqlite' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Platform/Sqlite.php',
+ 'Zend\\Db\\Adapter\\Profiler\\Profiler' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Profiler/Profiler.php',
+ 'Zend\\Db\\Adapter\\Profiler\\ProfilerAwareInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Profiler/ProfilerAwareInterface.php',
+ 'Zend\\Db\\Adapter\\Profiler\\ProfilerInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/Profiler/ProfilerInterface.php',
+ 'Zend\\Db\\Adapter\\StatementContainer' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/StatementContainer.php',
+ 'Zend\\Db\\Adapter\\StatementContainerInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Adapter/StatementContainerInterface.php',
+ 'Zend\\Db\\ConfigProvider' => __DIR__ . '/..' . '/zendframework/zend-db/src/ConfigProvider.php',
+ 'Zend\\Db\\Exception\\ErrorException' => __DIR__ . '/..' . '/zendframework/zend-db/src/Exception/ErrorException.php',
+ 'Zend\\Db\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Exception/ExceptionInterface.php',
+ 'Zend\\Db\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-db/src/Exception/InvalidArgumentException.php',
+ 'Zend\\Db\\Exception\\RuntimeException' => __DIR__ . '/..' . '/zendframework/zend-db/src/Exception/RuntimeException.php',
+ 'Zend\\Db\\Exception\\UnexpectedValueException' => __DIR__ . '/..' . '/zendframework/zend-db/src/Exception/UnexpectedValueException.php',
+ 'Zend\\Db\\Metadata\\Metadata' => __DIR__ . '/..' . '/zendframework/zend-db/src/Metadata/Metadata.php',
+ 'Zend\\Db\\Metadata\\MetadataInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Metadata/MetadataInterface.php',
+ 'Zend\\Db\\Metadata\\Object\\AbstractTableObject' => __DIR__ . '/..' . '/zendframework/zend-db/src/Metadata/Object/AbstractTableObject.php',
+ 'Zend\\Db\\Metadata\\Object\\ColumnObject' => __DIR__ . '/..' . '/zendframework/zend-db/src/Metadata/Object/ColumnObject.php',
+ 'Zend\\Db\\Metadata\\Object\\ConstraintKeyObject' => __DIR__ . '/..' . '/zendframework/zend-db/src/Metadata/Object/ConstraintKeyObject.php',
+ 'Zend\\Db\\Metadata\\Object\\ConstraintObject' => __DIR__ . '/..' . '/zendframework/zend-db/src/Metadata/Object/ConstraintObject.php',
+ 'Zend\\Db\\Metadata\\Object\\TableObject' => __DIR__ . '/..' . '/zendframework/zend-db/src/Metadata/Object/TableObject.php',
+ 'Zend\\Db\\Metadata\\Object\\TriggerObject' => __DIR__ . '/..' . '/zendframework/zend-db/src/Metadata/Object/TriggerObject.php',
+ 'Zend\\Db\\Metadata\\Object\\ViewObject' => __DIR__ . '/..' . '/zendframework/zend-db/src/Metadata/Object/ViewObject.php',
+ 'Zend\\Db\\Metadata\\Source\\AbstractSource' => __DIR__ . '/..' . '/zendframework/zend-db/src/Metadata/Source/AbstractSource.php',
+ 'Zend\\Db\\Metadata\\Source\\Factory' => __DIR__ . '/..' . '/zendframework/zend-db/src/Metadata/Source/Factory.php',
+ 'Zend\\Db\\Metadata\\Source\\MysqlMetadata' => __DIR__ . '/..' . '/zendframework/zend-db/src/Metadata/Source/MysqlMetadata.php',
+ 'Zend\\Db\\Metadata\\Source\\OracleMetadata' => __DIR__ . '/..' . '/zendframework/zend-db/src/Metadata/Source/OracleMetadata.php',
+ 'Zend\\Db\\Metadata\\Source\\PostgresqlMetadata' => __DIR__ . '/..' . '/zendframework/zend-db/src/Metadata/Source/PostgresqlMetadata.php',
+ 'Zend\\Db\\Metadata\\Source\\SqlServerMetadata' => __DIR__ . '/..' . '/zendframework/zend-db/src/Metadata/Source/SqlServerMetadata.php',
+ 'Zend\\Db\\Metadata\\Source\\SqliteMetadata' => __DIR__ . '/..' . '/zendframework/zend-db/src/Metadata/Source/SqliteMetadata.php',
+ 'Zend\\Db\\Module' => __DIR__ . '/..' . '/zendframework/zend-db/src/Module.php',
+ 'Zend\\Db\\ResultSet\\AbstractResultSet' => __DIR__ . '/..' . '/zendframework/zend-db/src/ResultSet/AbstractResultSet.php',
+ 'Zend\\Db\\ResultSet\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/ResultSet/Exception/ExceptionInterface.php',
+ 'Zend\\Db\\ResultSet\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-db/src/ResultSet/Exception/InvalidArgumentException.php',
+ 'Zend\\Db\\ResultSet\\Exception\\RuntimeException' => __DIR__ . '/..' . '/zendframework/zend-db/src/ResultSet/Exception/RuntimeException.php',
+ 'Zend\\Db\\ResultSet\\HydratingResultSet' => __DIR__ . '/..' . '/zendframework/zend-db/src/ResultSet/HydratingResultSet.php',
+ 'Zend\\Db\\ResultSet\\ResultSet' => __DIR__ . '/..' . '/zendframework/zend-db/src/ResultSet/ResultSet.php',
+ 'Zend\\Db\\ResultSet\\ResultSetInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/ResultSet/ResultSetInterface.php',
+ 'Zend\\Db\\RowGateway\\AbstractRowGateway' => __DIR__ . '/..' . '/zendframework/zend-db/src/RowGateway/AbstractRowGateway.php',
+ 'Zend\\Db\\RowGateway\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/RowGateway/Exception/ExceptionInterface.php',
+ 'Zend\\Db\\RowGateway\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-db/src/RowGateway/Exception/InvalidArgumentException.php',
+ 'Zend\\Db\\RowGateway\\Exception\\RuntimeException' => __DIR__ . '/..' . '/zendframework/zend-db/src/RowGateway/Exception/RuntimeException.php',
+ 'Zend\\Db\\RowGateway\\Feature\\AbstractFeature' => __DIR__ . '/..' . '/zendframework/zend-db/src/RowGateway/Feature/AbstractFeature.php',
+ 'Zend\\Db\\RowGateway\\Feature\\FeatureSet' => __DIR__ . '/..' . '/zendframework/zend-db/src/RowGateway/Feature/FeatureSet.php',
+ 'Zend\\Db\\RowGateway\\RowGateway' => __DIR__ . '/..' . '/zendframework/zend-db/src/RowGateway/RowGateway.php',
+ 'Zend\\Db\\RowGateway\\RowGatewayInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/RowGateway/RowGatewayInterface.php',
+ 'Zend\\Db\\Sql\\AbstractExpression' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/AbstractExpression.php',
+ 'Zend\\Db\\Sql\\AbstractPreparableSql' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/AbstractPreparableSql.php',
+ 'Zend\\Db\\Sql\\AbstractSql' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/AbstractSql.php',
+ 'Zend\\Db\\Sql\\Combine' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Combine.php',
+ 'Zend\\Db\\Sql\\Ddl\\AlterTable' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/AlterTable.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\AbstractLengthColumn' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/AbstractLengthColumn.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\AbstractPrecisionColumn' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/AbstractPrecisionColumn.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\AbstractTimestampColumn' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/AbstractTimestampColumn.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\BigInteger' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/BigInteger.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Binary' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/Binary.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Blob' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/Blob.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Boolean' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/Boolean.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Char' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/Char.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Column' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/Column.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\ColumnInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/ColumnInterface.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Date' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/Date.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Datetime' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/Datetime.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Decimal' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/Decimal.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Float' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/Float.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Floating' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/Floating.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Integer' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/Integer.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Text' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/Text.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Time' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/Time.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Timestamp' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/Timestamp.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Varbinary' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/Varbinary.php',
+ 'Zend\\Db\\Sql\\Ddl\\Column\\Varchar' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Column/Varchar.php',
+ 'Zend\\Db\\Sql\\Ddl\\Constraint\\AbstractConstraint' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Constraint/AbstractConstraint.php',
+ 'Zend\\Db\\Sql\\Ddl\\Constraint\\Check' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Constraint/Check.php',
+ 'Zend\\Db\\Sql\\Ddl\\Constraint\\ConstraintInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Constraint/ConstraintInterface.php',
+ 'Zend\\Db\\Sql\\Ddl\\Constraint\\ForeignKey' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Constraint/ForeignKey.php',
+ 'Zend\\Db\\Sql\\Ddl\\Constraint\\PrimaryKey' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Constraint/PrimaryKey.php',
+ 'Zend\\Db\\Sql\\Ddl\\Constraint\\UniqueKey' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Constraint/UniqueKey.php',
+ 'Zend\\Db\\Sql\\Ddl\\CreateTable' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/CreateTable.php',
+ 'Zend\\Db\\Sql\\Ddl\\DropTable' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/DropTable.php',
+ 'Zend\\Db\\Sql\\Ddl\\Index\\AbstractIndex' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Index/AbstractIndex.php',
+ 'Zend\\Db\\Sql\\Ddl\\Index\\Index' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/Index/Index.php',
+ 'Zend\\Db\\Sql\\Ddl\\SqlInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Ddl/SqlInterface.php',
+ 'Zend\\Db\\Sql\\Delete' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Delete.php',
+ 'Zend\\Db\\Sql\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Exception/ExceptionInterface.php',
+ 'Zend\\Db\\Sql\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Exception/InvalidArgumentException.php',
+ 'Zend\\Db\\Sql\\Exception\\RuntimeException' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Exception/RuntimeException.php',
+ 'Zend\\Db\\Sql\\Expression' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Expression.php',
+ 'Zend\\Db\\Sql\\ExpressionInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/ExpressionInterface.php',
+ 'Zend\\Db\\Sql\\Having' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Having.php',
+ 'Zend\\Db\\Sql\\Insert' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Insert.php',
+ 'Zend\\Db\\Sql\\Join' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Join.php',
+ 'Zend\\Db\\Sql\\Literal' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Literal.php',
+ 'Zend\\Db\\Sql\\Platform\\AbstractPlatform' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Platform/AbstractPlatform.php',
+ 'Zend\\Db\\Sql\\Platform\\IbmDb2\\IbmDb2' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Platform/IbmDb2/IbmDb2.php',
+ 'Zend\\Db\\Sql\\Platform\\IbmDb2\\SelectDecorator' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Platform/IbmDb2/SelectDecorator.php',
+ 'Zend\\Db\\Sql\\Platform\\Mysql\\Ddl\\AlterTableDecorator' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Platform/Mysql/Ddl/AlterTableDecorator.php',
+ 'Zend\\Db\\Sql\\Platform\\Mysql\\Ddl\\CreateTableDecorator' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Platform/Mysql/Ddl/CreateTableDecorator.php',
+ 'Zend\\Db\\Sql\\Platform\\Mysql\\Mysql' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Platform/Mysql/Mysql.php',
+ 'Zend\\Db\\Sql\\Platform\\Mysql\\SelectDecorator' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Platform/Mysql/SelectDecorator.php',
+ 'Zend\\Db\\Sql\\Platform\\Oracle\\Oracle' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Platform/Oracle/Oracle.php',
+ 'Zend\\Db\\Sql\\Platform\\Oracle\\SelectDecorator' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Platform/Oracle/SelectDecorator.php',
+ 'Zend\\Db\\Sql\\Platform\\Platform' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Platform/Platform.php',
+ 'Zend\\Db\\Sql\\Platform\\PlatformDecoratorInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Platform/PlatformDecoratorInterface.php',
+ 'Zend\\Db\\Sql\\Platform\\SqlServer\\Ddl\\CreateTableDecorator' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Platform/SqlServer/Ddl/CreateTableDecorator.php',
+ 'Zend\\Db\\Sql\\Platform\\SqlServer\\SelectDecorator' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Platform/SqlServer/SelectDecorator.php',
+ 'Zend\\Db\\Sql\\Platform\\SqlServer\\SqlServer' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Platform/SqlServer/SqlServer.php',
+ 'Zend\\Db\\Sql\\Platform\\Sqlite\\SelectDecorator' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Platform/Sqlite/SelectDecorator.php',
+ 'Zend\\Db\\Sql\\Platform\\Sqlite\\Sqlite' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Platform/Sqlite/Sqlite.php',
+ 'Zend\\Db\\Sql\\Predicate\\Between' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Predicate/Between.php',
+ 'Zend\\Db\\Sql\\Predicate\\Expression' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Predicate/Expression.php',
+ 'Zend\\Db\\Sql\\Predicate\\In' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Predicate/In.php',
+ 'Zend\\Db\\Sql\\Predicate\\IsNotNull' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Predicate/IsNotNull.php',
+ 'Zend\\Db\\Sql\\Predicate\\IsNull' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Predicate/IsNull.php',
+ 'Zend\\Db\\Sql\\Predicate\\Like' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Predicate/Like.php',
+ 'Zend\\Db\\Sql\\Predicate\\Literal' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Predicate/Literal.php',
+ 'Zend\\Db\\Sql\\Predicate\\NotBetween' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Predicate/NotBetween.php',
+ 'Zend\\Db\\Sql\\Predicate\\NotIn' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Predicate/NotIn.php',
+ 'Zend\\Db\\Sql\\Predicate\\NotLike' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Predicate/NotLike.php',
+ 'Zend\\Db\\Sql\\Predicate\\Operator' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Predicate/Operator.php',
+ 'Zend\\Db\\Sql\\Predicate\\Predicate' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Predicate/Predicate.php',
+ 'Zend\\Db\\Sql\\Predicate\\PredicateInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Predicate/PredicateInterface.php',
+ 'Zend\\Db\\Sql\\Predicate\\PredicateSet' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Predicate/PredicateSet.php',
+ 'Zend\\Db\\Sql\\PreparableSqlInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/PreparableSqlInterface.php',
+ 'Zend\\Db\\Sql\\Select' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Select.php',
+ 'Zend\\Db\\Sql\\Sql' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Sql.php',
+ 'Zend\\Db\\Sql\\SqlInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/SqlInterface.php',
+ 'Zend\\Db\\Sql\\TableIdentifier' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/TableIdentifier.php',
+ 'Zend\\Db\\Sql\\Update' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Update.php',
+ 'Zend\\Db\\Sql\\Where' => __DIR__ . '/..' . '/zendframework/zend-db/src/Sql/Where.php',
+ 'Zend\\Db\\TableGateway\\AbstractTableGateway' => __DIR__ . '/..' . '/zendframework/zend-db/src/TableGateway/AbstractTableGateway.php',
+ 'Zend\\Db\\TableGateway\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/TableGateway/Exception/ExceptionInterface.php',
+ 'Zend\\Db\\TableGateway\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-db/src/TableGateway/Exception/InvalidArgumentException.php',
+ 'Zend\\Db\\TableGateway\\Exception\\RuntimeException' => __DIR__ . '/..' . '/zendframework/zend-db/src/TableGateway/Exception/RuntimeException.php',
+ 'Zend\\Db\\TableGateway\\Feature\\AbstractFeature' => __DIR__ . '/..' . '/zendframework/zend-db/src/TableGateway/Feature/AbstractFeature.php',
+ 'Zend\\Db\\TableGateway\\Feature\\EventFeature' => __DIR__ . '/..' . '/zendframework/zend-db/src/TableGateway/Feature/EventFeature.php',
+ 'Zend\\Db\\TableGateway\\Feature\\EventFeatureEventsInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/TableGateway/Feature/EventFeatureEventsInterface.php',
+ 'Zend\\Db\\TableGateway\\Feature\\EventFeature\\TableGatewayEvent' => __DIR__ . '/..' . '/zendframework/zend-db/src/TableGateway/Feature/EventFeature/TableGatewayEvent.php',
+ 'Zend\\Db\\TableGateway\\Feature\\FeatureSet' => __DIR__ . '/..' . '/zendframework/zend-db/src/TableGateway/Feature/FeatureSet.php',
+ 'Zend\\Db\\TableGateway\\Feature\\GlobalAdapterFeature' => __DIR__ . '/..' . '/zendframework/zend-db/src/TableGateway/Feature/GlobalAdapterFeature.php',
+ 'Zend\\Db\\TableGateway\\Feature\\MasterSlaveFeature' => __DIR__ . '/..' . '/zendframework/zend-db/src/TableGateway/Feature/MasterSlaveFeature.php',
+ 'Zend\\Db\\TableGateway\\Feature\\MetadataFeature' => __DIR__ . '/..' . '/zendframework/zend-db/src/TableGateway/Feature/MetadataFeature.php',
+ 'Zend\\Db\\TableGateway\\Feature\\RowGatewayFeature' => __DIR__ . '/..' . '/zendframework/zend-db/src/TableGateway/Feature/RowGatewayFeature.php',
+ 'Zend\\Db\\TableGateway\\Feature\\SequenceFeature' => __DIR__ . '/..' . '/zendframework/zend-db/src/TableGateway/Feature/SequenceFeature.php',
+ 'Zend\\Db\\TableGateway\\TableGateway' => __DIR__ . '/..' . '/zendframework/zend-db/src/TableGateway/TableGateway.php',
+ 'Zend\\Db\\TableGateway\\TableGatewayInterface' => __DIR__ . '/..' . '/zendframework/zend-db/src/TableGateway/TableGatewayInterface.php',
+ 'Zend\\Stdlib\\AbstractOptions' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/AbstractOptions.php',
+ 'Zend\\Stdlib\\ArrayObject' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ArrayObject.php',
+ 'Zend\\Stdlib\\ArraySerializableInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ArraySerializableInterface.php',
+ 'Zend\\Stdlib\\ArrayStack' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ArrayStack.php',
+ 'Zend\\Stdlib\\ArrayUtils' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ArrayUtils.php',
+ 'Zend\\Stdlib\\ArrayUtils\\MergeRemoveKey' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ArrayUtils/MergeRemoveKey.php',
+ 'Zend\\Stdlib\\ArrayUtils\\MergeReplaceKey' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ArrayUtils/MergeReplaceKey.php',
+ 'Zend\\Stdlib\\ArrayUtils\\MergeReplaceKeyInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ArrayUtils/MergeReplaceKeyInterface.php',
+ 'Zend\\Stdlib\\ConsoleHelper' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ConsoleHelper.php',
+ 'Zend\\Stdlib\\DispatchableInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/DispatchableInterface.php',
+ 'Zend\\Stdlib\\ErrorHandler' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ErrorHandler.php',
+ 'Zend\\Stdlib\\Exception\\BadMethodCallException' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Exception/BadMethodCallException.php',
+ 'Zend\\Stdlib\\Exception\\DomainException' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Exception/DomainException.php',
+ 'Zend\\Stdlib\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Exception/ExceptionInterface.php',
+ 'Zend\\Stdlib\\Exception\\ExtensionNotLoadedException' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Exception/ExtensionNotLoadedException.php',
+ 'Zend\\Stdlib\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Exception/InvalidArgumentException.php',
+ 'Zend\\Stdlib\\Exception\\LogicException' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Exception/LogicException.php',
+ 'Zend\\Stdlib\\Exception\\RuntimeException' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Exception/RuntimeException.php',
+ 'Zend\\Stdlib\\FastPriorityQueue' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/FastPriorityQueue.php',
+ 'Zend\\Stdlib\\Glob' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Glob.php',
+ 'Zend\\Stdlib\\Guard\\AllGuardsTrait' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Guard/AllGuardsTrait.php',
+ 'Zend\\Stdlib\\Guard\\ArrayOrTraversableGuardTrait' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Guard/ArrayOrTraversableGuardTrait.php',
+ 'Zend\\Stdlib\\Guard\\EmptyGuardTrait' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Guard/EmptyGuardTrait.php',
+ 'Zend\\Stdlib\\Guard\\NullGuardTrait' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Guard/NullGuardTrait.php',
+ 'Zend\\Stdlib\\InitializableInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/InitializableInterface.php',
+ 'Zend\\Stdlib\\JsonSerializable' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/JsonSerializable.php',
+ 'Zend\\Stdlib\\Message' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Message.php',
+ 'Zend\\Stdlib\\MessageInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/MessageInterface.php',
+ 'Zend\\Stdlib\\ParameterObjectInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ParameterObjectInterface.php',
+ 'Zend\\Stdlib\\Parameters' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Parameters.php',
+ 'Zend\\Stdlib\\ParametersInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ParametersInterface.php',
+ 'Zend\\Stdlib\\PriorityList' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/PriorityList.php',
+ 'Zend\\Stdlib\\PriorityQueue' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/PriorityQueue.php',
+ 'Zend\\Stdlib\\Request' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Request.php',
+ 'Zend\\Stdlib\\RequestInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/RequestInterface.php',
+ 'Zend\\Stdlib\\Response' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/Response.php',
+ 'Zend\\Stdlib\\ResponseInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/ResponseInterface.php',
+ 'Zend\\Stdlib\\SplPriorityQueue' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/SplPriorityQueue.php',
+ 'Zend\\Stdlib\\SplQueue' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/SplQueue.php',
+ 'Zend\\Stdlib\\SplStack' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/SplStack.php',
+ 'Zend\\Stdlib\\StringUtils' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/StringUtils.php',
+ 'Zend\\Stdlib\\StringWrapper\\AbstractStringWrapper' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/StringWrapper/AbstractStringWrapper.php',
+ 'Zend\\Stdlib\\StringWrapper\\Iconv' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/StringWrapper/Iconv.php',
+ 'Zend\\Stdlib\\StringWrapper\\Intl' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/StringWrapper/Intl.php',
+ 'Zend\\Stdlib\\StringWrapper\\MbString' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/StringWrapper/MbString.php',
+ 'Zend\\Stdlib\\StringWrapper\\Native' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/StringWrapper/Native.php',
+ 'Zend\\Stdlib\\StringWrapper\\StringWrapperInterface' => __DIR__ . '/..' . '/zendframework/zend-stdlib/src/StringWrapper/StringWrapperInterface.php',
+ 'phpDocumentor\\Reflection\\DocBlock' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock.php',
+ 'phpDocumentor\\Reflection\\DocBlockFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlockFactory.php',
+ 'phpDocumentor\\Reflection\\DocBlockFactoryInterface' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Description' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Description.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\DescriptionFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\ExampleFinder' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Serializer' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\StandardTagFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\TagFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Author' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\BaseTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Covers' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Deprecated' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Example' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\StaticMethod' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\Strategy' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/Strategy.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\AlignFormatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\PassthroughFormatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Generic' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Link' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Method' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Param' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Property' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyRead' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyWrite' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Fqsen' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Reference' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Url' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Return_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\See' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Since' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Source' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Throws' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Uses' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Var_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php',
+ 'phpDocumentor\\Reflection\\DocBlock\\Tags\\Version' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php',
+ 'phpDocumentor\\Reflection\\Element' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Element.php',
+ 'phpDocumentor\\Reflection\\File' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/File.php',
+ 'phpDocumentor\\Reflection\\Fqsen' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Fqsen.php',
+ 'phpDocumentor\\Reflection\\FqsenResolver' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/FqsenResolver.php',
+ 'phpDocumentor\\Reflection\\Location' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Location.php',
+ 'phpDocumentor\\Reflection\\Project' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Project.php',
+ 'phpDocumentor\\Reflection\\ProjectFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/ProjectFactory.php',
+ 'phpDocumentor\\Reflection\\Type' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Type.php',
+ 'phpDocumentor\\Reflection\\TypeResolver' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/TypeResolver.php',
+ 'phpDocumentor\\Reflection\\Types\\Array_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Array_.php',
+ 'phpDocumentor\\Reflection\\Types\\Boolean' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Boolean.php',
+ 'phpDocumentor\\Reflection\\Types\\Callable_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Callable_.php',
+ 'phpDocumentor\\Reflection\\Types\\Compound' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Compound.php',
+ 'phpDocumentor\\Reflection\\Types\\Context' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Context.php',
+ 'phpDocumentor\\Reflection\\Types\\ContextFactory' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ContextFactory.php',
+ 'phpDocumentor\\Reflection\\Types\\Float_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Float_.php',
+ 'phpDocumentor\\Reflection\\Types\\Integer' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Integer.php',
+ 'phpDocumentor\\Reflection\\Types\\Iterable_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Iterable_.php',
+ 'phpDocumentor\\Reflection\\Types\\Mixed_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Mixed_.php',
+ 'phpDocumentor\\Reflection\\Types\\Null_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Null_.php',
+ 'phpDocumentor\\Reflection\\Types\\Nullable' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Nullable.php',
+ 'phpDocumentor\\Reflection\\Types\\Object_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Object_.php',
+ 'phpDocumentor\\Reflection\\Types\\Parent_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Parent_.php',
+ 'phpDocumentor\\Reflection\\Types\\Resource_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Resource_.php',
+ 'phpDocumentor\\Reflection\\Types\\Scalar' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Scalar.php',
+ 'phpDocumentor\\Reflection\\Types\\Self_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Self_.php',
+ 'phpDocumentor\\Reflection\\Types\\Static_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Static_.php',
+ 'phpDocumentor\\Reflection\\Types\\String_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/String_.php',
+ 'phpDocumentor\\Reflection\\Types\\This' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/This.php',
+ 'phpDocumentor\\Reflection\\Types\\Void_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Void_.php',
+ );
+
+ public static function getInitializer(ClassLoader $loader)
+ {
+ return \Closure::bind(function () use ($loader) {
+ $loader->prefixLengthsPsr4 = ComposerStaticInit989a4969ed6a6e584179ae2090c4eecd::$prefixLengthsPsr4;
+ $loader->prefixDirsPsr4 = ComposerStaticInit989a4969ed6a6e584179ae2090c4eecd::$prefixDirsPsr4;
+ $loader->prefixesPsr0 = ComposerStaticInit989a4969ed6a6e584179ae2090c4eecd::$prefixesPsr0;
+ $loader->classMap = ComposerStaticInit989a4969ed6a6e584179ae2090c4eecd::$classMap;
+
+ }, null, ClassLoader::class);
+ }
+}
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
new file mode 100644
index 0000000000..378218e446
--- /dev/null
+++ b/vendor/composer/installed.json
@@ -0,0 +1,3929 @@
+[
+ {
+ "name": "psr/log",
+ "version": "1.0.2",
+ "version_normalized": "1.0.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "time": "2016-10-10T12:19:37+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ]
+ },
+ {
+ "name": "monolog/monolog",
+ "version": "1.23.0",
+ "version_normalized": "1.23.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/monolog.git",
+ "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4",
+ "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "psr/log": "~1.0"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0.0"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+ "doctrine/couchdb": "~1.0@dev",
+ "graylog2/gelf-php": "~1.0",
+ "jakub-onderka/php-parallel-lint": "0.9",
+ "php-amqplib/php-amqplib": "~2.4",
+ "php-console/php-console": "^3.1.3",
+ "phpunit/phpunit": "~4.5",
+ "phpunit/phpunit-mock-objects": "2.3.0",
+ "ruflin/elastica": ">=0.90 <3.0",
+ "sentry/sentry": "^0.13",
+ "swiftmailer/swiftmailer": "^5.3|^6.0"
+ },
+ "suggest": {
+ "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+ "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+ "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+ "ext-mongo": "Allow sending log messages to a MongoDB server",
+ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+ "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
+ "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+ "php-console/php-console": "Allow sending log messages to Google Chrome",
+ "rollbar/rollbar": "Allow sending log messages to Rollbar",
+ "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
+ "sentry/sentry": "Allow sending log messages to a Sentry server"
+ },
+ "time": "2017-06-19T01:22:40+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Monolog\\": "src/Monolog"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+ "homepage": "http://github.com/Seldaek/monolog",
+ "keywords": [
+ "log",
+ "logging",
+ "psr-3"
+ ]
+ },
+ {
+ "name": "zendframework/zend-stdlib",
+ "version": "3.2.0",
+ "version_normalized": "3.2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/zendframework/zend-stdlib.git",
+ "reference": "cd164b4a18b5d1aeb69be2c26db035b5ed6925ae"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/cd164b4a18b5d1aeb69be2c26db035b5ed6925ae",
+ "reference": "cd164b4a18b5d1aeb69be2c26db035b5ed6925ae",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "phpbench/phpbench": "^0.13",
+ "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2",
+ "zendframework/zend-coding-standard": "~1.0.0"
+ },
+ "time": "2018-04-30T13:50:40+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2.x-dev",
+ "dev-develop": "3.3.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Zend\\Stdlib\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "SPL extensions, array utilities, error handlers, and more",
+ "keywords": [
+ "ZendFramework",
+ "stdlib",
+ "zf"
+ ]
+ },
+ {
+ "name": "zendframework/zend-db",
+ "version": "dev-directus",
+ "version_normalized": "dev-directus",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/wellingguzman/zend-db",
+ "reference": "ef55371343a85e5cd0937d0ab9d30da7e86f5ab3"
+ },
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "zendframework/zend-stdlib": "^2.7 || ^3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.25 || ^6.4.4",
+ "zendframework/zend-coding-standard": "~1.0.0",
+ "zendframework/zend-eventmanager": "^2.6.2 || ^3.0",
+ "zendframework/zend-hydrator": "^1.1 || ^2.1",
+ "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3"
+ },
+ "suggest": {
+ "zendframework/zend-eventmanager": "Zend\\EventManager component",
+ "zendframework/zend-hydrator": "Zend\\Hydrator component for using HydratingResultSets",
+ "zendframework/zend-servicemanager": "Zend\\ServiceManager component"
+ },
+ "time": "2018-04-05T21:56:49+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.9-dev",
+ "dev-develop": "2.10-dev"
+ },
+ "zf": {
+ "component": "Zend\\Db",
+ "config-provider": "Zend\\Db\\ConfigProvider"
+ }
+ },
+ "installation-source": "source",
+ "autoload": {
+ "psr-4": {
+ "Zend\\Db\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "files": [
+ "test/autoload.php"
+ ],
+ "psr-4": {
+ "ZendTest\\Db\\": "test/"
+ }
+ },
+ "scripts": {
+ "check": [
+ "@cs-check",
+ "@test"
+ ],
+ "cs-check": [
+ "phpcs"
+ ],
+ "cs-fix": [
+ "phpcbf"
+ ],
+ "test": [
+ "phpunit --colors=always"
+ ],
+ "test-coverage": [
+ "phpunit --colors=always --coverage-clover clover.xml"
+ ],
+ "upload-coverage": [
+ "coveralls -v"
+ ]
+ },
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "Database abstraction layer, SQL abstraction, result set abstraction, and RowDataGateway and TableDataGateway implementations",
+ "keywords": [
+ "db",
+ "zendframework",
+ "zf"
+ ],
+ "support": {
+ "docs": "https://docs.zendframework.com/zend-db/",
+ "issues": "https://github.com/zendframework/zend-db/issues",
+ "source": "https://github.com/zendframework/zend-db",
+ "rss": "https://github.com/zendframework/zend-db/releases.atom",
+ "slack": "https://zendframework-slack.herokuapp.com",
+ "forum": "https://discourse.zendframework.com/c/questions/components"
+ }
+ },
+ {
+ "name": "paragonie/random_compat",
+ "version": "v2.0.15",
+ "version_normalized": "2.0.15.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/paragonie/random_compat.git",
+ "reference": "10bcb46e8f3d365170f6de9d05245aa066b81f09"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/paragonie/random_compat/zipball/10bcb46e8f3d365170f6de9d05245aa066b81f09",
+ "reference": "10bcb46e8f3d365170f6de9d05245aa066b81f09",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*|5.*"
+ },
+ "suggest": {
+ "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+ },
+ "time": "2018-06-08T15:26:40+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "files": [
+ "lib/random.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paragon Initiative Enterprises",
+ "email": "security@paragonie.com",
+ "homepage": "https://paragonie.com"
+ }
+ ],
+ "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+ "keywords": [
+ "csprng",
+ "polyfill",
+ "pseudorandom",
+ "random"
+ ]
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "v1.3.1",
+ "version_normalized": "1.3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.0"
+ },
+ "time": "2016-12-20T10:07:11+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ]
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "version_normalized": "1.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "time": "2016-08-06T14:39:51+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ]
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "1.4.2",
+ "version_normalized": "1.4.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+ "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "psr/http-message": "~1.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "time": "2017-03-20T17:10:46+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Schultze",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ]
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "6.3.3",
+ "version_normalized": "6.3.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba",
+ "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/promises": "^1.0",
+ "guzzlehttp/psr7": "^1.4",
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "ext-curl": "*",
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
+ "psr/log": "^1.0"
+ },
+ "suggest": {
+ "psr/log": "Required for using the Log middleware"
+ },
+ "time": "2018-04-22T15:46:56+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.3-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "rest",
+ "web service"
+ ]
+ },
+ {
+ "name": "league/oauth2-client",
+ "version": "2.3.0",
+ "version_normalized": "2.3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/oauth2-client.git",
+ "reference": "aa2e3df188f0bfd87f7880cc880e906e99923580"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/aa2e3df188f0bfd87f7880cc880e906e99923580",
+ "reference": "aa2e3df188f0bfd87f7880cc880e906e99923580",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/guzzle": "^6.0",
+ "paragonie/random_compat": "^1|^2",
+ "php": "^5.6|^7.0"
+ },
+ "require-dev": {
+ "eloquent/liberator": "^2.0",
+ "eloquent/phony-phpunit": "^1.0|^3.0",
+ "jakub-onderka/php-parallel-lint": "^0.9.2",
+ "phpunit/phpunit": "^5.7|^6.0",
+ "squizlabs/php_codesniffer": "^2.3|^3.0"
+ },
+ "time": "2018-01-13T05:27:58+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "League\\OAuth2\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Alex Bilbie",
+ "email": "hello@alexbilbie.com",
+ "homepage": "http://www.alexbilbie.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Woody Gilk",
+ "homepage": "https://github.com/shadowhand",
+ "role": "Contributor"
+ }
+ ],
+ "description": "OAuth 2.0 Client Library",
+ "keywords": [
+ "Authentication",
+ "SSO",
+ "authorization",
+ "identity",
+ "idp",
+ "oauth",
+ "oauth2",
+ "single sign on"
+ ]
+ },
+ {
+ "name": "league/oauth2-github",
+ "version": "2.0.0",
+ "version_normalized": "2.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/oauth2-github.git",
+ "reference": "e63d64f3ec167c09232d189c6b0c397458a99357"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/oauth2-github/zipball/e63d64f3ec167c09232d189c6b0c397458a99357",
+ "reference": "e63d64f3ec167c09232d189c6b0c397458a99357",
+ "shasum": ""
+ },
+ "require": {
+ "league/oauth2-client": "^2.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "~0.9",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "time": "2017-01-26T01:14:51+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "League\\OAuth2\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Steven Maguire",
+ "email": "stevenmaguire@gmail.com",
+ "homepage": "https://github.com/stevenmaguire"
+ }
+ ],
+ "description": "Github OAuth 2.0 Client Provider for The PHP League OAuth2-Client",
+ "keywords": [
+ "authorisation",
+ "authorization",
+ "client",
+ "github",
+ "oauth",
+ "oauth2"
+ ]
+ },
+ {
+ "name": "league/oauth1-client",
+ "version": "1.7.0",
+ "version_normalized": "1.7.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/oauth1-client.git",
+ "reference": "fca5f160650cb74d23fc11aa570dd61f86dcf647"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/fca5f160650cb74d23fc11aa570dd61f86dcf647",
+ "reference": "fca5f160650cb74d23fc11aa570dd61f86dcf647",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/guzzle": "^6.0",
+ "php": ">=5.5.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9",
+ "phpunit/phpunit": "^4.0",
+ "squizlabs/php_codesniffer": "^2.0"
+ },
+ "time": "2016-08-17T00:36:58+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "League\\OAuth1\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ben Corlett",
+ "email": "bencorlett@me.com",
+ "homepage": "http://www.webcomm.com.au",
+ "role": "Developer"
+ }
+ ],
+ "description": "OAuth 1.0 Client Library",
+ "keywords": [
+ "Authentication",
+ "SSO",
+ "authorization",
+ "bitbucket",
+ "identity",
+ "idp",
+ "oauth",
+ "oauth1",
+ "single sign on",
+ "trello",
+ "tumblr",
+ "twitter"
+ ]
+ },
+ {
+ "name": "wellingguzman/oauth2-okta",
+ "version": "dev-master",
+ "version_normalized": "9999999-dev",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/WellingGuzman/oauth2-okta.git",
+ "reference": "5de9ef704ba079d913f75a40a98ecd61958860a5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/WellingGuzman/oauth2-okta/zipball/5de9ef704ba079d913f75a40a98ecd61958860a5",
+ "reference": "5de9ef704ba079d913f75a40a98ecd61958860a5",
+ "shasum": ""
+ },
+ "require": {
+ "league/oauth2-client": "^2.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "~0.9",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "time": "2018-04-16T18:17:10+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.0.x-dev"
+ }
+ },
+ "installation-source": "source",
+ "autoload": {
+ "psr-4": {
+ "WellingGuzman\\OAuth2\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Welling Guzman",
+ "email": "wellingguzman@gmail.com",
+ "homepage": "https://github.com/wellingguzman"
+ }
+ ],
+ "description": "Okta OAuth 2.0 Client Provider for The PHP League OAuth2-Client",
+ "keywords": [
+ "authorisation",
+ "authorization",
+ "client",
+ "oauth",
+ "oauth2",
+ "okta"
+ ]
+ },
+ {
+ "name": "league/flysystem",
+ "version": "1.0.45",
+ "version_normalized": "1.0.45.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/flysystem.git",
+ "reference": "a99f94e63b512d75f851b181afcdf0ee9ebef7e6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a99f94e63b512d75f851b181afcdf0ee9ebef7e6",
+ "reference": "a99f94e63b512d75f851b181afcdf0ee9ebef7e6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "conflict": {
+ "league/flysystem-sftp": "<1.0.6"
+ },
+ "require-dev": {
+ "ext-fileinfo": "*",
+ "phpspec/phpspec": "^3.4",
+ "phpunit/phpunit": "^5.7"
+ },
+ "suggest": {
+ "ext-fileinfo": "Required for MimeType",
+ "ext-ftp": "Allows you to use FTP server storage",
+ "ext-openssl": "Allows you to use FTPS server storage",
+ "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
+ "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
+ "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
+ "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
+ "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
+ "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
+ "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
+ "league/flysystem-webdav": "Allows you to use WebDAV storage",
+ "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter",
+ "spatie/flysystem-dropbox": "Allows you to use Dropbox storage",
+ "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications"
+ },
+ "time": "2018-05-07T08:44:23+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "League\\Flysystem\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Frank de Jonge",
+ "email": "info@frenky.net"
+ }
+ ],
+ "description": "Filesystem abstraction: Many filesystems, one API.",
+ "keywords": [
+ "Cloud Files",
+ "WebDAV",
+ "abstraction",
+ "aws",
+ "cloud",
+ "copy.com",
+ "dropbox",
+ "file systems",
+ "files",
+ "filesystem",
+ "filesystems",
+ "ftp",
+ "rackspace",
+ "remote",
+ "s3",
+ "sftp",
+ "storage"
+ ]
+ },
+ {
+ "name": "psr/simple-cache",
+ "version": "1.0.1",
+ "version_normalized": "1.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/simple-cache.git",
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "time": "2017-10-23T01:57:42+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Psr\\SimpleCache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for simple caching",
+ "keywords": [
+ "cache",
+ "caching",
+ "psr",
+ "psr-16",
+ "simple-cache"
+ ]
+ },
+ {
+ "name": "doctrine/cache",
+ "version": "v1.7.1",
+ "version_normalized": "1.7.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/cache.git",
+ "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/cache/zipball/b3217d58609e9c8e661cd41357a54d926c4a2a1a",
+ "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "~7.1"
+ },
+ "conflict": {
+ "doctrine/common": ">2.2,<2.4"
+ },
+ "require-dev": {
+ "alcaeus/mongo-php-adapter": "^1.1",
+ "mongodb/mongodb": "^1.1",
+ "phpunit/phpunit": "^5.7",
+ "predis/predis": "~1.0"
+ },
+ "suggest": {
+ "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver"
+ },
+ "time": "2017-08-25T07:02:50+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.7.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "Caching library offering an object-oriented API for many cache backends",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "cache",
+ "caching"
+ ]
+ },
+ {
+ "name": "psr/cache",
+ "version": "1.0.1",
+ "version_normalized": "1.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
+ "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "time": "2016-08-06T20:24:11+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ]
+ },
+ {
+ "name": "cache/cache",
+ "version": "1.0.0",
+ "version_normalized": "1.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-cache/cache.git",
+ "reference": "ca3bd08ebe53f5b13b5c4f589d57b1fe97da001c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-cache/cache/zipball/ca3bd08ebe53f5b13b5c4f589d57b1fe97da001c",
+ "reference": "ca3bd08ebe53f5b13b5c4f589d57b1fe97da001c",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/cache": "^1.3",
+ "league/flysystem": "^1.0",
+ "php": "^5.6 || ^7.0",
+ "psr/cache": "^1.0",
+ "psr/log": "^1.0",
+ "psr/simple-cache": "^1.0"
+ },
+ "conflict": {
+ "cache/adapter-common": "*",
+ "cache/apc-adapter": "*",
+ "cache/apcu-adapter": "*",
+ "cache/array-adapter": "*",
+ "cache/chain-adapter": "*",
+ "cache/doctrine-adapter": "*",
+ "cache/filesystem-adapter": "*",
+ "cache/hierarchical-cache": "*",
+ "cache/illuminate-adapter": "*",
+ "cache/memcache-adapter": "*",
+ "cache/memcached-adapter": "*",
+ "cache/mongodb-adapter": "*",
+ "cache/predis-adapter": "*",
+ "cache/psr-6-doctrine-bridge": "*",
+ "cache/redis-adapter": "*",
+ "cache/session-handler": "*",
+ "cache/taggable-cache": "*",
+ "cache/void-adapter": "*"
+ },
+ "require-dev": {
+ "cache/integration-tests": "^0.16",
+ "defuse/php-encryption": "^2.0",
+ "illuminate/cache": "^5.4",
+ "mockery/mockery": "^0.9.9",
+ "phpunit/phpunit": "^5.7.21",
+ "predis/predis": "^1.1",
+ "symfony/cache": "^3.1"
+ },
+ "suggest": {
+ "ext-apc": "APC extension is required to use the APC Adapter",
+ "ext-apcu": "APCu extension is required to use the APCu Adapter",
+ "ext-memcache": "Memcache extension is required to use the Memcache Adapter",
+ "ext-memcached": "Memcached extension is required to use the Memcached Adapter",
+ "ext-mongodb": "Mongodb extension required to use the Mongodb adapter",
+ "ext-redis": "Redis extension is required to use the Redis adapter",
+ "mongodb/mongodb": "Mongodb lib required to use the Mongodb adapter"
+ },
+ "time": "2017-07-17T11:15:08+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Cache\\": "src/"
+ },
+ "exclude-from-classmap": [
+ "**/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aaron Scherer",
+ "email": "aequasi@gmail.com",
+ "homepage": "https://github.com/aequasi"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/nyholm"
+ }
+ ],
+ "description": "Library of all the php-cache adapters",
+ "homepage": "http://www.php-cache.com/en/latest/",
+ "keywords": [
+ "cache",
+ "psr6"
+ ]
+ },
+ {
+ "name": "akrabat/rka-ip-address-middleware",
+ "version": "0.5",
+ "version_normalized": "0.5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/akrabat/rka-ip-address-middleware.git",
+ "reference": "832687b13bae4d7fe889fab1414aef6fafeecf80"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/akrabat/rka-ip-address-middleware/zipball/832687b13bae4d7fe889fab1414aef6fafeecf80",
+ "reference": "832687b13bae4d7fe889fab1414aef6fafeecf80",
+ "shasum": ""
+ },
+ "require": {
+ "psr/http-message": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8",
+ "squizlabs/php_codesniffer": "^2.3",
+ "zendframework/zend-diactoros": "^1.1"
+ },
+ "time": "2016-11-13T12:23:41+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "RKA\\Middleware\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Rob Allen",
+ "email": "rob@akrabat.com",
+ "homepage": "http://akrabat.com"
+ }
+ ],
+ "description": "PSR-7 Middleware that determines the client IP address and stores it as an ServerRequest attribute",
+ "homepage": "http://github.com/akrabat/rka-ip-address-middleware",
+ "keywords": [
+ "IP",
+ "middleware",
+ "psr7"
+ ],
+ "abandoned": "akrabat/ip-address-middleware"
+ },
+ {
+ "name": "firebase/php-jwt",
+ "version": "v5.0.0",
+ "version_normalized": "5.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/firebase/php-jwt.git",
+ "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/firebase/php-jwt/zipball/9984a4d3a32ae7673d6971ea00bae9d0a1abba0e",
+ "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": " 4.8.35"
+ },
+ "time": "2017-06-27T22:17:23+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Firebase\\JWT\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Neuman Vong",
+ "email": "neuman+pear@twilio.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Anant Narayanan",
+ "email": "anant@php.net",
+ "role": "Developer"
+ }
+ ],
+ "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
+ "homepage": "https://github.com/firebase/php-jwt"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.8.0",
+ "version_normalized": "1.8.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/7cc359f1b7b80fc25ed7796be7d96adc9b354bae",
+ "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "time": "2018-04-30T19:57:29+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.8-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ },
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ]
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v4.1.0",
+ "version_normalized": "4.1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "80e4bfa9685fc4a09acc4a857ec16974a9cd944e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/80e4bfa9685fc4a09acc4a857ec16974a9cd944e",
+ "reference": "80e4bfa9685fc4a09acc4a857ec16974a9cd944e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "conflict": {
+ "symfony/console": "<3.4"
+ },
+ "require-dev": {
+ "symfony/console": "~3.4|~4.0"
+ },
+ "suggest": {
+ "symfony/console": "For validating YAML files using the lint command"
+ },
+ "time": "2018-05-30T07:26:09+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.8.0",
+ "version_normalized": "1.8.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "3296adf6a6454a050679cde90f95350ad604b171"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171",
+ "reference": "3296adf6a6454a050679cde90f95350ad604b171",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "time": "2018-04-26T10:06:28+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.8-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ]
+ },
+ {
+ "name": "symfony/console",
+ "version": "v4.1.0",
+ "version_normalized": "4.1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "2d5d973bf9933d46802b01010bd25c800c87c242"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/2d5d973bf9933d46802b01010bd25c800c87c242",
+ "reference": "2d5d973bf9933d46802b01010bd25c800c87c242",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<3.4",
+ "symfony/process": "<3.3"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~3.4|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/event-dispatcher": "~3.4|~4.0",
+ "symfony/lock": "~3.4|~4.0",
+ "symfony/process": "~3.4|~4.0"
+ },
+ "suggest": {
+ "psr/log-implementation": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/lock": "",
+ "symfony/process": ""
+ },
+ "time": "2018-05-30T07:26:09+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Console Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v4.1.0",
+ "version_normalized": "4.1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "562bf7005b55fd80d26b582d28e3e10f2dd5ae9c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/562bf7005b55fd80d26b582d28e3e10f2dd5ae9c",
+ "reference": "562bf7005b55fd80d26b582d28e3e10f2dd5ae9c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "time": "2018-05-30T07:26:09+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Filesystem Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/config",
+ "version": "v4.1.0",
+ "version_normalized": "4.1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/config.git",
+ "reference": "5ceefc256caecc3e25147c4e5b933de71d0020c4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/config/zipball/5ceefc256caecc3e25147c4e5b933de71d0020c4",
+ "reference": "5ceefc256caecc3e25147c4e5b933de71d0020c4",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/filesystem": "~3.4|~4.0",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "conflict": {
+ "symfony/finder": "<3.4"
+ },
+ "require-dev": {
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/event-dispatcher": "~3.4|~4.0",
+ "symfony/finder": "~3.4|~4.0",
+ "symfony/yaml": "~3.4|~4.0"
+ },
+ "suggest": {
+ "symfony/yaml": "To use the yaml reference dumper"
+ },
+ "time": "2018-05-16T14:33:22+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Config\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Config Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "robmorgan/phinx",
+ "version": "0.9.2",
+ "version_normalized": "0.9.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cakephp/phinx.git",
+ "reference": "e1698319ad55157c233b658c08f7a10617e797ca"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cakephp/phinx/zipball/e1698319ad55157c233b658c08f7a10617e797ca",
+ "reference": "e1698319ad55157c233b658c08f7a10617e797ca",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4",
+ "symfony/config": "^2.8|^3.0|^4.0",
+ "symfony/console": "^2.8|^3.0|^4.0",
+ "symfony/yaml": "^2.8|^3.0|^4.0"
+ },
+ "require-dev": {
+ "cakephp/cakephp-codesniffer": "^3.0",
+ "phpunit/phpunit": "^4.8.35|^5.7|^6.5"
+ },
+ "time": "2017-12-23T06:48:51+00:00",
+ "bin": [
+ "bin/phinx"
+ ],
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Phinx\\": "src/Phinx"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Woody Gilk",
+ "email": "woody.gilk@gmail.com",
+ "homepage": "http://shadowhand.me",
+ "role": "Developer"
+ },
+ {
+ "name": "Rob Morgan",
+ "email": "robbym@gmail.com",
+ "homepage": "https://robmorgan.id.au",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Richard Quadling",
+ "email": "rquadling@gmail.com",
+ "role": "Developer"
+ },
+ {
+ "name": "CakePHP Community",
+ "homepage": "https://github.com/cakephp/phinx/graphs/contributors"
+ }
+ ],
+ "description": "Phinx makes it ridiculously easy to manage the database migrations for your PHP app.",
+ "homepage": "https://phinx.org",
+ "keywords": [
+ "database",
+ "database migrations",
+ "db",
+ "migrations",
+ "phinx"
+ ]
+ },
+ {
+ "name": "wellingguzman/rate-limit",
+ "version": "dev-master",
+ "version_normalized": "9999999-dev",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/WellingGuzman/rate-limit.git",
+ "reference": "4930e8715f820452c3c2f2f6375533e6863dd669"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/WellingGuzman/rate-limit/zipball/4930e8715f820452c3c2f2f6375533e6863dd669",
+ "reference": "4930e8715f820452c3c2f2f6375533e6863dd669",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 | ^7.0",
+ "psr/http-message": "^1.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.0",
+ "phpunit/phpunit": "^4.7 | ^5.0",
+ "zendframework/zend-diactoros": "^1.3"
+ },
+ "time": "2018-06-15T22:46:19+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "source",
+ "autoload": {
+ "psr-4": {
+ "RateLimit\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nikola Poša",
+ "email": "posa.nikola@gmail.com",
+ "homepage": "http://www.nikolaposa.in.rs"
+ },
+ {
+ "name": "Welling Guzmán",
+ "email": "hola@wellingguzman.com",
+ "homepage": "http://wellingguzman.com"
+ }
+ ],
+ "description": "Standalone component that facilitates rate-limiting functionality. Also provides a middleware designed for API and/or other application endpoints.",
+ "keywords": [
+ "middleware",
+ "rate limit"
+ ]
+ },
+ {
+ "name": "psr/container",
+ "version": "1.0.0",
+ "version_normalized": "1.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "time": "2017-02-14T16:28:37+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ]
+ },
+ {
+ "name": "container-interop/container-interop",
+ "version": "1.2.0",
+ "version_normalized": "1.2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/container-interop/container-interop.git",
+ "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8",
+ "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8",
+ "shasum": ""
+ },
+ "require": {
+ "psr/container": "^1.0"
+ },
+ "time": "2017-02-14T19:40:03+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Interop\\Container\\": "src/Interop/Container/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
+ "homepage": "https://github.com/container-interop/container-interop"
+ },
+ {
+ "name": "nikic/fast-route",
+ "version": "v1.3.0",
+ "version_normalized": "1.3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/FastRoute.git",
+ "reference": "181d480e08d9476e61381e04a71b34dc0432e812"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812",
+ "reference": "181d480e08d9476e61381e04a71b34dc0432e812",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35|~5.7"
+ },
+ "time": "2018-02-13T20:26:39+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "FastRoute\\": "src/"
+ },
+ "files": [
+ "src/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov",
+ "email": "nikic@php.net"
+ }
+ ],
+ "description": "Fast request router for PHP",
+ "keywords": [
+ "router",
+ "routing"
+ ]
+ },
+ {
+ "name": "pimple/pimple",
+ "version": "v3.2.3",
+ "version_normalized": "3.2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/silexphp/Pimple.git",
+ "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32",
+ "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "psr/container": "^1.0"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "^3.2"
+ },
+ "time": "2018-01-21T07:42:36+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Pimple": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Pimple, a simple Dependency Injection Container",
+ "homepage": "http://pimple.sensiolabs.org",
+ "keywords": [
+ "container",
+ "dependency injection"
+ ]
+ },
+ {
+ "name": "slim/slim",
+ "version": "3.10.0",
+ "version_normalized": "3.10.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/slimphp/Slim.git",
+ "reference": "d8aabeacc3688b25e2f2dd2db91df91ec6fdd748"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/slimphp/Slim/zipball/d8aabeacc3688b25e2f2dd2db91df91ec6fdd748",
+ "reference": "d8aabeacc3688b25e2f2dd2db91df91ec6fdd748",
+ "shasum": ""
+ },
+ "require": {
+ "container-interop/container-interop": "^1.2",
+ "nikic/fast-route": "^1.0",
+ "php": ">=5.5.0",
+ "pimple/pimple": "^3.0",
+ "psr/container": "^1.0",
+ "psr/http-message": "^1.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.0",
+ "squizlabs/php_codesniffer": "^2.5"
+ },
+ "time": "2018-04-19T19:29:08+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Slim\\": "Slim"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Rob Allen",
+ "email": "rob@akrabat.com",
+ "homepage": "http://akrabat.com"
+ },
+ {
+ "name": "Josh Lockhart",
+ "email": "hello@joshlockhart.com",
+ "homepage": "https://joshlockhart.com"
+ },
+ {
+ "name": "Gabriel Manricks",
+ "email": "gmanricks@me.com",
+ "homepage": "http://gabrielmanricks.com"
+ },
+ {
+ "name": "Andrew Smith",
+ "email": "a.smith@silentworks.co.uk",
+ "homepage": "http://silentworks.co.uk"
+ }
+ ],
+ "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs",
+ "homepage": "https://slimframework.com",
+ "keywords": [
+ "api",
+ "framework",
+ "micro",
+ "router"
+ ]
+ },
+ {
+ "name": "swiftmailer/swiftmailer",
+ "version": "v5.4.9",
+ "version_normalized": "5.4.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/swiftmailer/swiftmailer.git",
+ "reference": "7ffc1ea296ed14bf8260b6ef11b80208dbadba91"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/7ffc1ea296ed14bf8260b6ef11b80208dbadba91",
+ "reference": "7ffc1ea296ed14bf8260b6ef11b80208dbadba91",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "mockery/mockery": "~0.9.1",
+ "symfony/phpunit-bridge": "~3.2"
+ },
+ "time": "2018-01-23T07:37:21+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.4-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "files": [
+ "lib/swift_required.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Chris Corbyn"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Swiftmailer, free feature-rich PHP mailer",
+ "homepage": "https://swiftmailer.symfony.com",
+ "keywords": [
+ "email",
+ "mail",
+ "mailer"
+ ]
+ },
+ {
+ "name": "league/oauth2-google",
+ "version": "2.2.0",
+ "version_normalized": "2.2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/oauth2-google.git",
+ "reference": "c0faed29ec6d665ce3234e01f62029516cee4c02"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/oauth2-google/zipball/c0faed29ec6d665ce3234e01f62029516cee4c02",
+ "reference": "c0faed29ec6d665ce3234e01f62029516cee4c02",
+ "shasum": ""
+ },
+ "require": {
+ "league/oauth2-client": "^2.0"
+ },
+ "require-dev": {
+ "eloquent/phony": "^0.14.6",
+ "phpunit/phpunit": "^5.7",
+ "satooshi/php-coveralls": "^2.0",
+ "squizlabs/php_codesniffer": "^2.0"
+ },
+ "time": "2018-03-19T17:28:55+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "League\\OAuth2\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Woody Gilk",
+ "email": "woody.gilk@gmail.com",
+ "homepage": "http://shadowhand.me"
+ }
+ ],
+ "description": "Google OAuth 2.0 Client Provider for The PHP League OAuth2-Client",
+ "keywords": [
+ "Authentication",
+ "authorization",
+ "client",
+ "google",
+ "oauth",
+ "oauth2"
+ ]
+ },
+ {
+ "name": "league/oauth2-facebook",
+ "version": "2.0.1",
+ "version_normalized": "2.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/oauth2-facebook.git",
+ "reference": "bcbcd540fb66ae16b4f82671c8ae7752b6a89556"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/oauth2-facebook/zipball/bcbcd540fb66ae16b4f82671c8ae7752b6a89556",
+ "reference": "bcbcd540fb66ae16b4f82671c8ae7752b6a89556",
+ "shasum": ""
+ },
+ "require": {
+ "league/oauth2-client": "^2.0",
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "~0.9",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "time": "2017-07-22T01:25:00+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "League\\OAuth2\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Sammy Kaye Powers",
+ "email": "me@sammyk.me",
+ "homepage": "http://www.sammyk.me"
+ }
+ ],
+ "description": "Facebook OAuth 2.0 Client Provider for The PHP League OAuth2-Client",
+ "keywords": [
+ "Authentication",
+ "authorization",
+ "client",
+ "facebook",
+ "oauth",
+ "oauth2"
+ ]
+ },
+ {
+ "name": "intervention/image",
+ "version": "2.4.2",
+ "version_normalized": "2.4.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Intervention/image.git",
+ "reference": "e82d274f786e3d4b866a59b173f42e716f0783eb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Intervention/image/zipball/e82d274f786e3d4b866a59b173f42e716f0783eb",
+ "reference": "e82d274f786e3d4b866a59b173f42e716f0783eb",
+ "shasum": ""
+ },
+ "require": {
+ "ext-fileinfo": "*",
+ "guzzlehttp/psr7": "~1.1",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "~0.9.2",
+ "phpunit/phpunit": "^4.8 || ^5.7"
+ },
+ "suggest": {
+ "ext-gd": "to use GD library based image processing.",
+ "ext-imagick": "to use Imagick based image processing.",
+ "intervention/imagecache": "Caching extension for the Intervention Image library"
+ },
+ "time": "2018-05-29T14:19:03+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.4-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Intervention\\Image\\ImageServiceProvider"
+ ],
+ "aliases": {
+ "Image": "Intervention\\Image\\Facades\\Image"
+ }
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Intervention\\Image\\": "src/Intervention/Image"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Oliver Vogel",
+ "email": "oliver@olivervogel.com",
+ "homepage": "http://olivervogel.com/"
+ }
+ ],
+ "description": "Image handling and manipulation library with support for Laravel integration",
+ "homepage": "http://image.intervention.io/",
+ "keywords": [
+ "gd",
+ "image",
+ "imagick",
+ "laravel",
+ "thumbnail",
+ "watermark"
+ ]
+ },
+ {
+ "name": "symfony/translation",
+ "version": "v4.1.0",
+ "version_normalized": "4.1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "16328f5b217cebc8dd4adfe4aeeaa8c377581f5a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/16328f5b217cebc8dd4adfe4aeeaa8c377581f5a",
+ "reference": "16328f5b217cebc8dd4adfe4aeeaa8c377581f5a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/config": "<3.4",
+ "symfony/dependency-injection": "<3.4",
+ "symfony/yaml": "<3.4"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~3.4|~4.0",
+ "symfony/console": "~3.4|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/finder": "~2.8|~3.0|~4.0",
+ "symfony/intl": "~3.4|~4.0",
+ "symfony/yaml": "~3.4|~4.0"
+ },
+ "suggest": {
+ "psr/log-implementation": "To use logging capability in translator",
+ "symfony/config": "",
+ "symfony/yaml": ""
+ },
+ "time": "2018-05-30T07:26:09+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Translation Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/validator",
+ "version": "v3.4.11",
+ "version_normalized": "3.4.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/validator.git",
+ "reference": "62ccdf62042fbca3be1e7b2dae84965940023362"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/validator/zipball/62ccdf62042fbca3be1e7b2dae84965940023362",
+ "reference": "62ccdf62042fbca3be1e7b2dae84965940023362",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9|>=7.0.8",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/translation": "~2.8|~3.0|~4.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+ "symfony/dependency-injection": "<3.3",
+ "symfony/http-kernel": "<3.3.5",
+ "symfony/yaml": "<3.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "~1.0",
+ "doctrine/cache": "~1.0",
+ "egulias/email-validator": "^1.2.8|~2.0",
+ "symfony/cache": "~3.1|~4.0",
+ "symfony/config": "~2.8|~3.0|~4.0",
+ "symfony/dependency-injection": "~3.3|~4.0",
+ "symfony/expression-language": "~2.8|~3.0|~4.0",
+ "symfony/http-foundation": "~2.8|~3.0|~4.0",
+ "symfony/http-kernel": "^3.3.5|~4.0",
+ "symfony/intl": "^2.8.18|^3.2.5|~4.0",
+ "symfony/property-access": "~2.8|~3.0|~4.0",
+ "symfony/var-dumper": "~3.3|~4.0",
+ "symfony/yaml": "~3.4|~4.0"
+ },
+ "suggest": {
+ "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.",
+ "doctrine/cache": "For using the default cached annotation reader and metadata cache.",
+ "egulias/email-validator": "Strict (RFC compliant) email validation",
+ "psr/cache-implementation": "For using the metadata cache.",
+ "symfony/config": "",
+ "symfony/expression-language": "For using the Expression validator",
+ "symfony/http-foundation": "",
+ "symfony/intl": "",
+ "symfony/property-access": "For accessing properties within comparison constraints",
+ "symfony/yaml": ""
+ },
+ "time": "2018-05-18T02:00:55+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Validator\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Validator Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "twig/twig",
+ "version": "v2.4.8",
+ "version_normalized": "2.4.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/twigphp/Twig.git",
+ "reference": "7b604c89da162034bdf4bb66310f358d313dd16d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/7b604c89da162034bdf4bb66310f358d313dd16d",
+ "reference": "7b604c89da162034bdf4bb66310f358d313dd16d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "require-dev": {
+ "psr/container": "^1.0",
+ "symfony/debug": "^2.7",
+ "symfony/phpunit-bridge": "^3.3"
+ },
+ "time": "2018-04-02T09:24:19+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.4-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Twig_": "lib/"
+ },
+ "psr-4": {
+ "Twig\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Armin Ronacher",
+ "email": "armin.ronacher@active-4.com",
+ "role": "Project Founder"
+ },
+ {
+ "name": "Twig Team",
+ "homepage": "http://twig.sensiolabs.org/contributors",
+ "role": "Contributors"
+ }
+ ],
+ "description": "Twig, the flexible, fast, and secure template language for PHP",
+ "homepage": "http://twig.sensiolabs.org",
+ "keywords": [
+ "templating"
+ ]
+ },
+ {
+ "name": "slim/twig-view",
+ "version": "2.4.0",
+ "version_normalized": "2.4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/slimphp/Twig-View.git",
+ "reference": "78386c01a97f7870462b38fff759dad649da9efc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/slimphp/Twig-View/zipball/78386c01a97f7870462b38fff759dad649da9efc",
+ "reference": "78386c01a97f7870462b38fff759dad649da9efc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.0",
+ "psr/http-message": "^1.0",
+ "twig/twig": "^1.18|^2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8|^5.7",
+ "slim/slim": "^3.10"
+ },
+ "time": "2018-05-07T10:54:29+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Slim\\Views\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Josh Lockhart",
+ "email": "hello@joshlockhart.com",
+ "homepage": "http://joshlockhart.com"
+ }
+ ],
+ "description": "Slim Framework 3 view helper built on top of the Twig 2 templating component",
+ "homepage": "http://slimframework.com",
+ "keywords": [
+ "framework",
+ "slim",
+ "template",
+ "twig",
+ "view"
+ ]
+ },
+ {
+ "name": "ramsey/uuid",
+ "version": "3.7.3",
+ "version_normalized": "3.7.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/uuid.git",
+ "reference": "44abcdad877d9a46685a3a4d221e3b2c4b87cb76"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/uuid/zipball/44abcdad877d9a46685a3a4d221e3b2c4b87cb76",
+ "reference": "44abcdad877d9a46685a3a4d221e3b2c4b87cb76",
+ "shasum": ""
+ },
+ "require": {
+ "paragonie/random_compat": "^1.0|^2.0",
+ "php": "^5.4 || ^7.0"
+ },
+ "replace": {
+ "rhumsaa/uuid": "self.version"
+ },
+ "require-dev": {
+ "codeception/aspect-mock": "^1.0 | ~2.0.0",
+ "doctrine/annotations": "~1.2.0",
+ "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ^2.1",
+ "ircmaxell/random-lib": "^1.1",
+ "jakub-onderka/php-parallel-lint": "^0.9.0",
+ "mockery/mockery": "^0.9.9",
+ "moontoast/math": "^1.1",
+ "php-mock/php-mock-phpunit": "^0.3|^1.1",
+ "phpunit/phpunit": "^4.7|^5.0",
+ "squizlabs/php_codesniffer": "^2.3"
+ },
+ "suggest": {
+ "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator",
+ "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator",
+ "ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
+ "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).",
+ "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid",
+ "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
+ },
+ "time": "2018-01-20T00:28:24+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Ramsey\\Uuid\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marijn Huizendveld",
+ "email": "marijn.huizendveld@gmail.com"
+ },
+ {
+ "name": "Thibaud Fabre",
+ "email": "thibaud@aztech.io"
+ },
+ {
+ "name": "Ben Ramsey",
+ "email": "ben@benramsey.com",
+ "homepage": "https://benramsey.com"
+ }
+ ],
+ "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).",
+ "homepage": "https://github.com/ramsey/uuid",
+ "keywords": [
+ "guid",
+ "identifier",
+ "uuid"
+ ]
+ },
+ {
+ "name": "sebastian/version",
+ "version": "2.0.1",
+ "version_normalized": "2.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "time": "2016-10-03T07:35:21+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "1.0.0",
+ "version_normalized": "1.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6.0"
+ },
+ "time": "2015-07-28T20:34:47+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "2.0.0",
+ "version_normalized": "2.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a",
+ "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "time": "2016-11-19T07:33:16+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "2.0.1",
+ "version_normalized": "2.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7",
+ "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6",
+ "sebastian/recursion-context": "~2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~5"
+ },
+ "time": "2017-02-18T15:18:39+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "1.1.1",
+ "version_normalized": "1.1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "time": "2015-10-12T03:26:01+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ]
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "2.0.0",
+ "version_normalized": "2.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
+ "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/recursion-context": "~2.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "~4.4"
+ },
+ "time": "2016-11-19T08:54:04+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ]
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "2.0.0",
+ "version_normalized": "2.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+ "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.0"
+ },
+ "time": "2016-11-26T07:53:53+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ]
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "1.4.3",
+ "version_normalized": "1.4.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4",
+ "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ },
+ "time": "2017-05-22T07:24:03+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ]
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "1.2.4",
+ "version_normalized": "1.2.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+ "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/diff": "~1.2",
+ "sebastian/exporter": "~1.2 || ~2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "time": "2017-01-29T09:50:25+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ]
+ },
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.1.0",
+ "version_normalized": "1.1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda",
+ "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1.8",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpunit/phpunit": "^6.2.3",
+ "squizlabs/php_codesniffer": "^3.0.2"
+ },
+ "time": "2017-07-22T11:58:36+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "http://ocramius.github.com/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://github.com/doctrine/instantiator",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ]
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "version_normalized": "1.2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "time": "2015-06-21T13:50:34+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ]
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "3.4.4",
+ "version_normalized": "3.4.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "a23b761686d50a560cc56233b9ecf49597cc9118"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118",
+ "reference": "a23b761686d50a560cc56233b9ecf49597cc9118",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.6 || ^7.0",
+ "phpunit/php-text-template": "^1.2",
+ "sebastian/exporter": "^1.2 || ^2.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.4"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "time": "2017-06-30T09:13:00+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Mock Object library for PHPUnit",
+ "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+ "keywords": [
+ "mock",
+ "xunit"
+ ]
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "1.0.9",
+ "version_normalized": "1.0.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+ "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ },
+ "time": "2017-02-26T11:10:40+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ]
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.4.5",
+ "version_normalized": "1.4.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4",
+ "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "time": "2017-11-27T13:52:08+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ]
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "1.0.1",
+ "version_normalized": "1.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+ "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7 || ^6.0"
+ },
+ "time": "2017-03-04T06:30:41+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/"
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "2.0.2",
+ "version_normalized": "2.0.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "791198a2c6254db10131eecfe8c06670700904db"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db",
+ "reference": "791198a2c6254db10131eecfe8c06670700904db",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.2.4"
+ },
+ "time": "2017-11-27T05:48:46+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Wrapper around PHP's tokenizer extension.",
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "keywords": [
+ "tokenizer"
+ ]
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "4.0.8",
+ "version_normalized": "4.0.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
+ "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-xmlwriter": "*",
+ "php": "^5.6 || ^7.0",
+ "phpunit/php-file-iterator": "^1.3",
+ "phpunit/php-text-template": "^1.2",
+ "phpunit/php-token-stream": "^1.4.2 || ^2.0",
+ "sebastian/code-unit-reverse-lookup": "^1.0",
+ "sebastian/environment": "^1.3.2 || ^2.0",
+ "sebastian/version": "^1.0 || ^2.0"
+ },
+ "require-dev": {
+ "ext-xdebug": "^2.1.4",
+ "phpunit/phpunit": "^5.7"
+ },
+ "suggest": {
+ "ext-xdebug": "^2.5.1"
+ },
+ "time": "2017-04-02T07:44:40+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ]
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.3.0",
+ "version_normalized": "1.3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "0df1908962e7a3071564e857d86874dad1ef204a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a",
+ "reference": "0df1908962e7a3071564e857d86874dad1ef204a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6",
+ "sebastian/version": "^1.0.1"
+ },
+ "time": "2018-01-29T19:49:41+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ]
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "1.0.1",
+ "version_normalized": "1.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
+ "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "time": "2017-09-11T18:02:19+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ]
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "0.4.0",
+ "version_normalized": "0.4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7",
+ "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5 || ^7.0",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^5.2||^4.8.24"
+ },
+ "time": "2017-07-14T14:27:02+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ]
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "4.3.0",
+ "version_normalized": "4.3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "94fd0001232e47129dd3504189fa1c7225010d08"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08",
+ "reference": "94fd0001232e47129dd3504189fa1c7225010d08",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "phpdocumentor/reflection-common": "^1.0.0",
+ "phpdocumentor/type-resolver": "^0.4.0",
+ "webmozart/assert": "^1.0"
+ },
+ "require-dev": {
+ "doctrine/instantiator": "~1.0.5",
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^6.4"
+ },
+ "time": "2017-11-30T07:14:17+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock."
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "1.7.6",
+ "version_normalized": "1.7.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712",
+ "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0",
+ "sebastian/comparator": "^1.1|^2.0|^3.0",
+ "sebastian/recursion-context": "^1.0|^2.0|^3.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^2.5|^3.2",
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5"
+ },
+ "time": "2018-04-18T13:57:24+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.7.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ]
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.8.1",
+ "version_normalized": "1.8.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8",
+ "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1"
+ },
+ "replace": {
+ "myclabs/deep-copy": "self.version"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.0",
+ "doctrine/common": "^2.6",
+ "phpunit/phpunit": "^7.1"
+ },
+ "time": "2018-06-11T23:09:50+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ },
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ]
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "5.7.27",
+ "version_normalized": "5.7.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c",
+ "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "myclabs/deep-copy": "~1.3",
+ "php": "^5.6 || ^7.0",
+ "phpspec/prophecy": "^1.6.2",
+ "phpunit/php-code-coverage": "^4.0.4",
+ "phpunit/php-file-iterator": "~1.4",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-timer": "^1.0.6",
+ "phpunit/phpunit-mock-objects": "^3.2",
+ "sebastian/comparator": "^1.2.4",
+ "sebastian/diff": "^1.4.3",
+ "sebastian/environment": "^1.3.4 || ^2.0",
+ "sebastian/exporter": "~2.0",
+ "sebastian/global-state": "^1.1",
+ "sebastian/object-enumerator": "~2.0",
+ "sebastian/resource-operations": "~1.0",
+ "sebastian/version": "^1.0.6|^2.0.1",
+ "symfony/yaml": "~2.1|~3.0|~4.0"
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "3.0.2"
+ },
+ "require-dev": {
+ "ext-pdo": "*"
+ },
+ "suggest": {
+ "ext-xdebug": "*",
+ "phpunit/php-invoker": "~1.1"
+ },
+ "time": "2018-02-01T05:50:59+00:00",
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.7.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ]
+ }
+]
diff --git a/vendor/container-interop/container-interop/LICENSE b/vendor/container-interop/container-interop/LICENSE
new file mode 100644
index 0000000000..7671d9020f
--- /dev/null
+++ b/vendor/container-interop/container-interop/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2013 container-interop
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/container-interop/container-interop/README.md b/vendor/container-interop/container-interop/README.md
new file mode 100644
index 0000000000..cdd7a44c8e
--- /dev/null
+++ b/vendor/container-interop/container-interop/README.md
@@ -0,0 +1,148 @@
+# Container Interoperability
+
+[![Latest Stable Version](https://poser.pugx.org/container-interop/container-interop/v/stable.png)](https://packagist.org/packages/container-interop/container-interop)
+[![Total Downloads](https://poser.pugx.org/container-interop/container-interop/downloads.svg)](https://packagist.org/packages/container-interop/container-interop)
+
+## Deprecation warning!
+
+Starting Feb. 13th 2017, container-interop is officially deprecated in favor of [PSR-11](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-11-container.md).
+Container-interop has been the test-bed of PSR-11. From v1.2, container-interop directly extends PSR-11 interfaces.
+Therefore, all containers implementing container-interop are now *de-facto* compatible with PSR-11.
+
+- Projects implementing container-interop interfaces are encouraged to directly implement PSR-11 interfaces instead.
+- Projects consuming container-interop interfaces are very strongly encouraged to directly type-hint on PSR-11 interfaces, in order to be compatible with PSR-11 containers that are not compatible with container-interop.
+
+Regarding the delegate lookup feature, that is present in container-interop and not in PSR-11, the feature is actually a design pattern. It is therefore not deprecated. Documentation regarding this design pattern will be migrated from this repository into a separate website in the future.
+
+## About
+
+*container-interop* tries to identify and standardize features in *container* objects (service locators,
+dependency injection containers, etc.) to achieve interoperability.
+
+Through discussions and trials, we try to create a standard, made of common interfaces but also recommendations.
+
+If PHP projects that provide container implementations begin to adopt these common standards, then PHP
+applications and projects that use containers can depend on the common interfaces instead of specific
+implementations. This facilitates a high-level of interoperability and flexibility that allows users to consume
+*any* container implementation that can be adapted to these interfaces.
+
+The work done in this project is not officially endorsed by the [PHP-FIG](http://www.php-fig.org/), but it is being
+worked on by members of PHP-FIG and other good developers. We adhere to the spirit and ideals of PHP-FIG, and hope
+this project will pave the way for one or more future PSRs.
+
+
+## Installation
+
+You can install this package through Composer:
+
+```json
+composer require container-interop/container-interop
+```
+
+The packages adheres to the [SemVer](http://semver.org/) specification, and there will be full backward compatibility
+between minor versions.
+
+## Standards
+
+### Available
+
+- [`ContainerInterface`](src/Interop/Container/ContainerInterface.php).
+[Description](docs/ContainerInterface.md) [Meta Document](docs/ContainerInterface-meta.md).
+Describes the interface of a container that exposes methods to read its entries.
+- [*Delegate lookup feature*](docs/Delegate-lookup.md).
+[Meta Document](docs/Delegate-lookup-meta.md).
+Describes the ability for a container to delegate the lookup of its dependencies to a third-party container. This
+feature lets several containers work together in a single application.
+
+### Proposed
+
+View open [request for comments](https://github.com/container-interop/container-interop/labels/RFC)
+
+## Compatible projects
+
+### Projects implementing `ContainerInterface`
+
+- [Acclimate](https://github.com/jeremeamia/acclimate-container): Adapters for
+ Aura.Di, Laravel, Nette DI, Pimple, Symfony DI, ZF2 Service manager, ZF2
+ Dependency injection and any container using `ArrayAccess`
+- [Aura.Di](https://github.com/auraphp/Aura.Di)
+- [auryn-container-interop](https://github.com/elazar/auryn-container-interop)
+- [Burlap](https://github.com/codeeverything/burlap)
+- [Chernozem](https://github.com/pyrsmk/Chernozem)
+- [Data Manager](https://github.com/chrismichaels84/data-manager)
+- [Disco](https://github.com/bitexpert/disco)
+- [InDI](https://github.com/idealogica/indi)
+- [League/Container](http://container.thephpleague.com/)
+- [Mouf](http://mouf-php.com)
+- [Njasm Container](https://github.com/njasm/container)
+- [PHP-DI](http://php-di.org)
+- [Picotainer](https://github.com/thecodingmachine/picotainer)
+- [PimpleInterop](https://github.com/moufmouf/pimple-interop)
+- [Pimple3-ContainerInterop](https://github.com/Sam-Burns/pimple3-containerinterop) (using Pimple v3)
+- [SitePoint Container](https://github.com/sitepoint/Container)
+- [Thruster Container](https://github.com/ThrusterIO/container) (PHP7 only)
+- [Ultra-Lite Container](https://github.com/ultra-lite/container)
+- [Unbox](https://github.com/mindplay-dk/unbox)
+- [XStatic](https://github.com/jeremeamia/xstatic)
+- [Zend\ServiceManager](https://github.com/zendframework/zend-servicemanager)
+- [Zit](https://github.com/inxilpro/Zit)
+
+### Projects implementing the *delegate lookup* feature
+
+- [Aura.Di](https://github.com/auraphp/Aura.Di)
+- [Burlap](https://github.com/codeeverything/burlap)
+- [Chernozem](https://github.com/pyrsmk/Chernozem)
+- [InDI](https://github.com/idealogica/indi)
+- [League/Container](http://container.thephpleague.com/)
+- [Mouf](http://mouf-php.com)
+- [Picotainer](https://github.com/thecodingmachine/picotainer)
+- [PHP-DI](http://php-di.org)
+- [PimpleInterop](https://github.com/moufmouf/pimple-interop)
+- [Ultra-Lite Container](https://github.com/ultra-lite/container)
+
+### Middlewares implementing `ContainerInterface`
+
+- [Alias-Container](https://github.com/thecodingmachine/alias-container): add
+ aliases support to any container
+- [Prefixer-Container](https://github.com/thecodingmachine/prefixer-container):
+ dynamically prefix identifiers
+- [Lazy-Container](https://github.com/snapshotpl/lazy-container): lazy services
+
+### Projects using `ContainerInterface`
+
+The list below contains only a sample of all the projects consuming `ContainerInterface`. For a more complete list have a look [here](http://packanalyst.com/class?q=Interop%5CContainer%5CContainerInterface).
+
+| | Downloads |
+| --- | --- |
+| [Adroit](https://github.com/bitexpert/adroit) | ![](https://img.shields.io/packagist/dt/bitexpert/adroit.svg) |
+| [Behat](https://github.com/Behat/Behat/pull/974) | ![](https://img.shields.io/packagist/dt/behat/behat.svg) |
+| [blast-facades](https://github.com/phpthinktank/blast-facades): Minimize complexity and represent dependencies as facades. | ![](https://img.shields.io/packagist/dt/blast/facades.svg) |
+| [interop.silex.di](https://github.com/thecodingmachine/interop.silex.di): an extension to [Silex](http://silex.sensiolabs.org/) that adds support for any *container-interop* compatible container | ![](https://img.shields.io/packagist/dt/mouf/interop.silex.di.svg) |
+| [mindplay/walkway](https://github.com/mindplay-dk/walkway): a modular request router | ![](https://img.shields.io/packagist/dt/mindplay/walkway.svg) |
+| [mindplay/middleman](https://github.com/mindplay-dk/middleman): minimalist PSR-7 middleware dispatcher | ![](https://img.shields.io/packagist/dt/mindplay/middleman.svg) |
+| [PHP-DI/Invoker](https://github.com/PHP-DI/Invoker): extensible and configurable invoker/dispatcher | ![](https://img.shields.io/packagist/dt/php-di/invoker.svg) |
+| [Prophiler](https://github.com/fabfuel/prophiler) | ![](https://img.shields.io/packagist/dt/fabfuel/prophiler.svg) |
+| [Silly](https://github.com/mnapoli/silly): CLI micro-framework | ![](https://img.shields.io/packagist/dt/mnapoli/silly.svg) |
+| [Slim v3](https://github.com/slimphp/Slim) | ![](https://img.shields.io/packagist/dt/slim/slim.svg) |
+| [Splash](http://mouf-php.com/packages/mouf/mvc.splash-common/version/8.0-dev/README.md) | ![](https://img.shields.io/packagist/dt/mouf/mvc.splash-common.svg) |
+| [Woohoo Labs. Harmony](https://github.com/woohoolabs/harmony): a flexible micro-framework | ![](https://img.shields.io/packagist/dt/woohoolabs/harmony.svg) |
+| [zend-expressive](https://github.com/zendframework/zend-expressive) | ![](https://img.shields.io/packagist/dt/zendframework/zend-expressive.svg) |
+
+
+## Workflow
+
+Everyone is welcome to join and contribute.
+
+The general workflow looks like this:
+
+1. Someone opens a discussion (GitHub issue) to suggest an interface
+1. Feedback is gathered
+1. The interface is added to a development branch
+1. We release alpha versions so that the interface can be experimented with
+1. Discussions and edits ensue until the interface is deemed stable by a general consensus
+1. A new minor version of the package is released
+
+We try to not break BC by creating new interfaces instead of editing existing ones.
+
+While we currently work on interfaces, we are open to anything that might help towards interoperability, may that
+be code, best practices, etc.
diff --git a/vendor/container-interop/container-interop/composer.json b/vendor/container-interop/container-interop/composer.json
new file mode 100644
index 0000000000..855f766723
--- /dev/null
+++ b/vendor/container-interop/container-interop/composer.json
@@ -0,0 +1,15 @@
+{
+ "name": "container-interop/container-interop",
+ "type": "library",
+ "description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
+ "homepage": "https://github.com/container-interop/container-interop",
+ "license": "MIT",
+ "autoload": {
+ "psr-4": {
+ "Interop\\Container\\": "src/Interop/Container/"
+ }
+ },
+ "require": {
+ "psr/container": "^1.0"
+ }
+}
diff --git a/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md b/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md
new file mode 100644
index 0000000000..59f3d5599f
--- /dev/null
+++ b/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md
@@ -0,0 +1,114 @@
+# ContainerInterface Meta Document
+
+## Introduction
+
+This document describes the process and discussions that lead to the `ContainerInterface`.
+Its goal is to explain the reasons behind each decision.
+
+## Goal
+
+The goal set by `ContainerInterface` is to standardize how frameworks and libraries make use of a
+container to obtain objects and parameters.
+
+By standardizing such a behavior, frameworks and libraries using the `ContainerInterface`
+could work with any compatible container.
+That would allow end users to choose their own container based on their own preferences.
+
+It is important to distinguish the two usages of a container:
+
+- configuring entries
+- fetching entries
+
+Most of the time, those two sides are not used by the same party.
+While it is often end users who tend to configure entries, it is generally the framework that fetch
+entries to build the application.
+
+This is why this interface focuses only on how entries can be fetched from a container.
+
+## Interface name
+
+The interface name has been thoroughly discussed and was decided by a vote.
+
+The list of options considered with their respective votes are:
+
+- `ContainerInterface`: +8
+- `ProviderInterface`: +2
+- `LocatorInterface`: 0
+- `ReadableContainerInterface`: -5
+- `ServiceLocatorInterface`: -6
+- `ObjectFactory`: -6
+- `ObjectStore`: -8
+- `ConsumerInterface`: -9
+
+[Full results of the vote](https://github.com/container-interop/container-interop/wiki/%231-interface-name:-Vote)
+
+The complete discussion can be read in [the issue #1](https://github.com/container-interop/container-interop/issues/1).
+
+## Interface methods
+
+The choice of which methods the interface would contain was made after a statistical analysis of existing containers.
+The results of this analysis are available [in this document](https://gist.github.com/mnapoli/6159681).
+
+The summary of the analysis showed that:
+
+- all containers offer a method to get an entry by its id
+- a large majority name such method `get()`
+- for all containers, the `get()` method has 1 mandatory parameter of type string
+- some containers have an optional additional argument for `get()`, but it doesn't have the same purpose between containers
+- a large majority of the containers offer a method to test if it can return an entry by its id
+- a majority name such method `has()`
+- for all containers offering `has()`, the method has exactly 1 parameter of type string
+- a large majority of the containers throw an exception rather than returning null when an entry is not found in `get()`
+- a large majority of the containers don't implement `ArrayAccess`
+
+The question of whether to include methods to define entries has been discussed in
+[issue #1](https://github.com/container-interop/container-interop/issues/1).
+It has been judged that such methods do not belong in the interface described here because it is out of its scope
+(see the "Goal" section).
+
+As a result, the `ContainerInterface` contains two methods:
+
+- `get()`, returning anything, with one mandatory string parameter. Should throw an exception if the entry is not found.
+- `has()`, returning a boolean, with one mandatory string parameter.
+
+### Number of parameters in `get()` method
+
+While `ContainerInterface` only defines one mandatory parameter in `get()`, it is not incompatible with
+existing containers that have additional optional parameters. PHP allows an implementation to offer more parameters
+as long as they are optional, because the implementation *does* satisfy the interface.
+
+This issue has been discussed in [issue #6](https://github.com/container-interop/container-interop/issues/6).
+
+### Type of the `$id` parameter
+
+The type of the `$id` parameter in `get()` and `has()` has been discussed in
+[issue #6](https://github.com/container-interop/container-interop/issues/6).
+While `string` is used in all the containers that were analyzed, it was suggested that allowing
+anything (such as objects) could allow containers to offer a more advanced query API.
+
+An example given was to use the container as an object builder. The `$id` parameter would then be an
+object that would describe how to create an instance.
+
+The conclusion of the discussion was that this was beyond the scope of getting entries from a container without
+knowing how the container provided them, and it was more fit for a factory.
+
+## Contributors
+
+Are listed here all people that contributed in the discussions or votes, by alphabetical order:
+
+- [Amy Stephen](https://github.com/AmyStephen)
+- [David Négrier](https://github.com/moufmouf)
+- [Don Gilbert](https://github.com/dongilbert)
+- [Jason Judge](https://github.com/judgej)
+- [Jeremy Lindblom](https://github.com/jeremeamia)
+- [Marco Pivetta](https://github.com/Ocramius)
+- [Matthieu Napoli](https://github.com/mnapoli)
+- [Paul M. Jones](https://github.com/pmjones)
+- [Stephan Hochdörfer](https://github.com/shochdoerfer)
+- [Taylor Otwell](https://github.com/taylorotwell)
+
+## Relevant links
+
+- [`ContainerInterface.php`](https://github.com/container-interop/container-interop/blob/master/src/Interop/Container/ContainerInterface.php)
+- [List of all issues](https://github.com/container-interop/container-interop/issues?labels=ContainerInterface&milestone=&page=1&state=closed)
+- [Vote for the interface name](https://github.com/container-interop/container-interop/wiki/%231-interface-name:-Vote)
diff --git a/vendor/container-interop/container-interop/docs/ContainerInterface.md b/vendor/container-interop/container-interop/docs/ContainerInterface.md
new file mode 100644
index 0000000000..bda973d6fc
--- /dev/null
+++ b/vendor/container-interop/container-interop/docs/ContainerInterface.md
@@ -0,0 +1,158 @@
+Container interface
+===================
+
+This document describes a common interface for dependency injection containers.
+
+The goal set by `ContainerInterface` is to standardize how frameworks and libraries make use of a
+container to obtain objects and parameters (called *entries* in the rest of this document).
+
+The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
+"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
+interpreted as described in [RFC 2119][].
+
+The word `implementor` in this document is to be interpreted as someone
+implementing the `ContainerInterface` in a dependency injection-related library or framework.
+Users of dependency injections containers (DIC) are referred to as `user`.
+
+[RFC 2119]: http://tools.ietf.org/html/rfc2119
+
+1. Specification
+-----------------
+
+### 1.1 Basics
+
+- The `Interop\Container\ContainerInterface` exposes two methods : `get` and `has`.
+
+- `get` takes one mandatory parameter: an entry identifier. It MUST be a string.
+ A call to `get` can return anything (a *mixed* value), or throws an exception if the identifier
+ is not known to the container. Two successive calls to `get` with the same
+ identifier SHOULD return the same value. However, depending on the `implementor`
+ design and/or `user` configuration, different values might be returned, so
+ `user` SHOULD NOT rely on getting the same value on 2 successive calls.
+ While `ContainerInterface` only defines one mandatory parameter in `get()`, implementations
+ MAY accept additional optional parameters.
+
+- `has` takes one unique parameter: an entry identifier. It MUST return `true`
+ if an entry identifier is known to the container and `false` if it is not.
+ `has($id)` returning true does not mean that `get($id)` will not throw an exception.
+ It does however mean that `get($id)` will not throw a `NotFoundException`.
+
+### 1.2 Exceptions
+
+Exceptions directly thrown by the container MUST implement the
+[`Interop\Container\Exception\ContainerException`](../src/Interop/Container/Exception/ContainerException.php).
+
+A call to the `get` method with a non-existing id SHOULD throw a
+[`Interop\Container\Exception\NotFoundException`](../src/Interop/Container/Exception/NotFoundException.php).
+
+### 1.3 Additional features
+
+This section describes additional features that MAY be added to a container. Containers are not
+required to implement these features to respect the ContainerInterface.
+
+#### 1.3.1 Delegate lookup feature
+
+The goal of the *delegate lookup* feature is to allow several containers to share entries.
+Containers implementing this feature can perform dependency lookups in other containers.
+
+Containers implementing this feature will offer a greater lever of interoperability
+with other containers. Implementation of this feature is therefore RECOMMENDED.
+
+A container implementing this feature:
+
+- MUST implement the `ContainerInterface`
+- MUST provide a way to register a delegate container (using a constructor parameter, or a setter,
+ or any possible way). The delegate container MUST implement the `ContainerInterface`.
+
+When a container is configured to use a delegate container for dependencies:
+
+- Calls to the `get` method should only return an entry if the entry is part of the container.
+ If the entry is not part of the container, an exception should be thrown
+ (as requested by the `ContainerInterface`).
+- Calls to the `has` method should only return `true` if the entry is part of the container.
+ If the entry is not part of the container, `false` should be returned.
+- If the fetched entry has dependencies, **instead** of performing
+ the dependency lookup in the container, the lookup is performed on the *delegate container*.
+
+Important! By default, the lookup SHOULD be performed on the delegate container **only**, not on the container itself.
+
+It is however allowed for containers to provide exception cases for special entries, and a way to lookup
+into the same container (or another container) instead of the delegate container.
+
+2. Package
+----------
+
+The interfaces and classes described as well as relevant exception are provided as part of the
+[container-interop/container-interop](https://packagist.org/packages/container-interop/container-interop) package.
+
+3. `Interop\Container\ContainerInterface`
+-----------------------------------------
+
+```php
+setParentContainer($this);
+ }
+ }
+ ...
+ }
+}
+
+```
+
+**Cons:**
+
+Cons have been extensively discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-51721777).
+Basically, forcing a setter into an interface is a bad idea. Setters are similar to constructor arguments,
+and it's a bad idea to standardize a constructor: how the delegate container is configured into a container is an implementation detail. This outweights the benefits of the interface.
+
+### 4.4 Alternative: no exception case for delegate lookups
+
+Originally, the proposed wording for delegate lookup calls was:
+
+> Important! The lookup MUST be performed on the delegate container **only**, not on the container itself.
+
+This was later replaced by:
+
+> Important! By default, the lookup SHOULD be performed on the delegate container **only**, not on the container itself.
+>
+> It is however allowed for containers to provide exception cases for special entries, and a way to lookup
+> into the same container (or another container) instead of the delegate container.
+
+Exception cases have been allowed to avoid breaking dependencies with some services that must be provided
+by the container (on @njasm proposal). This was proposed here: https://github.com/container-interop/container-interop/pull/20#issuecomment-56597235
+
+### 4.5 Alternative: having one of the containers act as the composite container
+
+In real-life scenarios, we usually have a big framework (Symfony 2, Zend Framework 2, etc...) and we want to
+add another DI container to this container. Most of the time, the "big" framework will be responsible for
+creating the controller's instances, using it's own DI container. Until *container-interop* is fully adopted,
+the "big" framework will not be aware of the existence of a composite container that it should use instead
+of its own container.
+
+For this real-life use cases, @mnapoli and @moufmouf proposed to extend the "big" framework's DI container
+to make it act as a composite container.
+
+This has been discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-40367194)
+and [here](http://mouf-php.com/container-interop-whats-next#solution4).
+
+This was implemented in Symfony 2 using:
+
+- [interop.symfony.di](https://github.com/thecodingmachine/interop.symfony.di/tree/v0.1.0)
+- [framework interop](https://github.com/mnapoli/framework-interop/)
+
+This was implemented in Silex using:
+
+- [interop.silex.di](https://github.com/thecodingmachine/interop.silex.di)
+
+Having a container act as the composite container is not part of the delegate lookup standard because it is
+simply a temporary design pattern used to make existing frameworks that do not support yet ContainerInterop
+play nice with other DI containers.
+
+
+5. Implementations
+------------------
+
+The following projects already implement the delegate lookup feature:
+
+- [Mouf](http://mouf-php.com), through the [`setDelegateLookupContainer` method](https://github.com/thecodingmachine/mouf/blob/2.0/src/Mouf/MoufManager.php#L2120)
+- [PHP-DI](http://php-di.org/), through the [`$wrapperContainer` parameter of the constructor](https://github.com/mnapoli/PHP-DI/blob/master/src/DI/Container.php#L72)
+- [pimple-interop](https://github.com/moufmouf/pimple-interop), through the [`$container` parameter of the constructor](https://github.com/moufmouf/pimple-interop/blob/master/src/Interop/Container/Pimple/PimpleInterop.php#L62)
+
+6. People
+---------
+
+Are listed here all people that contributed in the discussions, by alphabetical order:
+
+- [Alexandru Pătrănescu](https://github.com/drealecs)
+- [Ben Peachey](https://github.com/potherca)
+- [David Négrier](https://github.com/moufmouf)
+- [Jeremy Lindblom](https://github.com/jeremeamia)
+- [Marco Pivetta](https://github.com/Ocramius)
+- [Matthieu Napoli](https://github.com/mnapoli)
+- [Nelson J Morais](https://github.com/njasm)
+- [Phil Sturgeon](https://github.com/philsturgeon)
+- [Stephan Hochdörfer](https://github.com/shochdoerfer)
+
+7. Relevant Links
+-----------------
+
+_**Note:** Order descending chronologically._
+
+- [Pull request on the delegate lookup feature](https://github.com/container-interop/container-interop/pull/20)
+- [Pull request on the interface idea](https://github.com/container-interop/container-interop/pull/8)
+- [Original article exposing the delegate lookup idea along many others](http://mouf-php.com/container-interop-whats-next)
+
diff --git a/vendor/container-interop/container-interop/docs/Delegate-lookup.md b/vendor/container-interop/container-interop/docs/Delegate-lookup.md
new file mode 100644
index 0000000000..f64a8f785a
--- /dev/null
+++ b/vendor/container-interop/container-interop/docs/Delegate-lookup.md
@@ -0,0 +1,60 @@
+Delegate lookup feature
+=======================
+
+This document describes a standard for dependency injection containers.
+
+The goal set by the *delegate lookup* feature is to allow several containers to share entries.
+Containers implementing this feature can perform dependency lookups in other containers.
+
+Containers implementing this feature will offer a greater lever of interoperability
+with other containers. Implementation of this feature is therefore RECOMMENDED.
+
+The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
+"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
+interpreted as described in [RFC 2119][].
+
+The word `implementor` in this document is to be interpreted as someone
+implementing the delegate lookup feature in a dependency injection-related library or framework.
+Users of dependency injections containers (DIC) are referred to as `user`.
+
+[RFC 2119]: http://tools.ietf.org/html/rfc2119
+
+1. Vocabulary
+-------------
+
+In a dependency injection container, the container is used to fetch entries.
+Entries can have dependencies on other entries. Usually, these other entries are fetched by the container.
+
+The *delegate lookup* feature is the ability for a container to fetch dependencies in
+another container. In the rest of the document, the word "container" will reference the container
+implemented by the implementor. The word "delegate container" will reference the container we are
+fetching the dependencies from.
+
+2. Specification
+----------------
+
+A container implementing the *delegate lookup* feature:
+
+- MUST implement the [`ContainerInterface`](ContainerInterface.md)
+- MUST provide a way to register a delegate container (using a constructor parameter, or a setter,
+ or any possible way). The delegate container MUST implement the [`ContainerInterface`](ContainerInterface.md).
+
+When a container is configured to use a delegate container for dependencies:
+
+- Calls to the `get` method should only return an entry if the entry is part of the container.
+ If the entry is not part of the container, an exception should be thrown
+ (as requested by the [`ContainerInterface`](ContainerInterface.md)).
+- Calls to the `has` method should only return `true` if the entry is part of the container.
+ If the entry is not part of the container, `false` should be returned.
+- If the fetched entry has dependencies, **instead** of performing
+ the dependency lookup in the container, the lookup is performed on the *delegate container*.
+
+Important: By default, the dependency lookups SHOULD be performed on the delegate container **only**, not on the container itself.
+
+It is however allowed for containers to provide exception cases for special entries, and a way to lookup
+into the same container (or another container) instead of the delegate container.
+
+3. Package / Interface
+----------------------
+
+This feature is not tied to any code, interface or package.
diff --git a/vendor/container-interop/container-interop/docs/images/interoperating_containers.png b/vendor/container-interop/container-interop/docs/images/interoperating_containers.png
new file mode 100644
index 0000000000..1d3fdd0ddb
Binary files /dev/null and b/vendor/container-interop/container-interop/docs/images/interoperating_containers.png differ
diff --git a/vendor/container-interop/container-interop/docs/images/priority.png b/vendor/container-interop/container-interop/docs/images/priority.png
new file mode 100644
index 0000000000..d02cb7d1f1
Binary files /dev/null and b/vendor/container-interop/container-interop/docs/images/priority.png differ
diff --git a/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png b/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png
new file mode 100644
index 0000000000..87884bc292
Binary files /dev/null and b/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png differ
diff --git a/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php b/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php
new file mode 100644
index 0000000000..a75468f6a4
--- /dev/null
+++ b/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php
@@ -0,0 +1,15 @@
+2.2,<2.4"
+ },
+ "autoload": {
+ "psr-4": { "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" }
+ },
+ "autoload-dev": {
+ "psr-4": { "Doctrine\\Tests\\": "tests/Doctrine/Tests" }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.7.x-dev"
+ }
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php
new file mode 100644
index 0000000000..0d2cb58587
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php
@@ -0,0 +1,118 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * APC cache provider.
+ *
+ * @link www.doctrine-project.org
+ * @deprecated since version 1.6, use ApcuCache instead
+ * @since 2.0
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author David Abdemoulaie
+ */
+class ApcCache extends CacheProvider
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return apc_fetch($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return apc_exists($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ return apc_store($id, $data, $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ // apc_delete returns false if the id does not exist
+ return apc_delete($id) || ! apc_exists($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ return apc_clear_cache() && apc_clear_cache('user');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetchMultiple(array $keys)
+ {
+ return apc_fetch($keys) ?: [];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
+ {
+ $result = apc_store($keysAndValues, null, $lifetime);
+
+ return empty($result);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $info = apc_cache_info('', true);
+ $sma = apc_sma_info();
+
+ // @TODO - Temporary fix @see https://github.com/krakjoe/apcu/pull/42
+ if (PHP_VERSION_ID >= 50500) {
+ $info['num_hits'] = isset($info['num_hits']) ? $info['num_hits'] : $info['nhits'];
+ $info['num_misses'] = isset($info['num_misses']) ? $info['num_misses'] : $info['nmisses'];
+ $info['start_time'] = isset($info['start_time']) ? $info['start_time'] : $info['stime'];
+ }
+
+ return [
+ Cache::STATS_HITS => $info['num_hits'],
+ Cache::STATS_MISSES => $info['num_misses'],
+ Cache::STATS_UPTIME => $info['start_time'],
+ Cache::STATS_MEMORY_USAGE => $info['mem_size'],
+ Cache::STATS_MEMORY_AVAILABLE => $sma['avail_mem'],
+ ];
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcuCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcuCache.php
new file mode 100644
index 0000000000..5449b02e75
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcuCache.php
@@ -0,0 +1,116 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * APCu cache provider.
+ *
+ * @link www.doctrine-project.org
+ * @since 1.6
+ * @author Kévin Dunglas
+ */
+class ApcuCache extends CacheProvider
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return apcu_fetch($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return apcu_exists($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ return apcu_store($id, $data, $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ // apcu_delete returns false if the id does not exist
+ return apcu_delete($id) || ! apcu_exists($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDeleteMultiple(array $keys)
+ {
+ $result = apcu_delete($keys);
+
+ return false !== $result && count($result) !== count($keys);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ return apcu_clear_cache();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetchMultiple(array $keys)
+ {
+ return apcu_fetch($keys) ?: [];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
+ {
+ $result = apcu_store($keysAndValues, null, $lifetime);
+
+ return empty($result);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $info = apcu_cache_info(true);
+ $sma = apcu_sma_info();
+
+ return [
+ Cache::STATS_HITS => $info['num_hits'],
+ Cache::STATS_MISSES => $info['num_misses'],
+ Cache::STATS_UPTIME => $info['start_time'],
+ Cache::STATS_MEMORY_USAGE => $info['mem_size'],
+ Cache::STATS_MEMORY_AVAILABLE => $sma['avail_mem'],
+ ];
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php
new file mode 100644
index 0000000000..6610cc2173
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php
@@ -0,0 +1,142 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Array cache driver.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.0
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author David Abdemoulaie
+ */
+class ArrayCache extends CacheProvider
+{
+ /**
+ * @var array[] $data each element being a tuple of [$data, $expiration], where the expiration is int|bool
+ */
+ private $data = [];
+
+ /**
+ * @var int
+ */
+ private $hitsCount = 0;
+
+ /**
+ * @var int
+ */
+ private $missesCount = 0;
+
+ /**
+ * @var int
+ */
+ private $upTime;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct()
+ {
+ $this->upTime = time();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ if (! $this->doContains($id)) {
+ $this->missesCount += 1;
+
+ return false;
+ }
+
+ $this->hitsCount += 1;
+
+ return $this->data[$id][0];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ if (! isset($this->data[$id])) {
+ return false;
+ }
+
+ $expiration = $this->data[$id][1];
+
+ if ($expiration && $expiration < time()) {
+ $this->doDelete($id);
+
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ $this->data[$id] = [$data, $lifeTime ? time() + $lifeTime : false];
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ unset($this->data[$id]);
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ $this->data = [];
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ return [
+ Cache::STATS_HITS => $this->hitsCount,
+ Cache::STATS_MISSES => $this->missesCount,
+ Cache::STATS_UPTIME => $this->upTime,
+ Cache::STATS_MEMORY_USAGE => null,
+ Cache::STATS_MEMORY_AVAILABLE => null,
+ ];
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php
new file mode 100644
index 0000000000..89fe32307f
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php
@@ -0,0 +1,116 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Interface for cache drivers.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.0
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author Fabio B. Silva
+ * @author Kévin Dunglas
+ */
+interface Cache
+{
+ const STATS_HITS = 'hits';
+ const STATS_MISSES = 'misses';
+ const STATS_UPTIME = 'uptime';
+ const STATS_MEMORY_USAGE = 'memory_usage';
+ const STATS_MEMORY_AVAILABLE = 'memory_available';
+ /**
+ * Only for backward compatibility (may be removed in next major release)
+ *
+ * @deprecated
+ */
+ const STATS_MEMORY_AVAILIABLE = 'memory_available';
+
+ /**
+ * Fetches an entry from the cache.
+ *
+ * @param string $id The id of the cache entry to fetch.
+ *
+ * @return mixed The cached data or FALSE, if no cache entry exists for the given id.
+ */
+ public function fetch($id);
+
+ /**
+ * Tests if an entry exists in the cache.
+ *
+ * @param string $id The cache id of the entry to check for.
+ *
+ * @return bool TRUE if a cache entry exists for the given cache id, FALSE otherwise.
+ */
+ public function contains($id);
+
+ /**
+ * Puts data into the cache.
+ *
+ * If a cache entry with the given id already exists, its data will be replaced.
+ *
+ * @param string $id The cache id.
+ * @param mixed $data The cache entry/data.
+ * @param int $lifeTime The lifetime in number of seconds for this cache entry.
+ * If zero (the default), the entry never expires (although it may be deleted from the cache
+ * to make place for other entries).
+ *
+ * @return bool TRUE if the entry was successfully stored in the cache, FALSE otherwise.
+ */
+ public function save($id, $data, $lifeTime = 0);
+
+ /**
+ * Deletes a cache entry.
+ *
+ * @param string $id The cache id.
+ *
+ * @return bool TRUE if the cache entry was successfully deleted, FALSE otherwise.
+ * Deleting a non-existing entry is considered successful.
+ */
+ public function delete($id);
+
+ /**
+ * Retrieves cached information from the data store.
+ *
+ * The server's statistics array has the following values:
+ *
+ * - hits
+ * Number of keys that have been requested and found present.
+ *
+ * - misses
+ * Number of items that have been requested and not found.
+ *
+ * - uptime
+ * Time that the server is running.
+ *
+ * - memory_usage
+ * Memory used by this server to store items.
+ *
+ * - memory_available
+ * Memory allowed to use for storage.
+ *
+ * @since 2.2
+ *
+ * @return array|null An associative array with server's statistics if available, NULL otherwise.
+ */
+ public function getStats();
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php
new file mode 100644
index 0000000000..546c0ec1dd
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php
@@ -0,0 +1,341 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Base class for cache provider implementations.
+ *
+ * @since 2.2
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author Fabio B. Silva
+ * @author Benoit Burnichon
+ */
+abstract class CacheProvider implements Cache, FlushableCache, ClearableCache, MultiOperationCache
+{
+ const DOCTRINE_NAMESPACE_CACHEKEY = 'DoctrineNamespaceCacheKey[%s]';
+
+ /**
+ * The namespace to prefix all cache ids with.
+ *
+ * @var string
+ */
+ private $namespace = '';
+
+ /**
+ * The namespace version.
+ *
+ * @var integer|null
+ */
+ private $namespaceVersion;
+
+ /**
+ * Sets the namespace to prefix all cache ids with.
+ *
+ * @param string $namespace
+ *
+ * @return void
+ */
+ public function setNamespace($namespace)
+ {
+ $this->namespace = (string) $namespace;
+ $this->namespaceVersion = null;
+ }
+
+ /**
+ * Retrieves the namespace that prefixes all cache ids.
+ *
+ * @return string
+ */
+ public function getNamespace()
+ {
+ return $this->namespace;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function fetch($id)
+ {
+ return $this->doFetch($this->getNamespacedId($id));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function fetchMultiple(array $keys)
+ {
+ if (empty($keys)) {
+ return [];
+ }
+
+ // note: the array_combine() is in place to keep an association between our $keys and the $namespacedKeys
+ $namespacedKeys = array_combine($keys, array_map([$this, 'getNamespacedId'], $keys));
+ $items = $this->doFetchMultiple($namespacedKeys);
+ $foundItems = [];
+
+ // no internal array function supports this sort of mapping: needs to be iterative
+ // this filters and combines keys in one pass
+ foreach ($namespacedKeys as $requestedKey => $namespacedKey) {
+ if (isset($items[$namespacedKey]) || array_key_exists($namespacedKey, $items)) {
+ $foundItems[$requestedKey] = $items[$namespacedKey];
+ }
+ }
+
+ return $foundItems;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function saveMultiple(array $keysAndValues, $lifetime = 0)
+ {
+ $namespacedKeysAndValues = [];
+ foreach ($keysAndValues as $key => $value) {
+ $namespacedKeysAndValues[$this->getNamespacedId($key)] = $value;
+ }
+
+ return $this->doSaveMultiple($namespacedKeysAndValues, $lifetime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function contains($id)
+ {
+ return $this->doContains($this->getNamespacedId($id));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function save($id, $data, $lifeTime = 0)
+ {
+ return $this->doSave($this->getNamespacedId($id), $data, $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function deleteMultiple(array $keys)
+ {
+ return $this->doDeleteMultiple(array_map(array($this, 'getNamespacedId'), $keys));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function delete($id)
+ {
+ return $this->doDelete($this->getNamespacedId($id));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getStats()
+ {
+ return $this->doGetStats();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function flushAll()
+ {
+ return $this->doFlush();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function deleteAll()
+ {
+ $namespaceCacheKey = $this->getNamespaceCacheKey();
+ $namespaceVersion = $this->getNamespaceVersion() + 1;
+
+ if ($this->doSave($namespaceCacheKey, $namespaceVersion)) {
+ $this->namespaceVersion = $namespaceVersion;
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Prefixes the passed id with the configured namespace value.
+ *
+ * @param string $id The id to namespace.
+ *
+ * @return string The namespaced id.
+ */
+ private function getNamespacedId(string $id) : string
+ {
+ $namespaceVersion = $this->getNamespaceVersion();
+
+ return sprintf('%s[%s][%s]', $this->namespace, $id, $namespaceVersion);
+ }
+
+ /**
+ * Returns the namespace cache key.
+ *
+ * @return string
+ */
+ private function getNamespaceCacheKey() : string
+ {
+ return sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace);
+ }
+
+ /**
+ * Returns the namespace version.
+ *
+ * @return integer
+ */
+ private function getNamespaceVersion() : int
+ {
+ if (null !== $this->namespaceVersion) {
+ return $this->namespaceVersion;
+ }
+
+ $namespaceCacheKey = $this->getNamespaceCacheKey();
+ $this->namespaceVersion = (int) $this->doFetch($namespaceCacheKey) ?: 1;
+
+ return $this->namespaceVersion;
+ }
+
+ /**
+ * Default implementation of doFetchMultiple. Each driver that supports multi-get should owerwrite it.
+ *
+ * @param array $keys Array of keys to retrieve from cache
+ * @return array Array of values retrieved for the given keys.
+ */
+ protected function doFetchMultiple(array $keys)
+ {
+ $returnValues = [];
+
+ foreach ($keys as $key) {
+ if (false !== ($item = $this->doFetch($key)) || $this->doContains($key)) {
+ $returnValues[$key] = $item;
+ }
+ }
+
+ return $returnValues;
+ }
+
+ /**
+ * Fetches an entry from the cache.
+ *
+ * @param string $id The id of the cache entry to fetch.
+ *
+ * @return mixed|false The cached data or FALSE, if no cache entry exists for the given id.
+ */
+ abstract protected function doFetch($id);
+
+ /**
+ * Tests if an entry exists in the cache.
+ *
+ * @param string $id The cache id of the entry to check for.
+ *
+ * @return bool TRUE if a cache entry exists for the given cache id, FALSE otherwise.
+ */
+ abstract protected function doContains($id);
+
+ /**
+ * Default implementation of doSaveMultiple. Each driver that supports multi-put should override it.
+ *
+ * @param array $keysAndValues Array of keys and values to save in cache
+ * @param int $lifetime The lifetime. If != 0, sets a specific lifetime for these
+ * cache entries (0 => infinite lifeTime).
+ *
+ * @return bool TRUE if the operation was successful, FALSE if it wasn't.
+ */
+ protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
+ {
+ $success = true;
+
+ foreach ($keysAndValues as $key => $value) {
+ if (!$this->doSave($key, $value, $lifetime)) {
+ $success = false;
+ }
+ }
+
+ return $success;
+ }
+
+ /**
+ * Puts data into the cache.
+ *
+ * @param string $id The cache id.
+ * @param string $data The cache entry/data.
+ * @param int $lifeTime The lifetime. If != 0, sets a specific lifetime for this
+ * cache entry (0 => infinite lifeTime).
+ *
+ * @return bool TRUE if the entry was successfully stored in the cache, FALSE otherwise.
+ */
+ abstract protected function doSave($id, $data, $lifeTime = 0);
+
+ /**
+ * Default implementation of doDeleteMultiple. Each driver that supports multi-delete should override it.
+ *
+ * @param array $keys Array of keys to delete from cache
+ *
+ * @return bool TRUE if the operation was successful, FALSE if it wasn't
+ */
+ protected function doDeleteMultiple(array $keys)
+ {
+ $success = true;
+
+ foreach ($keys as $key) {
+ if (! $this->doDelete($key)) {
+ $success = false;
+ }
+ }
+
+ return $success;
+ }
+
+ /**
+ * Deletes a cache entry.
+ *
+ * @param string $id The cache id.
+ *
+ * @return bool TRUE if the cache entry was successfully deleted, FALSE otherwise.
+ */
+ abstract protected function doDelete($id);
+
+ /**
+ * Flushes all cache entries.
+ *
+ * @return bool TRUE if the cache entries were successfully flushed, FALSE otherwise.
+ */
+ abstract protected function doFlush();
+
+ /**
+ * Retrieves cached information from the data store.
+ *
+ * @since 2.2
+ *
+ * @return array|null An associative array with server's statistics if available, NULL otherwise.
+ */
+ abstract protected function doGetStats();
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php
new file mode 100644
index 0000000000..32534aa4e3
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php
@@ -0,0 +1,205 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Cache provider that allows to easily chain multiple cache providers
+ *
+ * @author Michaël Gallego
+ */
+class ChainCache extends CacheProvider
+{
+ /**
+ * @var CacheProvider[]
+ */
+ private $cacheProviders = [];
+
+ /**
+ * Constructor
+ *
+ * @param CacheProvider[] $cacheProviders
+ */
+ public function __construct($cacheProviders = [])
+ {
+ $this->cacheProviders = $cacheProviders instanceof \Traversable
+ ? iterator_to_array($cacheProviders, false)
+ : array_values($cacheProviders);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function setNamespace($namespace)
+ {
+ parent::setNamespace($namespace);
+
+ foreach ($this->cacheProviders as $cacheProvider) {
+ $cacheProvider->setNamespace($namespace);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doFetch($id)
+ {
+ foreach ($this->cacheProviders as $key => $cacheProvider) {
+ if ($cacheProvider->doContains($id)) {
+ $value = $cacheProvider->doFetch($id);
+
+ // We populate all the previous cache layers (that are assumed to be faster)
+ for ($subKey = $key - 1 ; $subKey >= 0 ; $subKey--) {
+ $this->cacheProviders[$subKey]->doSave($id, $value);
+ }
+
+ return $value;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetchMultiple(array $keys)
+ {
+ /* @var $traversedProviders CacheProvider[] */
+ $traversedProviders = [];
+ $keysCount = count($keys);
+ $fetchedValues = [];
+
+ foreach ($this->cacheProviders as $key => $cacheProvider) {
+ $fetchedValues = $cacheProvider->doFetchMultiple($keys);
+
+ // We populate all the previous cache layers (that are assumed to be faster)
+ if (count($fetchedValues) === $keysCount) {
+ foreach ($traversedProviders as $previousCacheProvider) {
+ $previousCacheProvider->doSaveMultiple($fetchedValues);
+ }
+
+ return $fetchedValues;
+ }
+
+ $traversedProviders[] = $cacheProvider;
+ }
+
+ return $fetchedValues;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doContains($id)
+ {
+ foreach ($this->cacheProviders as $cacheProvider) {
+ if ($cacheProvider->doContains($id)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ $stored = true;
+
+ foreach ($this->cacheProviders as $cacheProvider) {
+ $stored = $cacheProvider->doSave($id, $data, $lifeTime) && $stored;
+ }
+
+ return $stored;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
+ {
+ $stored = true;
+
+ foreach ($this->cacheProviders as $cacheProvider) {
+ $stored = $cacheProvider->doSaveMultiple($keysAndValues, $lifetime) && $stored;
+ }
+
+ return $stored;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doDelete($id)
+ {
+ $deleted = true;
+
+ foreach ($this->cacheProviders as $cacheProvider) {
+ $deleted = $cacheProvider->doDelete($id) && $deleted;
+ }
+
+ return $deleted;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDeleteMultiple(array $keys)
+ {
+ $deleted = true;
+
+ foreach ($this->cacheProviders as $cacheProvider) {
+ $deleted = $cacheProvider->doDeleteMultiple($keys) && $deleted;
+ }
+
+ return $deleted;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doFlush()
+ {
+ $flushed = true;
+
+ foreach ($this->cacheProviders as $cacheProvider) {
+ $flushed = $cacheProvider->doFlush() && $flushed;
+ }
+
+ return $flushed;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doGetStats()
+ {
+ // We return all the stats from all adapters
+ $stats = [];
+
+ foreach ($this->cacheProviders as $cacheProvider) {
+ $stats[] = $cacheProvider->doGetStats();
+ }
+
+ return $stats;
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php
new file mode 100644
index 0000000000..3a91eaf3a2
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php
@@ -0,0 +1,40 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Interface for cache that can be flushed.
+ *
+ * Intended to be used for partial clearing of a cache namespace. For a more
+ * global "flushing", see {@see FlushableCache}.
+ *
+ * @link www.doctrine-project.org
+ * @since 1.4
+ * @author Adirelle
+ */
+interface ClearableCache
+{
+ /**
+ * Deletes all cache entries in the current cache namespace.
+ *
+ * @return bool TRUE if the cache entries were successfully deleted, FALSE otherwise.
+ */
+ public function deleteAll();
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php
new file mode 100644
index 0000000000..fe35533a8c
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php
@@ -0,0 +1,121 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+use \Couchbase;
+
+/**
+ * Couchbase cache provider.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.4
+ * @author Michael Nitschinger
+ */
+class CouchbaseCache extends CacheProvider
+{
+ /**
+ * @var Couchbase|null
+ */
+ private $couchbase;
+
+ /**
+ * Sets the Couchbase instance to use.
+ *
+ * @param Couchbase $couchbase
+ *
+ * @return void
+ */
+ public function setCouchbase(Couchbase $couchbase)
+ {
+ $this->couchbase = $couchbase;
+ }
+
+ /**
+ * Gets the Couchbase instance used by the cache.
+ *
+ * @return Couchbase|null
+ */
+ public function getCouchbase()
+ {
+ return $this->couchbase;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return $this->couchbase->get($id) ?: false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return (null !== $this->couchbase->get($id));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ if ($lifeTime > 30 * 24 * 3600) {
+ $lifeTime = time() + $lifeTime;
+ }
+ return $this->couchbase->set($id, $data, (int) $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return $this->couchbase->delete($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ return $this->couchbase->flush();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $stats = $this->couchbase->getStats();
+ $servers = $this->couchbase->getServers();
+ $server = explode(":", $servers[0]);
+ $key = $server[0] . ":" . "11210";
+ $stats = $stats[$key];
+ return [
+ Cache::STATS_HITS => $stats['get_hits'],
+ Cache::STATS_MISSES => $stats['get_misses'],
+ Cache::STATS_UPTIME => $stats['uptime'],
+ Cache::STATS_MEMORY_USAGE => $stats['bytes'],
+ Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'],
+ ];
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ExtMongoDBCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ExtMongoDBCache.php
new file mode 100644
index 0000000000..b07cf6d4e4
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ExtMongoDBCache.php
@@ -0,0 +1,221 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+use MongoDB\BSON\Binary;
+use MongoDB\BSON\UTCDateTime;
+use MongoDB\Collection;
+use MongoDB\Database;
+use MongoDB\Driver\Exception\Exception;
+use MongoDB\Model\BSONDocument;
+
+/**
+ * MongoDB cache provider for ext-mongodb
+ *
+ * @internal Do not use - will be removed in 2.0. Use MongoDBCache instead
+ */
+class ExtMongoDBCache extends CacheProvider
+{
+ /**
+ * @var Database
+ */
+ private $database;
+
+ /**
+ * @var Collection
+ */
+ private $collection;
+
+ /**
+ * @var bool
+ */
+ private $expirationIndexCreated = false;
+
+ /**
+ * Constructor.
+ *
+ * This provider will default to the write concern and read preference
+ * options set on the Database instance (or inherited from MongoDB or
+ * Client). Using an unacknowledged write concern (< 1) may make the return
+ * values of delete() and save() unreliable. Reading from secondaries may
+ * make contain() and fetch() unreliable.
+ *
+ * @see http://www.php.net/manual/en/mongo.readpreferences.php
+ * @see http://www.php.net/manual/en/mongo.writeconcerns.php
+ * @param Collection $collection
+ */
+ public function __construct(Collection $collection)
+ {
+ // Ensure there is no typemap set - we want to use our own
+ $this->collection = $collection->withOptions(['typeMap' => null]);
+ $this->database = new Database($collection->getManager(), $collection->getDatabaseName());
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ $document = $this->collection->findOne(['_id' => $id], [MongoDBCache::DATA_FIELD, MongoDBCache::EXPIRATION_FIELD]);
+
+ if ($document === null) {
+ return false;
+ }
+
+ if ($this->isExpired($document)) {
+ $this->createExpirationIndex();
+ $this->doDelete($id);
+ return false;
+ }
+
+ return unserialize($document[MongoDBCache::DATA_FIELD]->getData());
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ $document = $this->collection->findOne(['_id' => $id], [MongoDBCache::EXPIRATION_FIELD]);
+
+ if ($document === null) {
+ return false;
+ }
+
+ if ($this->isExpired($document)) {
+ $this->createExpirationIndex();
+ $this->doDelete($id);
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ try {
+ $this->collection->updateOne(
+ ['_id' => $id],
+ ['$set' => [
+ MongoDBCache::EXPIRATION_FIELD => ($lifeTime > 0 ? new UTCDateTime((time() + $lifeTime) * 1000): null),
+ MongoDBCache::DATA_FIELD => new Binary(serialize($data), Binary::TYPE_GENERIC),
+ ]],
+ ['upsert' => true]
+ );
+ } catch (Exception $e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ try {
+ $this->collection->deleteOne(['_id' => $id]);
+ } catch (Exception $e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ try {
+ // Use remove() in lieu of drop() to maintain any collection indexes
+ $this->collection->deleteMany([]);
+ } catch (Exception $e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $uptime = null;
+ $memoryUsage = null;
+
+ try {
+ $serverStatus = $this->database->command([
+ 'serverStatus' => 1,
+ 'locks' => 0,
+ 'metrics' => 0,
+ 'recordStats' => 0,
+ 'repl' => 0,
+ ])->toArray()[0];
+ $uptime = $serverStatus['uptime'] ?? null;
+ } catch (Exception $e) {
+ }
+
+ try {
+ $collStats = $this->database->command(['collStats' => $this->collection->getCollectionName()])->toArray()[0];
+ $memoryUsage = $collStats['size'] ?? null;
+ } catch (Exception $e) {
+ }
+
+ return [
+ Cache::STATS_HITS => null,
+ Cache::STATS_MISSES => null,
+ Cache::STATS_UPTIME => $uptime,
+ Cache::STATS_MEMORY_USAGE => $memoryUsage,
+ Cache::STATS_MEMORY_AVAILABLE => null,
+ ];
+ }
+
+ /**
+ * Check if the document is expired.
+ *
+ * @param BSONDocument $document
+ *
+ * @return bool
+ */
+ private function isExpired(BSONDocument $document): bool
+ {
+ return isset($document[MongoDBCache::EXPIRATION_FIELD]) &&
+ $document[MongoDBCache::EXPIRATION_FIELD] instanceof UTCDateTime &&
+ $document[MongoDBCache::EXPIRATION_FIELD]->toDateTime() < new \DateTime();
+ }
+
+ private function createExpirationIndex(): void
+ {
+ if ($this->expirationIndexCreated) {
+ return;
+ }
+
+ $this->collection->createIndex([MongoDBCache::EXPIRATION_FIELD => 1], ['background' => true, 'expireAfterSeconds' => 0]);
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php
new file mode 100644
index 0000000000..5293b8fdda
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php
@@ -0,0 +1,287 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Base file cache driver.
+ *
+ * @since 2.3
+ * @author Fabio B. Silva
+ * @author Tobias Schultze
+ */
+abstract class FileCache extends CacheProvider
+{
+ /**
+ * The cache directory.
+ *
+ * @var string
+ */
+ protected $directory;
+
+ /**
+ * The cache file extension.
+ *
+ * @var string
+ */
+ private $extension;
+
+ /**
+ * @var int
+ */
+ private $umask;
+
+ /**
+ * @var int
+ */
+ private $directoryStringLength;
+
+ /**
+ * @var int
+ */
+ private $extensionStringLength;
+
+ /**
+ * @var bool
+ */
+ private $isRunningOnWindows;
+
+ /**
+ * Constructor.
+ *
+ * @param string $directory The cache directory.
+ * @param string $extension The cache file extension.
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function __construct($directory, $extension = '', $umask = 0002)
+ {
+ // YES, this needs to be *before* createPathIfNeeded()
+ if ( ! is_int($umask)) {
+ throw new \InvalidArgumentException(sprintf(
+ 'The umask parameter is required to be integer, was: %s',
+ gettype($umask)
+ ));
+ }
+ $this->umask = $umask;
+
+ if ( ! $this->createPathIfNeeded($directory)) {
+ throw new \InvalidArgumentException(sprintf(
+ 'The directory "%s" does not exist and could not be created.',
+ $directory
+ ));
+ }
+
+ if ( ! is_writable($directory)) {
+ throw new \InvalidArgumentException(sprintf(
+ 'The directory "%s" is not writable.',
+ $directory
+ ));
+ }
+
+ // YES, this needs to be *after* createPathIfNeeded()
+ $this->directory = realpath($directory);
+ $this->extension = (string) $extension;
+
+ $this->directoryStringLength = strlen($this->directory);
+ $this->extensionStringLength = strlen($this->extension);
+ $this->isRunningOnWindows = defined('PHP_WINDOWS_VERSION_BUILD');
+ }
+
+ /**
+ * Gets the cache directory.
+ *
+ * @return string
+ */
+ public function getDirectory()
+ {
+ return $this->directory;
+ }
+
+ /**
+ * Gets the cache file extension.
+ *
+ * @return string
+ */
+ public function getExtension()
+ {
+ return $this->extension;
+ }
+
+ /**
+ * @param string $id
+ *
+ * @return string
+ */
+ protected function getFilename($id)
+ {
+ $hash = hash('sha256', $id);
+
+ // This ensures that the filename is unique and that there are no invalid chars in it.
+ if (
+ '' === $id
+ || ((strlen($id) * 2 + $this->extensionStringLength) > 255)
+ || ($this->isRunningOnWindows && ($this->directoryStringLength + 4 + strlen($id) * 2 + $this->extensionStringLength) > 258)
+ ) {
+ // Most filesystems have a limit of 255 chars for each path component. On Windows the the whole path is limited
+ // to 260 chars (including terminating null char). Using long UNC ("\\?\" prefix) does not work with the PHP API.
+ // And there is a bug in PHP (https://bugs.php.net/bug.php?id=70943) with path lengths of 259.
+ // So if the id in hex representation would surpass the limit, we use the hash instead. The prefix prevents
+ // collisions between the hash and bin2hex.
+ $filename = '_' . $hash;
+ } else {
+ $filename = bin2hex($id);
+ }
+
+ return $this->directory
+ . DIRECTORY_SEPARATOR
+ . substr($hash, 0, 2)
+ . DIRECTORY_SEPARATOR
+ . $filename
+ . $this->extension;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ $filename = $this->getFilename($id);
+
+ return @unlink($filename) || ! file_exists($filename);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ foreach ($this->getIterator() as $name => $file) {
+ if ($file->isDir()) {
+ // Remove the intermediate directories which have been created to balance the tree. It only takes effect
+ // if the directory is empty. If several caches share the same directory but with different file extensions,
+ // the other ones are not removed.
+ @rmdir($name);
+ } elseif ($this->isFilenameEndingWithExtension($name)) {
+ // If an extension is set, only remove files which end with the given extension.
+ // If no extension is set, we have no other choice than removing everything.
+ @unlink($name);
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $usage = 0;
+ foreach ($this->getIterator() as $name => $file) {
+ if (! $file->isDir() && $this->isFilenameEndingWithExtension($name)) {
+ $usage += $file->getSize();
+ }
+ }
+
+ $free = disk_free_space($this->directory);
+
+ return [
+ Cache::STATS_HITS => null,
+ Cache::STATS_MISSES => null,
+ Cache::STATS_UPTIME => null,
+ Cache::STATS_MEMORY_USAGE => $usage,
+ Cache::STATS_MEMORY_AVAILABLE => $free,
+ ];
+ }
+
+ /**
+ * Create path if needed.
+ *
+ * @param string $path
+ * @return bool TRUE on success or if path already exists, FALSE if path cannot be created.
+ */
+ private function createPathIfNeeded(string $path) : bool
+ {
+ if ( ! is_dir($path)) {
+ if (false === @mkdir($path, 0777 & (~$this->umask), true) && !is_dir($path)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Writes a string content to file in an atomic way.
+ *
+ * @param string $filename Path to the file where to write the data.
+ * @param string $content The content to write
+ *
+ * @return bool TRUE on success, FALSE if path cannot be created, if path is not writable or an any other error.
+ */
+ protected function writeFile(string $filename, string $content) : bool
+ {
+ $filepath = pathinfo($filename, PATHINFO_DIRNAME);
+
+ if ( ! $this->createPathIfNeeded($filepath)) {
+ return false;
+ }
+
+ if ( ! is_writable($filepath)) {
+ return false;
+ }
+
+ $tmpFile = tempnam($filepath, 'swap');
+ @chmod($tmpFile, 0666 & (~$this->umask));
+
+ if (file_put_contents($tmpFile, $content) !== false) {
+ @chmod($tmpFile, 0666 & (~$this->umask));
+ if (@rename($tmpFile, $filename)) {
+ return true;
+ }
+
+ @unlink($tmpFile);
+ }
+
+ return false;
+ }
+
+ /**
+ * @return \Iterator
+ */
+ private function getIterator() : \Iterator
+ {
+ return new \RecursiveIteratorIterator(
+ new \RecursiveDirectoryIterator($this->directory, \FilesystemIterator::SKIP_DOTS),
+ \RecursiveIteratorIterator::CHILD_FIRST
+ );
+ }
+
+ /**
+ * @param string $name The filename
+ *
+ * @return bool
+ */
+ private function isFilenameEndingWithExtension(string $name) : bool
+ {
+ return '' === $this->extension
+ || strrpos($name, $this->extension) === (strlen($name) - $this->extensionStringLength);
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php
new file mode 100644
index 0000000000..d988294f6f
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php
@@ -0,0 +1,111 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Filesystem cache driver.
+ *
+ * @since 2.3
+ * @author Fabio B. Silva
+ */
+class FilesystemCache extends FileCache
+{
+ const EXTENSION = '.doctrinecache.data';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct($directory, $extension = self::EXTENSION, $umask = 0002)
+ {
+ parent::__construct($directory, $extension, $umask);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ $data = '';
+ $lifetime = -1;
+ $filename = $this->getFilename($id);
+
+ if ( ! is_file($filename)) {
+ return false;
+ }
+
+ $resource = fopen($filename, "r");
+
+ if (false !== ($line = fgets($resource))) {
+ $lifetime = (int) $line;
+ }
+
+ if ($lifetime !== 0 && $lifetime < time()) {
+ fclose($resource);
+
+ return false;
+ }
+
+ while (false !== ($line = fgets($resource))) {
+ $data .= $line;
+ }
+
+ fclose($resource);
+
+ return unserialize($data);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ $lifetime = -1;
+ $filename = $this->getFilename($id);
+
+ if ( ! is_file($filename)) {
+ return false;
+ }
+
+ $resource = fopen($filename, "r");
+
+ if (false !== ($line = fgets($resource))) {
+ $lifetime = (int) $line;
+ }
+
+ fclose($resource);
+
+ return $lifetime === 0 || $lifetime > time();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ if ($lifeTime > 0) {
+ $lifeTime = time() + $lifeTime;
+ }
+
+ $data = serialize($data);
+ $filename = $this->getFilename($id);
+
+ return $this->writeFile($filename, $lifeTime . PHP_EOL . $data);
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php
new file mode 100644
index 0000000000..4311d4f593
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php
@@ -0,0 +1,37 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Interface for cache that can be flushed.
+ *
+ * @link www.doctrine-project.org
+ * @since 1.4
+ * @author Adirelle
+ */
+interface FlushableCache
+{
+ /**
+ * Flushes all cache entries, globally.
+ *
+ * @return bool TRUE if the cache entries were successfully flushed, FALSE otherwise.
+ */
+ public function flushAll();
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/LegacyMongoDBCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/LegacyMongoDBCache.php
new file mode 100644
index 0000000000..91a78bffbc
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/LegacyMongoDBCache.php
@@ -0,0 +1,194 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+use MongoBinData;
+use MongoCollection;
+use MongoCursorException;
+use MongoDate;
+
+/**
+ * MongoDB cache provider.
+ *
+ * @author Jeremy Mikola
+ * @internal Do not use - will be removed in 2.0. Use MongoDBCache instead
+ */
+class LegacyMongoDBCache extends CacheProvider
+{
+ /**
+ * @var MongoCollection
+ */
+ private $collection;
+
+ /**
+ * @var bool
+ */
+ private $expirationIndexCreated = false;
+
+ /**
+ * Constructor.
+ *
+ * This provider will default to the write concern and read preference
+ * options set on the MongoCollection instance (or inherited from MongoDB or
+ * MongoClient). Using an unacknowledged write concern (< 1) may make the
+ * return values of delete() and save() unreliable. Reading from secondaries
+ * may make contain() and fetch() unreliable.
+ *
+ * @see http://www.php.net/manual/en/mongo.readpreferences.php
+ * @see http://www.php.net/manual/en/mongo.writeconcerns.php
+ * @param MongoCollection $collection
+ */
+ public function __construct(MongoCollection $collection)
+ {
+ @trigger_error('Using the legacy MongoDB cache provider is deprecated and will be removed in 2.0', E_USER_DEPRECATED);
+ $this->collection = $collection;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ $document = $this->collection->findOne(['_id' => $id], [MongoDBCache::DATA_FIELD, MongoDBCache::EXPIRATION_FIELD]);
+
+ if ($document === null) {
+ return false;
+ }
+
+ if ($this->isExpired($document)) {
+ $this->createExpirationIndex();
+ $this->doDelete($id);
+ return false;
+ }
+
+ return unserialize($document[MongoDBCache::DATA_FIELD]->bin);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ $document = $this->collection->findOne(['_id' => $id], [MongoDBCache::EXPIRATION_FIELD]);
+
+ if ($document === null) {
+ return false;
+ }
+
+ if ($this->isExpired($document)) {
+ $this->createExpirationIndex();
+ $this->doDelete($id);
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ try {
+ $result = $this->collection->update(
+ ['_id' => $id],
+ ['$set' => [
+ MongoDBCache::EXPIRATION_FIELD => ($lifeTime > 0 ? new MongoDate(time() + $lifeTime) : null),
+ MongoDBCache::DATA_FIELD => new MongoBinData(serialize($data), MongoBinData::BYTE_ARRAY),
+ ]],
+ ['upsert' => true, 'multiple' => false]
+ );
+ } catch (MongoCursorException $e) {
+ return false;
+ }
+
+ return ($result['ok'] ?? 1) == 1;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ $result = $this->collection->remove(['_id' => $id]);
+
+ return ($result['ok'] ?? 1) == 1;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ // Use remove() in lieu of drop() to maintain any collection indexes
+ $result = $this->collection->remove();
+
+ return ($result['ok'] ?? 1) == 1;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $serverStatus = $this->collection->db->command([
+ 'serverStatus' => 1,
+ 'locks' => 0,
+ 'metrics' => 0,
+ 'recordStats' => 0,
+ 'repl' => 0,
+ ]);
+
+ $collStats = $this->collection->db->command(['collStats' => 1]);
+
+ return [
+ Cache::STATS_HITS => null,
+ Cache::STATS_MISSES => null,
+ Cache::STATS_UPTIME => $serverStatus['uptime'] ?? null,
+ Cache::STATS_MEMORY_USAGE => $collStats['size'] ?? null,
+ Cache::STATS_MEMORY_AVAILABLE => null,
+ ];
+ }
+
+ /**
+ * Check if the document is expired.
+ *
+ * @param array $document
+ *
+ * @return bool
+ */
+ private function isExpired(array $document) : bool
+ {
+ return isset($document[MongoDBCache::EXPIRATION_FIELD]) &&
+ $document[MongoDBCache::EXPIRATION_FIELD] instanceof MongoDate &&
+ $document[MongoDBCache::EXPIRATION_FIELD]->sec < time();
+ }
+
+
+ private function createExpirationIndex(): void
+ {
+ if ($this->expirationIndexCreated) {
+ return;
+ }
+
+ $this->expirationIndexCreated = true;
+ $this->collection->createIndex([MongoDBCache::EXPIRATION_FIELD => 1], ['background' => true, 'expireAfterSeconds' => 0]);
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php
new file mode 100644
index 0000000000..97ab90a983
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php
@@ -0,0 +1,126 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+use \Memcache;
+
+/**
+ * Memcache cache provider.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.0
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author David Abdemoulaie
+ */
+class MemcacheCache extends CacheProvider
+{
+ /**
+ * @var Memcache|null
+ */
+ private $memcache;
+
+ /**
+ * Sets the memcache instance to use.
+ *
+ * @param Memcache $memcache
+ *
+ * @return void
+ */
+ public function setMemcache(Memcache $memcache)
+ {
+ $this->memcache = $memcache;
+ }
+
+ /**
+ * Gets the memcache instance used by the cache.
+ *
+ * @return Memcache|null
+ */
+ public function getMemcache()
+ {
+ return $this->memcache;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return $this->memcache->get($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ $flags = null;
+ $this->memcache->get($id, $flags);
+
+ //if memcache has changed the value of "flags", it means the value exists
+ return ($flags !== null);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ if ($lifeTime > 30 * 24 * 3600) {
+ $lifeTime = time() + $lifeTime;
+ }
+ return $this->memcache->set($id, $data, 0, (int) $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ // Memcache::delete() returns false if entry does not exist
+ return $this->memcache->delete($id) || ! $this->doContains($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ return $this->memcache->flush();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $stats = $this->memcache->getStats();
+ return [
+ Cache::STATS_HITS => $stats['get_hits'],
+ Cache::STATS_MISSES => $stats['get_misses'],
+ Cache::STATS_UPTIME => $stats['uptime'],
+ Cache::STATS_MEMORY_USAGE => $stats['bytes'],
+ Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'],
+ ];
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php
new file mode 100644
index 0000000000..7bb32a03a1
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php
@@ -0,0 +1,156 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+use \Memcached;
+
+/**
+ * Memcached cache provider.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.2
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author David Abdemoulaie
+ */
+class MemcachedCache extends CacheProvider
+{
+ /**
+ * @var Memcached|null
+ */
+ private $memcached;
+
+ /**
+ * Sets the memcache instance to use.
+ *
+ * @param Memcached $memcached
+ *
+ * @return void
+ */
+ public function setMemcached(Memcached $memcached)
+ {
+ $this->memcached = $memcached;
+ }
+
+ /**
+ * Gets the memcached instance used by the cache.
+ *
+ * @return Memcached|null
+ */
+ public function getMemcached()
+ {
+ return $this->memcached;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return $this->memcached->get($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetchMultiple(array $keys)
+ {
+ return $this->memcached->getMulti($keys) ?: [];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
+ {
+ if ($lifetime > 30 * 24 * 3600) {
+ $lifetime = time() + $lifetime;
+ }
+
+ return $this->memcached->setMulti($keysAndValues, $lifetime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ $this->memcached->get($id);
+
+ return $this->memcached->getResultCode() === Memcached::RES_SUCCESS;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ if ($lifeTime > 30 * 24 * 3600) {
+ $lifeTime = time() + $lifeTime;
+ }
+ return $this->memcached->set($id, $data, (int) $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDeleteMultiple(array $keys)
+ {
+ return $this->memcached->deleteMulti($keys)
+ || $this->memcached->getResultCode() === Memcached::RES_NOTFOUND;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return $this->memcached->delete($id)
+ || $this->memcached->getResultCode() === Memcached::RES_NOTFOUND;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ return $this->memcached->flush();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $stats = $this->memcached->getStats();
+ $servers = $this->memcached->getServerList();
+ $key = $servers[0]['host'] . ':' . $servers[0]['port'];
+ $stats = $stats[$key];
+ return [
+ Cache::STATS_HITS => $stats['get_hits'],
+ Cache::STATS_MISSES => $stats['get_misses'],
+ Cache::STATS_UPTIME => $stats['uptime'],
+ Cache::STATS_MEMORY_USAGE => $stats['bytes'],
+ Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'],
+ ];
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php
new file mode 100644
index 0000000000..238fde41c5
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php
@@ -0,0 +1,132 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+use MongoCollection;
+use MongoDB\Collection;
+
+/**
+ * MongoDB cache provider.
+ *
+ * @since 1.1
+ * @author Jeremy Mikola
+ */
+class MongoDBCache extends CacheProvider
+{
+ /**
+ * The data field will store the serialized PHP value.
+ */
+ const DATA_FIELD = 'd';
+
+ /**
+ * The expiration field will store a MongoDate value indicating when the
+ * cache entry should expire.
+ *
+ * With MongoDB 2.2+, entries can be automatically deleted by MongoDB by
+ * indexing this field with the "expireAfterSeconds" option equal to zero.
+ * This will direct MongoDB to regularly query for and delete any entries
+ * whose date is older than the current time. Entries without a date value
+ * in this field will be ignored.
+ *
+ * The cache provider will also check dates on its own, in case expired
+ * entries are fetched before MongoDB's TTLMonitor pass can expire them.
+ *
+ * @see http://docs.mongodb.org/manual/tutorial/expire-data/
+ */
+ const EXPIRATION_FIELD = 'e';
+
+ /**
+ * @var CacheProvider
+ */
+ private $provider;
+
+ /**
+ * Constructor.
+ *
+ * This provider will default to the write concern and read preference
+ * options set on the collection instance (or inherited from MongoDB or
+ * MongoClient). Using an unacknowledged write concern (< 1) may make the
+ * return values of delete() and save() unreliable. Reading from secondaries
+ * may make contain() and fetch() unreliable.
+ *
+ * @see http://www.php.net/manual/en/mongo.readpreferences.php
+ * @see http://www.php.net/manual/en/mongo.writeconcerns.php
+ * @param MongoCollection|Collection $collection
+ */
+ public function __construct($collection)
+ {
+ if ($collection instanceof MongoCollection) {
+ @trigger_error('Using a MongoCollection instance for creating a cache adapter is deprecated and will be removed in 2.0', E_USER_DEPRECATED);
+ $this->provider = new LegacyMongoDBCache($collection);
+ } elseif ($collection instanceof Collection) {
+ $this->provider = new ExtMongoDBCache($collection);
+ } else {
+ throw new \InvalidArgumentException('Invalid collection given - expected a MongoCollection or MongoDB\Collection instance');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return $this->provider->doFetch($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return $this->provider->doContains($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ return $this->provider->doSave($id, $data, $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return $this->provider->doDelete($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ return $this->provider->doFlush();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ return $this->provider->doGetStats();
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiDeleteCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiDeleteCache.php
new file mode 100644
index 0000000000..0abaea18be
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiDeleteCache.php
@@ -0,0 +1,41 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Interface for cache drivers that allows to put many items at once.
+ *
+ * @link www.doctrine-project.org
+ * @since 1.7
+ * @author Benoit Burnichon
+ *
+ * @deprecated
+ */
+interface MultiDeleteCache
+{
+ /**
+ * Deletes several cache entries.
+ *
+ * @param string[] $keys Array of keys to delete from cache
+ *
+ * @return bool TRUE if the operation was successful, FALSE if it wasn't.
+ */
+ function deleteMultiple(array $keys);
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php
new file mode 100644
index 0000000000..0d437d143b
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php
@@ -0,0 +1,41 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Interface for cache drivers that allows to get many items at once.
+ *
+ * @link www.doctrine-project.org
+ * @since 1.4
+ * @author Asmir Mustafic
+ *
+ * @deprecated
+ */
+interface MultiGetCache
+{
+ /**
+ * Returns an associative array of values for keys is found in cache.
+ *
+ * @param string[] $keys Array of keys to retrieve from cache
+ * @return mixed[] Array of retrieved values, indexed by the specified keys.
+ * Values that couldn't be retrieved are not contained in this array.
+ */
+ function fetchMultiple(array $keys);
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiOperationCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiOperationCache.php
new file mode 100644
index 0000000000..7d5c0b9fc1
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiOperationCache.php
@@ -0,0 +1,31 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Interface for cache drivers that supports multiple items manipulation.
+ *
+ * @link www.doctrine-project.org
+ * @since 1.7
+ * @author Luís Cobucci
+ */
+interface MultiOperationCache extends MultiGetCache, MultiDeleteCache, MultiPutCache
+{
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiPutCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiPutCache.php
new file mode 100644
index 0000000000..cb20bdc619
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiPutCache.php
@@ -0,0 +1,43 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Interface for cache drivers that allows to put many items at once.
+ *
+ * @link www.doctrine-project.org
+ * @since 1.6
+ * @author Daniel Gorgan
+ *
+ * @deprecated
+ */
+interface MultiPutCache
+{
+ /**
+ * Returns a boolean value indicating if the operation succeeded.
+ *
+ * @param array $keysAndValues Array of keys and values to save in cache
+ * @param int $lifetime The lifetime. If != 0, sets a specific lifetime for these
+ * cache entries (0 => infinite lifeTime).
+ *
+ * @return bool TRUE if the operation was successful, FALSE if it wasn't.
+ */
+ function saveMultiple(array $keysAndValues, $lifetime = 0);
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php
new file mode 100644
index 0000000000..d243ab6c74
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php
@@ -0,0 +1,131 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Php file cache driver.
+ *
+ * @since 2.3
+ * @author Fabio B. Silva
+ */
+class PhpFileCache extends FileCache
+{
+ const EXTENSION = '.doctrinecache.php';
+
+ /**
+ * @var callable
+ *
+ * This is cached in a local static variable to avoid instantiating a closure each time we need an empty handler
+ */
+ private static $emptyErrorHandler;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct($directory, $extension = self::EXTENSION, $umask = 0002)
+ {
+ parent::__construct($directory, $extension, $umask);
+
+ self::$emptyErrorHandler = function () {
+ };
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ $value = $this->includeFileForId($id);
+
+ if ($value === null) {
+ return false;
+ }
+
+ if ($value['lifetime'] !== 0 && $value['lifetime'] < time()) {
+ return false;
+ }
+
+ return $value['data'];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ $value = $this->includeFileForId($id);
+
+ if ($value === null) {
+ return false;
+ }
+
+ return $value['lifetime'] === 0 || $value['lifetime'] > time();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ if ($lifeTime > 0) {
+ $lifeTime = time() + $lifeTime;
+ }
+
+ $filename = $this->getFilename($id);
+
+ $value = [
+ 'lifetime' => $lifeTime,
+ 'data' => $data
+ ];
+
+ if (is_object($data) && method_exists($data, '__set_state')) {
+ $value = var_export($value, true);
+ $code = sprintf('writeFile($filename, $code);
+ }
+
+ /**
+ * @param string $id
+ *
+ * @return array|null
+ */
+ private function includeFileForId(string $id) : ?array
+ {
+ $fileName = $this->getFilename($id);
+
+ // note: error suppression is still faster than `file_exists`, `is_file` and `is_readable`
+ set_error_handler(self::$emptyErrorHandler);
+
+ $value = include $fileName;
+
+ restore_error_handler();
+
+ if (! isset($value['lifetime'])) {
+ return null;
+ }
+
+ return $value;
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php
new file mode 100644
index 0000000000..a0cb86f976
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php
@@ -0,0 +1,161 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+use Predis\ClientInterface;
+
+/**
+ * Predis cache provider.
+ *
+ * @author othillo
+ */
+class PredisCache extends CacheProvider
+{
+ /**
+ * @var ClientInterface
+ */
+ private $client;
+
+ /**
+ * @param ClientInterface $client
+ *
+ * @return void
+ */
+ public function __construct(ClientInterface $client)
+ {
+ $this->client = $client;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ $result = $this->client->get($id);
+ if (null === $result) {
+ return false;
+ }
+
+ return unserialize($result);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetchMultiple(array $keys)
+ {
+ $fetchedItems = call_user_func_array([$this->client, 'mget'], $keys);
+
+ return array_map('unserialize', array_filter(array_combine($keys, $fetchedItems)));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
+ {
+ if ($lifetime) {
+ $success = true;
+
+ // Keys have lifetime, use SETEX for each of them
+ foreach ($keysAndValues as $key => $value) {
+ $response = $this->client->setex($key, $lifetime, serialize($value));
+
+ if ((string) $response != 'OK') {
+ $success = false;
+ }
+ }
+
+ return $success;
+ }
+
+ // No lifetime, use MSET
+ $response = $this->client->mset(array_map(function ($value) {
+ return serialize($value);
+ }, $keysAndValues));
+
+ return (string) $response == 'OK';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return (bool) $this->client->exists($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ $data = serialize($data);
+ if ($lifeTime > 0) {
+ $response = $this->client->setex($id, $lifeTime, $data);
+ } else {
+ $response = $this->client->set($id, $data);
+ }
+
+ return $response === true || $response == 'OK';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return $this->client->del($id) >= 0;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDeleteMultiple(array $keys)
+ {
+ return $this->client->del($keys) >= 0;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ $response = $this->client->flushdb();
+
+ return $response === true || $response == 'OK';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $info = $this->client->info();
+
+ return [
+ Cache::STATS_HITS => $info['Stats']['keyspace_hits'],
+ Cache::STATS_MISSES => $info['Stats']['keyspace_misses'],
+ Cache::STATS_UPTIME => $info['Server']['uptime_in_seconds'],
+ Cache::STATS_MEMORY_USAGE => $info['Memory']['used_memory'],
+ Cache::STATS_MEMORY_AVAILABLE => false
+ ];
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php
new file mode 100644
index 0000000000..3ea51d507a
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php
@@ -0,0 +1,184 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+use Redis;
+
+/**
+ * Redis cache provider.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.2
+ * @author Osman Ungur
+ */
+class RedisCache extends CacheProvider
+{
+ /**
+ * @var Redis|null
+ */
+ private $redis;
+
+ /**
+ * Sets the redis instance to use.
+ *
+ * @param Redis $redis
+ *
+ * @return void
+ */
+ public function setRedis(Redis $redis)
+ {
+ $redis->setOption(Redis::OPT_SERIALIZER, $this->getSerializerValue());
+ $this->redis = $redis;
+ }
+
+ /**
+ * Gets the redis instance used by the cache.
+ *
+ * @return Redis|null
+ */
+ public function getRedis()
+ {
+ return $this->redis;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return $this->redis->get($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetchMultiple(array $keys)
+ {
+ $fetchedItems = array_combine($keys, $this->redis->mget($keys));
+
+ // Redis mget returns false for keys that do not exist. So we need to filter those out unless it's the real data.
+ $foundItems = [];
+
+ foreach ($fetchedItems as $key => $value) {
+ if (false !== $value || $this->redis->exists($key)) {
+ $foundItems[$key] = $value;
+ }
+ }
+
+ return $foundItems;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
+ {
+ if ($lifetime) {
+ $success = true;
+
+ // Keys have lifetime, use SETEX for each of them
+ foreach ($keysAndValues as $key => $value) {
+ if (!$this->redis->setex($key, $lifetime, $value)) {
+ $success = false;
+ }
+ }
+
+ return $success;
+ }
+
+ // No lifetime, use MSET
+ return (bool) $this->redis->mset($keysAndValues);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return $this->redis->exists($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ if ($lifeTime > 0) {
+ return $this->redis->setex($id, $lifeTime, $data);
+ }
+
+ return $this->redis->set($id, $data);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return $this->redis->delete($id) >= 0;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDeleteMultiple(array $keys)
+ {
+ return $this->redis->delete($keys) >= 0;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ return $this->redis->flushDB();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $info = $this->redis->info();
+ return [
+ Cache::STATS_HITS => $info['keyspace_hits'],
+ Cache::STATS_MISSES => $info['keyspace_misses'],
+ Cache::STATS_UPTIME => $info['uptime_in_seconds'],
+ Cache::STATS_MEMORY_USAGE => $info['used_memory'],
+ Cache::STATS_MEMORY_AVAILABLE => false
+ ];
+ }
+
+ /**
+ * Returns the serializer constant to use. If Redis is compiled with
+ * igbinary support, that is used. Otherwise the default PHP serializer is
+ * used.
+ *
+ * @return integer One of the Redis::SERIALIZER_* constants
+ */
+ protected function getSerializerValue()
+ {
+ if (defined('Redis::SERIALIZER_IGBINARY') && extension_loaded('igbinary')) {
+ return Redis::SERIALIZER_IGBINARY;
+ }
+
+ return Redis::SERIALIZER_PHP;
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php
new file mode 100644
index 0000000000..8a2e59ee1f
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php
@@ -0,0 +1,249 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+use Riak\Bucket;
+use Riak\Input;
+use Riak\Exception;
+use Riak\Object;
+
+/**
+ * Riak cache provider.
+ *
+ * @link www.doctrine-project.org
+ * @since 1.1
+ * @author Guilherme Blanco
+ */
+class RiakCache extends CacheProvider
+{
+ const EXPIRES_HEADER = 'X-Riak-Meta-Expires';
+
+ /**
+ * @var \Riak\Bucket
+ */
+ private $bucket;
+
+ /**
+ * Sets the riak bucket instance to use.
+ *
+ * @param \Riak\Bucket $bucket
+ */
+ public function __construct(Bucket $bucket)
+ {
+ $this->bucket = $bucket;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ try {
+ $response = $this->bucket->get($id);
+
+ // No objects found
+ if ( ! $response->hasObject()) {
+ return false;
+ }
+
+ // Check for attempted siblings
+ $object = ($response->hasSiblings())
+ ? $this->resolveConflict($id, $response->getVClock(), $response->getObjectList())
+ : $response->getFirstObject();
+
+ // Check for expired object
+ if ($this->isExpired($object)) {
+ $this->bucket->delete($object);
+
+ return false;
+ }
+
+ return unserialize($object->getContent());
+ } catch (Exception\RiakException $e) {
+ // Covers:
+ // - Riak\ConnectionException
+ // - Riak\CommunicationException
+ // - Riak\UnexpectedResponseException
+ // - Riak\NotFoundException
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ try {
+ // We only need the HEAD, not the entire object
+ $input = new Input\GetInput();
+
+ $input->setReturnHead(true);
+
+ $response = $this->bucket->get($id, $input);
+
+ // No objects found
+ if ( ! $response->hasObject()) {
+ return false;
+ }
+
+ $object = $response->getFirstObject();
+
+ // Check for expired object
+ if ($this->isExpired($object)) {
+ $this->bucket->delete($object);
+
+ return false;
+ }
+
+ return true;
+ } catch (Exception\RiakException $e) {
+ // Do nothing
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ try {
+ $object = new Object($id);
+
+ $object->setContent(serialize($data));
+
+ if ($lifeTime > 0) {
+ $object->addMetadata(self::EXPIRES_HEADER, (string) (time() + $lifeTime));
+ }
+
+ $this->bucket->put($object);
+
+ return true;
+ } catch (Exception\RiakException $e) {
+ // Do nothing
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ try {
+ $this->bucket->delete($id);
+
+ return true;
+ } catch (Exception\BadArgumentsException $e) {
+ // Key did not exist on cluster already
+ } catch (Exception\RiakException $e) {
+ // Covers:
+ // - Riak\Exception\ConnectionException
+ // - Riak\Exception\CommunicationException
+ // - Riak\Exception\UnexpectedResponseException
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ try {
+ $keyList = $this->bucket->getKeyList();
+
+ foreach ($keyList as $key) {
+ $this->bucket->delete($key);
+ }
+
+ return true;
+ } catch (Exception\RiakException $e) {
+ // Do nothing
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ // Only exposed through HTTP stats API, not Protocol Buffers API
+ return null;
+ }
+
+ /**
+ * Check if a given Riak Object have expired.
+ *
+ * @param \Riak\Object $object
+ *
+ * @return bool
+ */
+ private function isExpired(Object $object) : bool
+ {
+ $metadataMap = $object->getMetadataMap();
+
+ return isset($metadataMap[self::EXPIRES_HEADER])
+ && $metadataMap[self::EXPIRES_HEADER] < time();
+ }
+
+ /**
+ * On-read conflict resolution. Applied approach here is last write wins.
+ * Specific needs may override this method to apply alternate conflict resolutions.
+ *
+ * {@internal Riak does not attempt to resolve a write conflict, and store
+ * it as sibling of conflicted one. By following this approach, it is up to
+ * the next read to resolve the conflict. When this happens, your fetched
+ * object will have a list of siblings (read as a list of objects).
+ * In our specific case, we do not care about the intermediate ones since
+ * they are all the same read from storage, and we do apply a last sibling
+ * (last write) wins logic.
+ * If by any means our resolution generates another conflict, it'll up to
+ * next read to properly solve it.}
+ *
+ * @param string $id
+ * @param string $vClock
+ * @param array $objectList
+ *
+ * @return \Riak\Object
+ */
+ protected function resolveConflict($id, $vClock, array $objectList)
+ {
+ // Our approach here is last-write wins
+ $winner = $objectList[count($objectList)];
+
+ $putInput = new Input\PutInput();
+ $putInput->setVClock($vClock);
+
+ $mergedObject = new Object($id);
+ $mergedObject->setContent($winner->getContent());
+
+ $this->bucket->put($mergedObject, $putInput);
+
+ return $mergedObject;
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php
new file mode 100644
index 0000000000..5b98538e58
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php
@@ -0,0 +1,222 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+use SQLite3;
+use SQLite3Result;
+
+/**
+ * SQLite3 cache provider.
+ *
+ * @since 1.4
+ * @author Jake Bell
+ */
+class SQLite3Cache extends CacheProvider
+{
+ /**
+ * The ID field will store the cache key.
+ */
+ const ID_FIELD = 'k';
+
+ /**
+ * The data field will store the serialized PHP value.
+ */
+ const DATA_FIELD = 'd';
+
+ /**
+ * The expiration field will store a date value indicating when the
+ * cache entry should expire.
+ */
+ const EXPIRATION_FIELD = 'e';
+
+ /**
+ * @var SQLite3
+ */
+ private $sqlite;
+
+ /**
+ * @var string
+ */
+ private $table;
+
+ /**
+ * Constructor.
+ *
+ * Calling the constructor will ensure that the database file and table
+ * exist and will create both if they don't.
+ *
+ * @param SQLite3 $sqlite
+ * @param string $table
+ */
+ public function __construct(SQLite3 $sqlite, $table)
+ {
+ $this->sqlite = $sqlite;
+ $this->table = (string) $table;
+
+ list($id, $data, $exp) = $this->getFields();
+
+ return $this->sqlite->exec(sprintf(
+ 'CREATE TABLE IF NOT EXISTS %s(%s TEXT PRIMARY KEY NOT NULL, %s BLOB, %s INTEGER)',
+ $table,
+ $id,
+ $data,
+ $exp
+ ));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ $item = $this->findById($id);
+
+ if (!$item) {
+ return false;
+ }
+
+ return unserialize($item[self::DATA_FIELD]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return null !== $this->findById($id, false);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ $statement = $this->sqlite->prepare(sprintf(
+ 'INSERT OR REPLACE INTO %s (%s) VALUES (:id, :data, :expire)',
+ $this->table,
+ implode(',', $this->getFields())
+ ));
+
+ $statement->bindValue(':id', $id);
+ $statement->bindValue(':data', serialize($data), SQLITE3_BLOB);
+ $statement->bindValue(':expire', $lifeTime > 0 ? time() + $lifeTime : null);
+
+ return $statement->execute() instanceof SQLite3Result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ list($idField) = $this->getFields();
+
+ $statement = $this->sqlite->prepare(sprintf(
+ 'DELETE FROM %s WHERE %s = :id',
+ $this->table,
+ $idField
+ ));
+
+ $statement->bindValue(':id', $id);
+
+ return $statement->execute() instanceof SQLite3Result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ return $this->sqlite->exec(sprintf('DELETE FROM %s', $this->table));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ // no-op.
+ }
+
+ /**
+ * Find a single row by ID.
+ *
+ * @param mixed $id
+ * @param bool $includeData
+ *
+ * @return array|null
+ */
+ private function findById($id, bool $includeData = true) : ?array
+ {
+ list($idField) = $fields = $this->getFields();
+
+ if (!$includeData) {
+ $key = array_search(static::DATA_FIELD, $fields);
+ unset($fields[$key]);
+ }
+
+ $statement = $this->sqlite->prepare(sprintf(
+ 'SELECT %s FROM %s WHERE %s = :id LIMIT 1',
+ implode(',', $fields),
+ $this->table,
+ $idField
+ ));
+
+ $statement->bindValue(':id', $id, SQLITE3_TEXT);
+
+ $item = $statement->execute()->fetchArray(SQLITE3_ASSOC);
+
+ if ($item === false) {
+ return null;
+ }
+
+ if ($this->isExpired($item)) {
+ $this->doDelete($id);
+
+ return null;
+ }
+
+ return $item;
+ }
+
+ /**
+ * Gets an array of the fields in our table.
+ *
+ * @return array
+ */
+ private function getFields() : array
+ {
+ return [static::ID_FIELD, static::DATA_FIELD, static::EXPIRATION_FIELD];
+ }
+
+ /**
+ * Check if the item is expired.
+ *
+ * @param array $item
+ *
+ * @return bool
+ */
+ private function isExpired(array $item) : bool
+ {
+ return isset($item[static::EXPIRATION_FIELD]) &&
+ $item[self::EXPIRATION_FIELD] !== null &&
+ $item[self::EXPIRATION_FIELD] < time();
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php
new file mode 100644
index 0000000000..71b8b6f804
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php
@@ -0,0 +1,25 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+class Version
+{
+ const VERSION = '1.7.1';
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php
new file mode 100644
index 0000000000..65e8456faa
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php
@@ -0,0 +1,78 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Void cache driver. The cache could be of use in tests where you don`t need to cache anything.
+ *
+ * @link www.doctrine-project.org
+ * @since 1.5
+ * @author Kotlyar Maksim
+ */
+class VoidCache extends CacheProvider
+{
+ /**
+ * {@inheritDoc}
+ */
+ protected function doFetch($id)
+ {
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doContains($id)
+ {
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doDelete($id)
+ {
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doFlush()
+ {
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doGetStats()
+ {
+ return;
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php
new file mode 100644
index 0000000000..905ccbc27b
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php
@@ -0,0 +1,119 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * WinCache cache provider.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.2
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author David Abdemoulaie
+ */
+class WinCacheCache extends CacheProvider
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return wincache_ucache_get($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return wincache_ucache_exists($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ return wincache_ucache_set($id, $data, $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return wincache_ucache_delete($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ return wincache_ucache_clear();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetchMultiple(array $keys)
+ {
+ return wincache_ucache_get($keys);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
+ {
+ $result = wincache_ucache_set($keysAndValues, null, $lifetime);
+
+ return empty($result);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDeleteMultiple(array $keys)
+ {
+ $result = wincache_ucache_delete($keys);
+
+ return is_array($result) && count($result) !== count($keys);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $info = wincache_ucache_info();
+ $meminfo = wincache_ucache_meminfo();
+
+ return [
+ Cache::STATS_HITS => $info['total_hit_count'],
+ Cache::STATS_MISSES => $info['total_miss_count'],
+ Cache::STATS_UPTIME => $info['total_cache_uptime'],
+ Cache::STATS_MEMORY_USAGE => $meminfo['memory_total'],
+ Cache::STATS_MEMORY_AVAILABLE => $meminfo['memory_free'],
+ ];
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php
new file mode 100644
index 0000000000..799a5fc5bc
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php
@@ -0,0 +1,112 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Xcache cache driver.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.0
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author David Abdemoulaie
+ */
+class XcacheCache extends CacheProvider
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return $this->doContains($id) ? unserialize(xcache_get($id)) : false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return xcache_isset($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ return xcache_set($id, serialize($data), (int) $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return xcache_unset($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ $this->checkAuthorization();
+
+ xcache_clear_cache(XC_TYPE_VAR);
+
+ return true;
+ }
+
+ /**
+ * Checks that xcache.admin.enable_auth is Off.
+ *
+ * @return void
+ *
+ * @throws \BadMethodCallException When xcache.admin.enable_auth is On.
+ */
+ protected function checkAuthorization()
+ {
+ if (ini_get('xcache.admin.enable_auth')) {
+ throw new \BadMethodCallException(
+ 'To use all features of \Doctrine\Common\Cache\XcacheCache, '
+ . 'you must set "xcache.admin.enable_auth" to "Off" in your php.ini.'
+ );
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $this->checkAuthorization();
+
+ $info = xcache_info(XC_TYPE_VAR, 0);
+ return [
+ Cache::STATS_HITS => $info['hits'],
+ Cache::STATS_MISSES => $info['misses'],
+ Cache::STATS_UPTIME => null,
+ Cache::STATS_MEMORY_USAGE => $info['size'],
+ Cache::STATS_MEMORY_AVAILABLE => $info['avail'],
+ ];
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php
new file mode 100644
index 0000000000..6e35ac8236
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php
@@ -0,0 +1,83 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Zend Data Cache cache driver.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.0
+ * @author Ralph Schindler
+ * @author Guilherme Blanco
+ */
+class ZendDataCache extends CacheProvider
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return zend_shm_cache_fetch($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return (false !== zend_shm_cache_fetch($id));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ return zend_shm_cache_store($id, $data, $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return zend_shm_cache_delete($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ $namespace = $this->getNamespace();
+ if (empty($namespace)) {
+ return zend_shm_cache_clear();
+ }
+ return zend_shm_cache_clear($namespace);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ return null;
+ }
+}
diff --git a/vendor/doctrine/instantiator/CONTRIBUTING.md b/vendor/doctrine/instantiator/CONTRIBUTING.md
new file mode 100644
index 0000000000..75b84b2aa2
--- /dev/null
+++ b/vendor/doctrine/instantiator/CONTRIBUTING.md
@@ -0,0 +1,35 @@
+# Contributing
+
+ * Coding standard for the project is [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)
+ * The project will follow strict [object calisthenics](http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php)
+ * Any contribution must provide tests for additional introduced conditions
+ * Any un-confirmed issue needs a failing test case before being accepted
+ * Pull requests must be sent from a new hotfix/feature branch, not from `master`.
+
+## Installation
+
+To install the project and run the tests, you need to clone it first:
+
+```sh
+$ git clone git://github.com/doctrine/instantiator.git
+```
+
+You will then need to run a composer installation:
+
+```sh
+$ cd Instantiator
+$ curl -s https://getcomposer.org/installer | php
+$ php composer.phar update
+```
+
+## Testing
+
+The PHPUnit version to be used is the one installed as a dev- dependency via composer:
+
+```sh
+$ ./vendor/bin/phpunit
+```
+
+Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement
+won't be merged.
+
diff --git a/vendor/doctrine/instantiator/LICENSE b/vendor/doctrine/instantiator/LICENSE
new file mode 100644
index 0000000000..4d983d1ac7
--- /dev/null
+++ b/vendor/doctrine/instantiator/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2014 Doctrine Project
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/doctrine/instantiator/README.md b/vendor/doctrine/instantiator/README.md
new file mode 100644
index 0000000000..b66064bf55
--- /dev/null
+++ b/vendor/doctrine/instantiator/README.md
@@ -0,0 +1,40 @@
+# Instantiator
+
+This library provides a way of avoiding usage of constructors when instantiating PHP classes.
+
+[![Build Status](https://travis-ci.org/doctrine/instantiator.svg?branch=master)](https://travis-ci.org/doctrine/instantiator)
+[![Code Coverage](https://scrutinizer-ci.com/g/doctrine/instantiator/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/doctrine/instantiator/?branch=master)
+[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/doctrine/instantiator/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/doctrine/instantiator/?branch=master)
+[![Dependency Status](https://www.versioneye.com/package/php--doctrine--instantiator/badge.svg)](https://www.versioneye.com/package/php--doctrine--instantiator)
+[![HHVM Status](http://hhvm.h4cc.de/badge/doctrine/instantiator.png)](http://hhvm.h4cc.de/package/doctrine/instantiator)
+
+[![Latest Stable Version](https://poser.pugx.org/doctrine/instantiator/v/stable.png)](https://packagist.org/packages/doctrine/instantiator)
+[![Latest Unstable Version](https://poser.pugx.org/doctrine/instantiator/v/unstable.png)](https://packagist.org/packages/doctrine/instantiator)
+
+## Installation
+
+The suggested installation method is via [composer](https://getcomposer.org/):
+
+```sh
+php composer.phar require "doctrine/instantiator:~1.0.3"
+```
+
+## Usage
+
+The instantiator is able to create new instances of any class without using the constructor or any API of the class
+itself:
+
+```php
+$instantiator = new \Doctrine\Instantiator\Instantiator();
+
+$instance = $instantiator->instantiate(\My\ClassName\Here::class);
+```
+
+## Contributing
+
+Please read the [CONTRIBUTING.md](CONTRIBUTING.md) contents if you wish to help out!
+
+## Credits
+
+This library was migrated from [ocramius/instantiator](https://github.com/Ocramius/Instantiator), which
+has been donated to the doctrine organization, and which is now deprecated in favour of this package.
diff --git a/vendor/doctrine/instantiator/composer.json b/vendor/doctrine/instantiator/composer.json
new file mode 100644
index 0000000000..403ee8e609
--- /dev/null
+++ b/vendor/doctrine/instantiator/composer.json
@@ -0,0 +1,45 @@
+{
+ "name": "doctrine/instantiator",
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "type": "library",
+ "license": "MIT",
+ "homepage": "https://github.com/doctrine/instantiator",
+ "keywords": [
+ "instantiate",
+ "constructor"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "http://ocramius.github.com/"
+ }
+ ],
+ "require": {
+ "php": "^7.1"
+ },
+ "require-dev": {
+ "ext-phar": "*",
+ "ext-pdo": "*",
+ "phpunit/phpunit": "^6.2.3",
+ "squizlabs/php_codesniffer": "^3.0.2",
+ "athletic/athletic": "~0.1.8"
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "autoload-dev": {
+ "psr-0": {
+ "DoctrineTest\\InstantiatorPerformance\\": "tests",
+ "DoctrineTest\\InstantiatorTest\\": "tests",
+ "DoctrineTest\\InstantiatorTestAsset\\": "tests"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ }
+}
diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php
new file mode 100644
index 0000000000..3065375a8c
--- /dev/null
+++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php
@@ -0,0 +1,29 @@
+.
+ */
+
+namespace Doctrine\Instantiator\Exception;
+
+/**
+ * Base exception marker interface for the instantiator component
+ *
+ * @author Marco Pivetta
+ */
+interface ExceptionInterface
+{
+}
diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php
new file mode 100644
index 0000000000..cb57aa86fe
--- /dev/null
+++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php
@@ -0,0 +1,52 @@
+.
+ */
+
+namespace Doctrine\Instantiator\Exception;
+
+use InvalidArgumentException as BaseInvalidArgumentException;
+use ReflectionClass;
+
+/**
+ * Exception for invalid arguments provided to the instantiator
+ *
+ * @author Marco Pivetta
+ */
+class InvalidArgumentException extends BaseInvalidArgumentException implements ExceptionInterface
+{
+ public static function fromNonExistingClass(string $className) : self
+ {
+ if (interface_exists($className)) {
+ return new self(sprintf('The provided type "%s" is an interface, and can not be instantiated', $className));
+ }
+
+ if (PHP_VERSION_ID >= 50400 && trait_exists($className)) {
+ return new self(sprintf('The provided type "%s" is a trait, and can not be instantiated', $className));
+ }
+
+ return new self(sprintf('The provided class "%s" does not exist', $className));
+ }
+
+ public static function fromAbstractClass(ReflectionClass $reflectionClass) : self
+ {
+ return new self(sprintf(
+ 'The provided class "%s" is abstract, and can not be instantiated',
+ $reflectionClass->getName()
+ ));
+ }
+}
diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php
new file mode 100644
index 0000000000..2b704b9202
--- /dev/null
+++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php
@@ -0,0 +1,66 @@
+.
+ */
+
+namespace Doctrine\Instantiator\Exception;
+
+use Exception;
+use ReflectionClass;
+use UnexpectedValueException as BaseUnexpectedValueException;
+
+/**
+ * Exception for given parameters causing invalid/unexpected state on instantiation
+ *
+ * @author Marco Pivetta
+ */
+class UnexpectedValueException extends BaseUnexpectedValueException implements ExceptionInterface
+{
+ public static function fromSerializationTriggeredException(
+ ReflectionClass $reflectionClass,
+ Exception $exception
+ ) : self {
+ return new self(
+ sprintf(
+ 'An exception was raised while trying to instantiate an instance of "%s" via un-serialization',
+ $reflectionClass->getName()
+ ),
+ 0,
+ $exception
+ );
+ }
+
+ public static function fromUncleanUnSerialization(
+ ReflectionClass $reflectionClass,
+ string $errorString,
+ int $errorCode,
+ string $errorFile,
+ int $errorLine
+ ) : self {
+ return new self(
+ sprintf(
+ 'Could not produce an instance of "%s" via un-serialization, since an error was triggered '
+ . 'in file "%s" at line "%d"',
+ $reflectionClass->getName(),
+ $errorFile,
+ $errorLine
+ ),
+ 0,
+ new Exception($errorString, $errorCode)
+ );
+ }
+}
diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php
new file mode 100644
index 0000000000..69fe65da34
--- /dev/null
+++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php
@@ -0,0 +1,216 @@
+.
+ */
+
+namespace Doctrine\Instantiator;
+
+use Doctrine\Instantiator\Exception\InvalidArgumentException;
+use Doctrine\Instantiator\Exception\UnexpectedValueException;
+use Exception;
+use ReflectionClass;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Marco Pivetta
+ */
+final class Instantiator implements InstantiatorInterface
+{
+ /**
+ * Markers used internally by PHP to define whether {@see \unserialize} should invoke
+ * the method {@see \Serializable::unserialize()} when dealing with classes implementing
+ * the {@see \Serializable} interface.
+ */
+ const SERIALIZATION_FORMAT_USE_UNSERIALIZER = 'C';
+ const SERIALIZATION_FORMAT_AVOID_UNSERIALIZER = 'O';
+
+ /**
+ * @var \callable[] used to instantiate specific classes, indexed by class name
+ */
+ private static $cachedInstantiators = [];
+
+ /**
+ * @var object[] of objects that can directly be cloned, indexed by class name
+ */
+ private static $cachedCloneables = [];
+
+ /**
+ * {@inheritDoc}
+ */
+ public function instantiate($className)
+ {
+ if (isset(self::$cachedCloneables[$className])) {
+ return clone self::$cachedCloneables[$className];
+ }
+
+ if (isset(self::$cachedInstantiators[$className])) {
+ $factory = self::$cachedInstantiators[$className];
+
+ return $factory();
+ }
+
+ return $this->buildAndCacheFromFactory($className);
+ }
+
+ /**
+ * Builds the requested object and caches it in static properties for performance
+ *
+ * @return object
+ */
+ private function buildAndCacheFromFactory(string $className)
+ {
+ $factory = self::$cachedInstantiators[$className] = $this->buildFactory($className);
+ $instance = $factory();
+
+ if ($this->isSafeToClone(new ReflectionClass($instance))) {
+ self::$cachedCloneables[$className] = clone $instance;
+ }
+
+ return $instance;
+ }
+
+ /**
+ * Builds a callable capable of instantiating the given $className without
+ * invoking its constructor.
+ *
+ * @throws InvalidArgumentException
+ * @throws UnexpectedValueException
+ * @throws \ReflectionException
+ */
+ private function buildFactory(string $className) : callable
+ {
+ $reflectionClass = $this->getReflectionClass($className);
+
+ if ($this->isInstantiableViaReflection($reflectionClass)) {
+ return [$reflectionClass, 'newInstanceWithoutConstructor'];
+ }
+
+ $serializedString = sprintf(
+ '%s:%d:"%s":0:{}',
+ self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER,
+ strlen($className),
+ $className
+ );
+
+ $this->checkIfUnSerializationIsSupported($reflectionClass, $serializedString);
+
+ return function () use ($serializedString) {
+ return unserialize($serializedString);
+ };
+ }
+
+ /**
+ * @param string $className
+ *
+ * @return ReflectionClass
+ *
+ * @throws InvalidArgumentException
+ * @throws \ReflectionException
+ */
+ private function getReflectionClass($className) : ReflectionClass
+ {
+ if (! class_exists($className)) {
+ throw InvalidArgumentException::fromNonExistingClass($className);
+ }
+
+ $reflection = new ReflectionClass($className);
+
+ if ($reflection->isAbstract()) {
+ throw InvalidArgumentException::fromAbstractClass($reflection);
+ }
+
+ return $reflection;
+ }
+
+ /**
+ * @param ReflectionClass $reflectionClass
+ * @param string $serializedString
+ *
+ * @throws UnexpectedValueException
+ *
+ * @return void
+ */
+ private function checkIfUnSerializationIsSupported(ReflectionClass $reflectionClass, $serializedString) : void
+ {
+ set_error_handler(function ($code, $message, $file, $line) use ($reflectionClass, & $error) : void {
+ $error = UnexpectedValueException::fromUncleanUnSerialization(
+ $reflectionClass,
+ $message,
+ $code,
+ $file,
+ $line
+ );
+ });
+
+ $this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString);
+
+ restore_error_handler();
+
+ if ($error) {
+ throw $error;
+ }
+ }
+
+ /**
+ * @param ReflectionClass $reflectionClass
+ * @param string $serializedString
+ *
+ * @throws UnexpectedValueException
+ *
+ * @return void
+ */
+ private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, $serializedString) : void
+ {
+ try {
+ unserialize($serializedString);
+ } catch (Exception $exception) {
+ restore_error_handler();
+
+ throw UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $exception);
+ }
+ }
+
+ private function isInstantiableViaReflection(ReflectionClass $reflectionClass) : bool
+ {
+ return ! ($this->hasInternalAncestors($reflectionClass) && $reflectionClass->isFinal());
+ }
+
+ /**
+ * Verifies whether the given class is to be considered internal
+ */
+ private function hasInternalAncestors(ReflectionClass $reflectionClass) : bool
+ {
+ do {
+ if ($reflectionClass->isInternal()) {
+ return true;
+ }
+ } while ($reflectionClass = $reflectionClass->getParentClass());
+
+ return false;
+ }
+
+ /**
+ * Checks if a class is cloneable
+ *
+ * Classes implementing `__clone` cannot be safely cloned, as that may cause side-effects.
+ */
+ private function isSafeToClone(ReflectionClass $reflection) : bool
+ {
+ return $reflection->isCloneable() && ! $reflection->hasMethod('__clone');
+ }
+}
diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php
new file mode 100644
index 0000000000..b665bea854
--- /dev/null
+++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php
@@ -0,0 +1,37 @@
+.
+ */
+
+namespace Doctrine\Instantiator;
+
+/**
+ * Instantiator provides utility methods to build objects without invoking their constructors
+ *
+ * @author Marco Pivetta
+ */
+interface InstantiatorInterface
+{
+ /**
+ * @param string $className
+ *
+ * @return object
+ *
+ * @throws \Doctrine\Instantiator\Exception\ExceptionInterface
+ */
+ public function instantiate($className);
+}
diff --git a/vendor/firebase/php-jwt/LICENSE b/vendor/firebase/php-jwt/LICENSE
new file mode 100644
index 0000000000..cb0c49b331
--- /dev/null
+++ b/vendor/firebase/php-jwt/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2011, Neuman Vong
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ * Neither the name of Neuman Vong nor the names of other
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/firebase/php-jwt/README.md b/vendor/firebase/php-jwt/README.md
new file mode 100644
index 0000000000..b1a7a3a206
--- /dev/null
+++ b/vendor/firebase/php-jwt/README.md
@@ -0,0 +1,200 @@
+[![Build Status](https://travis-ci.org/firebase/php-jwt.png?branch=master)](https://travis-ci.org/firebase/php-jwt)
+[![Latest Stable Version](https://poser.pugx.org/firebase/php-jwt/v/stable)](https://packagist.org/packages/firebase/php-jwt)
+[![Total Downloads](https://poser.pugx.org/firebase/php-jwt/downloads)](https://packagist.org/packages/firebase/php-jwt)
+[![License](https://poser.pugx.org/firebase/php-jwt/license)](https://packagist.org/packages/firebase/php-jwt)
+
+PHP-JWT
+=======
+A simple library to encode and decode JSON Web Tokens (JWT) in PHP, conforming to [RFC 7519](https://tools.ietf.org/html/rfc7519).
+
+Installation
+------------
+
+Use composer to manage your dependencies and download PHP-JWT:
+
+```bash
+composer require firebase/php-jwt
+```
+
+Example
+-------
+```php
+ "http://example.org",
+ "aud" => "http://example.com",
+ "iat" => 1356999524,
+ "nbf" => 1357000000
+);
+
+/**
+ * IMPORTANT:
+ * You must specify supported algorithms for your application. See
+ * https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40
+ * for a list of spec-compliant algorithms.
+ */
+$jwt = JWT::encode($token, $key);
+$decoded = JWT::decode($jwt, $key, array('HS256'));
+
+print_r($decoded);
+
+/*
+ NOTE: This will now be an object instead of an associative array. To get
+ an associative array, you will need to cast it as such:
+*/
+
+$decoded_array = (array) $decoded;
+
+/**
+ * You can add a leeway to account for when there is a clock skew times between
+ * the signing and verifying servers. It is recommended that this leeway should
+ * not be bigger than a few minutes.
+ *
+ * Source: http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#nbfDef
+ */
+JWT::$leeway = 60; // $leeway in seconds
+$decoded = JWT::decode($jwt, $key, array('HS256'));
+
+?>
+```
+Example with RS256 (openssl)
+----------------------------
+```php
+ "example.org",
+ "aud" => "example.com",
+ "iat" => 1356999524,
+ "nbf" => 1357000000
+);
+
+$jwt = JWT::encode($token, $privateKey, 'RS256');
+echo "Encode:\n" . print_r($jwt, true) . "\n";
+
+$decoded = JWT::decode($jwt, $publicKey, array('RS256'));
+
+/*
+ NOTE: This will now be an object instead of an associative array. To get
+ an associative array, you will need to cast it as such:
+*/
+
+$decoded_array = (array) $decoded;
+echo "Decode:\n" . print_r($decoded_array, true) . "\n";
+?>
+```
+
+Changelog
+---------
+
+#### 5.0.0 / 2017-06-26
+- Support RS384 and RS512.
+ See [#117](https://github.com/firebase/php-jwt/pull/117). Thanks [@joostfaassen](https://github.com/joostfaassen)!
+- Add an example for RS256 openssl.
+ See [#125](https://github.com/firebase/php-jwt/pull/125). Thanks [@akeeman](https://github.com/akeeman)!
+- Detect invalid Base64 encoding in signature.
+ See [#162](https://github.com/firebase/php-jwt/pull/162). Thanks [@psignoret](https://github.com/psignoret)!
+- Update `JWT::verify` to handle OpenSSL errors.
+ See [#159](https://github.com/firebase/php-jwt/pull/159). Thanks [@bshaffer](https://github.com/bshaffer)!
+- Add `array` type hinting to `decode` method
+ See [#101](https://github.com/firebase/php-jwt/pull/101). Thanks [@hywak](https://github.com/hywak)!
+- Add all JSON error types.
+ See [#110](https://github.com/firebase/php-jwt/pull/110). Thanks [@gbalduzzi](https://github.com/gbalduzzi)!
+- Bugfix 'kid' not in given key list.
+ See [#129](https://github.com/firebase/php-jwt/pull/129). Thanks [@stampycode](https://github.com/stampycode)!
+- Miscellaneous cleanup, documentation and test fixes.
+ See [#107](https://github.com/firebase/php-jwt/pull/107), [#115](https://github.com/firebase/php-jwt/pull/115),
+ [#160](https://github.com/firebase/php-jwt/pull/160), [#161](https://github.com/firebase/php-jwt/pull/161), and
+ [#165](https://github.com/firebase/php-jwt/pull/165). Thanks [@akeeman](https://github.com/akeeman),
+ [@chinedufn](https://github.com/chinedufn), and [@bshaffer](https://github.com/bshaffer)!
+
+#### 4.0.0 / 2016-07-17
+- Add support for late static binding. See [#88](https://github.com/firebase/php-jwt/pull/88) for details. Thanks to [@chappy84](https://github.com/chappy84)!
+- Use static `$timestamp` instead of `time()` to improve unit testing. See [#93](https://github.com/firebase/php-jwt/pull/93) for details. Thanks to [@josephmcdermott](https://github.com/josephmcdermott)!
+- Fixes to exceptions classes. See [#81](https://github.com/firebase/php-jwt/pull/81) for details. Thanks to [@Maks3w](https://github.com/Maks3w)!
+- Fixes to PHPDoc. See [#76](https://github.com/firebase/php-jwt/pull/76) for details. Thanks to [@akeeman](https://github.com/akeeman)!
+
+#### 3.0.0 / 2015-07-22
+- Minimum PHP version updated from `5.2.0` to `5.3.0`.
+- Add `\Firebase\JWT` namespace. See
+[#59](https://github.com/firebase/php-jwt/pull/59) for details. Thanks to
+[@Dashron](https://github.com/Dashron)!
+- Require a non-empty key to decode and verify a JWT. See
+[#60](https://github.com/firebase/php-jwt/pull/60) for details. Thanks to
+[@sjones608](https://github.com/sjones608)!
+- Cleaner documentation blocks in the code. See
+[#62](https://github.com/firebase/php-jwt/pull/62) for details. Thanks to
+[@johanderuijter](https://github.com/johanderuijter)!
+
+#### 2.2.0 / 2015-06-22
+- Add support for adding custom, optional JWT headers to `JWT::encode()`. See
+[#53](https://github.com/firebase/php-jwt/pull/53/files) for details. Thanks to
+[@mcocaro](https://github.com/mcocaro)!
+
+#### 2.1.0 / 2015-05-20
+- Add support for adding a leeway to `JWT:decode()` that accounts for clock skew
+between signing and verifying entities. Thanks to [@lcabral](https://github.com/lcabral)!
+- Add support for passing an object implementing the `ArrayAccess` interface for
+`$keys` argument in `JWT::decode()`. Thanks to [@aztech-dev](https://github.com/aztech-dev)!
+
+#### 2.0.0 / 2015-04-01
+- **Note**: It is strongly recommended that you update to > v2.0.0 to address
+ known security vulnerabilities in prior versions when both symmetric and
+ asymmetric keys are used together.
+- Update signature for `JWT::decode(...)` to require an array of supported
+ algorithms to use when verifying token signatures.
+
+
+Tests
+-----
+Run the tests using phpunit:
+
+```bash
+$ pear install PHPUnit
+$ phpunit --configuration phpunit.xml.dist
+PHPUnit 3.7.10 by Sebastian Bergmann.
+.....
+Time: 0 seconds, Memory: 2.50Mb
+OK (5 tests, 5 assertions)
+```
+
+New Lines in private keys
+-----
+
+If your private key contains `\n` characters, be sure to wrap it in double quotes `""`
+and not single quotes `''` in order to properly interpret the escaped characters.
+
+License
+-------
+[3-Clause BSD](http://opensource.org/licenses/BSD-3-Clause).
diff --git a/vendor/firebase/php-jwt/composer.json b/vendor/firebase/php-jwt/composer.json
new file mode 100644
index 0000000000..b76ffd1910
--- /dev/null
+++ b/vendor/firebase/php-jwt/composer.json
@@ -0,0 +1,29 @@
+{
+ "name": "firebase/php-jwt",
+ "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
+ "homepage": "https://github.com/firebase/php-jwt",
+ "authors": [
+ {
+ "name": "Neuman Vong",
+ "email": "neuman+pear@twilio.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Anant Narayanan",
+ "email": "anant@php.net",
+ "role": "Developer"
+ }
+ ],
+ "license": "BSD-3-Clause",
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Firebase\\JWT\\": "src"
+ }
+ },
+ "require-dev": {
+ "phpunit/phpunit": " 4.8.35"
+ }
+}
diff --git a/vendor/firebase/php-jwt/src/BeforeValidException.php b/vendor/firebase/php-jwt/src/BeforeValidException.php
new file mode 100644
index 0000000000..a6ee2f7c69
--- /dev/null
+++ b/vendor/firebase/php-jwt/src/BeforeValidException.php
@@ -0,0 +1,7 @@
+
+ * @author Anant Narayanan
+ * @license http://opensource.org/licenses/BSD-3-Clause 3-clause BSD
+ * @link https://github.com/firebase/php-jwt
+ */
+class JWT
+{
+
+ /**
+ * When checking nbf, iat or expiration times,
+ * we want to provide some extra leeway time to
+ * account for clock skew.
+ */
+ public static $leeway = 0;
+
+ /**
+ * Allow the current timestamp to be specified.
+ * Useful for fixing a value within unit testing.
+ *
+ * Will default to PHP time() value if null.
+ */
+ public static $timestamp = null;
+
+ public static $supported_algs = array(
+ 'HS256' => array('hash_hmac', 'SHA256'),
+ 'HS512' => array('hash_hmac', 'SHA512'),
+ 'HS384' => array('hash_hmac', 'SHA384'),
+ 'RS256' => array('openssl', 'SHA256'),
+ 'RS384' => array('openssl', 'SHA384'),
+ 'RS512' => array('openssl', 'SHA512'),
+ );
+
+ /**
+ * Decodes a JWT string into a PHP object.
+ *
+ * @param string $jwt The JWT
+ * @param string|array $key The key, or map of keys.
+ * If the algorithm used is asymmetric, this is the public key
+ * @param array $allowed_algs List of supported verification algorithms
+ * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256'
+ *
+ * @return object The JWT's payload as a PHP object
+ *
+ * @throws UnexpectedValueException Provided JWT was invalid
+ * @throws SignatureInvalidException Provided JWT was invalid because the signature verification failed
+ * @throws BeforeValidException Provided JWT is trying to be used before it's eligible as defined by 'nbf'
+ * @throws BeforeValidException Provided JWT is trying to be used before it's been created as defined by 'iat'
+ * @throws ExpiredException Provided JWT has since expired, as defined by the 'exp' claim
+ *
+ * @uses jsonDecode
+ * @uses urlsafeB64Decode
+ */
+ public static function decode($jwt, $key, array $allowed_algs = array())
+ {
+ $timestamp = is_null(static::$timestamp) ? time() : static::$timestamp;
+
+ if (empty($key)) {
+ throw new InvalidArgumentException('Key may not be empty');
+ }
+ $tks = explode('.', $jwt);
+ if (count($tks) != 3) {
+ throw new UnexpectedValueException('Wrong number of segments');
+ }
+ list($headb64, $bodyb64, $cryptob64) = $tks;
+ if (null === ($header = static::jsonDecode(static::urlsafeB64Decode($headb64)))) {
+ throw new UnexpectedValueException('Invalid header encoding');
+ }
+ if (null === $payload = static::jsonDecode(static::urlsafeB64Decode($bodyb64))) {
+ throw new UnexpectedValueException('Invalid claims encoding');
+ }
+ if (false === ($sig = static::urlsafeB64Decode($cryptob64))) {
+ throw new UnexpectedValueException('Invalid signature encoding');
+ }
+ if (empty($header->alg)) {
+ throw new UnexpectedValueException('Empty algorithm');
+ }
+ if (empty(static::$supported_algs[$header->alg])) {
+ throw new UnexpectedValueException('Algorithm not supported');
+ }
+ if (!in_array($header->alg, $allowed_algs)) {
+ throw new UnexpectedValueException('Algorithm not allowed');
+ }
+ if (is_array($key) || $key instanceof \ArrayAccess) {
+ if (isset($header->kid)) {
+ if (!isset($key[$header->kid])) {
+ throw new UnexpectedValueException('"kid" invalid, unable to lookup correct key');
+ }
+ $key = $key[$header->kid];
+ } else {
+ throw new UnexpectedValueException('"kid" empty, unable to lookup correct key');
+ }
+ }
+
+ // Check the signature
+ if (!static::verify("$headb64.$bodyb64", $sig, $key, $header->alg)) {
+ throw new SignatureInvalidException('Signature verification failed');
+ }
+
+ // Check if the nbf if it is defined. This is the time that the
+ // token can actually be used. If it's not yet that time, abort.
+ if (isset($payload->nbf) && $payload->nbf > ($timestamp + static::$leeway)) {
+ throw new BeforeValidException(
+ 'Cannot handle token prior to ' . date(DateTime::ISO8601, $payload->nbf)
+ );
+ }
+
+ // Check that this token has been created before 'now'. This prevents
+ // using tokens that have been created for later use (and haven't
+ // correctly used the nbf claim).
+ if (isset($payload->iat) && $payload->iat > ($timestamp + static::$leeway)) {
+ throw new BeforeValidException(
+ 'Cannot handle token prior to ' . date(DateTime::ISO8601, $payload->iat)
+ );
+ }
+
+ // Check if this token has expired.
+ if (isset($payload->exp) && ($timestamp - static::$leeway) >= $payload->exp) {
+ throw new ExpiredException('Expired token');
+ }
+
+ return $payload;
+ }
+
+ /**
+ * Converts and signs a PHP object or array into a JWT string.
+ *
+ * @param object|array $payload PHP object or array
+ * @param string $key The secret key.
+ * If the algorithm used is asymmetric, this is the private key
+ * @param string $alg The signing algorithm.
+ * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256'
+ * @param mixed $keyId
+ * @param array $head An array with header elements to attach
+ *
+ * @return string A signed JWT
+ *
+ * @uses jsonEncode
+ * @uses urlsafeB64Encode
+ */
+ public static function encode($payload, $key, $alg = 'HS256', $keyId = null, $head = null)
+ {
+ $header = array('typ' => 'JWT', 'alg' => $alg);
+ if ($keyId !== null) {
+ $header['kid'] = $keyId;
+ }
+ if ( isset($head) && is_array($head) ) {
+ $header = array_merge($head, $header);
+ }
+ $segments = array();
+ $segments[] = static::urlsafeB64Encode(static::jsonEncode($header));
+ $segments[] = static::urlsafeB64Encode(static::jsonEncode($payload));
+ $signing_input = implode('.', $segments);
+
+ $signature = static::sign($signing_input, $key, $alg);
+ $segments[] = static::urlsafeB64Encode($signature);
+
+ return implode('.', $segments);
+ }
+
+ /**
+ * Sign a string with a given key and algorithm.
+ *
+ * @param string $msg The message to sign
+ * @param string|resource $key The secret key
+ * @param string $alg The signing algorithm.
+ * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256'
+ *
+ * @return string An encrypted message
+ *
+ * @throws DomainException Unsupported algorithm was specified
+ */
+ public static function sign($msg, $key, $alg = 'HS256')
+ {
+ if (empty(static::$supported_algs[$alg])) {
+ throw new DomainException('Algorithm not supported');
+ }
+ list($function, $algorithm) = static::$supported_algs[$alg];
+ switch($function) {
+ case 'hash_hmac':
+ return hash_hmac($algorithm, $msg, $key, true);
+ case 'openssl':
+ $signature = '';
+ $success = openssl_sign($msg, $signature, $key, $algorithm);
+ if (!$success) {
+ throw new DomainException("OpenSSL unable to sign data");
+ } else {
+ return $signature;
+ }
+ }
+ }
+
+ /**
+ * Verify a signature with the message, key and method. Not all methods
+ * are symmetric, so we must have a separate verify and sign method.
+ *
+ * @param string $msg The original message (header and body)
+ * @param string $signature The original signature
+ * @param string|resource $key For HS*, a string key works. for RS*, must be a resource of an openssl public key
+ * @param string $alg The algorithm
+ *
+ * @return bool
+ *
+ * @throws DomainException Invalid Algorithm or OpenSSL failure
+ */
+ private static function verify($msg, $signature, $key, $alg)
+ {
+ if (empty(static::$supported_algs[$alg])) {
+ throw new DomainException('Algorithm not supported');
+ }
+
+ list($function, $algorithm) = static::$supported_algs[$alg];
+ switch($function) {
+ case 'openssl':
+ $success = openssl_verify($msg, $signature, $key, $algorithm);
+ if ($success === 1) {
+ return true;
+ } elseif ($success === 0) {
+ return false;
+ }
+ // returns 1 on success, 0 on failure, -1 on error.
+ throw new DomainException(
+ 'OpenSSL error: ' . openssl_error_string()
+ );
+ case 'hash_hmac':
+ default:
+ $hash = hash_hmac($algorithm, $msg, $key, true);
+ if (function_exists('hash_equals')) {
+ return hash_equals($signature, $hash);
+ }
+ $len = min(static::safeStrlen($signature), static::safeStrlen($hash));
+
+ $status = 0;
+ for ($i = 0; $i < $len; $i++) {
+ $status |= (ord($signature[$i]) ^ ord($hash[$i]));
+ }
+ $status |= (static::safeStrlen($signature) ^ static::safeStrlen($hash));
+
+ return ($status === 0);
+ }
+ }
+
+ /**
+ * Decode a JSON string into a PHP object.
+ *
+ * @param string $input JSON string
+ *
+ * @return object Object representation of JSON string
+ *
+ * @throws DomainException Provided string was invalid JSON
+ */
+ public static function jsonDecode($input)
+ {
+ if (version_compare(PHP_VERSION, '5.4.0', '>=') && !(defined('JSON_C_VERSION') && PHP_INT_SIZE > 4)) {
+ /** In PHP >=5.4.0, json_decode() accepts an options parameter, that allows you
+ * to specify that large ints (like Steam Transaction IDs) should be treated as
+ * strings, rather than the PHP default behaviour of converting them to floats.
+ */
+ $obj = json_decode($input, false, 512, JSON_BIGINT_AS_STRING);
+ } else {
+ /** Not all servers will support that, however, so for older versions we must
+ * manually detect large ints in the JSON string and quote them (thus converting
+ *them to strings) before decoding, hence the preg_replace() call.
+ */
+ $max_int_length = strlen((string) PHP_INT_MAX) - 1;
+ $json_without_bigints = preg_replace('/:\s*(-?\d{'.$max_int_length.',})/', ': "$1"', $input);
+ $obj = json_decode($json_without_bigints);
+ }
+
+ if (function_exists('json_last_error') && $errno = json_last_error()) {
+ static::handleJsonError($errno);
+ } elseif ($obj === null && $input !== 'null') {
+ throw new DomainException('Null result with non-null input');
+ }
+ return $obj;
+ }
+
+ /**
+ * Encode a PHP object into a JSON string.
+ *
+ * @param object|array $input A PHP object or array
+ *
+ * @return string JSON representation of the PHP object or array
+ *
+ * @throws DomainException Provided object could not be encoded to valid JSON
+ */
+ public static function jsonEncode($input)
+ {
+ $json = json_encode($input);
+ if (function_exists('json_last_error') && $errno = json_last_error()) {
+ static::handleJsonError($errno);
+ } elseif ($json === 'null' && $input !== null) {
+ throw new DomainException('Null result with non-null input');
+ }
+ return $json;
+ }
+
+ /**
+ * Decode a string with URL-safe Base64.
+ *
+ * @param string $input A Base64 encoded string
+ *
+ * @return string A decoded string
+ */
+ public static function urlsafeB64Decode($input)
+ {
+ $remainder = strlen($input) % 4;
+ if ($remainder) {
+ $padlen = 4 - $remainder;
+ $input .= str_repeat('=', $padlen);
+ }
+ return base64_decode(strtr($input, '-_', '+/'));
+ }
+
+ /**
+ * Encode a string with URL-safe Base64.
+ *
+ * @param string $input The string you want encoded
+ *
+ * @return string The base64 encode of what you passed in
+ */
+ public static function urlsafeB64Encode($input)
+ {
+ return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));
+ }
+
+ /**
+ * Helper method to create a JSON error.
+ *
+ * @param int $errno An error number from json_last_error()
+ *
+ * @return void
+ */
+ private static function handleJsonError($errno)
+ {
+ $messages = array(
+ JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
+ JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON',
+ JSON_ERROR_CTRL_CHAR => 'Unexpected control character found',
+ JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON',
+ JSON_ERROR_UTF8 => 'Malformed UTF-8 characters' //PHP >= 5.3.3
+ );
+ throw new DomainException(
+ isset($messages[$errno])
+ ? $messages[$errno]
+ : 'Unknown JSON error: ' . $errno
+ );
+ }
+
+ /**
+ * Get the number of bytes in cryptographic strings.
+ *
+ * @param string
+ *
+ * @return int
+ */
+ private static function safeStrlen($str)
+ {
+ if (function_exists('mb_strlen')) {
+ return mb_strlen($str, '8bit');
+ }
+ return strlen($str);
+ }
+}
diff --git a/vendor/firebase/php-jwt/src/SignatureInvalidException.php b/vendor/firebase/php-jwt/src/SignatureInvalidException.php
new file mode 100644
index 0000000000..27332b21be
--- /dev/null
+++ b/vendor/firebase/php-jwt/src/SignatureInvalidException.php
@@ -0,0 +1,7 @@
+= 5.5
+* Updated to use PSR-7
+ * Requires immutable messages, which basically means an event based system
+ owned by a request instance is no longer possible.
+ * Utilizing the [Guzzle PSR-7 package](https://github.com/guzzle/psr7).
+ * Removed the dependency on `guzzlehttp/streams`. These stream abstractions
+ are available in the `guzzlehttp/psr7` package under the `GuzzleHttp\Psr7`
+ namespace.
+* Added middleware and handler system
+ * Replaced the Guzzle event and subscriber system with a middleware system.
+ * No longer depends on RingPHP, but rather places the HTTP handlers directly
+ in Guzzle, operating on PSR-7 messages.
+ * Retry logic is now encapsulated in `GuzzleHttp\Middleware::retry`, which
+ means the `guzzlehttp/retry-subscriber` is now obsolete.
+ * Mocking responses is now handled using `GuzzleHttp\Handler\MockHandler`.
+* Asynchronous responses
+ * No longer supports the `future` request option to send an async request.
+ Instead, use one of the `*Async` methods of a client (e.g., `requestAsync`,
+ `getAsync`, etc.).
+ * Utilizing `GuzzleHttp\Promise` instead of React's promise library to avoid
+ recursion required by chaining and forwarding react promises. See
+ https://github.com/guzzle/promises
+ * Added `requestAsync` and `sendAsync` to send request asynchronously.
+ * Added magic methods for `getAsync()`, `postAsync()`, etc. to send requests
+ asynchronously.
+* Request options
+ * POST and form updates
+ * Added the `form_fields` and `form_files` request options.
+ * Removed the `GuzzleHttp\Post` namespace.
+ * The `body` request option no longer accepts an array for POST requests.
+ * The `exceptions` request option has been deprecated in favor of the
+ `http_errors` request options.
+ * The `save_to` request option has been deprecated in favor of `sink` request
+ option.
+* Clients no longer accept an array of URI template string and variables for
+ URI variables. You will need to expand URI templates before passing them
+ into a client constructor or request method.
+* Client methods `get()`, `post()`, `put()`, `patch()`, `options()`, etc. are
+ now magic methods that will send synchronous requests.
+* Replaced `Utils.php` with plain functions in `functions.php`.
+* Removed `GuzzleHttp\Collection`.
+* Removed `GuzzleHttp\BatchResults`. Batched pool results are now returned as
+ an array.
+* Removed `GuzzleHttp\Query`. Query string handling is now handled using an
+ associative array passed into the `query` request option. The query string
+ is serialized using PHP's `http_build_query`. If you need more control, you
+ can pass the query string in as a string.
+* `GuzzleHttp\QueryParser` has been replaced with the
+ `GuzzleHttp\Psr7\parse_query`.
+
+## 5.2.0 - 2015-01-27
+
+* Added `AppliesHeadersInterface` to make applying headers to a request based
+ on the body more generic and not specific to `PostBodyInterface`.
+* Reduced the number of stack frames needed to send requests.
+* Nested futures are now resolved in the client rather than the RequestFsm
+* Finishing state transitions is now handled in the RequestFsm rather than the
+ RingBridge.
+* Added a guard in the Pool class to not use recursion for request retries.
+
+## 5.1.0 - 2014-12-19
+
+* Pool class no longer uses recursion when a request is intercepted.
+* The size of a Pool can now be dynamically adjusted using a callback.
+ See https://github.com/guzzle/guzzle/pull/943.
+* Setting a request option to `null` when creating a request with a client will
+ ensure that the option is not set. This allows you to overwrite default
+ request options on a per-request basis.
+ See https://github.com/guzzle/guzzle/pull/937.
+* Added the ability to limit which protocols are allowed for redirects by
+ specifying a `protocols` array in the `allow_redirects` request option.
+* Nested futures due to retries are now resolved when waiting for synchronous
+ responses. See https://github.com/guzzle/guzzle/pull/947.
+* `"0"` is now an allowed URI path. See
+ https://github.com/guzzle/guzzle/pull/935.
+* `Query` no longer typehints on the `$query` argument in the constructor,
+ allowing for strings and arrays.
+* Exceptions thrown in the `end` event are now correctly wrapped with Guzzle
+ specific exceptions if necessary.
+
+## 5.0.3 - 2014-11-03
+
+This change updates query strings so that they are treated as un-encoded values
+by default where the value represents an un-encoded value to send over the
+wire. A Query object then encodes the value before sending over the wire. This
+means that even value query string values (e.g., ":") are url encoded. This
+makes the Query class match PHP's http_build_query function. However, if you
+want to send requests over the wire using valid query string characters that do
+not need to be encoded, then you can provide a string to Url::setQuery() and
+pass true as the second argument to specify that the query string is a raw
+string that should not be parsed or encoded (unless a call to getQuery() is
+subsequently made, forcing the query-string to be converted into a Query
+object).
+
+## 5.0.2 - 2014-10-30
+
+* Added a trailing `\r\n` to multipart/form-data payloads. See
+ https://github.com/guzzle/guzzle/pull/871
+* Added a `GuzzleHttp\Pool::send()` convenience method to match the docs.
+* Status codes are now returned as integers. See
+ https://github.com/guzzle/guzzle/issues/881
+* No longer overwriting an existing `application/x-www-form-urlencoded` header
+ when sending POST requests, allowing for customized headers. See
+ https://github.com/guzzle/guzzle/issues/877
+* Improved path URL serialization.
+
+ * No longer double percent-encoding characters in the path or query string if
+ they are already encoded.
+ * Now properly encoding the supplied path to a URL object, instead of only
+ encoding ' ' and '?'.
+ * Note: This has been changed in 5.0.3 to now encode query string values by
+ default unless the `rawString` argument is provided when setting the query
+ string on a URL: Now allowing many more characters to be present in the
+ query string without being percent encoded. See http://tools.ietf.org/html/rfc3986#appendix-A
+
+## 5.0.1 - 2014-10-16
+
+Bugfix release.
+
+* Fixed an issue where connection errors still returned response object in
+ error and end events event though the response is unusable. This has been
+ corrected so that a response is not returned in the `getResponse` method of
+ these events if the response did not complete. https://github.com/guzzle/guzzle/issues/867
+* Fixed an issue where transfer statistics were not being populated in the
+ RingBridge. https://github.com/guzzle/guzzle/issues/866
+
+## 5.0.0 - 2014-10-12
+
+Adding support for non-blocking responses and some minor API cleanup.
+
+### New Features
+
+* Added support for non-blocking responses based on `guzzlehttp/guzzle-ring`.
+* Added a public API for creating a default HTTP adapter.
+* Updated the redirect plugin to be non-blocking so that redirects are sent
+ concurrently. Other plugins like this can now be updated to be non-blocking.
+* Added a "progress" event so that you can get upload and download progress
+ events.
+* Added `GuzzleHttp\Pool` which implements FutureInterface and transfers
+ requests concurrently using a capped pool size as efficiently as possible.
+* Added `hasListeners()` to EmitterInterface.
+* Removed `GuzzleHttp\ClientInterface::sendAll` and marked
+ `GuzzleHttp\Client::sendAll` as deprecated (it's still there, just not the
+ recommended way).
+
+### Breaking changes
+
+The breaking changes in this release are relatively minor. The biggest thing to
+look out for is that request and response objects no longer implement fluent
+interfaces.
+
+* Removed the fluent interfaces (i.e., `return $this`) from requests,
+ responses, `GuzzleHttp\Collection`, `GuzzleHttp\Url`,
+ `GuzzleHttp\Query`, `GuzzleHttp\Post\PostBody`, and
+ `GuzzleHttp\Cookie\SetCookie`. This blog post provides a good outline of
+ why I did this: http://ocramius.github.io/blog/fluent-interfaces-are-evil/.
+ This also makes the Guzzle message interfaces compatible with the current
+ PSR-7 message proposal.
+* Removed "functions.php", so that Guzzle is truly PSR-4 compliant. Except
+ for the HTTP request functions from function.php, these functions are now
+ implemented in `GuzzleHttp\Utils` using camelCase. `GuzzleHttp\json_decode`
+ moved to `GuzzleHttp\Utils::jsonDecode`. `GuzzleHttp\get_path` moved to
+ `GuzzleHttp\Utils::getPath`. `GuzzleHttp\set_path` moved to
+ `GuzzleHttp\Utils::setPath`. `GuzzleHttp\batch` should now be
+ `GuzzleHttp\Pool::batch`, which returns an `objectStorage`. Using functions.php
+ caused problems for many users: they aren't PSR-4 compliant, require an
+ explicit include, and needed an if-guard to ensure that the functions are not
+ declared multiple times.
+* Rewrote adapter layer.
+ * Removing all classes from `GuzzleHttp\Adapter`, these are now
+ implemented as callables that are stored in `GuzzleHttp\Ring\Client`.
+ * Removed the concept of "parallel adapters". Sending requests serially or
+ concurrently is now handled using a single adapter.
+ * Moved `GuzzleHttp\Adapter\Transaction` to `GuzzleHttp\Transaction`. The
+ Transaction object now exposes the request, response, and client as public
+ properties. The getters and setters have been removed.
+* Removed the "headers" event. This event was only useful for changing the
+ body a response once the headers of the response were known. You can implement
+ a similar behavior in a number of ways. One example might be to use a
+ FnStream that has access to the transaction being sent. For example, when the
+ first byte is written, you could check if the response headers match your
+ expectations, and if so, change the actual stream body that is being
+ written to.
+* Removed the `asArray` parameter from
+ `GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header
+ value as an array, then use the newly added `getHeaderAsArray()` method of
+ `MessageInterface`. This change makes the Guzzle interfaces compatible with
+ the PSR-7 interfaces.
+* `GuzzleHttp\Message\MessageFactory` no longer allows subclasses to add
+ custom request options using double-dispatch (this was an implementation
+ detail). Instead, you should now provide an associative array to the
+ constructor which is a mapping of the request option name mapping to a
+ function that applies the option value to a request.
+* Removed the concept of "throwImmediately" from exceptions and error events.
+ This control mechanism was used to stop a transfer of concurrent requests
+ from completing. This can now be handled by throwing the exception or by
+ cancelling a pool of requests or each outstanding future request individually.
+* Updated to "GuzzleHttp\Streams" 3.0.
+ * `GuzzleHttp\Stream\StreamInterface::getContents()` no longer accepts a
+ `maxLen` parameter. This update makes the Guzzle streams project
+ compatible with the current PSR-7 proposal.
+ * `GuzzleHttp\Stream\Stream::__construct`,
+ `GuzzleHttp\Stream\Stream::factory`, and
+ `GuzzleHttp\Stream\Utils::create` no longer accept a size in the second
+ argument. They now accept an associative array of options, including the
+ "size" key and "metadata" key which can be used to provide custom metadata.
+
+## 4.2.2 - 2014-09-08
+
+* Fixed a memory leak in the CurlAdapter when reusing cURL handles.
+* No longer using `request_fulluri` in stream adapter proxies.
+* Relative redirects are now based on the last response, not the first response.
+
+## 4.2.1 - 2014-08-19
+
+* Ensuring that the StreamAdapter does not always add a Content-Type header
+* Adding automated github releases with a phar and zip
+
+## 4.2.0 - 2014-08-17
+
+* Now merging in default options using a case-insensitive comparison.
+ Closes https://github.com/guzzle/guzzle/issues/767
+* Added the ability to automatically decode `Content-Encoding` response bodies
+ using the `decode_content` request option. This is set to `true` by default
+ to decode the response body if it comes over the wire with a
+ `Content-Encoding`. Set this value to `false` to disable decoding the
+ response content, and pass a string to provide a request `Accept-Encoding`
+ header and turn on automatic response decoding. This feature now allows you
+ to pass an `Accept-Encoding` header in the headers of a request but still
+ disable automatic response decoding.
+ Closes https://github.com/guzzle/guzzle/issues/764
+* Added the ability to throw an exception immediately when transferring
+ requests in parallel. Closes https://github.com/guzzle/guzzle/issues/760
+* Updating guzzlehttp/streams dependency to ~2.1
+* No longer utilizing the now deprecated namespaced methods from the stream
+ package.
+
+## 4.1.8 - 2014-08-14
+
+* Fixed an issue in the CurlFactory that caused setting the `stream=false`
+ request option to throw an exception.
+ See: https://github.com/guzzle/guzzle/issues/769
+* TransactionIterator now calls rewind on the inner iterator.
+ See: https://github.com/guzzle/guzzle/pull/765
+* You can now set the `Content-Type` header to `multipart/form-data`
+ when creating POST requests to force multipart bodies.
+ See https://github.com/guzzle/guzzle/issues/768
+
+## 4.1.7 - 2014-08-07
+
+* Fixed an error in the HistoryPlugin that caused the same request and response
+ to be logged multiple times when an HTTP protocol error occurs.
+* Ensuring that cURL does not add a default Content-Type when no Content-Type
+ has been supplied by the user. This prevents the adapter layer from modifying
+ the request that is sent over the wire after any listeners may have already
+ put the request in a desired state (e.g., signed the request).
+* Throwing an exception when you attempt to send requests that have the
+ "stream" set to true in parallel using the MultiAdapter.
+* Only calling curl_multi_select when there are active cURL handles. This was
+ previously changed and caused performance problems on some systems due to PHP
+ always selecting until the maximum select timeout.
+* Fixed a bug where multipart/form-data POST fields were not correctly
+ aggregated (e.g., values with "&").
+
+## 4.1.6 - 2014-08-03
+
+* Added helper methods to make it easier to represent messages as strings,
+ including getting the start line and getting headers as a string.
+
+## 4.1.5 - 2014-08-02
+
+* Automatically retrying cURL "Connection died, retrying a fresh connect"
+ errors when possible.
+* cURL implementation cleanup
+* Allowing multiple event subscriber listeners to be registered per event by
+ passing an array of arrays of listener configuration.
+
+## 4.1.4 - 2014-07-22
+
+* Fixed a bug that caused multi-part POST requests with more than one field to
+ serialize incorrectly.
+* Paths can now be set to "0"
+* `ResponseInterface::xml` now accepts a `libxml_options` option and added a
+ missing default argument that was required when parsing XML response bodies.
+* A `save_to` stream is now created lazily, which means that files are not
+ created on disk unless a request succeeds.
+
+## 4.1.3 - 2014-07-15
+
+* Various fixes to multipart/form-data POST uploads
+* Wrapping function.php in an if-statement to ensure Guzzle can be used
+ globally and in a Composer install
+* Fixed an issue with generating and merging in events to an event array
+* POST headers are only applied before sending a request to allow you to change
+ the query aggregator used before uploading
+* Added much more robust query string parsing
+* Fixed various parsing and normalization issues with URLs
+* Fixing an issue where multi-valued headers were not being utilized correctly
+ in the StreamAdapter
+
+## 4.1.2 - 2014-06-18
+
+* Added support for sending payloads with GET requests
+
+## 4.1.1 - 2014-06-08
+
+* Fixed an issue related to using custom message factory options in subclasses
+* Fixed an issue with nested form fields in a multi-part POST
+* Fixed an issue with using the `json` request option for POST requests
+* Added `ToArrayInterface` to `GuzzleHttp\Cookie\CookieJar`
+
+## 4.1.0 - 2014-05-27
+
+* Added a `json` request option to easily serialize JSON payloads.
+* Added a `GuzzleHttp\json_decode()` wrapper to safely parse JSON.
+* Added `setPort()` and `getPort()` to `GuzzleHttp\Message\RequestInterface`.
+* Added the ability to provide an emitter to a client in the client constructor.
+* Added the ability to persist a cookie session using $_SESSION.
+* Added a trait that can be used to add event listeners to an iterator.
+* Removed request method constants from RequestInterface.
+* Fixed warning when invalid request start-lines are received.
+* Updated MessageFactory to work with custom request option methods.
+* Updated cacert bundle to latest build.
+
+4.0.2 (2014-04-16)
+------------------
+
+* Proxy requests using the StreamAdapter now properly use request_fulluri (#632)
+* Added the ability to set scalars as POST fields (#628)
+
+## 4.0.1 - 2014-04-04
+
+* The HTTP status code of a response is now set as the exception code of
+ RequestException objects.
+* 303 redirects will now correctly switch from POST to GET requests.
+* The default parallel adapter of a client now correctly uses the MultiAdapter.
+* HasDataTrait now initializes the internal data array as an empty array so
+ that the toArray() method always returns an array.
+
+## 4.0.0 - 2014-03-29
+
+* For more information on the 4.0 transition, see:
+ http://mtdowling.com/blog/2014/03/15/guzzle-4-rc/
+* For information on changes and upgrading, see:
+ https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40
+* Added `GuzzleHttp\batch()` as a convenience function for sending requests in
+ parallel without needing to write asynchronous code.
+* Restructured how events are added to `GuzzleHttp\ClientInterface::sendAll()`.
+ You can now pass a callable or an array of associative arrays where each
+ associative array contains the "fn", "priority", and "once" keys.
+
+## 4.0.0.rc-2 - 2014-03-25
+
+* Removed `getConfig()` and `setConfig()` from clients to avoid confusion
+ around whether things like base_url, message_factory, etc. should be able to
+ be retrieved or modified.
+* Added `getDefaultOption()` and `setDefaultOption()` to ClientInterface
+* functions.php functions were renamed using snake_case to match PHP idioms
+* Added support for `HTTP_PROXY`, `HTTPS_PROXY`, and
+ `GUZZLE_CURL_SELECT_TIMEOUT` environment variables
+* Added the ability to specify custom `sendAll()` event priorities
+* Added the ability to specify custom stream context options to the stream
+ adapter.
+* Added a functions.php function for `get_path()` and `set_path()`
+* CurlAdapter and MultiAdapter now use a callable to generate curl resources
+* MockAdapter now properly reads a body and emits a `headers` event
+* Updated Url class to check if a scheme and host are set before adding ":"
+ and "//". This allows empty Url (e.g., "") to be serialized as "".
+* Parsing invalid XML no longer emits warnings
+* Curl classes now properly throw AdapterExceptions
+* Various performance optimizations
+* Streams are created with the faster `Stream\create()` function
+* Marked deprecation_proxy() as internal
+* Test server is now a collection of static methods on a class
+
+## 4.0.0-rc.1 - 2014-03-15
+
+* See https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40
+
+## 3.8.1 - 2014-01-28
+
+* Bug: Always using GET requests when redirecting from a 303 response
+* Bug: CURLOPT_SSL_VERIFYHOST is now correctly set to false when setting `$certificateAuthority` to false in
+ `Guzzle\Http\ClientInterface::setSslVerification()`
+* Bug: RedirectPlugin now uses strict RFC 3986 compliance when combining a base URL with a relative URL
+* Bug: The body of a request can now be set to `"0"`
+* Sending PHP stream requests no longer forces `HTTP/1.0`
+* Adding more information to ExceptionCollection exceptions so that users have more context, including a stack trace of
+ each sub-exception
+* Updated the `$ref` attribute in service descriptions to merge over any existing parameters of a schema (rather than
+ clobbering everything).
+* Merging URLs will now use the query string object from the relative URL (thus allowing custom query aggregators)
+* Query strings are now parsed in a way that they do no convert empty keys with no value to have a dangling `=`.
+ For example `foo&bar=baz` is now correctly parsed and recognized as `foo&bar=baz` rather than `foo=&bar=baz`.
+* Now properly escaping the regular expression delimiter when matching Cookie domains.
+* Network access is now disabled when loading XML documents
+
+## 3.8.0 - 2013-12-05
+
+* Added the ability to define a POST name for a file
+* JSON response parsing now properly walks additionalProperties
+* cURL error code 18 is now retried automatically in the BackoffPlugin
+* Fixed a cURL error when URLs contain fragments
+* Fixed an issue in the BackoffPlugin retry event where it was trying to access all exceptions as if they were
+ CurlExceptions
+* CURLOPT_PROGRESS function fix for PHP 5.5 (69fcc1e)
+* Added the ability for Guzzle to work with older versions of cURL that do not support `CURLOPT_TIMEOUT_MS`
+* Fixed a bug that was encountered when parsing empty header parameters
+* UriTemplate now has a `setRegex()` method to match the docs
+* The `debug` request parameter now checks if it is truthy rather than if it exists
+* Setting the `debug` request parameter to true shows verbose cURL output instead of using the LogPlugin
+* Added the ability to combine URLs using strict RFC 3986 compliance
+* Command objects can now return the validation errors encountered by the command
+* Various fixes to cache revalidation (#437 and 29797e5)
+* Various fixes to the AsyncPlugin
+* Cleaned up build scripts
+
+## 3.7.4 - 2013-10-02
+
+* Bug fix: 0 is now an allowed value in a description parameter that has a default value (#430)
+* Bug fix: SchemaFormatter now returns an integer when formatting to a Unix timestamp
+ (see https://github.com/aws/aws-sdk-php/issues/147)
+* Bug fix: Cleaned up and fixed URL dot segment removal to properly resolve internal dots
+* Minimum PHP version is now properly specified as 5.3.3 (up from 5.3.2) (#420)
+* Updated the bundled cacert.pem (#419)
+* OauthPlugin now supports adding authentication to headers or query string (#425)
+
+## 3.7.3 - 2013-09-08
+
+* Added the ability to get the exception associated with a request/command when using `MultiTransferException` and
+ `CommandTransferException`.
+* Setting `additionalParameters` of a response to false is now honored when parsing responses with a service description
+* Schemas are only injected into response models when explicitly configured.
+* No longer guessing Content-Type based on the path of a request. Content-Type is now only guessed based on the path of
+ an EntityBody.
+* Bug fix: ChunkedIterator can now properly chunk a \Traversable as well as an \Iterator.
+* Bug fix: FilterIterator now relies on `\Iterator` instead of `\Traversable`.
+* Bug fix: Gracefully handling malformed responses in RequestMediator::writeResponseBody()
+* Bug fix: Replaced call to canCache with canCacheRequest in the CallbackCanCacheStrategy of the CachePlugin
+* Bug fix: Visiting XML attributes first before visiting XML children when serializing requests
+* Bug fix: Properly parsing headers that contain commas contained in quotes
+* Bug fix: mimetype guessing based on a filename is now case-insensitive
+
+## 3.7.2 - 2013-08-02
+
+* Bug fix: Properly URL encoding paths when using the PHP-only version of the UriTemplate expander
+ See https://github.com/guzzle/guzzle/issues/371
+* Bug fix: Cookie domains are now matched correctly according to RFC 6265
+ See https://github.com/guzzle/guzzle/issues/377
+* Bug fix: GET parameters are now used when calculating an OAuth signature
+* Bug fix: Fixed an issue with cache revalidation where the If-None-Match header was being double quoted
+* `Guzzle\Common\AbstractHasDispatcher::dispatch()` now returns the event that was dispatched
+* `Guzzle\Http\QueryString::factory()` now guesses the most appropriate query aggregator to used based on the input.
+ See https://github.com/guzzle/guzzle/issues/379
+* Added a way to add custom domain objects to service description parsing using the `operation.parse_class` event. See
+ https://github.com/guzzle/guzzle/pull/380
+* cURL multi cleanup and optimizations
+
+## 3.7.1 - 2013-07-05
+
+* Bug fix: Setting default options on a client now works
+* Bug fix: Setting options on HEAD requests now works. See #352
+* Bug fix: Moving stream factory before send event to before building the stream. See #353
+* Bug fix: Cookies no longer match on IP addresses per RFC 6265
+* Bug fix: Correctly parsing header parameters that are in `<>` and quotes
+* Added `cert` and `ssl_key` as request options
+* `Host` header can now diverge from the host part of a URL if the header is set manually
+* `Guzzle\Service\Command\LocationVisitor\Request\XmlVisitor` was rewritten to change from using SimpleXML to XMLWriter
+* OAuth parameters are only added via the plugin if they aren't already set
+* Exceptions are now thrown when a URL cannot be parsed
+* Returning `false` if `Guzzle\Http\EntityBody::getContentMd5()` fails
+* Not setting a `Content-MD5` on a command if calculating the Content-MD5 fails via the CommandContentMd5Plugin
+
+## 3.7.0 - 2013-06-10
+
+* See UPGRADING.md for more information on how to upgrade.
+* Requests now support the ability to specify an array of $options when creating a request to more easily modify a
+ request. You can pass a 'request.options' configuration setting to a client to apply default request options to
+ every request created by a client (e.g. default query string variables, headers, curl options, etc.).
+* Added a static facade class that allows you to use Guzzle with static methods and mount the class to `\Guzzle`.
+ See `Guzzle\Http\StaticClient::mount`.
+* Added `command.request_options` to `Guzzle\Service\Command\AbstractCommand` to pass request options to requests
+ created by a command (e.g. custom headers, query string variables, timeout settings, etc.).
+* Stream size in `Guzzle\Stream\PhpStreamRequestFactory` will now be set if Content-Length is returned in the
+ headers of a response
+* Added `Guzzle\Common\Collection::setPath($path, $value)` to set a value into an array using a nested key
+ (e.g. `$collection->setPath('foo/baz/bar', 'test'); echo $collection['foo']['bar']['bar'];`)
+* ServiceBuilders now support storing and retrieving arbitrary data
+* CachePlugin can now purge all resources for a given URI
+* CachePlugin can automatically purge matching cached items when a non-idempotent request is sent to a resource
+* CachePlugin now uses the Vary header to determine if a resource is a cache hit
+* `Guzzle\Http\Message\Response` now implements `\Serializable`
+* Added `Guzzle\Cache\CacheAdapterFactory::fromCache()` to more easily create cache adapters
+* `Guzzle\Service\ClientInterface::execute()` now accepts an array, single command, or Traversable
+* Fixed a bug in `Guzzle\Http\Message\Header\Link::addLink()`
+* Better handling of calculating the size of a stream in `Guzzle\Stream\Stream` using fstat() and caching the size
+* `Guzzle\Common\Exception\ExceptionCollection` now creates a more readable exception message
+* Fixing BC break: Added back the MonologLogAdapter implementation rather than extending from PsrLog so that older
+ Symfony users can still use the old version of Monolog.
+* Fixing BC break: Added the implementation back in for `Guzzle\Http\Message\AbstractMessage::getTokenizedHeader()`.
+ Now triggering an E_USER_DEPRECATED warning when used. Use `$message->getHeader()->parseParams()`.
+* Several performance improvements to `Guzzle\Common\Collection`
+* Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`:
+ createRequest, head, delete, put, patch, post, options, prepareRequest
+* Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()`
+* Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface`
+* Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to
+ `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a
+ resource, string, or EntityBody into the $options parameter to specify the download location of the response.
+* Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a
+ default `array()`
+* Added `Guzzle\Stream\StreamInterface::isRepeatable`
+* Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use
+ $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or
+ $client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))`.
+* Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use $client->getConfig()->getPath('request.options/headers')`.
+* Removed `Guzzle\Http\ClientInterface::expandTemplate()`
+* Removed `Guzzle\Http\ClientInterface::setRequestFactory()`
+* Removed `Guzzle\Http\ClientInterface::getCurlMulti()`
+* Removed `Guzzle\Http\Message\RequestInterface::canCache`
+* Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect`
+* Removed `Guzzle\Http\Message\RequestInterface::isRedirect`
+* Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods.
+* You can now enable E_USER_DEPRECATED warnings to see if you are using a deprecated method by setting
+ `Guzzle\Common\Version::$emitWarnings` to true.
+* Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use
+ `$request->getResponseBody()->isRepeatable()` instead.
+* Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use
+ `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead.
+* Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use
+ `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead.
+* Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead.
+* Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead.
+* Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated
+* Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand.
+ These will work through Guzzle 4.0
+* Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use [request.options][params].
+* Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client.
+* Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use $client->getConfig()->getPath('request.options/headers')`.
+* Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`.
+* Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8.
+* Marked `Guzzle\Common\Collection::inject()` as deprecated.
+* Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest');`
+* CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a
+ CacheStorageInterface. These two objects and interface will be removed in a future version.
+* Always setting X-cache headers on cached responses
+* Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin
+* `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface
+ $request, Response $response);`
+* `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);`
+* `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);`
+* Added `CacheStorageInterface::purge($url)`
+* `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin
+ $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache,
+ CanCacheStrategyInterface $canCache = null)`
+* Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)`
+
+## 3.6.0 - 2013-05-29
+
+* ServiceDescription now implements ToArrayInterface
+* Added command.hidden_params to blacklist certain headers from being treated as additionalParameters
+* Guzzle can now correctly parse incomplete URLs
+* Mixed casing of headers are now forced to be a single consistent casing across all values for that header.
+* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution
+* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader().
+* Specific header implementations can be created for complex headers. When a message creates a header, it uses a
+ HeaderFactory which can map specific headers to specific header classes. There is now a Link header and
+ CacheControl header implementation.
+* Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate
+* Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti()
+* Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in
+ Guzzle\Http\Curl\RequestMediator
+* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string.
+* Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface
+* Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders()
+* Removed Guzzle\Parser\ParserRegister::get(). Use getParser()
+* Removed Guzzle\Parser\ParserRegister::set(). Use registerParser().
+* All response header helper functions return a string rather than mixing Header objects and strings inconsistently
+* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle
+ directly via interfaces
+* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist
+ but are a no-op until removed.
+* Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a
+ `Guzzle\Service\Command\ArrayCommandInterface`.
+* Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response
+ on a request while the request is still being transferred
+* The ability to case-insensitively search for header values
+* Guzzle\Http\Message\Header::hasExactHeader
+* Guzzle\Http\Message\Header::raw. Use getAll()
+* Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object
+ instead.
+* `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess
+* Added the ability to cast Model objects to a string to view debug information.
+
+## 3.5.0 - 2013-05-13
+
+* Bug: Fixed a regression so that request responses are parsed only once per oncomplete event rather than multiple times
+* Bug: Better cleanup of one-time events across the board (when an event is meant to fire once, it will now remove
+ itself from the EventDispatcher)
+* Bug: `Guzzle\Log\MessageFormatter` now properly writes "total_time" and "connect_time" values
+* Bug: Cloning an EntityEnclosingRequest now clones the EntityBody too
+* Bug: Fixed an undefined index error when parsing nested JSON responses with a sentAs parameter that reference a
+ non-existent key
+* Bug: All __call() method arguments are now required (helps with mocking frameworks)
+* Deprecating Response::getRequest() and now using a shallow clone of a request object to remove a circular reference
+ to help with refcount based garbage collection of resources created by sending a request
+* Deprecating ZF1 cache and log adapters. These will be removed in the next major version.
+* Deprecating `Response::getPreviousResponse()` (method signature still exists, but it's deprecated). Use the
+ HistoryPlugin for a history.
+* Added a `responseBody` alias for the `response_body` location
+* Refactored internals to no longer rely on Response::getRequest()
+* HistoryPlugin can now be cast to a string
+* HistoryPlugin now logs transactions rather than requests and responses to more accurately keep track of the requests
+ and responses that are sent over the wire
+* Added `getEffectiveUrl()` and `getRedirectCount()` to Response objects
+
+## 3.4.3 - 2013-04-30
+
+* Bug fix: Fixing bug introduced in 3.4.2 where redirect responses are duplicated on the final redirected response
+* Added a check to re-extract the temp cacert bundle from the phar before sending each request
+
+## 3.4.2 - 2013-04-29
+
+* Bug fix: Stream objects now work correctly with "a" and "a+" modes
+* Bug fix: Removing `Transfer-Encoding: chunked` header when a Content-Length is present
+* Bug fix: AsyncPlugin no longer forces HEAD requests
+* Bug fix: DateTime timezones are now properly handled when using the service description schema formatter
+* Bug fix: CachePlugin now properly handles stale-if-error directives when a request to the origin server fails
+* Setting a response on a request will write to the custom request body from the response body if one is specified
+* LogPlugin now writes to php://output when STDERR is undefined
+* Added the ability to set multiple POST files for the same key in a single call
+* application/x-www-form-urlencoded POSTs now use the utf-8 charset by default
+* Added the ability to queue CurlExceptions to the MockPlugin
+* Cleaned up how manual responses are queued on requests (removed "queued_response" and now using request.before_send)
+* Configuration loading now allows remote files
+
+## 3.4.1 - 2013-04-16
+
+* Large refactoring to how CurlMulti handles work. There is now a proxy that sits in front of a pool of CurlMulti
+ handles. This greatly simplifies the implementation, fixes a couple bugs, and provides a small performance boost.
+* Exceptions are now properly grouped when sending requests in parallel
+* Redirects are now properly aggregated when a multi transaction fails
+* Redirects now set the response on the original object even in the event of a failure
+* Bug fix: Model names are now properly set even when using $refs
+* Added support for PHP 5.5's CurlFile to prevent warnings with the deprecated @ syntax
+* Added support for oauth_callback in OAuth signatures
+* Added support for oauth_verifier in OAuth signatures
+* Added support to attempt to retrieve a command first literally, then ucfirst, the with inflection
+
+## 3.4.0 - 2013-04-11
+
+* Bug fix: URLs are now resolved correctly based on http://tools.ietf.org/html/rfc3986#section-5.2. #289
+* Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289
+* Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263
+* Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264.
+* Bug fix: Added `number` type to service descriptions.
+* Bug fix: empty parameters are removed from an OAuth signature
+* Bug fix: Revalidating a cache entry prefers the Last-Modified over the Date header
+* Bug fix: Fixed "array to string" error when validating a union of types in a service description
+* Bug fix: Removed code that attempted to determine the size of a stream when data is written to the stream
+* Bug fix: Not including an `oauth_token` if the value is null in the OauthPlugin.
+* Bug fix: Now correctly aggregating successful requests and failed requests in CurlMulti when a redirect occurs.
+* The new default CURLOPT_TIMEOUT setting has been increased to 150 seconds so that Guzzle works on poor connections.
+* Added a feature to EntityEnclosingRequest::setBody() that will automatically set the Content-Type of the request if
+ the Content-Type can be determined based on the entity body or the path of the request.
+* Added the ability to overwrite configuration settings in a client when grabbing a throwaway client from a builder.
+* Added support for a PSR-3 LogAdapter.
+* Added a `command.after_prepare` event
+* Added `oauth_callback` parameter to the OauthPlugin
+* Added the ability to create a custom stream class when using a stream factory
+* Added a CachingEntityBody decorator
+* Added support for `additionalParameters` in service descriptions to define how custom parameters are serialized.
+* The bundled SSL certificate is now provided in the phar file and extracted when running Guzzle from a phar.
+* You can now send any EntityEnclosingRequest with POST fields or POST files and cURL will handle creating bodies
+* POST requests using a custom entity body are now treated exactly like PUT requests but with a custom cURL method. This
+ means that the redirect behavior of POST requests with custom bodies will not be the same as POST requests that use
+ POST fields or files (the latter is only used when emulating a form POST in the browser).
+* Lots of cleanup to CurlHandle::factory and RequestFactory::createRequest
+
+## 3.3.1 - 2013-03-10
+
+* Added the ability to create PHP streaming responses from HTTP requests
+* Bug fix: Running any filters when parsing response headers with service descriptions
+* Bug fix: OauthPlugin fixes to allow for multi-dimensional array signing, and sorting parameters before signing
+* Bug fix: Removed the adding of default empty arrays and false Booleans to responses in order to be consistent across
+ response location visitors.
+* Bug fix: Removed the possibility of creating configuration files with circular dependencies
+* RequestFactory::create() now uses the key of a POST file when setting the POST file name
+* Added xmlAllowEmpty to serialize an XML body even if no XML specific parameters are set
+
+## 3.3.0 - 2013-03-03
+
+* A large number of performance optimizations have been made
+* Bug fix: Added 'wb' as a valid write mode for streams
+* Bug fix: `Guzzle\Http\Message\Response::json()` now allows scalar values to be returned
+* Bug fix: Fixed bug in `Guzzle\Http\Message\Response` where wrapping quotes were stripped from `getEtag()`
+* BC: Removed `Guzzle\Http\Utils` class
+* BC: Setting a service description on a client will no longer modify the client's command factories.
+* BC: Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using
+ the 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io'
+* BC: `Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getSteamType()` are no longer converted to
+ lowercase
+* Operation parameter objects are now lazy loaded internally
+* Added ErrorResponsePlugin that can throw errors for responses defined in service description operations' errorResponses
+* Added support for instantiating responseType=class responseClass classes. Classes must implement
+ `Guzzle\Service\Command\ResponseClassInterface`
+* Added support for additionalProperties for top-level parameters in responseType=model responseClasses. These
+ additional properties also support locations and can be used to parse JSON responses where the outermost part of the
+ JSON is an array
+* Added support for nested renaming of JSON models (rename sentAs to name)
+* CachePlugin
+ * Added support for stale-if-error so that the CachePlugin can now serve stale content from the cache on error
+ * Debug headers can now added to cached response in the CachePlugin
+
+## 3.2.0 - 2013-02-14
+
+* CurlMulti is no longer reused globally. A new multi object is created per-client. This helps to isolate clients.
+* URLs with no path no longer contain a "/" by default
+* Guzzle\Http\QueryString does no longer manages the leading "?". This is now handled in Guzzle\Http\Url.
+* BadResponseException no longer includes the full request and response message
+* Adding setData() to Guzzle\Service\Description\ServiceDescriptionInterface
+* Adding getResponseBody() to Guzzle\Http\Message\RequestInterface
+* Various updates to classes to use ServiceDescriptionInterface type hints rather than ServiceDescription
+* Header values can now be normalized into distinct values when multiple headers are combined with a comma separated list
+* xmlEncoding can now be customized for the XML declaration of a XML service description operation
+* Guzzle\Http\QueryString now uses Guzzle\Http\QueryAggregator\QueryAggregatorInterface objects to add custom value
+ aggregation and no longer uses callbacks
+* The URL encoding implementation of Guzzle\Http\QueryString can now be customized
+* Bug fix: Filters were not always invoked for array service description parameters
+* Bug fix: Redirects now use a target response body rather than a temporary response body
+* Bug fix: The default exponential backoff BackoffPlugin was not giving when the request threshold was exceeded
+* Bug fix: Guzzle now takes the first found value when grabbing Cache-Control directives
+
+## 3.1.2 - 2013-01-27
+
+* Refactored how operation responses are parsed. Visitors now include a before() method responsible for parsing the
+ response body. For example, the XmlVisitor now parses the XML response into an array in the before() method.
+* Fixed an issue where cURL would not automatically decompress responses when the Accept-Encoding header was sent
+* CURLOPT_SSL_VERIFYHOST is never set to 1 because it is deprecated (see 5e0ff2ef20f839e19d1eeb298f90ba3598784444)
+* Fixed a bug where redirect responses were not chained correctly using getPreviousResponse()
+* Setting default headers on a client after setting the user-agent will not erase the user-agent setting
+
+## 3.1.1 - 2013-01-20
+
+* Adding wildcard support to Guzzle\Common\Collection::getPath()
+* Adding alias support to ServiceBuilder configs
+* Adding Guzzle\Service\Resource\CompositeResourceIteratorFactory and cleaning up factory interface
+
+## 3.1.0 - 2013-01-12
+
+* BC: CurlException now extends from RequestException rather than BadResponseException
+* BC: Renamed Guzzle\Plugin\Cache\CanCacheStrategyInterface::canCache() to canCacheRequest() and added CanCacheResponse()
+* Added getData to ServiceDescriptionInterface
+* Added context array to RequestInterface::setState()
+* Bug: Removing hard dependency on the BackoffPlugin from Guzzle\Http
+* Bug: Adding required content-type when JSON request visitor adds JSON to a command
+* Bug: Fixing the serialization of a service description with custom data
+* Made it easier to deal with exceptions thrown when transferring commands or requests in parallel by providing
+ an array of successful and failed responses
+* Moved getPath from Guzzle\Service\Resource\Model to Guzzle\Common\Collection
+* Added Guzzle\Http\IoEmittingEntityBody
+* Moved command filtration from validators to location visitors
+* Added `extends` attributes to service description parameters
+* Added getModels to ServiceDescriptionInterface
+
+## 3.0.7 - 2012-12-19
+
+* Fixing phar detection when forcing a cacert to system if null or true
+* Allowing filename to be passed to `Guzzle\Http\Message\Request::setResponseBody()`
+* Cleaning up `Guzzle\Common\Collection::inject` method
+* Adding a response_body location to service descriptions
+
+## 3.0.6 - 2012-12-09
+
+* CurlMulti performance improvements
+* Adding setErrorResponses() to Operation
+* composer.json tweaks
+
+## 3.0.5 - 2012-11-18
+
+* Bug: Fixing an infinite recursion bug caused from revalidating with the CachePlugin
+* Bug: Response body can now be a string containing "0"
+* Bug: Using Guzzle inside of a phar uses system by default but now allows for a custom cacert
+* Bug: QueryString::fromString now properly parses query string parameters that contain equal signs
+* Added support for XML attributes in service description responses
+* DefaultRequestSerializer now supports array URI parameter values for URI template expansion
+* Added better mimetype guessing to requests and post files
+
+## 3.0.4 - 2012-11-11
+
+* Bug: Fixed a bug when adding multiple cookies to a request to use the correct glue value
+* Bug: Cookies can now be added that have a name, domain, or value set to "0"
+* Bug: Using the system cacert bundle when using the Phar
+* Added json and xml methods to Response to make it easier to parse JSON and XML response data into data structures
+* Enhanced cookie jar de-duplication
+* Added the ability to enable strict cookie jars that throw exceptions when invalid cookies are added
+* Added setStream to StreamInterface to actually make it possible to implement custom rewind behavior for entity bodies
+* Added the ability to create any sort of hash for a stream rather than just an MD5 hash
+
+## 3.0.3 - 2012-11-04
+
+* Implementing redirects in PHP rather than cURL
+* Added PECL URI template extension and using as default parser if available
+* Bug: Fixed Content-Length parsing of Response factory
+* Adding rewind() method to entity bodies and streams. Allows for custom rewinding of non-repeatable streams.
+* Adding ToArrayInterface throughout library
+* Fixing OauthPlugin to create unique nonce values per request
+
+## 3.0.2 - 2012-10-25
+
+* Magic methods are enabled by default on clients
+* Magic methods return the result of a command
+* Service clients no longer require a base_url option in the factory
+* Bug: Fixed an issue with URI templates where null template variables were being expanded
+
+## 3.0.1 - 2012-10-22
+
+* Models can now be used like regular collection objects by calling filter, map, etc.
+* Models no longer require a Parameter structure or initial data in the constructor
+* Added a custom AppendIterator to get around a PHP bug with the `\AppendIterator`
+
+## 3.0.0 - 2012-10-15
+
+* Rewrote service description format to be based on Swagger
+ * Now based on JSON schema
+ * Added nested input structures and nested response models
+ * Support for JSON and XML input and output models
+ * Renamed `commands` to `operations`
+ * Removed dot class notation
+ * Removed custom types
+* Broke the project into smaller top-level namespaces to be more component friendly
+* Removed support for XML configs and descriptions. Use arrays or JSON files.
+* Removed the Validation component and Inspector
+* Moved all cookie code to Guzzle\Plugin\Cookie
+* Magic methods on a Guzzle\Service\Client now return the command un-executed.
+* Calling getResult() or getResponse() on a command will lazily execute the command if needed.
+* Now shipping with cURL's CA certs and using it by default
+* Added previousResponse() method to response objects
+* No longer sending Accept and Accept-Encoding headers on every request
+* Only sending an Expect header by default when a payload is greater than 1MB
+* Added/moved client options:
+ * curl.blacklist to curl.option.blacklist
+ * Added ssl.certificate_authority
+* Added a Guzzle\Iterator component
+* Moved plugins from Guzzle\Http\Plugin to Guzzle\Plugin
+* Added a more robust backoff retry strategy (replaced the ExponentialBackoffPlugin)
+* Added a more robust caching plugin
+* Added setBody to response objects
+* Updating LogPlugin to use a more flexible MessageFormatter
+* Added a completely revamped build process
+* Cleaning up Collection class and removing default values from the get method
+* Fixed ZF2 cache adapters
+
+## 2.8.8 - 2012-10-15
+
+* Bug: Fixed a cookie issue that caused dot prefixed domains to not match where popular browsers did
+
+## 2.8.7 - 2012-09-30
+
+* Bug: Fixed config file aliases for JSON includes
+* Bug: Fixed cookie bug on a request object by using CookieParser to parse cookies on requests
+* Bug: Removing the path to a file when sending a Content-Disposition header on a POST upload
+* Bug: Hardening request and response parsing to account for missing parts
+* Bug: Fixed PEAR packaging
+* Bug: Fixed Request::getInfo
+* Bug: Fixed cases where CURLM_CALL_MULTI_PERFORM return codes were causing curl transactions to fail
+* Adding the ability for the namespace Iterator factory to look in multiple directories
+* Added more getters/setters/removers from service descriptions
+* Added the ability to remove POST fields from OAuth signatures
+* OAuth plugin now supports 2-legged OAuth
+
+## 2.8.6 - 2012-09-05
+
+* Added the ability to modify and build service descriptions
+* Added the use of visitors to apply parameters to locations in service descriptions using the dynamic command
+* Added a `json` parameter location
+* Now allowing dot notation for classes in the CacheAdapterFactory
+* Using the union of two arrays rather than an array_merge when extending service builder services and service params
+* Ensuring that a service is a string before doing strpos() checks on it when substituting services for references
+ in service builder config files.
+* Services defined in two different config files that include one another will by default replace the previously
+ defined service, but you can now create services that extend themselves and merge their settings over the previous
+* The JsonLoader now supports aliasing filenames with different filenames. This allows you to alias something like
+ '_default' with a default JSON configuration file.
+
+## 2.8.5 - 2012-08-29
+
+* Bug: Suppressed empty arrays from URI templates
+* Bug: Added the missing $options argument from ServiceDescription::factory to enable caching
+* Added support for HTTP responses that do not contain a reason phrase in the start-line
+* AbstractCommand commands are now invokable
+* Added a way to get the data used when signing an Oauth request before a request is sent
+
+## 2.8.4 - 2012-08-15
+
+* Bug: Custom delay time calculations are no longer ignored in the ExponentialBackoffPlugin
+* Added the ability to transfer entity bodies as a string rather than streamed. This gets around curl error 65. Set `body_as_string` in a request's curl options to enable.
+* Added a StreamInterface, EntityBodyInterface, and added ftell() to Guzzle\Common\Stream
+* Added an AbstractEntityBodyDecorator and a ReadLimitEntityBody decorator to transfer only a subset of a decorated stream
+* Stream and EntityBody objects will now return the file position to the previous position after a read required operation (e.g. getContentMd5())
+* Added additional response status codes
+* Removed SSL information from the default User-Agent header
+* DELETE requests can now send an entity body
+* Added an EventDispatcher to the ExponentialBackoffPlugin and added an ExponentialBackoffLogger to log backoff retries
+* Added the ability of the MockPlugin to consume mocked request bodies
+* LogPlugin now exposes request and response objects in the extras array
+
+## 2.8.3 - 2012-07-30
+
+* Bug: Fixed a case where empty POST requests were sent as GET requests
+* Bug: Fixed a bug in ExponentialBackoffPlugin that caused fatal errors when retrying an EntityEnclosingRequest that does not have a body
+* Bug: Setting the response body of a request to null after completing a request, not when setting the state of a request to new
+* Added multiple inheritance to service description commands
+* Added an ApiCommandInterface and added `getParamNames()` and `hasParam()`
+* Removed the default 2mb size cutoff from the Md5ValidatorPlugin so that it now defaults to validating everything
+* Changed CurlMulti::perform to pass a smaller timeout to CurlMulti::executeHandles
+
+## 2.8.2 - 2012-07-24
+
+* Bug: Query string values set to 0 are no longer dropped from the query string
+* Bug: A Collection object is no longer created each time a call is made to `Guzzle\Service\Command\AbstractCommand::getRequestHeaders()`
+* Bug: `+` is now treated as an encoded space when parsing query strings
+* QueryString and Collection performance improvements
+* Allowing dot notation for class paths in filters attribute of a service descriptions
+
+## 2.8.1 - 2012-07-16
+
+* Loosening Event Dispatcher dependency
+* POST redirects can now be customized using CURLOPT_POSTREDIR
+
+## 2.8.0 - 2012-07-15
+
+* BC: Guzzle\Http\Query
+ * Query strings with empty variables will always show an equal sign unless the variable is set to QueryString::BLANK (e.g. ?acl= vs ?acl)
+ * Changed isEncodingValues() and isEncodingFields() to isUrlEncoding()
+ * Changed setEncodeValues(bool) and setEncodeFields(bool) to useUrlEncoding(bool)
+ * Changed the aggregation functions of QueryString to be static methods
+ * Can now use fromString() with querystrings that have a leading ?
+* cURL configuration values can be specified in service descriptions using `curl.` prefixed parameters
+* Content-Length is set to 0 before emitting the request.before_send event when sending an empty request body
+* Cookies are no longer URL decoded by default
+* Bug: URI template variables set to null are no longer expanded
+
+## 2.7.2 - 2012-07-02
+
+* BC: Moving things to get ready for subtree splits. Moving Inflection into Common. Moving Guzzle\Http\Parser to Guzzle\Parser.
+* BC: Removing Guzzle\Common\Batch\Batch::count() and replacing it with isEmpty()
+* CachePlugin now allows for a custom request parameter function to check if a request can be cached
+* Bug fix: CachePlugin now only caches GET and HEAD requests by default
+* Bug fix: Using header glue when transferring headers over the wire
+* Allowing deeply nested arrays for composite variables in URI templates
+* Batch divisors can now return iterators or arrays
+
+## 2.7.1 - 2012-06-26
+
+* Minor patch to update version number in UA string
+* Updating build process
+
+## 2.7.0 - 2012-06-25
+
+* BC: Inflection classes moved to Guzzle\Inflection. No longer static methods. Can now inject custom inflectors into classes.
+* BC: Removed magic setX methods from commands
+* BC: Magic methods mapped to service description commands are now inflected in the command factory rather than the client __call() method
+* Verbose cURL options are no longer enabled by default. Set curl.debug to true on a client to enable.
+* Bug: Now allowing colons in a response start-line (e.g. HTTP/1.1 503 Service Unavailable: Back-end server is at capacity)
+* Guzzle\Service\Resource\ResourceIteratorApplyBatched now internally uses the Guzzle\Common\Batch namespace
+* Added Guzzle\Service\Plugin namespace and a PluginCollectionPlugin
+* Added the ability to set POST fields and files in a service description
+* Guzzle\Http\EntityBody::factory() now accepts objects with a __toString() method
+* Adding a command.before_prepare event to clients
+* Added BatchClosureTransfer and BatchClosureDivisor
+* BatchTransferException now includes references to the batch divisor and transfer strategies
+* Fixed some tests so that they pass more reliably
+* Added Guzzle\Common\Log\ArrayLogAdapter
+
+## 2.6.6 - 2012-06-10
+
+* BC: Removing Guzzle\Http\Plugin\BatchQueuePlugin
+* BC: Removing Guzzle\Service\Command\CommandSet
+* Adding generic batching system (replaces the batch queue plugin and command set)
+* Updating ZF cache and log adapters and now using ZF's composer repository
+* Bug: Setting the name of each ApiParam when creating through an ApiCommand
+* Adding result_type, result_doc, deprecated, and doc_url to service descriptions
+* Bug: Changed the default cookie header casing back to 'Cookie'
+
+## 2.6.5 - 2012-06-03
+
+* BC: Renaming Guzzle\Http\Message\RequestInterface::getResourceUri() to getResource()
+* BC: Removing unused AUTH_BASIC and AUTH_DIGEST constants from
+* BC: Guzzle\Http\Cookie is now used to manage Set-Cookie data, not Cookie data
+* BC: Renaming methods in the CookieJarInterface
+* Moving almost all cookie logic out of the CookiePlugin and into the Cookie or CookieJar implementations
+* Making the default glue for HTTP headers ';' instead of ','
+* Adding a removeValue to Guzzle\Http\Message\Header
+* Adding getCookies() to request interface.
+* Making it easier to add event subscribers to HasDispatcherInterface classes. Can now directly call addSubscriber()
+
+## 2.6.4 - 2012-05-30
+
+* BC: Cleaning up how POST files are stored in EntityEnclosingRequest objects. Adding PostFile class.
+* BC: Moving ApiCommand specific functionality from the Inspector and on to the ApiCommand
+* Bug: Fixing magic method command calls on clients
+* Bug: Email constraint only validates strings
+* Bug: Aggregate POST fields when POST files are present in curl handle
+* Bug: Fixing default User-Agent header
+* Bug: Only appending or prepending parameters in commands if they are specified
+* Bug: Not requiring response reason phrases or status codes to match a predefined list of codes
+* Allowing the use of dot notation for class namespaces when using instance_of constraint
+* Added any_match validation constraint
+* Added an AsyncPlugin
+* Passing request object to the calculateWait method of the ExponentialBackoffPlugin
+* Allowing the result of a command object to be changed
+* Parsing location and type sub values when instantiating a service description rather than over and over at runtime
+
+## 2.6.3 - 2012-05-23
+
+* [BC] Guzzle\Common\FromConfigInterface no longer requires any config options.
+* [BC] Refactoring how POST files are stored on an EntityEnclosingRequest. They are now separate from POST fields.
+* You can now use an array of data when creating PUT request bodies in the request factory.
+* Removing the requirement that HTTPS requests needed a Cache-Control: public directive to be cacheable.
+* [Http] Adding support for Content-Type in multipart POST uploads per upload
+* [Http] Added support for uploading multiple files using the same name (foo[0], foo[1])
+* Adding more POST data operations for easier manipulation of POST data.
+* You can now set empty POST fields.
+* The body of a request is only shown on EntityEnclosingRequest objects that do not use POST files.
+* Split the Guzzle\Service\Inspector::validateConfig method into two methods. One to initialize when a command is created, and one to validate.
+* CS updates
+
+## 2.6.2 - 2012-05-19
+
+* [Http] Better handling of nested scope requests in CurlMulti. Requests are now always prepares in the send() method rather than the addRequest() method.
+
+## 2.6.1 - 2012-05-19
+
+* [BC] Removing 'path' support in service descriptions. Use 'uri'.
+* [BC] Guzzle\Service\Inspector::parseDocBlock is now protected. Adding getApiParamsForClass() with cache.
+* [BC] Removing Guzzle\Common\NullObject. Use https://github.com/mtdowling/NullObject if you need it.
+* [BC] Removing Guzzle\Common\XmlElement.
+* All commands, both dynamic and concrete, have ApiCommand objects.
+* Adding a fix for CurlMulti so that if all of the connections encounter some sort of curl error, then the loop exits.
+* Adding checks to EntityEnclosingRequest so that empty POST files and fields are ignored.
+* Making the method signature of Guzzle\Service\Builder\ServiceBuilder::factory more flexible.
+
+## 2.6.0 - 2012-05-15
+
+* [BC] Moving Guzzle\Service\Builder to Guzzle\Service\Builder\ServiceBuilder
+* [BC] Executing a Command returns the result of the command rather than the command
+* [BC] Moving all HTTP parsing logic to Guzzle\Http\Parsers. Allows for faster C implementations if needed.
+* [BC] Changing the Guzzle\Http\Message\Response::setProtocol() method to accept a protocol and version in separate args.
+* [BC] Moving ResourceIterator* to Guzzle\Service\Resource
+* [BC] Completely refactored ResourceIterators to iterate over a cloned command object
+* [BC] Moved Guzzle\Http\UriTemplate to Guzzle\Http\Parser\UriTemplate\UriTemplate
+* [BC] Guzzle\Guzzle is now deprecated
+* Moving Guzzle\Common\Guzzle::inject to Guzzle\Common\Collection::inject
+* Adding Guzzle\Version class to give version information about Guzzle
+* Adding Guzzle\Http\Utils class to provide getDefaultUserAgent() and getHttpDate()
+* Adding Guzzle\Curl\CurlVersion to manage caching curl_version() data
+* ServiceDescription and ServiceBuilder are now cacheable using similar configs
+* Changing the format of XML and JSON service builder configs. Backwards compatible.
+* Cleaned up Cookie parsing
+* Trimming the default Guzzle User-Agent header
+* Adding a setOnComplete() method to Commands that is called when a command completes
+* Keeping track of requests that were mocked in the MockPlugin
+* Fixed a caching bug in the CacheAdapterFactory
+* Inspector objects can be injected into a Command object
+* Refactoring a lot of code and tests to be case insensitive when dealing with headers
+* Adding Guzzle\Http\Message\HeaderComparison for easy comparison of HTTP headers using a DSL
+* Adding the ability to set global option overrides to service builder configs
+* Adding the ability to include other service builder config files from within XML and JSON files
+* Moving the parseQuery method out of Url and on to QueryString::fromString() as a static factory method.
+
+## 2.5.0 - 2012-05-08
+
+* Major performance improvements
+* [BC] Simplifying Guzzle\Common\Collection. Please check to see if you are using features that are now deprecated.
+* [BC] Using a custom validation system that allows a flyweight implementation for much faster validation. No longer using Symfony2 Validation component.
+* [BC] No longer supporting "{{ }}" for injecting into command or UriTemplates. Use "{}"
+* Added the ability to passed parameters to all requests created by a client
+* Added callback functionality to the ExponentialBackoffPlugin
+* Using microtime in ExponentialBackoffPlugin to allow more granular backoff strategies.
+* Rewinding request stream bodies when retrying requests
+* Exception is thrown when JSON response body cannot be decoded
+* Added configurable magic method calls to clients and commands. This is off by default.
+* Fixed a defect that added a hash to every parsed URL part
+* Fixed duplicate none generation for OauthPlugin.
+* Emitting an event each time a client is generated by a ServiceBuilder
+* Using an ApiParams object instead of a Collection for parameters of an ApiCommand
+* cache.* request parameters should be renamed to params.cache.*
+* Added the ability to set arbitrary curl options on requests (disable_wire, progress, etc.). See CurlHandle.
+* Added the ability to disable type validation of service descriptions
+* ServiceDescriptions and ServiceBuilders are now Serializable
diff --git a/vendor/guzzlehttp/guzzle/LICENSE b/vendor/guzzlehttp/guzzle/LICENSE
new file mode 100644
index 0000000000..50a177b032
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2011-2018 Michael Dowling, https://github.com/mtdowling
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/guzzlehttp/guzzle/README.md b/vendor/guzzlehttp/guzzle/README.md
new file mode 100644
index 0000000000..bcd18b8e71
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/README.md
@@ -0,0 +1,91 @@
+Guzzle, PHP HTTP client
+=======================
+
+[![Latest Version](https://img.shields.io/github/release/guzzle/guzzle.svg?style=flat-square)](https://github.com/guzzle/guzzle/releases)
+[![Build Status](https://img.shields.io/travis/guzzle/guzzle.svg?style=flat-square)](https://travis-ci.org/guzzle/guzzle)
+[![Total Downloads](https://img.shields.io/packagist/dt/guzzlehttp/guzzle.svg?style=flat-square)](https://packagist.org/packages/guzzlehttp/guzzle)
+
+Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and
+trivial to integrate with web services.
+
+- Simple interface for building query strings, POST requests, streaming large
+ uploads, streaming large downloads, using HTTP cookies, uploading JSON data,
+ etc...
+- Can send both synchronous and asynchronous requests using the same interface.
+- Uses PSR-7 interfaces for requests, responses, and streams. This allows you
+ to utilize other PSR-7 compatible libraries with Guzzle.
+- Abstracts away the underlying HTTP transport, allowing you to write
+ environment and transport agnostic code; i.e., no hard dependency on cURL,
+ PHP streams, sockets, or non-blocking event loops.
+- Middleware system allows you to augment and compose client behavior.
+
+```php
+$client = new \GuzzleHttp\Client();
+$res = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle');
+echo $res->getStatusCode();
+// 200
+echo $res->getHeaderLine('content-type');
+// 'application/json; charset=utf8'
+echo $res->getBody();
+// '{"id": 1420053, "name": "guzzle", ...}'
+
+// Send an asynchronous request.
+$request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org');
+$promise = $client->sendAsync($request)->then(function ($response) {
+ echo 'I completed! ' . $response->getBody();
+});
+$promise->wait();
+```
+
+## Help and docs
+
+- [Documentation](http://guzzlephp.org/)
+- [Stack Overflow](http://stackoverflow.com/questions/tagged/guzzle)
+- [Gitter](https://gitter.im/guzzle/guzzle)
+
+
+## Installing Guzzle
+
+The recommended way to install Guzzle is through
+[Composer](http://getcomposer.org).
+
+```bash
+# Install Composer
+curl -sS https://getcomposer.org/installer | php
+```
+
+Next, run the Composer command to install the latest stable version of Guzzle:
+
+```bash
+php composer.phar require guzzlehttp/guzzle
+```
+
+After installing, you need to require Composer's autoloader:
+
+```php
+require 'vendor/autoload.php';
+```
+
+You can then later update Guzzle using composer:
+
+ ```bash
+composer.phar update
+ ```
+
+
+## Version Guidance
+
+| Version | Status | Packagist | Namespace | Repo | Docs | PSR-7 | PHP Version |
+|---------|------------|---------------------|--------------|---------------------|---------------------|-------|-------------|
+| 3.x | EOL | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >= 5.3.3 |
+| 4.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >= 5.4 |
+| 5.x | Maintained | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >= 5.4 |
+| 6.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >= 5.5 |
+
+[guzzle-3-repo]: https://github.com/guzzle/guzzle3
+[guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x
+[guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3
+[guzzle-6-repo]: https://github.com/guzzle/guzzle
+[guzzle-3-docs]: http://guzzle3.readthedocs.org/en/latest/
+[guzzle-5-docs]: http://guzzle.readthedocs.org/en/5.3/
+[guzzle-6-docs]: http://guzzle.readthedocs.org/en/latest/
diff --git a/vendor/guzzlehttp/guzzle/UPGRADING.md b/vendor/guzzlehttp/guzzle/UPGRADING.md
new file mode 100644
index 0000000000..91d1dcc993
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/UPGRADING.md
@@ -0,0 +1,1203 @@
+Guzzle Upgrade Guide
+====================
+
+5.0 to 6.0
+----------
+
+Guzzle now uses [PSR-7](http://www.php-fig.org/psr/psr-7/) for HTTP messages.
+Due to the fact that these messages are immutable, this prompted a refactoring
+of Guzzle to use a middleware based system rather than an event system. Any
+HTTP message interaction (e.g., `GuzzleHttp\Message\Request`) need to be
+updated to work with the new immutable PSR-7 request and response objects. Any
+event listeners or subscribers need to be updated to become middleware
+functions that wrap handlers (or are injected into a
+`GuzzleHttp\HandlerStack`).
+
+- Removed `GuzzleHttp\BatchResults`
+- Removed `GuzzleHttp\Collection`
+- Removed `GuzzleHttp\HasDataTrait`
+- Removed `GuzzleHttp\ToArrayInterface`
+- The `guzzlehttp/streams` dependency has been removed. Stream functionality
+ is now present in the `GuzzleHttp\Psr7` namespace provided by the
+ `guzzlehttp/psr7` package.
+- Guzzle no longer uses ReactPHP promises and now uses the
+ `guzzlehttp/promises` library. We use a custom promise library for three
+ significant reasons:
+ 1. React promises (at the time of writing this) are recursive. Promise
+ chaining and promise resolution will eventually blow the stack. Guzzle
+ promises are not recursive as they use a sort of trampolining technique.
+ Note: there has been movement in the React project to modify promises to
+ no longer utilize recursion.
+ 2. Guzzle needs to have the ability to synchronously block on a promise to
+ wait for a result. Guzzle promises allows this functionality (and does
+ not require the use of recursion).
+ 3. Because we need to be able to wait on a result, doing so using React
+ promises requires wrapping react promises with RingPHP futures. This
+ overhead is no longer needed, reducing stack sizes, reducing complexity,
+ and improving performance.
+- `GuzzleHttp\Mimetypes` has been moved to a function in
+ `GuzzleHttp\Psr7\mimetype_from_extension` and
+ `GuzzleHttp\Psr7\mimetype_from_filename`.
+- `GuzzleHttp\Query` and `GuzzleHttp\QueryParser` have been removed. Query
+ strings must now be passed into request objects as strings, or provided to
+ the `query` request option when creating requests with clients. The `query`
+ option uses PHP's `http_build_query` to convert an array to a string. If you
+ need a different serialization technique, you will need to pass the query
+ string in as a string. There are a couple helper functions that will make
+ working with query strings easier: `GuzzleHttp\Psr7\parse_query` and
+ `GuzzleHttp\Psr7\build_query`.
+- Guzzle no longer has a dependency on RingPHP. Due to the use of a middleware
+ system based on PSR-7, using RingPHP and it's middleware system as well adds
+ more complexity than the benefits it provides. All HTTP handlers that were
+ present in RingPHP have been modified to work directly with PSR-7 messages
+ and placed in the `GuzzleHttp\Handler` namespace. This significantly reduces
+ complexity in Guzzle, removes a dependency, and improves performance. RingPHP
+ will be maintained for Guzzle 5 support, but will no longer be a part of
+ Guzzle 6.
+- As Guzzle now uses a middleware based systems the event system and RingPHP
+ integration has been removed. Note: while the event system has been removed,
+ it is possible to add your own type of event system that is powered by the
+ middleware system.
+ - Removed the `Event` namespace.
+ - Removed the `Subscriber` namespace.
+ - Removed `Transaction` class
+ - Removed `RequestFsm`
+ - Removed `RingBridge`
+ - `GuzzleHttp\Subscriber\Cookie` is now provided by
+ `GuzzleHttp\Middleware::cookies`
+ - `GuzzleHttp\Subscriber\HttpError` is now provided by
+ `GuzzleHttp\Middleware::httpError`
+ - `GuzzleHttp\Subscriber\History` is now provided by
+ `GuzzleHttp\Middleware::history`
+ - `GuzzleHttp\Subscriber\Mock` is now provided by
+ `GuzzleHttp\Handler\MockHandler`
+ - `GuzzleHttp\Subscriber\Prepare` is now provided by
+ `GuzzleHttp\PrepareBodyMiddleware`
+ - `GuzzleHttp\Subscriber\Redirect` is now provided by
+ `GuzzleHttp\RedirectMiddleware`
+- Guzzle now uses `Psr\Http\Message\UriInterface` (implements in
+ `GuzzleHttp\Psr7\Uri`) for URI support. `GuzzleHttp\Url` is now gone.
+- Static functions in `GuzzleHttp\Utils` have been moved to namespaced
+ functions under the `GuzzleHttp` namespace. This requires either a Composer
+ based autoloader or you to include functions.php.
+- `GuzzleHttp\ClientInterface::getDefaultOption` has been renamed to
+ `GuzzleHttp\ClientInterface::getConfig`.
+- `GuzzleHttp\ClientInterface::setDefaultOption` has been removed.
+- The `json` and `xml` methods of response objects has been removed. With the
+ migration to strictly adhering to PSR-7 as the interface for Guzzle messages,
+ adding methods to message interfaces would actually require Guzzle messages
+ to extend from PSR-7 messages rather then work with them directly.
+
+## Migrating to middleware
+
+The change to PSR-7 unfortunately required significant refactoring to Guzzle
+due to the fact that PSR-7 messages are immutable. Guzzle 5 relied on an event
+system from plugins. The event system relied on mutability of HTTP messages and
+side effects in order to work. With immutable messages, you have to change your
+workflow to become more about either returning a value (e.g., functional
+middlewares) or setting a value on an object. Guzzle v6 has chosen the
+functional middleware approach.
+
+Instead of using the event system to listen for things like the `before` event,
+you now create a stack based middleware function that intercepts a request on
+the way in and the promise of the response on the way out. This is a much
+simpler and more predictable approach than the event system and works nicely
+with PSR-7 middleware. Due to the use of promises, the middleware system is
+also asynchronous.
+
+v5:
+
+```php
+use GuzzleHttp\Event\BeforeEvent;
+$client = new GuzzleHttp\Client();
+// Get the emitter and listen to the before event.
+$client->getEmitter()->on('before', function (BeforeEvent $e) {
+ // Guzzle v5 events relied on mutation
+ $e->getRequest()->setHeader('X-Foo', 'Bar');
+});
+```
+
+v6:
+
+In v6, you can modify the request before it is sent using the `mapRequest`
+middleware. The idiomatic way in v6 to modify the request/response lifecycle is
+to setup a handler middleware stack up front and inject the handler into a
+client.
+
+```php
+use GuzzleHttp\Middleware;
+// Create a handler stack that has all of the default middlewares attached
+$handler = GuzzleHttp\HandlerStack::create();
+// Push the handler onto the handler stack
+$handler->push(Middleware::mapRequest(function (RequestInterface $request) {
+ // Notice that we have to return a request object
+ return $request->withHeader('X-Foo', 'Bar');
+}));
+// Inject the handler into the client
+$client = new GuzzleHttp\Client(['handler' => $handler]);
+```
+
+## POST Requests
+
+This version added the [`form_params`](http://guzzle.readthedocs.org/en/latest/request-options.html#form_params)
+and `multipart` request options. `form_params` is an associative array of
+strings or array of strings and is used to serialize an
+`application/x-www-form-urlencoded` POST request. The
+[`multipart`](http://guzzle.readthedocs.org/en/latest/request-options.html#multipart)
+option is now used to send a multipart/form-data POST request.
+
+`GuzzleHttp\Post\PostFile` has been removed. Use the `multipart` option to add
+POST files to a multipart/form-data request.
+
+The `body` option no longer accepts an array to send POST requests. Please use
+`multipart` or `form_params` instead.
+
+The `base_url` option has been renamed to `base_uri`.
+
+4.x to 5.0
+----------
+
+## Rewritten Adapter Layer
+
+Guzzle now uses [RingPHP](http://ringphp.readthedocs.org/en/latest) to send
+HTTP requests. The `adapter` option in a `GuzzleHttp\Client` constructor
+is still supported, but it has now been renamed to `handler`. Instead of
+passing a `GuzzleHttp\Adapter\AdapterInterface`, you must now pass a PHP
+`callable` that follows the RingPHP specification.
+
+## Removed Fluent Interfaces
+
+[Fluent interfaces were removed](http://ocramius.github.io/blog/fluent-interfaces-are-evil)
+from the following classes:
+
+- `GuzzleHttp\Collection`
+- `GuzzleHttp\Url`
+- `GuzzleHttp\Query`
+- `GuzzleHttp\Post\PostBody`
+- `GuzzleHttp\Cookie\SetCookie`
+
+## Removed functions.php
+
+Removed "functions.php", so that Guzzle is truly PSR-4 compliant. The following
+functions can be used as replacements.
+
+- `GuzzleHttp\json_decode` -> `GuzzleHttp\Utils::jsonDecode`
+- `GuzzleHttp\get_path` -> `GuzzleHttp\Utils::getPath`
+- `GuzzleHttp\Utils::setPath` -> `GuzzleHttp\set_path`
+- `GuzzleHttp\Pool::batch` -> `GuzzleHttp\batch`. This function is, however,
+ deprecated in favor of using `GuzzleHttp\Pool::batch()`.
+
+The "procedural" global client has been removed with no replacement (e.g.,
+`GuzzleHttp\get()`, `GuzzleHttp\post()`, etc.). Use a `GuzzleHttp\Client`
+object as a replacement.
+
+## `throwImmediately` has been removed
+
+The concept of "throwImmediately" has been removed from exceptions and error
+events. This control mechanism was used to stop a transfer of concurrent
+requests from completing. This can now be handled by throwing the exception or
+by cancelling a pool of requests or each outstanding future request
+individually.
+
+## headers event has been removed
+
+Removed the "headers" event. This event was only useful for changing the
+body a response once the headers of the response were known. You can implement
+a similar behavior in a number of ways. One example might be to use a
+FnStream that has access to the transaction being sent. For example, when the
+first byte is written, you could check if the response headers match your
+expectations, and if so, change the actual stream body that is being
+written to.
+
+## Updates to HTTP Messages
+
+Removed the `asArray` parameter from
+`GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header
+value as an array, then use the newly added `getHeaderAsArray()` method of
+`MessageInterface`. This change makes the Guzzle interfaces compatible with
+the PSR-7 interfaces.
+
+3.x to 4.0
+----------
+
+## Overarching changes:
+
+- Now requires PHP 5.4 or greater.
+- No longer requires cURL to send requests.
+- Guzzle no longer wraps every exception it throws. Only exceptions that are
+ recoverable are now wrapped by Guzzle.
+- Various namespaces have been removed or renamed.
+- No longer requiring the Symfony EventDispatcher. A custom event dispatcher
+ based on the Symfony EventDispatcher is
+ now utilized in `GuzzleHttp\Event\EmitterInterface` (resulting in significant
+ speed and functionality improvements).
+
+Changes per Guzzle 3.x namespace are described below.
+
+## Batch
+
+The `Guzzle\Batch` namespace has been removed. This is best left to
+third-parties to implement on top of Guzzle's core HTTP library.
+
+## Cache
+
+The `Guzzle\Cache` namespace has been removed. (Todo: No suitable replacement
+has been implemented yet, but hoping to utilize a PSR cache interface).
+
+## Common
+
+- Removed all of the wrapped exceptions. It's better to use the standard PHP
+ library for unrecoverable exceptions.
+- `FromConfigInterface` has been removed.
+- `Guzzle\Common\Version` has been removed. The VERSION constant can be found
+ at `GuzzleHttp\ClientInterface::VERSION`.
+
+### Collection
+
+- `getAll` has been removed. Use `toArray` to convert a collection to an array.
+- `inject` has been removed.
+- `keySearch` has been removed.
+- `getPath` no longer supports wildcard expressions. Use something better like
+ JMESPath for this.
+- `setPath` now supports appending to an existing array via the `[]` notation.
+
+### Events
+
+Guzzle no longer requires Symfony's EventDispatcher component. Guzzle now uses
+`GuzzleHttp\Event\Emitter`.
+
+- `Symfony\Component\EventDispatcher\EventDispatcherInterface` is replaced by
+ `GuzzleHttp\Event\EmitterInterface`.
+- `Symfony\Component\EventDispatcher\EventDispatcher` is replaced by
+ `GuzzleHttp\Event\Emitter`.
+- `Symfony\Component\EventDispatcher\Event` is replaced by
+ `GuzzleHttp\Event\Event`, and Guzzle now has an EventInterface in
+ `GuzzleHttp\Event\EventInterface`.
+- `AbstractHasDispatcher` has moved to a trait, `HasEmitterTrait`, and
+ `HasDispatcherInterface` has moved to `HasEmitterInterface`. Retrieving the
+ event emitter of a request, client, etc. now uses the `getEmitter` method
+ rather than the `getDispatcher` method.
+
+#### Emitter
+
+- Use the `once()` method to add a listener that automatically removes itself
+ the first time it is invoked.
+- Use the `listeners()` method to retrieve a list of event listeners rather than
+ the `getListeners()` method.
+- Use `emit()` instead of `dispatch()` to emit an event from an emitter.
+- Use `attach()` instead of `addSubscriber()` and `detach()` instead of
+ `removeSubscriber()`.
+
+```php
+$mock = new Mock();
+// 3.x
+$request->getEventDispatcher()->addSubscriber($mock);
+$request->getEventDispatcher()->removeSubscriber($mock);
+// 4.x
+$request->getEmitter()->attach($mock);
+$request->getEmitter()->detach($mock);
+```
+
+Use the `on()` method to add a listener rather than the `addListener()` method.
+
+```php
+// 3.x
+$request->getEventDispatcher()->addListener('foo', function (Event $event) { /* ... */ } );
+// 4.x
+$request->getEmitter()->on('foo', function (Event $event, $name) { /* ... */ } );
+```
+
+## Http
+
+### General changes
+
+- The cacert.pem certificate has been moved to `src/cacert.pem`.
+- Added the concept of adapters that are used to transfer requests over the
+ wire.
+- Simplified the event system.
+- Sending requests in parallel is still possible, but batching is no longer a
+ concept of the HTTP layer. Instead, you must use the `complete` and `error`
+ events to asynchronously manage parallel request transfers.
+- `Guzzle\Http\Url` has moved to `GuzzleHttp\Url`.
+- `Guzzle\Http\QueryString` has moved to `GuzzleHttp\Query`.
+- QueryAggregators have been rewritten so that they are simply callable
+ functions.
+- `GuzzleHttp\StaticClient` has been removed. Use the functions provided in
+ `functions.php` for an easy to use static client instance.
+- Exceptions in `GuzzleHttp\Exception` have been updated to all extend from
+ `GuzzleHttp\Exception\TransferException`.
+
+### Client
+
+Calling methods like `get()`, `post()`, `head()`, etc. no longer create and
+return a request, but rather creates a request, sends the request, and returns
+the response.
+
+```php
+// 3.0
+$request = $client->get('/');
+$response = $request->send();
+
+// 4.0
+$response = $client->get('/');
+
+// or, to mirror the previous behavior
+$request = $client->createRequest('GET', '/');
+$response = $client->send($request);
+```
+
+`GuzzleHttp\ClientInterface` has changed.
+
+- The `send` method no longer accepts more than one request. Use `sendAll` to
+ send multiple requests in parallel.
+- `setUserAgent()` has been removed. Use a default request option instead. You
+ could, for example, do something like:
+ `$client->setConfig('defaults/headers/User-Agent', 'Foo/Bar ' . $client::getDefaultUserAgent())`.
+- `setSslVerification()` has been removed. Use default request options instead,
+ like `$client->setConfig('defaults/verify', true)`.
+
+`GuzzleHttp\Client` has changed.
+
+- The constructor now accepts only an associative array. You can include a
+ `base_url` string or array to use a URI template as the base URL of a client.
+ You can also specify a `defaults` key that is an associative array of default
+ request options. You can pass an `adapter` to use a custom adapter,
+ `batch_adapter` to use a custom adapter for sending requests in parallel, or
+ a `message_factory` to change the factory used to create HTTP requests and
+ responses.
+- The client no longer emits a `client.create_request` event.
+- Creating requests with a client no longer automatically utilize a URI
+ template. You must pass an array into a creational method (e.g.,
+ `createRequest`, `get`, `put`, etc.) in order to expand a URI template.
+
+### Messages
+
+Messages no longer have references to their counterparts (i.e., a request no
+longer has a reference to it's response, and a response no loger has a
+reference to its request). This association is now managed through a
+`GuzzleHttp\Adapter\TransactionInterface` object. You can get references to
+these transaction objects using request events that are emitted over the
+lifecycle of a request.
+
+#### Requests with a body
+
+- `GuzzleHttp\Message\EntityEnclosingRequest` and
+ `GuzzleHttp\Message\EntityEnclosingRequestInterface` have been removed. The
+ separation between requests that contain a body and requests that do not
+ contain a body has been removed, and now `GuzzleHttp\Message\RequestInterface`
+ handles both use cases.
+- Any method that previously accepts a `GuzzleHttp\Response` object now accept a
+ `GuzzleHttp\Message\ResponseInterface`.
+- `GuzzleHttp\Message\RequestFactoryInterface` has been renamed to
+ `GuzzleHttp\Message\MessageFactoryInterface`. This interface is used to create
+ both requests and responses and is implemented in
+ `GuzzleHttp\Message\MessageFactory`.
+- POST field and file methods have been removed from the request object. You
+ must now use the methods made available to `GuzzleHttp\Post\PostBodyInterface`
+ to control the format of a POST body. Requests that are created using a
+ standard `GuzzleHttp\Message\MessageFactoryInterface` will automatically use
+ a `GuzzleHttp\Post\PostBody` body if the body was passed as an array or if
+ the method is POST and no body is provided.
+
+```php
+$request = $client->createRequest('POST', '/');
+$request->getBody()->setField('foo', 'bar');
+$request->getBody()->addFile(new PostFile('file_key', fopen('/path/to/content', 'r')));
+```
+
+#### Headers
+
+- `GuzzleHttp\Message\Header` has been removed. Header values are now simply
+ represented by an array of values or as a string. Header values are returned
+ as a string by default when retrieving a header value from a message. You can
+ pass an optional argument of `true` to retrieve a header value as an array
+ of strings instead of a single concatenated string.
+- `GuzzleHttp\PostFile` and `GuzzleHttp\PostFileInterface` have been moved to
+ `GuzzleHttp\Post`. This interface has been simplified and now allows the
+ addition of arbitrary headers.
+- Custom headers like `GuzzleHttp\Message\Header\Link` have been removed. Most
+ of the custom headers are now handled separately in specific
+ subscribers/plugins, and `GuzzleHttp\Message\HeaderValues::parseParams()` has
+ been updated to properly handle headers that contain parameters (like the
+ `Link` header).
+
+#### Responses
+
+- `GuzzleHttp\Message\Response::getInfo()` and
+ `GuzzleHttp\Message\Response::setInfo()` have been removed. Use the event
+ system to retrieve this type of information.
+- `GuzzleHttp\Message\Response::getRawHeaders()` has been removed.
+- `GuzzleHttp\Message\Response::getMessage()` has been removed.
+- `GuzzleHttp\Message\Response::calculateAge()` and other cache specific
+ methods have moved to the CacheSubscriber.
+- Header specific helper functions like `getContentMd5()` have been removed.
+ Just use `getHeader('Content-MD5')` instead.
+- `GuzzleHttp\Message\Response::setRequest()` and
+ `GuzzleHttp\Message\Response::getRequest()` have been removed. Use the event
+ system to work with request and response objects as a transaction.
+- `GuzzleHttp\Message\Response::getRedirectCount()` has been removed. Use the
+ Redirect subscriber instead.
+- `GuzzleHttp\Message\Response::isSuccessful()` and other related methods have
+ been removed. Use `getStatusCode()` instead.
+
+#### Streaming responses
+
+Streaming requests can now be created by a client directly, returning a
+`GuzzleHttp\Message\ResponseInterface` object that contains a body stream
+referencing an open PHP HTTP stream.
+
+```php
+// 3.0
+use Guzzle\Stream\PhpStreamRequestFactory;
+$request = $client->get('/');
+$factory = new PhpStreamRequestFactory();
+$stream = $factory->fromRequest($request);
+$data = $stream->read(1024);
+
+// 4.0
+$response = $client->get('/', ['stream' => true]);
+// Read some data off of the stream in the response body
+$data = $response->getBody()->read(1024);
+```
+
+#### Redirects
+
+The `configureRedirects()` method has been removed in favor of a
+`allow_redirects` request option.
+
+```php
+// Standard redirects with a default of a max of 5 redirects
+$request = $client->createRequest('GET', '/', ['allow_redirects' => true]);
+
+// Strict redirects with a custom number of redirects
+$request = $client->createRequest('GET', '/', [
+ 'allow_redirects' => ['max' => 5, 'strict' => true]
+]);
+```
+
+#### EntityBody
+
+EntityBody interfaces and classes have been removed or moved to
+`GuzzleHttp\Stream`. All classes and interfaces that once required
+`GuzzleHttp\EntityBodyInterface` now require
+`GuzzleHttp\Stream\StreamInterface`. Creating a new body for a request no
+longer uses `GuzzleHttp\EntityBody::factory` but now uses
+`GuzzleHttp\Stream\Stream::factory` or even better:
+`GuzzleHttp\Stream\create()`.
+
+- `Guzzle\Http\EntityBodyInterface` is now `GuzzleHttp\Stream\StreamInterface`
+- `Guzzle\Http\EntityBody` is now `GuzzleHttp\Stream\Stream`
+- `Guzzle\Http\CachingEntityBody` is now `GuzzleHttp\Stream\CachingStream`
+- `Guzzle\Http\ReadLimitEntityBody` is now `GuzzleHttp\Stream\LimitStream`
+- `Guzzle\Http\IoEmittyinEntityBody` has been removed.
+
+#### Request lifecycle events
+
+Requests previously submitted a large number of requests. The number of events
+emitted over the lifecycle of a request has been significantly reduced to make
+it easier to understand how to extend the behavior of a request. All events
+emitted during the lifecycle of a request now emit a custom
+`GuzzleHttp\Event\EventInterface` object that contains context providing
+methods and a way in which to modify the transaction at that specific point in
+time (e.g., intercept the request and set a response on the transaction).
+
+- `request.before_send` has been renamed to `before` and now emits a
+ `GuzzleHttp\Event\BeforeEvent`
+- `request.complete` has been renamed to `complete` and now emits a
+ `GuzzleHttp\Event\CompleteEvent`.
+- `request.sent` has been removed. Use `complete`.
+- `request.success` has been removed. Use `complete`.
+- `error` is now an event that emits a `GuzzleHttp\Event\ErrorEvent`.
+- `request.exception` has been removed. Use `error`.
+- `request.receive.status_line` has been removed.
+- `curl.callback.progress` has been removed. Use a custom `StreamInterface` to
+ maintain a status update.
+- `curl.callback.write` has been removed. Use a custom `StreamInterface` to
+ intercept writes.
+- `curl.callback.read` has been removed. Use a custom `StreamInterface` to
+ intercept reads.
+
+`headers` is a new event that is emitted after the response headers of a
+request have been received before the body of the response is downloaded. This
+event emits a `GuzzleHttp\Event\HeadersEvent`.
+
+You can intercept a request and inject a response using the `intercept()` event
+of a `GuzzleHttp\Event\BeforeEvent`, `GuzzleHttp\Event\CompleteEvent`, and
+`GuzzleHttp\Event\ErrorEvent` event.
+
+See: http://docs.guzzlephp.org/en/latest/events.html
+
+## Inflection
+
+The `Guzzle\Inflection` namespace has been removed. This is not a core concern
+of Guzzle.
+
+## Iterator
+
+The `Guzzle\Iterator` namespace has been removed.
+
+- `Guzzle\Iterator\AppendIterator`, `Guzzle\Iterator\ChunkedIterator`, and
+ `Guzzle\Iterator\MethodProxyIterator` are nice, but not a core requirement of
+ Guzzle itself.
+- `Guzzle\Iterator\FilterIterator` is no longer needed because an equivalent
+ class is shipped with PHP 5.4.
+- `Guzzle\Iterator\MapIterator` is not really needed when using PHP 5.5 because
+ it's easier to just wrap an iterator in a generator that maps values.
+
+For a replacement of these iterators, see https://github.com/nikic/iter
+
+## Log
+
+The LogPlugin has moved to https://github.com/guzzle/log-subscriber. The
+`Guzzle\Log` namespace has been removed. Guzzle now relies on
+`Psr\Log\LoggerInterface` for all logging. The MessageFormatter class has been
+moved to `GuzzleHttp\Subscriber\Log\Formatter`.
+
+## Parser
+
+The `Guzzle\Parser` namespace has been removed. This was previously used to
+make it possible to plug in custom parsers for cookies, messages, URI
+templates, and URLs; however, this level of complexity is not needed in Guzzle
+so it has been removed.
+
+- Cookie: Cookie parsing logic has been moved to
+ `GuzzleHttp\Cookie\SetCookie::fromString`.
+- Message: Message parsing logic for both requests and responses has been moved
+ to `GuzzleHttp\Message\MessageFactory::fromMessage`. Message parsing is only
+ used in debugging or deserializing messages, so it doesn't make sense for
+ Guzzle as a library to add this level of complexity to parsing messages.
+- UriTemplate: URI template parsing has been moved to
+ `GuzzleHttp\UriTemplate`. The Guzzle library will automatically use the PECL
+ URI template library if it is installed.
+- Url: URL parsing is now performed in `GuzzleHttp\Url::fromString` (previously
+ it was `Guzzle\Http\Url::factory()`). If custom URL parsing is necessary,
+ then developers are free to subclass `GuzzleHttp\Url`.
+
+## Plugin
+
+The `Guzzle\Plugin` namespace has been renamed to `GuzzleHttp\Subscriber`.
+Several plugins are shipping with the core Guzzle library under this namespace.
+
+- `GuzzleHttp\Subscriber\Cookie`: Replaces the old CookiePlugin. Cookie jar
+ code has moved to `GuzzleHttp\Cookie`.
+- `GuzzleHttp\Subscriber\History`: Replaces the old HistoryPlugin.
+- `GuzzleHttp\Subscriber\HttpError`: Throws errors when a bad HTTP response is
+ received.
+- `GuzzleHttp\Subscriber\Mock`: Replaces the old MockPlugin.
+- `GuzzleHttp\Subscriber\Prepare`: Prepares the body of a request just before
+ sending. This subscriber is attached to all requests by default.
+- `GuzzleHttp\Subscriber\Redirect`: Replaces the RedirectPlugin.
+
+The following plugins have been removed (third-parties are free to re-implement
+these if needed):
+
+- `GuzzleHttp\Plugin\Async` has been removed.
+- `GuzzleHttp\Plugin\CurlAuth` has been removed.
+- `GuzzleHttp\Plugin\ErrorResponse\ErrorResponsePlugin` has been removed. This
+ functionality should instead be implemented with event listeners that occur
+ after normal response parsing occurs in the guzzle/command package.
+
+The following plugins are not part of the core Guzzle package, but are provided
+in separate repositories:
+
+- `Guzzle\Http\Plugin\BackoffPlugin` has been rewritten to be much simpler
+ to build custom retry policies using simple functions rather than various
+ chained classes. See: https://github.com/guzzle/retry-subscriber
+- `Guzzle\Http\Plugin\Cache\CachePlugin` has moved to
+ https://github.com/guzzle/cache-subscriber
+- `Guzzle\Http\Plugin\Log\LogPlugin` has moved to
+ https://github.com/guzzle/log-subscriber
+- `Guzzle\Http\Plugin\Md5\Md5Plugin` has moved to
+ https://github.com/guzzle/message-integrity-subscriber
+- `Guzzle\Http\Plugin\Mock\MockPlugin` has moved to
+ `GuzzleHttp\Subscriber\MockSubscriber`.
+- `Guzzle\Http\Plugin\Oauth\OauthPlugin` has moved to
+ https://github.com/guzzle/oauth-subscriber
+
+## Service
+
+The service description layer of Guzzle has moved into two separate packages:
+
+- http://github.com/guzzle/command Provides a high level abstraction over web
+ services by representing web service operations using commands.
+- http://github.com/guzzle/guzzle-services Provides an implementation of
+ guzzle/command that provides request serialization and response parsing using
+ Guzzle service descriptions.
+
+## Stream
+
+Stream have moved to a separate package available at
+https://github.com/guzzle/streams.
+
+`Guzzle\Stream\StreamInterface` has been given a large update to cleanly take
+on the responsibilities of `Guzzle\Http\EntityBody` and
+`Guzzle\Http\EntityBodyInterface` now that they have been removed. The number
+of methods implemented by the `StreamInterface` has been drastically reduced to
+allow developers to more easily extend and decorate stream behavior.
+
+## Removed methods from StreamInterface
+
+- `getStream` and `setStream` have been removed to better encapsulate streams.
+- `getMetadata` and `setMetadata` have been removed in favor of
+ `GuzzleHttp\Stream\MetadataStreamInterface`.
+- `getWrapper`, `getWrapperData`, `getStreamType`, and `getUri` have all been
+ removed. This data is accessible when
+ using streams that implement `GuzzleHttp\Stream\MetadataStreamInterface`.
+- `rewind` has been removed. Use `seek(0)` for a similar behavior.
+
+## Renamed methods
+
+- `detachStream` has been renamed to `detach`.
+- `feof` has been renamed to `eof`.
+- `ftell` has been renamed to `tell`.
+- `readLine` has moved from an instance method to a static class method of
+ `GuzzleHttp\Stream\Stream`.
+
+## Metadata streams
+
+`GuzzleHttp\Stream\MetadataStreamInterface` has been added to denote streams
+that contain additional metadata accessible via `getMetadata()`.
+`GuzzleHttp\Stream\StreamInterface::getMetadata` and
+`GuzzleHttp\Stream\StreamInterface::setMetadata` have been removed.
+
+## StreamRequestFactory
+
+The entire concept of the StreamRequestFactory has been removed. The way this
+was used in Guzzle 3 broke the actual interface of sending streaming requests
+(instead of getting back a Response, you got a StreamInterface). Streaming
+PHP requests are now implemented through the `GuzzleHttp\Adapter\StreamAdapter`.
+
+3.6 to 3.7
+----------
+
+### Deprecations
+
+- You can now enable E_USER_DEPRECATED warnings to see if you are using any deprecated methods.:
+
+```php
+\Guzzle\Common\Version::$emitWarnings = true;
+```
+
+The following APIs and options have been marked as deprecated:
+
+- Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use `$request->getResponseBody()->isRepeatable()` instead.
+- Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead.
+- Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead.
+- Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead.
+- Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead.
+- Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated
+- Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client.
+- Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8.
+- Marked `Guzzle\Common\Collection::inject()` as deprecated.
+- Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use
+ `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` or
+ `$client->setDefaultOption('auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));`
+
+3.7 introduces `request.options` as a parameter for a client configuration and as an optional argument to all creational
+request methods. When paired with a client's configuration settings, these options allow you to specify default settings
+for various aspects of a request. Because these options make other previous configuration options redundant, several
+configuration options and methods of a client and AbstractCommand have been deprecated.
+
+- Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use `$client->getDefaultOption('headers')`.
+- Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use `$client->setDefaultOption('headers/{header_name}', 'value')`.
+- Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use `$client->setDefaultOption('params/{param_name}', 'value')`
+- Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. These will work through Guzzle 4.0
+
+ $command = $client->getCommand('foo', array(
+ 'command.headers' => array('Test' => '123'),
+ 'command.response_body' => '/path/to/file'
+ ));
+
+ // Should be changed to:
+
+ $command = $client->getCommand('foo', array(
+ 'command.request_options' => array(
+ 'headers' => array('Test' => '123'),
+ 'save_as' => '/path/to/file'
+ )
+ ));
+
+### Interface changes
+
+Additions and changes (you will need to update any implementations or subclasses you may have created):
+
+- Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`:
+ createRequest, head, delete, put, patch, post, options, prepareRequest
+- Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()`
+- Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface`
+- Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to
+ `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a
+ resource, string, or EntityBody into the $options parameter to specify the download location of the response.
+- Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a
+ default `array()`
+- Added `Guzzle\Stream\StreamInterface::isRepeatable`
+- Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods.
+
+The following methods were removed from interfaces. All of these methods are still available in the concrete classes
+that implement them, but you should update your code to use alternative methods:
+
+- Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use
+ `$client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or
+ `$client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))` or
+ `$client->setDefaultOption('headers/{header_name}', 'value')`. or
+ `$client->setDefaultOption('headers', array('header_name' => 'value'))`.
+- Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use `$client->getConfig()->getPath('request.options/headers')`.
+- Removed `Guzzle\Http\ClientInterface::expandTemplate()`. This is an implementation detail.
+- Removed `Guzzle\Http\ClientInterface::setRequestFactory()`. This is an implementation detail.
+- Removed `Guzzle\Http\ClientInterface::getCurlMulti()`. This is a very specific implementation detail.
+- Removed `Guzzle\Http\Message\RequestInterface::canCache`. Use the CachePlugin.
+- Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect`. Use the HistoryPlugin.
+- Removed `Guzzle\Http\Message\RequestInterface::isRedirect`. Use the HistoryPlugin.
+
+### Cache plugin breaking changes
+
+- CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a
+ CacheStorageInterface. These two objects and interface will be removed in a future version.
+- Always setting X-cache headers on cached responses
+- Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin
+- `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface
+ $request, Response $response);`
+- `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);`
+- `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);`
+- Added `CacheStorageInterface::purge($url)`
+- `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin
+ $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache,
+ CanCacheStrategyInterface $canCache = null)`
+- Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)`
+
+3.5 to 3.6
+----------
+
+* Mixed casing of headers are now forced to be a single consistent casing across all values for that header.
+* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution
+* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader().
+ For example, setHeader() first removes the header using unset on a HeaderCollection and then calls addHeader().
+ Keeping the Host header and URL host in sync is now handled by overriding the addHeader method in Request.
+* Specific header implementations can be created for complex headers. When a message creates a header, it uses a
+ HeaderFactory which can map specific headers to specific header classes. There is now a Link header and
+ CacheControl header implementation.
+* Moved getLinks() from Response to just be used on a Link header object.
+
+If you previously relied on Guzzle\Http\Message\Header::raw(), then you will need to update your code to use the
+HeaderInterface (e.g. toArray(), getAll(), etc.).
+
+### Interface changes
+
+* Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate
+* Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti()
+* Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in
+ Guzzle\Http\Curl\RequestMediator
+* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string.
+* Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface
+* Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders()
+
+### Removed deprecated functions
+
+* Removed Guzzle\Parser\ParserRegister::get(). Use getParser()
+* Removed Guzzle\Parser\ParserRegister::set(). Use registerParser().
+
+### Deprecations
+
+* The ability to case-insensitively search for header values
+* Guzzle\Http\Message\Header::hasExactHeader
+* Guzzle\Http\Message\Header::raw. Use getAll()
+* Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object
+ instead.
+
+### Other changes
+
+* All response header helper functions return a string rather than mixing Header objects and strings inconsistently
+* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle
+ directly via interfaces
+* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist
+ but are a no-op until removed.
+* Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a
+ `Guzzle\Service\Command\ArrayCommandInterface`.
+* Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response
+ on a request while the request is still being transferred
+* `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess
+
+3.3 to 3.4
+----------
+
+Base URLs of a client now follow the rules of http://tools.ietf.org/html/rfc3986#section-5.2.2 when merging URLs.
+
+3.2 to 3.3
+----------
+
+### Response::getEtag() quote stripping removed
+
+`Guzzle\Http\Message\Response::getEtag()` no longer strips quotes around the ETag response header
+
+### Removed `Guzzle\Http\Utils`
+
+The `Guzzle\Http\Utils` class was removed. This class was only used for testing.
+
+### Stream wrapper and type
+
+`Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getStreamType()` are no longer converted to lowercase.
+
+### curl.emit_io became emit_io
+
+Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using the
+'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io'
+
+3.1 to 3.2
+----------
+
+### CurlMulti is no longer reused globally
+
+Before 3.2, the same CurlMulti object was reused globally for each client. This can cause issue where plugins added
+to a single client can pollute requests dispatched from other clients.
+
+If you still wish to reuse the same CurlMulti object with each client, then you can add a listener to the
+ServiceBuilder's `service_builder.create_client` event to inject a custom CurlMulti object into each client as it is
+created.
+
+```php
+$multi = new Guzzle\Http\Curl\CurlMulti();
+$builder = Guzzle\Service\Builder\ServiceBuilder::factory('/path/to/config.json');
+$builder->addListener('service_builder.create_client', function ($event) use ($multi) {
+ $event['client']->setCurlMulti($multi);
+}
+});
+```
+
+### No default path
+
+URLs no longer have a default path value of '/' if no path was specified.
+
+Before:
+
+```php
+$request = $client->get('http://www.foo.com');
+echo $request->getUrl();
+// >> http://www.foo.com/
+```
+
+After:
+
+```php
+$request = $client->get('http://www.foo.com');
+echo $request->getUrl();
+// >> http://www.foo.com
+```
+
+### Less verbose BadResponseException
+
+The exception message for `Guzzle\Http\Exception\BadResponseException` no longer contains the full HTTP request and
+response information. You can, however, get access to the request and response object by calling `getRequest()` or
+`getResponse()` on the exception object.
+
+### Query parameter aggregation
+
+Multi-valued query parameters are no longer aggregated using a callback function. `Guzzle\Http\Query` now has a
+setAggregator() method that accepts a `Guzzle\Http\QueryAggregator\QueryAggregatorInterface` object. This object is
+responsible for handling the aggregation of multi-valued query string variables into a flattened hash.
+
+2.8 to 3.x
+----------
+
+### Guzzle\Service\Inspector
+
+Change `\Guzzle\Service\Inspector::fromConfig` to `\Guzzle\Common\Collection::fromConfig`
+
+**Before**
+
+```php
+use Guzzle\Service\Inspector;
+
+class YourClient extends \Guzzle\Service\Client
+{
+ public static function factory($config = array())
+ {
+ $default = array();
+ $required = array('base_url', 'username', 'api_key');
+ $config = Inspector::fromConfig($config, $default, $required);
+
+ $client = new self(
+ $config->get('base_url'),
+ $config->get('username'),
+ $config->get('api_key')
+ );
+ $client->setConfig($config);
+
+ $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json'));
+
+ return $client;
+ }
+```
+
+**After**
+
+```php
+use Guzzle\Common\Collection;
+
+class YourClient extends \Guzzle\Service\Client
+{
+ public static function factory($config = array())
+ {
+ $default = array();
+ $required = array('base_url', 'username', 'api_key');
+ $config = Collection::fromConfig($config, $default, $required);
+
+ $client = new self(
+ $config->get('base_url'),
+ $config->get('username'),
+ $config->get('api_key')
+ );
+ $client->setConfig($config);
+
+ $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json'));
+
+ return $client;
+ }
+```
+
+### Convert XML Service Descriptions to JSON
+
+**Before**
+
+```xml
+
+
+
+
+
+ Get a list of groups
+
+
+ Uses a search query to get a list of groups
+
+
+
+ Create a group
+
+
+
+
+ Delete a group by ID
+
+
+
+
+
+
+ Update a group
+
+
+
+
+
+
+```
+
+**After**
+
+```json
+{
+ "name": "Zendesk REST API v2",
+ "apiVersion": "2012-12-31",
+ "description":"Provides access to Zendesk views, groups, tickets, ticket fields, and users",
+ "operations": {
+ "list_groups": {
+ "httpMethod":"GET",
+ "uri": "groups.json",
+ "summary": "Get a list of groups"
+ },
+ "search_groups":{
+ "httpMethod":"GET",
+ "uri": "search.json?query=\"{query} type:group\"",
+ "summary": "Uses a search query to get a list of groups",
+ "parameters":{
+ "query":{
+ "location": "uri",
+ "description":"Zendesk Search Query",
+ "type": "string",
+ "required": true
+ }
+ }
+ },
+ "create_group": {
+ "httpMethod":"POST",
+ "uri": "groups.json",
+ "summary": "Create a group",
+ "parameters":{
+ "data": {
+ "type": "array",
+ "location": "body",
+ "description":"Group JSON",
+ "filters": "json_encode",
+ "required": true
+ },
+ "Content-Type":{
+ "type": "string",
+ "location":"header",
+ "static": "application/json"
+ }
+ }
+ },
+ "delete_group": {
+ "httpMethod":"DELETE",
+ "uri": "groups/{id}.json",
+ "summary": "Delete a group",
+ "parameters":{
+ "id":{
+ "location": "uri",
+ "description":"Group to delete by ID",
+ "type": "integer",
+ "required": true
+ }
+ }
+ },
+ "get_group": {
+ "httpMethod":"GET",
+ "uri": "groups/{id}.json",
+ "summary": "Get a ticket",
+ "parameters":{
+ "id":{
+ "location": "uri",
+ "description":"Group to get by ID",
+ "type": "integer",
+ "required": true
+ }
+ }
+ },
+ "update_group": {
+ "httpMethod":"PUT",
+ "uri": "groups/{id}.json",
+ "summary": "Update a group",
+ "parameters":{
+ "id": {
+ "location": "uri",
+ "description":"Group to update by ID",
+ "type": "integer",
+ "required": true
+ },
+ "data": {
+ "type": "array",
+ "location": "body",
+ "description":"Group JSON",
+ "filters": "json_encode",
+ "required": true
+ },
+ "Content-Type":{
+ "type": "string",
+ "location":"header",
+ "static": "application/json"
+ }
+ }
+ }
+}
+```
+
+### Guzzle\Service\Description\ServiceDescription
+
+Commands are now called Operations
+
+**Before**
+
+```php
+use Guzzle\Service\Description\ServiceDescription;
+
+$sd = new ServiceDescription();
+$sd->getCommands(); // @returns ApiCommandInterface[]
+$sd->hasCommand($name);
+$sd->getCommand($name); // @returns ApiCommandInterface|null
+$sd->addCommand($command); // @param ApiCommandInterface $command
+```
+
+**After**
+
+```php
+use Guzzle\Service\Description\ServiceDescription;
+
+$sd = new ServiceDescription();
+$sd->getOperations(); // @returns OperationInterface[]
+$sd->hasOperation($name);
+$sd->getOperation($name); // @returns OperationInterface|null
+$sd->addOperation($operation); // @param OperationInterface $operation
+```
+
+### Guzzle\Common\Inflection\Inflector
+
+Namespace is now `Guzzle\Inflection\Inflector`
+
+### Guzzle\Http\Plugin
+
+Namespace is now `Guzzle\Plugin`. Many other changes occur within this namespace and are detailed in their own sections below.
+
+### Guzzle\Http\Plugin\LogPlugin and Guzzle\Common\Log
+
+Now `Guzzle\Plugin\Log\LogPlugin` and `Guzzle\Log` respectively.
+
+**Before**
+
+```php
+use Guzzle\Common\Log\ClosureLogAdapter;
+use Guzzle\Http\Plugin\LogPlugin;
+
+/** @var \Guzzle\Http\Client */
+$client;
+
+// $verbosity is an integer indicating desired message verbosity level
+$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $verbosity = LogPlugin::LOG_VERBOSE);
+```
+
+**After**
+
+```php
+use Guzzle\Log\ClosureLogAdapter;
+use Guzzle\Log\MessageFormatter;
+use Guzzle\Plugin\Log\LogPlugin;
+
+/** @var \Guzzle\Http\Client */
+$client;
+
+// $format is a string indicating desired message format -- @see MessageFormatter
+$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $format = MessageFormatter::DEBUG_FORMAT);
+```
+
+### Guzzle\Http\Plugin\CurlAuthPlugin
+
+Now `Guzzle\Plugin\CurlAuth\CurlAuthPlugin`.
+
+### Guzzle\Http\Plugin\ExponentialBackoffPlugin
+
+Now `Guzzle\Plugin\Backoff\BackoffPlugin`, and other changes.
+
+**Before**
+
+```php
+use Guzzle\Http\Plugin\ExponentialBackoffPlugin;
+
+$backoffPlugin = new ExponentialBackoffPlugin($maxRetries, array_merge(
+ ExponentialBackoffPlugin::getDefaultFailureCodes(), array(429)
+ ));
+
+$client->addSubscriber($backoffPlugin);
+```
+
+**After**
+
+```php
+use Guzzle\Plugin\Backoff\BackoffPlugin;
+use Guzzle\Plugin\Backoff\HttpBackoffStrategy;
+
+// Use convenient factory method instead -- see implementation for ideas of what
+// you can do with chaining backoff strategies
+$backoffPlugin = BackoffPlugin::getExponentialBackoff($maxRetries, array_merge(
+ HttpBackoffStrategy::getDefaultFailureCodes(), array(429)
+ ));
+$client->addSubscriber($backoffPlugin);
+```
+
+### Known Issues
+
+#### [BUG] Accept-Encoding header behavior changed unintentionally.
+
+(See #217) (Fixed in 09daeb8c666fb44499a0646d655a8ae36456575e)
+
+In version 2.8 setting the `Accept-Encoding` header would set the CURLOPT_ENCODING option, which permitted cURL to
+properly handle gzip/deflate compressed responses from the server. In versions affected by this bug this does not happen.
+See issue #217 for a workaround, or use a version containing the fix.
diff --git a/vendor/guzzlehttp/guzzle/composer.json b/vendor/guzzlehttp/guzzle/composer.json
new file mode 100644
index 0000000000..1f328e308c
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/composer.json
@@ -0,0 +1,44 @@
+{
+ "name": "guzzlehttp/guzzle",
+ "type": "library",
+ "description": "Guzzle is a PHP HTTP client library",
+ "keywords": ["framework", "http", "rest", "web service", "curl", "client", "HTTP client"],
+ "homepage": "http://guzzlephp.org/",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "require": {
+ "php": ">=5.5",
+ "guzzlehttp/psr7": "^1.4",
+ "guzzlehttp/promises": "^1.0"
+ },
+ "require-dev": {
+ "ext-curl": "*",
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
+ "psr/log": "^1.0"
+ },
+ "autoload": {
+ "files": ["src/functions_include.php"],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "GuzzleHttp\\Tests\\": "tests/"
+ }
+ },
+ "suggest": {
+ "psr/log": "Required for using the Log middleware"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.3-dev"
+ }
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Client.php b/vendor/guzzlehttp/guzzle/src/Client.php
new file mode 100644
index 0000000000..80417918d0
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Client.php
@@ -0,0 +1,422 @@
+ 'http://www.foo.com/1.0/',
+ * 'timeout' => 0,
+ * 'allow_redirects' => false,
+ * 'proxy' => '192.168.16.1:10'
+ * ]);
+ *
+ * Client configuration settings include the following options:
+ *
+ * - handler: (callable) Function that transfers HTTP requests over the
+ * wire. The function is called with a Psr7\Http\Message\RequestInterface
+ * and array of transfer options, and must return a
+ * GuzzleHttp\Promise\PromiseInterface that is fulfilled with a
+ * Psr7\Http\Message\ResponseInterface on success. "handler" is a
+ * constructor only option that cannot be overridden in per/request
+ * options. If no handler is provided, a default handler will be created
+ * that enables all of the request options below by attaching all of the
+ * default middleware to the handler.
+ * - base_uri: (string|UriInterface) Base URI of the client that is merged
+ * into relative URIs. Can be a string or instance of UriInterface.
+ * - **: any request option
+ *
+ * @param array $config Client configuration settings.
+ *
+ * @see \GuzzleHttp\RequestOptions for a list of available request options.
+ */
+ public function __construct(array $config = [])
+ {
+ if (!isset($config['handler'])) {
+ $config['handler'] = HandlerStack::create();
+ } elseif (!is_callable($config['handler'])) {
+ throw new \InvalidArgumentException('handler must be a callable');
+ }
+
+ // Convert the base_uri to a UriInterface
+ if (isset($config['base_uri'])) {
+ $config['base_uri'] = Psr7\uri_for($config['base_uri']);
+ }
+
+ $this->configureDefaults($config);
+ }
+
+ public function __call($method, $args)
+ {
+ if (count($args) < 1) {
+ throw new \InvalidArgumentException('Magic request methods require a URI and optional options array');
+ }
+
+ $uri = $args[0];
+ $opts = isset($args[1]) ? $args[1] : [];
+
+ return substr($method, -5) === 'Async'
+ ? $this->requestAsync(substr($method, 0, -5), $uri, $opts)
+ : $this->request($method, $uri, $opts);
+ }
+
+ public function sendAsync(RequestInterface $request, array $options = [])
+ {
+ // Merge the base URI into the request URI if needed.
+ $options = $this->prepareDefaults($options);
+
+ return $this->transfer(
+ $request->withUri($this->buildUri($request->getUri(), $options), $request->hasHeader('Host')),
+ $options
+ );
+ }
+
+ public function send(RequestInterface $request, array $options = [])
+ {
+ $options[RequestOptions::SYNCHRONOUS] = true;
+ return $this->sendAsync($request, $options)->wait();
+ }
+
+ public function requestAsync($method, $uri = '', array $options = [])
+ {
+ $options = $this->prepareDefaults($options);
+ // Remove request modifying parameter because it can be done up-front.
+ $headers = isset($options['headers']) ? $options['headers'] : [];
+ $body = isset($options['body']) ? $options['body'] : null;
+ $version = isset($options['version']) ? $options['version'] : '1.1';
+ // Merge the URI into the base URI.
+ $uri = $this->buildUri($uri, $options);
+ if (is_array($body)) {
+ $this->invalidBody();
+ }
+ $request = new Psr7\Request($method, $uri, $headers, $body, $version);
+ // Remove the option so that they are not doubly-applied.
+ unset($options['headers'], $options['body'], $options['version']);
+
+ return $this->transfer($request, $options);
+ }
+
+ public function request($method, $uri = '', array $options = [])
+ {
+ $options[RequestOptions::SYNCHRONOUS] = true;
+ return $this->requestAsync($method, $uri, $options)->wait();
+ }
+
+ public function getConfig($option = null)
+ {
+ return $option === null
+ ? $this->config
+ : (isset($this->config[$option]) ? $this->config[$option] : null);
+ }
+
+ private function buildUri($uri, array $config)
+ {
+ // for BC we accept null which would otherwise fail in uri_for
+ $uri = Psr7\uri_for($uri === null ? '' : $uri);
+
+ if (isset($config['base_uri'])) {
+ $uri = Psr7\UriResolver::resolve(Psr7\uri_for($config['base_uri']), $uri);
+ }
+
+ return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri;
+ }
+
+ /**
+ * Configures the default options for a client.
+ *
+ * @param array $config
+ */
+ private function configureDefaults(array $config)
+ {
+ $defaults = [
+ 'allow_redirects' => RedirectMiddleware::$defaultSettings,
+ 'http_errors' => true,
+ 'decode_content' => true,
+ 'verify' => true,
+ 'cookies' => false
+ ];
+
+ // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set.
+
+ // We can only trust the HTTP_PROXY environment variable in a CLI
+ // process due to the fact that PHP has no reliable mechanism to
+ // get environment variables that start with "HTTP_".
+ if (php_sapi_name() == 'cli' && getenv('HTTP_PROXY')) {
+ $defaults['proxy']['http'] = getenv('HTTP_PROXY');
+ }
+
+ if ($proxy = getenv('HTTPS_PROXY')) {
+ $defaults['proxy']['https'] = $proxy;
+ }
+
+ if ($noProxy = getenv('NO_PROXY')) {
+ $cleanedNoProxy = str_replace(' ', '', $noProxy);
+ $defaults['proxy']['no'] = explode(',', $cleanedNoProxy);
+ }
+
+ $this->config = $config + $defaults;
+
+ if (!empty($config['cookies']) && $config['cookies'] === true) {
+ $this->config['cookies'] = new CookieJar();
+ }
+
+ // Add the default user-agent header.
+ if (!isset($this->config['headers'])) {
+ $this->config['headers'] = ['User-Agent' => default_user_agent()];
+ } else {
+ // Add the User-Agent header if one was not already set.
+ foreach (array_keys($this->config['headers']) as $name) {
+ if (strtolower($name) === 'user-agent') {
+ return;
+ }
+ }
+ $this->config['headers']['User-Agent'] = default_user_agent();
+ }
+ }
+
+ /**
+ * Merges default options into the array.
+ *
+ * @param array $options Options to modify by reference
+ *
+ * @return array
+ */
+ private function prepareDefaults($options)
+ {
+ $defaults = $this->config;
+
+ if (!empty($defaults['headers'])) {
+ // Default headers are only added if they are not present.
+ $defaults['_conditional'] = $defaults['headers'];
+ unset($defaults['headers']);
+ }
+
+ // Special handling for headers is required as they are added as
+ // conditional headers and as headers passed to a request ctor.
+ if (array_key_exists('headers', $options)) {
+ // Allows default headers to be unset.
+ if ($options['headers'] === null) {
+ $defaults['_conditional'] = null;
+ unset($options['headers']);
+ } elseif (!is_array($options['headers'])) {
+ throw new \InvalidArgumentException('headers must be an array');
+ }
+ }
+
+ // Shallow merge defaults underneath options.
+ $result = $options + $defaults;
+
+ // Remove null values.
+ foreach ($result as $k => $v) {
+ if ($v === null) {
+ unset($result[$k]);
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * Transfers the given request and applies request options.
+ *
+ * The URI of the request is not modified and the request options are used
+ * as-is without merging in default options.
+ *
+ * @param RequestInterface $request
+ * @param array $options
+ *
+ * @return Promise\PromiseInterface
+ */
+ private function transfer(RequestInterface $request, array $options)
+ {
+ // save_to -> sink
+ if (isset($options['save_to'])) {
+ $options['sink'] = $options['save_to'];
+ unset($options['save_to']);
+ }
+
+ // exceptions -> http_errors
+ if (isset($options['exceptions'])) {
+ $options['http_errors'] = $options['exceptions'];
+ unset($options['exceptions']);
+ }
+
+ $request = $this->applyOptions($request, $options);
+ $handler = $options['handler'];
+
+ try {
+ return Promise\promise_for($handler($request, $options));
+ } catch (\Exception $e) {
+ return Promise\rejection_for($e);
+ }
+ }
+
+ /**
+ * Applies the array of request options to a request.
+ *
+ * @param RequestInterface $request
+ * @param array $options
+ *
+ * @return RequestInterface
+ */
+ private function applyOptions(RequestInterface $request, array &$options)
+ {
+ $modify = [
+ 'set_headers' => [],
+ ];
+
+ if (isset($options['headers'])) {
+ $modify['set_headers'] = $options['headers'];
+ unset($options['headers']);
+ }
+
+ if (isset($options['form_params'])) {
+ if (isset($options['multipart'])) {
+ throw new \InvalidArgumentException('You cannot use '
+ . 'form_params and multipart at the same time. Use the '
+ . 'form_params option if you want to send application/'
+ . 'x-www-form-urlencoded requests, and the multipart '
+ . 'option to send multipart/form-data requests.');
+ }
+ $options['body'] = http_build_query($options['form_params'], '', '&');
+ unset($options['form_params']);
+ // Ensure that we don't have the header in different case and set the new value.
+ $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']);
+ $options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded';
+ }
+
+ if (isset($options['multipart'])) {
+ $options['body'] = new Psr7\MultipartStream($options['multipart']);
+ unset($options['multipart']);
+ }
+
+ if (isset($options['json'])) {
+ $options['body'] = \GuzzleHttp\json_encode($options['json']);
+ unset($options['json']);
+ // Ensure that we don't have the header in different case and set the new value.
+ $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']);
+ $options['_conditional']['Content-Type'] = 'application/json';
+ }
+
+ if (!empty($options['decode_content'])
+ && $options['decode_content'] !== true
+ ) {
+ // Ensure that we don't have the header in different case and set the new value.
+ $options['_conditional'] = Psr7\_caseless_remove(['Accept-Encoding'], $options['_conditional']);
+ $modify['set_headers']['Accept-Encoding'] = $options['decode_content'];
+ }
+
+ if (isset($options['body'])) {
+ if (is_array($options['body'])) {
+ $this->invalidBody();
+ }
+ $modify['body'] = Psr7\stream_for($options['body']);
+ unset($options['body']);
+ }
+
+ if (!empty($options['auth']) && is_array($options['auth'])) {
+ $value = $options['auth'];
+ $type = isset($value[2]) ? strtolower($value[2]) : 'basic';
+ switch ($type) {
+ case 'basic':
+ // Ensure that we don't have the header in different case and set the new value.
+ $modify['set_headers'] = Psr7\_caseless_remove(['Authorization'], $modify['set_headers']);
+ $modify['set_headers']['Authorization'] = 'Basic '
+ . base64_encode("$value[0]:$value[1]");
+ break;
+ case 'digest':
+ // @todo: Do not rely on curl
+ $options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_DIGEST;
+ $options['curl'][CURLOPT_USERPWD] = "$value[0]:$value[1]";
+ break;
+ case 'ntlm':
+ $options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_NTLM;
+ $options['curl'][CURLOPT_USERPWD] = "$value[0]:$value[1]";
+ break;
+ }
+ }
+
+ if (isset($options['query'])) {
+ $value = $options['query'];
+ if (is_array($value)) {
+ $value = http_build_query($value, null, '&', PHP_QUERY_RFC3986);
+ }
+ if (!is_string($value)) {
+ throw new \InvalidArgumentException('query must be a string or array');
+ }
+ $modify['query'] = $value;
+ unset($options['query']);
+ }
+
+ // Ensure that sink is not an invalid value.
+ if (isset($options['sink'])) {
+ // TODO: Add more sink validation?
+ if (is_bool($options['sink'])) {
+ throw new \InvalidArgumentException('sink must not be a boolean');
+ }
+ }
+
+ $request = Psr7\modify_request($request, $modify);
+ if ($request->getBody() instanceof Psr7\MultipartStream) {
+ // Use a multipart/form-data POST if a Content-Type is not set.
+ // Ensure that we don't have the header in different case and set the new value.
+ $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']);
+ $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary='
+ . $request->getBody()->getBoundary();
+ }
+
+ // Merge in conditional headers if they are not present.
+ if (isset($options['_conditional'])) {
+ // Build up the changes so it's in a single clone of the message.
+ $modify = [];
+ foreach ($options['_conditional'] as $k => $v) {
+ if (!$request->hasHeader($k)) {
+ $modify['set_headers'][$k] = $v;
+ }
+ }
+ $request = Psr7\modify_request($request, $modify);
+ // Don't pass this internal value along to middleware/handlers.
+ unset($options['_conditional']);
+ }
+
+ return $request;
+ }
+
+ private function invalidBody()
+ {
+ throw new \InvalidArgumentException('Passing in the "body" request '
+ . 'option as an array to send a POST request has been deprecated. '
+ . 'Please use the "form_params" request option to send a '
+ . 'application/x-www-form-urlencoded request, or the "multipart" '
+ . 'request option to send a multipart/form-data request.');
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/ClientInterface.php b/vendor/guzzlehttp/guzzle/src/ClientInterface.php
new file mode 100644
index 0000000000..2dbcffa492
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/ClientInterface.php
@@ -0,0 +1,84 @@
+strictMode = $strictMode;
+
+ foreach ($cookieArray as $cookie) {
+ if (!($cookie instanceof SetCookie)) {
+ $cookie = new SetCookie($cookie);
+ }
+ $this->setCookie($cookie);
+ }
+ }
+
+ /**
+ * Create a new Cookie jar from an associative array and domain.
+ *
+ * @param array $cookies Cookies to create the jar from
+ * @param string $domain Domain to set the cookies to
+ *
+ * @return self
+ */
+ public static function fromArray(array $cookies, $domain)
+ {
+ $cookieJar = new self();
+ foreach ($cookies as $name => $value) {
+ $cookieJar->setCookie(new SetCookie([
+ 'Domain' => $domain,
+ 'Name' => $name,
+ 'Value' => $value,
+ 'Discard' => true
+ ]));
+ }
+
+ return $cookieJar;
+ }
+
+ /**
+ * @deprecated
+ */
+ public static function getCookieValue($value)
+ {
+ return $value;
+ }
+
+ /**
+ * Evaluate if this cookie should be persisted to storage
+ * that survives between requests.
+ *
+ * @param SetCookie $cookie Being evaluated.
+ * @param bool $allowSessionCookies If we should persist session cookies
+ * @return bool
+ */
+ public static function shouldPersist(
+ SetCookie $cookie,
+ $allowSessionCookies = false
+ ) {
+ if ($cookie->getExpires() || $allowSessionCookies) {
+ if (!$cookie->getDiscard()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Finds and returns the cookie based on the name
+ *
+ * @param string $name cookie name to search for
+ * @return SetCookie|null cookie that was found or null if not found
+ */
+ public function getCookieByName($name)
+ {
+ // don't allow a null name
+ if ($name === null) {
+ return null;
+ }
+ foreach ($this->cookies as $cookie) {
+ if ($cookie->getName() !== null && strcasecmp($cookie->getName(), $name) === 0) {
+ return $cookie;
+ }
+ }
+ }
+
+ public function toArray()
+ {
+ return array_map(function (SetCookie $cookie) {
+ return $cookie->toArray();
+ }, $this->getIterator()->getArrayCopy());
+ }
+
+ public function clear($domain = null, $path = null, $name = null)
+ {
+ if (!$domain) {
+ $this->cookies = [];
+ return;
+ } elseif (!$path) {
+ $this->cookies = array_filter(
+ $this->cookies,
+ function (SetCookie $cookie) use ($path, $domain) {
+ return !$cookie->matchesDomain($domain);
+ }
+ );
+ } elseif (!$name) {
+ $this->cookies = array_filter(
+ $this->cookies,
+ function (SetCookie $cookie) use ($path, $domain) {
+ return !($cookie->matchesPath($path) &&
+ $cookie->matchesDomain($domain));
+ }
+ );
+ } else {
+ $this->cookies = array_filter(
+ $this->cookies,
+ function (SetCookie $cookie) use ($path, $domain, $name) {
+ return !($cookie->getName() == $name &&
+ $cookie->matchesPath($path) &&
+ $cookie->matchesDomain($domain));
+ }
+ );
+ }
+ }
+
+ public function clearSessionCookies()
+ {
+ $this->cookies = array_filter(
+ $this->cookies,
+ function (SetCookie $cookie) {
+ return !$cookie->getDiscard() && $cookie->getExpires();
+ }
+ );
+ }
+
+ public function setCookie(SetCookie $cookie)
+ {
+ // If the name string is empty (but not 0), ignore the set-cookie
+ // string entirely.
+ $name = $cookie->getName();
+ if (!$name && $name !== '0') {
+ return false;
+ }
+
+ // Only allow cookies with set and valid domain, name, value
+ $result = $cookie->validate();
+ if ($result !== true) {
+ if ($this->strictMode) {
+ throw new \RuntimeException('Invalid cookie: ' . $result);
+ } else {
+ $this->removeCookieIfEmpty($cookie);
+ return false;
+ }
+ }
+
+ // Resolve conflicts with previously set cookies
+ foreach ($this->cookies as $i => $c) {
+
+ // Two cookies are identical, when their path, and domain are
+ // identical.
+ if ($c->getPath() != $cookie->getPath() ||
+ $c->getDomain() != $cookie->getDomain() ||
+ $c->getName() != $cookie->getName()
+ ) {
+ continue;
+ }
+
+ // The previously set cookie is a discard cookie and this one is
+ // not so allow the new cookie to be set
+ if (!$cookie->getDiscard() && $c->getDiscard()) {
+ unset($this->cookies[$i]);
+ continue;
+ }
+
+ // If the new cookie's expiration is further into the future, then
+ // replace the old cookie
+ if ($cookie->getExpires() > $c->getExpires()) {
+ unset($this->cookies[$i]);
+ continue;
+ }
+
+ // If the value has changed, we better change it
+ if ($cookie->getValue() !== $c->getValue()) {
+ unset($this->cookies[$i]);
+ continue;
+ }
+
+ // The cookie exists, so no need to continue
+ return false;
+ }
+
+ $this->cookies[] = $cookie;
+
+ return true;
+ }
+
+ public function count()
+ {
+ return count($this->cookies);
+ }
+
+ public function getIterator()
+ {
+ return new \ArrayIterator(array_values($this->cookies));
+ }
+
+ public function extractCookies(
+ RequestInterface $request,
+ ResponseInterface $response
+ ) {
+ if ($cookieHeader = $response->getHeader('Set-Cookie')) {
+ foreach ($cookieHeader as $cookie) {
+ $sc = SetCookie::fromString($cookie);
+ if (!$sc->getDomain()) {
+ $sc->setDomain($request->getUri()->getHost());
+ }
+ if (0 !== strpos($sc->getPath(), '/')) {
+ $sc->setPath($this->getCookiePathFromRequest($request));
+ }
+ $this->setCookie($sc);
+ }
+ }
+ }
+
+ /**
+ * Computes cookie path following RFC 6265 section 5.1.4
+ *
+ * @link https://tools.ietf.org/html/rfc6265#section-5.1.4
+ *
+ * @param RequestInterface $request
+ * @return string
+ */
+ private function getCookiePathFromRequest(RequestInterface $request)
+ {
+ $uriPath = $request->getUri()->getPath();
+ if ('' === $uriPath) {
+ return '/';
+ }
+ if (0 !== strpos($uriPath, '/')) {
+ return '/';
+ }
+ if ('/' === $uriPath) {
+ return '/';
+ }
+ if (0 === $lastSlashPos = strrpos($uriPath, '/')) {
+ return '/';
+ }
+
+ return substr($uriPath, 0, $lastSlashPos);
+ }
+
+ public function withCookieHeader(RequestInterface $request)
+ {
+ $values = [];
+ $uri = $request->getUri();
+ $scheme = $uri->getScheme();
+ $host = $uri->getHost();
+ $path = $uri->getPath() ?: '/';
+
+ foreach ($this->cookies as $cookie) {
+ if ($cookie->matchesPath($path) &&
+ $cookie->matchesDomain($host) &&
+ !$cookie->isExpired() &&
+ (!$cookie->getSecure() || $scheme === 'https')
+ ) {
+ $values[] = $cookie->getName() . '='
+ . $cookie->getValue();
+ }
+ }
+
+ return $values
+ ? $request->withHeader('Cookie', implode('; ', $values))
+ : $request;
+ }
+
+ /**
+ * If a cookie already exists and the server asks to set it again with a
+ * null value, the cookie must be deleted.
+ *
+ * @param SetCookie $cookie
+ */
+ private function removeCookieIfEmpty(SetCookie $cookie)
+ {
+ $cookieValue = $cookie->getValue();
+ if ($cookieValue === null || $cookieValue === '') {
+ $this->clear(
+ $cookie->getDomain(),
+ $cookie->getPath(),
+ $cookie->getName()
+ );
+ }
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php
new file mode 100644
index 0000000000..2cf298a867
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php
@@ -0,0 +1,84 @@
+filename = $cookieFile;
+ $this->storeSessionCookies = $storeSessionCookies;
+
+ if (file_exists($cookieFile)) {
+ $this->load($cookieFile);
+ }
+ }
+
+ /**
+ * Saves the file when shutting down
+ */
+ public function __destruct()
+ {
+ $this->save($this->filename);
+ }
+
+ /**
+ * Saves the cookies to a file.
+ *
+ * @param string $filename File to save
+ * @throws \RuntimeException if the file cannot be found or created
+ */
+ public function save($filename)
+ {
+ $json = [];
+ foreach ($this as $cookie) {
+ /** @var SetCookie $cookie */
+ if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {
+ $json[] = $cookie->toArray();
+ }
+ }
+
+ $jsonStr = \GuzzleHttp\json_encode($json);
+ if (false === file_put_contents($filename, $jsonStr)) {
+ throw new \RuntimeException("Unable to save file {$filename}");
+ }
+ }
+
+ /**
+ * Load cookies from a JSON formatted file.
+ *
+ * Old cookies are kept unless overwritten by newly loaded ones.
+ *
+ * @param string $filename Cookie file to load.
+ * @throws \RuntimeException if the file cannot be loaded.
+ */
+ public function load($filename)
+ {
+ $json = file_get_contents($filename);
+ if (false === $json) {
+ throw new \RuntimeException("Unable to load file {$filename}");
+ } elseif ($json === '') {
+ return;
+ }
+
+ $data = \GuzzleHttp\json_decode($json, true);
+ if (is_array($data)) {
+ foreach (json_decode($json, true) as $cookie) {
+ $this->setCookie(new SetCookie($cookie));
+ }
+ } elseif (strlen($data)) {
+ throw new \RuntimeException("Invalid cookie file: {$filename}");
+ }
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php b/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php
new file mode 100644
index 0000000000..4497bcf03e
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php
@@ -0,0 +1,71 @@
+sessionKey = $sessionKey;
+ $this->storeSessionCookies = $storeSessionCookies;
+ $this->load();
+ }
+
+ /**
+ * Saves cookies to session when shutting down
+ */
+ public function __destruct()
+ {
+ $this->save();
+ }
+
+ /**
+ * Save cookies to the client session
+ */
+ public function save()
+ {
+ $json = [];
+ foreach ($this as $cookie) {
+ /** @var SetCookie $cookie */
+ if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {
+ $json[] = $cookie->toArray();
+ }
+ }
+
+ $_SESSION[$this->sessionKey] = json_encode($json);
+ }
+
+ /**
+ * Load the contents of the client session into the data array
+ */
+ protected function load()
+ {
+ if (!isset($_SESSION[$this->sessionKey])) {
+ return;
+ }
+ $data = json_decode($_SESSION[$this->sessionKey], true);
+ if (is_array($data)) {
+ foreach ($data as $cookie) {
+ $this->setCookie(new SetCookie($cookie));
+ }
+ } elseif (strlen($data)) {
+ throw new \RuntimeException("Invalid cookie data");
+ }
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php
new file mode 100644
index 0000000000..f6993943e7
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php
@@ -0,0 +1,403 @@
+ null,
+ 'Value' => null,
+ 'Domain' => null,
+ 'Path' => '/',
+ 'Max-Age' => null,
+ 'Expires' => null,
+ 'Secure' => false,
+ 'Discard' => false,
+ 'HttpOnly' => false
+ ];
+
+ /** @var array Cookie data */
+ private $data;
+
+ /**
+ * Create a new SetCookie object from a string
+ *
+ * @param string $cookie Set-Cookie header string
+ *
+ * @return self
+ */
+ public static function fromString($cookie)
+ {
+ // Create the default return array
+ $data = self::$defaults;
+ // Explode the cookie string using a series of semicolons
+ $pieces = array_filter(array_map('trim', explode(';', $cookie)));
+ // The name of the cookie (first kvp) must exist and include an equal sign.
+ if (empty($pieces[0]) || !strpos($pieces[0], '=')) {
+ return new self($data);
+ }
+
+ // Add the cookie pieces into the parsed data array
+ foreach ($pieces as $part) {
+ $cookieParts = explode('=', $part, 2);
+ $key = trim($cookieParts[0]);
+ $value = isset($cookieParts[1])
+ ? trim($cookieParts[1], " \n\r\t\0\x0B")
+ : true;
+
+ // Only check for non-cookies when cookies have been found
+ if (empty($data['Name'])) {
+ $data['Name'] = $key;
+ $data['Value'] = $value;
+ } else {
+ foreach (array_keys(self::$defaults) as $search) {
+ if (!strcasecmp($search, $key)) {
+ $data[$search] = $value;
+ continue 2;
+ }
+ }
+ $data[$key] = $value;
+ }
+ }
+
+ return new self($data);
+ }
+
+ /**
+ * @param array $data Array of cookie data provided by a Cookie parser
+ */
+ public function __construct(array $data = [])
+ {
+ $this->data = array_replace(self::$defaults, $data);
+ // Extract the Expires value and turn it into a UNIX timestamp if needed
+ if (!$this->getExpires() && $this->getMaxAge()) {
+ // Calculate the Expires date
+ $this->setExpires(time() + $this->getMaxAge());
+ } elseif ($this->getExpires() && !is_numeric($this->getExpires())) {
+ $this->setExpires($this->getExpires());
+ }
+ }
+
+ public function __toString()
+ {
+ $str = $this->data['Name'] . '=' . $this->data['Value'] . '; ';
+ foreach ($this->data as $k => $v) {
+ if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) {
+ if ($k === 'Expires') {
+ $str .= 'Expires=' . gmdate('D, d M Y H:i:s \G\M\T', $v) . '; ';
+ } else {
+ $str .= ($v === true ? $k : "{$k}={$v}") . '; ';
+ }
+ }
+ }
+
+ return rtrim($str, '; ');
+ }
+
+ public function toArray()
+ {
+ return $this->data;
+ }
+
+ /**
+ * Get the cookie name
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->data['Name'];
+ }
+
+ /**
+ * Set the cookie name
+ *
+ * @param string $name Cookie name
+ */
+ public function setName($name)
+ {
+ $this->data['Name'] = $name;
+ }
+
+ /**
+ * Get the cookie value
+ *
+ * @return string
+ */
+ public function getValue()
+ {
+ return $this->data['Value'];
+ }
+
+ /**
+ * Set the cookie value
+ *
+ * @param string $value Cookie value
+ */
+ public function setValue($value)
+ {
+ $this->data['Value'] = $value;
+ }
+
+ /**
+ * Get the domain
+ *
+ * @return string|null
+ */
+ public function getDomain()
+ {
+ return $this->data['Domain'];
+ }
+
+ /**
+ * Set the domain of the cookie
+ *
+ * @param string $domain
+ */
+ public function setDomain($domain)
+ {
+ $this->data['Domain'] = $domain;
+ }
+
+ /**
+ * Get the path
+ *
+ * @return string
+ */
+ public function getPath()
+ {
+ return $this->data['Path'];
+ }
+
+ /**
+ * Set the path of the cookie
+ *
+ * @param string $path Path of the cookie
+ */
+ public function setPath($path)
+ {
+ $this->data['Path'] = $path;
+ }
+
+ /**
+ * Maximum lifetime of the cookie in seconds
+ *
+ * @return int|null
+ */
+ public function getMaxAge()
+ {
+ return $this->data['Max-Age'];
+ }
+
+ /**
+ * Set the max-age of the cookie
+ *
+ * @param int $maxAge Max age of the cookie in seconds
+ */
+ public function setMaxAge($maxAge)
+ {
+ $this->data['Max-Age'] = $maxAge;
+ }
+
+ /**
+ * The UNIX timestamp when the cookie Expires
+ *
+ * @return mixed
+ */
+ public function getExpires()
+ {
+ return $this->data['Expires'];
+ }
+
+ /**
+ * Set the unix timestamp for which the cookie will expire
+ *
+ * @param int $timestamp Unix timestamp
+ */
+ public function setExpires($timestamp)
+ {
+ $this->data['Expires'] = is_numeric($timestamp)
+ ? (int) $timestamp
+ : strtotime($timestamp);
+ }
+
+ /**
+ * Get whether or not this is a secure cookie
+ *
+ * @return null|bool
+ */
+ public function getSecure()
+ {
+ return $this->data['Secure'];
+ }
+
+ /**
+ * Set whether or not the cookie is secure
+ *
+ * @param bool $secure Set to true or false if secure
+ */
+ public function setSecure($secure)
+ {
+ $this->data['Secure'] = $secure;
+ }
+
+ /**
+ * Get whether or not this is a session cookie
+ *
+ * @return null|bool
+ */
+ public function getDiscard()
+ {
+ return $this->data['Discard'];
+ }
+
+ /**
+ * Set whether or not this is a session cookie
+ *
+ * @param bool $discard Set to true or false if this is a session cookie
+ */
+ public function setDiscard($discard)
+ {
+ $this->data['Discard'] = $discard;
+ }
+
+ /**
+ * Get whether or not this is an HTTP only cookie
+ *
+ * @return bool
+ */
+ public function getHttpOnly()
+ {
+ return $this->data['HttpOnly'];
+ }
+
+ /**
+ * Set whether or not this is an HTTP only cookie
+ *
+ * @param bool $httpOnly Set to true or false if this is HTTP only
+ */
+ public function setHttpOnly($httpOnly)
+ {
+ $this->data['HttpOnly'] = $httpOnly;
+ }
+
+ /**
+ * Check if the cookie matches a path value.
+ *
+ * A request-path path-matches a given cookie-path if at least one of
+ * the following conditions holds:
+ *
+ * - The cookie-path and the request-path are identical.
+ * - The cookie-path is a prefix of the request-path, and the last
+ * character of the cookie-path is %x2F ("/").
+ * - The cookie-path is a prefix of the request-path, and the first
+ * character of the request-path that is not included in the cookie-
+ * path is a %x2F ("/") character.
+ *
+ * @param string $requestPath Path to check against
+ *
+ * @return bool
+ */
+ public function matchesPath($requestPath)
+ {
+ $cookiePath = $this->getPath();
+
+ // Match on exact matches or when path is the default empty "/"
+ if ($cookiePath === '/' || $cookiePath == $requestPath) {
+ return true;
+ }
+
+ // Ensure that the cookie-path is a prefix of the request path.
+ if (0 !== strpos($requestPath, $cookiePath)) {
+ return false;
+ }
+
+ // Match if the last character of the cookie-path is "/"
+ if (substr($cookiePath, -1, 1) === '/') {
+ return true;
+ }
+
+ // Match if the first character not included in cookie path is "/"
+ return substr($requestPath, strlen($cookiePath), 1) === '/';
+ }
+
+ /**
+ * Check if the cookie matches a domain value
+ *
+ * @param string $domain Domain to check against
+ *
+ * @return bool
+ */
+ public function matchesDomain($domain)
+ {
+ // Remove the leading '.' as per spec in RFC 6265.
+ // http://tools.ietf.org/html/rfc6265#section-5.2.3
+ $cookieDomain = ltrim($this->getDomain(), '.');
+
+ // Domain not set or exact match.
+ if (!$cookieDomain || !strcasecmp($domain, $cookieDomain)) {
+ return true;
+ }
+
+ // Matching the subdomain according to RFC 6265.
+ // http://tools.ietf.org/html/rfc6265#section-5.1.3
+ if (filter_var($domain, FILTER_VALIDATE_IP)) {
+ return false;
+ }
+
+ return (bool) preg_match('/\.' . preg_quote($cookieDomain, '/') . '$/', $domain);
+ }
+
+ /**
+ * Check if the cookie is expired
+ *
+ * @return bool
+ */
+ public function isExpired()
+ {
+ return $this->getExpires() !== null && time() > $this->getExpires();
+ }
+
+ /**
+ * Check if the cookie is valid according to RFC 6265
+ *
+ * @return bool|string Returns true if valid or an error message if invalid
+ */
+ public function validate()
+ {
+ // Names must not be empty, but can be 0
+ $name = $this->getName();
+ if (empty($name) && !is_numeric($name)) {
+ return 'The cookie name must not be empty';
+ }
+
+ // Check if any of the invalid characters are present in the cookie name
+ if (preg_match(
+ '/[\x00-\x20\x22\x28-\x29\x2c\x2f\x3a-\x40\x5c\x7b\x7d\x7f]/',
+ $name
+ )) {
+ return 'Cookie name must not contain invalid characters: ASCII '
+ . 'Control characters (0-31;127), space, tab and the '
+ . 'following characters: ()<>@,;:\"/?={}';
+ }
+
+ // Value must not be empty, but can be 0
+ $value = $this->getValue();
+ if (empty($value) && !is_numeric($value)) {
+ return 'The cookie value must not be empty';
+ }
+
+ // Domains must not be empty, but can be 0
+ // A "0" is not a valid internet domain, but may be used as server name
+ // in a private network.
+ $domain = $this->getDomain();
+ if (empty($domain) && !is_numeric($domain)) {
+ return 'The cookie domain must not be empty';
+ }
+
+ return true;
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php b/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php
new file mode 100644
index 0000000000..427d896fb2
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php
@@ -0,0 +1,27 @@
+getStatusCode()
+ : 0;
+ parent::__construct($message, $code, $previous);
+ $this->request = $request;
+ $this->response = $response;
+ $this->handlerContext = $handlerContext;
+ }
+
+ /**
+ * Wrap non-RequestExceptions with a RequestException
+ *
+ * @param RequestInterface $request
+ * @param \Exception $e
+ *
+ * @return RequestException
+ */
+ public static function wrapException(RequestInterface $request, \Exception $e)
+ {
+ return $e instanceof RequestException
+ ? $e
+ : new RequestException($e->getMessage(), $request, null, $e);
+ }
+
+ /**
+ * Factory method to create a new exception with a normalized error message
+ *
+ * @param RequestInterface $request Request
+ * @param ResponseInterface $response Response received
+ * @param \Exception $previous Previous exception
+ * @param array $ctx Optional handler context.
+ *
+ * @return self
+ */
+ public static function create(
+ RequestInterface $request,
+ ResponseInterface $response = null,
+ \Exception $previous = null,
+ array $ctx = []
+ ) {
+ if (!$response) {
+ return new self(
+ 'Error completing request',
+ $request,
+ null,
+ $previous,
+ $ctx
+ );
+ }
+
+ $level = (int) floor($response->getStatusCode() / 100);
+ if ($level === 4) {
+ $label = 'Client error';
+ $className = ClientException::class;
+ } elseif ($level === 5) {
+ $label = 'Server error';
+ $className = ServerException::class;
+ } else {
+ $label = 'Unsuccessful request';
+ $className = __CLASS__;
+ }
+
+ $uri = $request->getUri();
+ $uri = static::obfuscateUri($uri);
+
+ // Client Error: `GET /` resulted in a `404 Not Found` response:
+ // ... (truncated)
+ $message = sprintf(
+ '%s: `%s %s` resulted in a `%s %s` response',
+ $label,
+ $request->getMethod(),
+ $uri,
+ $response->getStatusCode(),
+ $response->getReasonPhrase()
+ );
+
+ $summary = static::getResponseBodySummary($response);
+
+ if ($summary !== null) {
+ $message .= ":\n{$summary}\n";
+ }
+
+ return new $className($message, $request, $response, $previous, $ctx);
+ }
+
+ /**
+ * Get a short summary of the response
+ *
+ * Will return `null` if the response is not printable.
+ *
+ * @param ResponseInterface $response
+ *
+ * @return string|null
+ */
+ public static function getResponseBodySummary(ResponseInterface $response)
+ {
+ $body = $response->getBody();
+
+ if (!$body->isSeekable()) {
+ return null;
+ }
+
+ $size = $body->getSize();
+
+ if ($size === 0) {
+ return null;
+ }
+
+ $summary = $body->read(120);
+ $body->rewind();
+
+ if ($size > 120) {
+ $summary .= ' (truncated...)';
+ }
+
+ // Matches any printable character, including unicode characters:
+ // letters, marks, numbers, punctuation, spacing, and separators.
+ if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/', $summary)) {
+ return null;
+ }
+
+ return $summary;
+ }
+
+ /**
+ * Obfuscates URI if there is an username and a password present
+ *
+ * @param UriInterface $uri
+ *
+ * @return UriInterface
+ */
+ private static function obfuscateUri($uri)
+ {
+ $userInfo = $uri->getUserInfo();
+
+ if (false !== ($pos = strpos($userInfo, ':'))) {
+ return $uri->withUserInfo(substr($userInfo, 0, $pos), '***');
+ }
+
+ return $uri;
+ }
+
+ /**
+ * Get the request that caused the exception
+ *
+ * @return RequestInterface
+ */
+ public function getRequest()
+ {
+ return $this->request;
+ }
+
+ /**
+ * Get the associated response
+ *
+ * @return ResponseInterface|null
+ */
+ public function getResponse()
+ {
+ return $this->response;
+ }
+
+ /**
+ * Check if a response was received
+ *
+ * @return bool
+ */
+ public function hasResponse()
+ {
+ return $this->response !== null;
+ }
+
+ /**
+ * Get contextual information about the error from the underlying handler.
+ *
+ * The contents of this array will vary depending on which handler you are
+ * using. It may also be just an empty array. Relying on this data will
+ * couple you to a specific handler, but can give more debug information
+ * when needed.
+ *
+ * @return array
+ */
+ public function getHandlerContext()
+ {
+ return $this->handlerContext;
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php b/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php
new file mode 100644
index 0000000000..a77c28926c
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php
@@ -0,0 +1,27 @@
+stream = $stream;
+ $msg = $msg ?: 'Could not seek the stream to position ' . $pos;
+ parent::__construct($msg);
+ }
+
+ /**
+ * @return StreamInterface
+ */
+ public function getStream()
+ {
+ return $this->stream;
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php b/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php
new file mode 100644
index 0000000000..7cdd340866
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php
@@ -0,0 +1,7 @@
+maxHandles = $maxHandles;
+ }
+
+ public function create(RequestInterface $request, array $options)
+ {
+ if (isset($options['curl']['body_as_string'])) {
+ $options['_body_as_string'] = $options['curl']['body_as_string'];
+ unset($options['curl']['body_as_string']);
+ }
+
+ $easy = new EasyHandle;
+ $easy->request = $request;
+ $easy->options = $options;
+ $conf = $this->getDefaultConf($easy);
+ $this->applyMethod($easy, $conf);
+ $this->applyHandlerOptions($easy, $conf);
+ $this->applyHeaders($easy, $conf);
+ unset($conf['_headers']);
+
+ // Add handler options from the request configuration options
+ if (isset($options['curl'])) {
+ $conf = array_replace($conf, $options['curl']);
+ }
+
+ $conf[CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy);
+ $easy->handle = $this->handles
+ ? array_pop($this->handles)
+ : curl_init();
+ curl_setopt_array($easy->handle, $conf);
+
+ return $easy;
+ }
+
+ public function release(EasyHandle $easy)
+ {
+ $resource = $easy->handle;
+ unset($easy->handle);
+
+ if (count($this->handles) >= $this->maxHandles) {
+ curl_close($resource);
+ } else {
+ // Remove all callback functions as they can hold onto references
+ // and are not cleaned up by curl_reset. Using curl_setopt_array
+ // does not work for some reason, so removing each one
+ // individually.
+ curl_setopt($resource, CURLOPT_HEADERFUNCTION, null);
+ curl_setopt($resource, CURLOPT_READFUNCTION, null);
+ curl_setopt($resource, CURLOPT_WRITEFUNCTION, null);
+ curl_setopt($resource, CURLOPT_PROGRESSFUNCTION, null);
+ curl_reset($resource);
+ $this->handles[] = $resource;
+ }
+ }
+
+ /**
+ * Completes a cURL transaction, either returning a response promise or a
+ * rejected promise.
+ *
+ * @param callable $handler
+ * @param EasyHandle $easy
+ * @param CurlFactoryInterface $factory Dictates how the handle is released
+ *
+ * @return \GuzzleHttp\Promise\PromiseInterface
+ */
+ public static function finish(
+ callable $handler,
+ EasyHandle $easy,
+ CurlFactoryInterface $factory
+ ) {
+ if (isset($easy->options['on_stats'])) {
+ self::invokeStats($easy);
+ }
+
+ if (!$easy->response || $easy->errno) {
+ return self::finishError($handler, $easy, $factory);
+ }
+
+ // Return the response if it is present and there is no error.
+ $factory->release($easy);
+
+ // Rewind the body of the response if possible.
+ $body = $easy->response->getBody();
+ if ($body->isSeekable()) {
+ $body->rewind();
+ }
+
+ return new FulfilledPromise($easy->response);
+ }
+
+ private static function invokeStats(EasyHandle $easy)
+ {
+ $curlStats = curl_getinfo($easy->handle);
+ $stats = new TransferStats(
+ $easy->request,
+ $easy->response,
+ $curlStats['total_time'],
+ $easy->errno,
+ $curlStats
+ );
+ call_user_func($easy->options['on_stats'], $stats);
+ }
+
+ private static function finishError(
+ callable $handler,
+ EasyHandle $easy,
+ CurlFactoryInterface $factory
+ ) {
+ // Get error information and release the handle to the factory.
+ $ctx = [
+ 'errno' => $easy->errno,
+ 'error' => curl_error($easy->handle),
+ ] + curl_getinfo($easy->handle);
+ $factory->release($easy);
+
+ // Retry when nothing is present or when curl failed to rewind.
+ if (empty($easy->options['_err_message'])
+ && (!$easy->errno || $easy->errno == 65)
+ ) {
+ return self::retryFailedRewind($handler, $easy, $ctx);
+ }
+
+ return self::createRejection($easy, $ctx);
+ }
+
+ private static function createRejection(EasyHandle $easy, array $ctx)
+ {
+ static $connectionErrors = [
+ CURLE_OPERATION_TIMEOUTED => true,
+ CURLE_COULDNT_RESOLVE_HOST => true,
+ CURLE_COULDNT_CONNECT => true,
+ CURLE_SSL_CONNECT_ERROR => true,
+ CURLE_GOT_NOTHING => true,
+ ];
+
+ // If an exception was encountered during the onHeaders event, then
+ // return a rejected promise that wraps that exception.
+ if ($easy->onHeadersException) {
+ return \GuzzleHttp\Promise\rejection_for(
+ new RequestException(
+ 'An error was encountered during the on_headers event',
+ $easy->request,
+ $easy->response,
+ $easy->onHeadersException,
+ $ctx
+ )
+ );
+ }
+
+ $message = sprintf(
+ 'cURL error %s: %s (%s)',
+ $ctx['errno'],
+ $ctx['error'],
+ 'see http://curl.haxx.se/libcurl/c/libcurl-errors.html'
+ );
+
+ // Create a connection exception if it was a specific error code.
+ $error = isset($connectionErrors[$easy->errno])
+ ? new ConnectException($message, $easy->request, null, $ctx)
+ : new RequestException($message, $easy->request, $easy->response, null, $ctx);
+
+ return \GuzzleHttp\Promise\rejection_for($error);
+ }
+
+ private function getDefaultConf(EasyHandle $easy)
+ {
+ $conf = [
+ '_headers' => $easy->request->getHeaders(),
+ CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(),
+ CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''),
+ CURLOPT_RETURNTRANSFER => false,
+ CURLOPT_HEADER => false,
+ CURLOPT_CONNECTTIMEOUT => 150,
+ ];
+
+ if (defined('CURLOPT_PROTOCOLS')) {
+ $conf[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS;
+ }
+
+ $version = $easy->request->getProtocolVersion();
+ if ($version == 1.1) {
+ $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_1;
+ } elseif ($version == 2.0) {
+ $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_2_0;
+ } else {
+ $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_0;
+ }
+
+ return $conf;
+ }
+
+ private function applyMethod(EasyHandle $easy, array &$conf)
+ {
+ $body = $easy->request->getBody();
+ $size = $body->getSize();
+
+ if ($size === null || $size > 0) {
+ $this->applyBody($easy->request, $easy->options, $conf);
+ return;
+ }
+
+ $method = $easy->request->getMethod();
+ if ($method === 'PUT' || $method === 'POST') {
+ // See http://tools.ietf.org/html/rfc7230#section-3.3.2
+ if (!$easy->request->hasHeader('Content-Length')) {
+ $conf[CURLOPT_HTTPHEADER][] = 'Content-Length: 0';
+ }
+ } elseif ($method === 'HEAD') {
+ $conf[CURLOPT_NOBODY] = true;
+ unset(
+ $conf[CURLOPT_WRITEFUNCTION],
+ $conf[CURLOPT_READFUNCTION],
+ $conf[CURLOPT_FILE],
+ $conf[CURLOPT_INFILE]
+ );
+ }
+ }
+
+ private function applyBody(RequestInterface $request, array $options, array &$conf)
+ {
+ $size = $request->hasHeader('Content-Length')
+ ? (int) $request->getHeaderLine('Content-Length')
+ : null;
+
+ // Send the body as a string if the size is less than 1MB OR if the
+ // [curl][body_as_string] request value is set.
+ if (($size !== null && $size < 1000000) ||
+ !empty($options['_body_as_string'])
+ ) {
+ $conf[CURLOPT_POSTFIELDS] = (string) $request->getBody();
+ // Don't duplicate the Content-Length header
+ $this->removeHeader('Content-Length', $conf);
+ $this->removeHeader('Transfer-Encoding', $conf);
+ } else {
+ $conf[CURLOPT_UPLOAD] = true;
+ if ($size !== null) {
+ $conf[CURLOPT_INFILESIZE] = $size;
+ $this->removeHeader('Content-Length', $conf);
+ }
+ $body = $request->getBody();
+ if ($body->isSeekable()) {
+ $body->rewind();
+ }
+ $conf[CURLOPT_READFUNCTION] = function ($ch, $fd, $length) use ($body) {
+ return $body->read($length);
+ };
+ }
+
+ // If the Expect header is not present, prevent curl from adding it
+ if (!$request->hasHeader('Expect')) {
+ $conf[CURLOPT_HTTPHEADER][] = 'Expect:';
+ }
+
+ // cURL sometimes adds a content-type by default. Prevent this.
+ if (!$request->hasHeader('Content-Type')) {
+ $conf[CURLOPT_HTTPHEADER][] = 'Content-Type:';
+ }
+ }
+
+ private function applyHeaders(EasyHandle $easy, array &$conf)
+ {
+ foreach ($conf['_headers'] as $name => $values) {
+ foreach ($values as $value) {
+ $value = (string) $value;
+ if ($value === '') {
+ // cURL requires a special format for empty headers.
+ // See https://github.com/guzzle/guzzle/issues/1882 for more details.
+ $conf[CURLOPT_HTTPHEADER][] = "$name;";
+ } else {
+ $conf[CURLOPT_HTTPHEADER][] = "$name: $value";
+ }
+ }
+ }
+
+ // Remove the Accept header if one was not set
+ if (!$easy->request->hasHeader('Accept')) {
+ $conf[CURLOPT_HTTPHEADER][] = 'Accept:';
+ }
+ }
+
+ /**
+ * Remove a header from the options array.
+ *
+ * @param string $name Case-insensitive header to remove
+ * @param array $options Array of options to modify
+ */
+ private function removeHeader($name, array &$options)
+ {
+ foreach (array_keys($options['_headers']) as $key) {
+ if (!strcasecmp($key, $name)) {
+ unset($options['_headers'][$key]);
+ return;
+ }
+ }
+ }
+
+ private function applyHandlerOptions(EasyHandle $easy, array &$conf)
+ {
+ $options = $easy->options;
+ if (isset($options['verify'])) {
+ if ($options['verify'] === false) {
+ unset($conf[CURLOPT_CAINFO]);
+ $conf[CURLOPT_SSL_VERIFYHOST] = 0;
+ $conf[CURLOPT_SSL_VERIFYPEER] = false;
+ } else {
+ $conf[CURLOPT_SSL_VERIFYHOST] = 2;
+ $conf[CURLOPT_SSL_VERIFYPEER] = true;
+ if (is_string($options['verify'])) {
+ // Throw an error if the file/folder/link path is not valid or doesn't exist.
+ if (!file_exists($options['verify'])) {
+ throw new \InvalidArgumentException(
+ "SSL CA bundle not found: {$options['verify']}"
+ );
+ }
+ // If it's a directory or a link to a directory use CURLOPT_CAPATH.
+ // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO.
+ if (is_dir($options['verify']) ||
+ (is_link($options['verify']) && is_dir(readlink($options['verify'])))) {
+ $conf[CURLOPT_CAPATH] = $options['verify'];
+ } else {
+ $conf[CURLOPT_CAINFO] = $options['verify'];
+ }
+ }
+ }
+ }
+
+ if (!empty($options['decode_content'])) {
+ $accept = $easy->request->getHeaderLine('Accept-Encoding');
+ if ($accept) {
+ $conf[CURLOPT_ENCODING] = $accept;
+ } else {
+ $conf[CURLOPT_ENCODING] = '';
+ // Don't let curl send the header over the wire
+ $conf[CURLOPT_HTTPHEADER][] = 'Accept-Encoding:';
+ }
+ }
+
+ if (isset($options['sink'])) {
+ $sink = $options['sink'];
+ if (!is_string($sink)) {
+ $sink = \GuzzleHttp\Psr7\stream_for($sink);
+ } elseif (!is_dir(dirname($sink))) {
+ // Ensure that the directory exists before failing in curl.
+ throw new \RuntimeException(sprintf(
+ 'Directory %s does not exist for sink value of %s',
+ dirname($sink),
+ $sink
+ ));
+ } else {
+ $sink = new LazyOpenStream($sink, 'w+');
+ }
+ $easy->sink = $sink;
+ $conf[CURLOPT_WRITEFUNCTION] = function ($ch, $write) use ($sink) {
+ return $sink->write($write);
+ };
+ } else {
+ // Use a default temp stream if no sink was set.
+ $conf[CURLOPT_FILE] = fopen('php://temp', 'w+');
+ $easy->sink = Psr7\stream_for($conf[CURLOPT_FILE]);
+ }
+ $timeoutRequiresNoSignal = false;
+ if (isset($options['timeout'])) {
+ $timeoutRequiresNoSignal |= $options['timeout'] < 1;
+ $conf[CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000;
+ }
+
+ // CURL default value is CURL_IPRESOLVE_WHATEVER
+ if (isset($options['force_ip_resolve'])) {
+ if ('v4' === $options['force_ip_resolve']) {
+ $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4;
+ } elseif ('v6' === $options['force_ip_resolve']) {
+ $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V6;
+ }
+ }
+
+ if (isset($options['connect_timeout'])) {
+ $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1;
+ $conf[CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000;
+ }
+
+ if ($timeoutRequiresNoSignal && strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') {
+ $conf[CURLOPT_NOSIGNAL] = true;
+ }
+
+ if (isset($options['proxy'])) {
+ if (!is_array($options['proxy'])) {
+ $conf[CURLOPT_PROXY] = $options['proxy'];
+ } else {
+ $scheme = $easy->request->getUri()->getScheme();
+ if (isset($options['proxy'][$scheme])) {
+ $host = $easy->request->getUri()->getHost();
+ if (!isset($options['proxy']['no']) ||
+ !\GuzzleHttp\is_host_in_noproxy($host, $options['proxy']['no'])
+ ) {
+ $conf[CURLOPT_PROXY] = $options['proxy'][$scheme];
+ }
+ }
+ }
+ }
+
+ if (isset($options['cert'])) {
+ $cert = $options['cert'];
+ if (is_array($cert)) {
+ $conf[CURLOPT_SSLCERTPASSWD] = $cert[1];
+ $cert = $cert[0];
+ }
+ if (!file_exists($cert)) {
+ throw new \InvalidArgumentException(
+ "SSL certificate not found: {$cert}"
+ );
+ }
+ $conf[CURLOPT_SSLCERT] = $cert;
+ }
+
+ if (isset($options['ssl_key'])) {
+ $sslKey = $options['ssl_key'];
+ if (is_array($sslKey)) {
+ $conf[CURLOPT_SSLKEYPASSWD] = $sslKey[1];
+ $sslKey = $sslKey[0];
+ }
+ if (!file_exists($sslKey)) {
+ throw new \InvalidArgumentException(
+ "SSL private key not found: {$sslKey}"
+ );
+ }
+ $conf[CURLOPT_SSLKEY] = $sslKey;
+ }
+
+ if (isset($options['progress'])) {
+ $progress = $options['progress'];
+ if (!is_callable($progress)) {
+ throw new \InvalidArgumentException(
+ 'progress client option must be callable'
+ );
+ }
+ $conf[CURLOPT_NOPROGRESS] = false;
+ $conf[CURLOPT_PROGRESSFUNCTION] = function () use ($progress) {
+ $args = func_get_args();
+ // PHP 5.5 pushed the handle onto the start of the args
+ if (is_resource($args[0])) {
+ array_shift($args);
+ }
+ call_user_func_array($progress, $args);
+ };
+ }
+
+ if (!empty($options['debug'])) {
+ $conf[CURLOPT_STDERR] = \GuzzleHttp\debug_resource($options['debug']);
+ $conf[CURLOPT_VERBOSE] = true;
+ }
+ }
+
+ /**
+ * This function ensures that a response was set on a transaction. If one
+ * was not set, then the request is retried if possible. This error
+ * typically means you are sending a payload, curl encountered a
+ * "Connection died, retrying a fresh connect" error, tried to rewind the
+ * stream, and then encountered a "necessary data rewind wasn't possible"
+ * error, causing the request to be sent through curl_multi_info_read()
+ * without an error status.
+ */
+ private static function retryFailedRewind(
+ callable $handler,
+ EasyHandle $easy,
+ array $ctx
+ ) {
+ try {
+ // Only rewind if the body has been read from.
+ $body = $easy->request->getBody();
+ if ($body->tell() > 0) {
+ $body->rewind();
+ }
+ } catch (\RuntimeException $e) {
+ $ctx['error'] = 'The connection unexpectedly failed without '
+ . 'providing an error. The request would have been retried, '
+ . 'but attempting to rewind the request body failed. '
+ . 'Exception: ' . $e;
+ return self::createRejection($easy, $ctx);
+ }
+
+ // Retry no more than 3 times before giving up.
+ if (!isset($easy->options['_curl_retries'])) {
+ $easy->options['_curl_retries'] = 1;
+ } elseif ($easy->options['_curl_retries'] == 2) {
+ $ctx['error'] = 'The cURL request was retried 3 times '
+ . 'and did not succeed. The most likely reason for the failure '
+ . 'is that cURL was unable to rewind the body of the request '
+ . 'and subsequent retries resulted in the same error. Turn on '
+ . 'the debug option to see what went wrong. See '
+ . 'https://bugs.php.net/bug.php?id=47204 for more information.';
+ return self::createRejection($easy, $ctx);
+ } else {
+ $easy->options['_curl_retries']++;
+ }
+
+ return $handler($easy->request, $easy->options);
+ }
+
+ private function createHeaderFn(EasyHandle $easy)
+ {
+ if (isset($easy->options['on_headers'])) {
+ $onHeaders = $easy->options['on_headers'];
+
+ if (!is_callable($onHeaders)) {
+ throw new \InvalidArgumentException('on_headers must be callable');
+ }
+ } else {
+ $onHeaders = null;
+ }
+
+ return function ($ch, $h) use (
+ $onHeaders,
+ $easy,
+ &$startingResponse
+ ) {
+ $value = trim($h);
+ if ($value === '') {
+ $startingResponse = true;
+ $easy->createResponse();
+ if ($onHeaders !== null) {
+ try {
+ $onHeaders($easy->response);
+ } catch (\Exception $e) {
+ // Associate the exception with the handle and trigger
+ // a curl header write error by returning 0.
+ $easy->onHeadersException = $e;
+ return -1;
+ }
+ }
+ } elseif ($startingResponse) {
+ $startingResponse = false;
+ $easy->headers = [$value];
+ } else {
+ $easy->headers[] = $value;
+ }
+ return strlen($h);
+ };
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php b/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php
new file mode 100644
index 0000000000..b0fc236850
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php
@@ -0,0 +1,27 @@
+factory = isset($options['handle_factory'])
+ ? $options['handle_factory']
+ : new CurlFactory(3);
+ }
+
+ public function __invoke(RequestInterface $request, array $options)
+ {
+ if (isset($options['delay'])) {
+ usleep($options['delay'] * 1000);
+ }
+
+ $easy = $this->factory->create($request, $options);
+ curl_exec($easy->handle);
+ $easy->errno = curl_errno($easy->handle);
+
+ return CurlFactory::finish($this, $easy, $this->factory);
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php
new file mode 100644
index 0000000000..2754d8e437
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php
@@ -0,0 +1,199 @@
+factory = isset($options['handle_factory'])
+ ? $options['handle_factory'] : new CurlFactory(50);
+ $this->selectTimeout = isset($options['select_timeout'])
+ ? $options['select_timeout'] : 1;
+ }
+
+ public function __get($name)
+ {
+ if ($name === '_mh') {
+ return $this->_mh = curl_multi_init();
+ }
+
+ throw new \BadMethodCallException();
+ }
+
+ public function __destruct()
+ {
+ if (isset($this->_mh)) {
+ curl_multi_close($this->_mh);
+ unset($this->_mh);
+ }
+ }
+
+ public function __invoke(RequestInterface $request, array $options)
+ {
+ $easy = $this->factory->create($request, $options);
+ $id = (int) $easy->handle;
+
+ $promise = new Promise(
+ [$this, 'execute'],
+ function () use ($id) {
+ return $this->cancel($id);
+ }
+ );
+
+ $this->addRequest(['easy' => $easy, 'deferred' => $promise]);
+
+ return $promise;
+ }
+
+ /**
+ * Ticks the curl event loop.
+ */
+ public function tick()
+ {
+ // Add any delayed handles if needed.
+ if ($this->delays) {
+ $currentTime = microtime(true);
+ foreach ($this->delays as $id => $delay) {
+ if ($currentTime >= $delay) {
+ unset($this->delays[$id]);
+ curl_multi_add_handle(
+ $this->_mh,
+ $this->handles[$id]['easy']->handle
+ );
+ }
+ }
+ }
+
+ // Step through the task queue which may add additional requests.
+ P\queue()->run();
+
+ if ($this->active &&
+ curl_multi_select($this->_mh, $this->selectTimeout) === -1
+ ) {
+ // Perform a usleep if a select returns -1.
+ // See: https://bugs.php.net/bug.php?id=61141
+ usleep(250);
+ }
+
+ while (curl_multi_exec($this->_mh, $this->active) === CURLM_CALL_MULTI_PERFORM);
+
+ $this->processMessages();
+ }
+
+ /**
+ * Runs until all outstanding connections have completed.
+ */
+ public function execute()
+ {
+ $queue = P\queue();
+
+ while ($this->handles || !$queue->isEmpty()) {
+ // If there are no transfers, then sleep for the next delay
+ if (!$this->active && $this->delays) {
+ usleep($this->timeToNext());
+ }
+ $this->tick();
+ }
+ }
+
+ private function addRequest(array $entry)
+ {
+ $easy = $entry['easy'];
+ $id = (int) $easy->handle;
+ $this->handles[$id] = $entry;
+ if (empty($easy->options['delay'])) {
+ curl_multi_add_handle($this->_mh, $easy->handle);
+ } else {
+ $this->delays[$id] = microtime(true) + ($easy->options['delay'] / 1000);
+ }
+ }
+
+ /**
+ * Cancels a handle from sending and removes references to it.
+ *
+ * @param int $id Handle ID to cancel and remove.
+ *
+ * @return bool True on success, false on failure.
+ */
+ private function cancel($id)
+ {
+ // Cannot cancel if it has been processed.
+ if (!isset($this->handles[$id])) {
+ return false;
+ }
+
+ $handle = $this->handles[$id]['easy']->handle;
+ unset($this->delays[$id], $this->handles[$id]);
+ curl_multi_remove_handle($this->_mh, $handle);
+ curl_close($handle);
+
+ return true;
+ }
+
+ private function processMessages()
+ {
+ while ($done = curl_multi_info_read($this->_mh)) {
+ $id = (int) $done['handle'];
+ curl_multi_remove_handle($this->_mh, $done['handle']);
+
+ if (!isset($this->handles[$id])) {
+ // Probably was cancelled.
+ continue;
+ }
+
+ $entry = $this->handles[$id];
+ unset($this->handles[$id], $this->delays[$id]);
+ $entry['easy']->errno = $done['result'];
+ $entry['deferred']->resolve(
+ CurlFactory::finish(
+ $this,
+ $entry['easy'],
+ $this->factory
+ )
+ );
+ }
+ }
+
+ private function timeToNext()
+ {
+ $currentTime = microtime(true);
+ $nextTime = PHP_INT_MAX;
+ foreach ($this->delays as $time) {
+ if ($time < $nextTime) {
+ $nextTime = $time;
+ }
+ }
+
+ return max(0, $nextTime - $currentTime) * 1000000;
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php b/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php
new file mode 100644
index 0000000000..7754e9111b
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php
@@ -0,0 +1,92 @@
+headers)) {
+ throw new \RuntimeException('No headers have been received');
+ }
+
+ // HTTP-version SP status-code SP reason-phrase
+ $startLine = explode(' ', array_shift($this->headers), 3);
+ $headers = \GuzzleHttp\headers_from_lines($this->headers);
+ $normalizedKeys = \GuzzleHttp\normalize_header_keys($headers);
+
+ if (!empty($this->options['decode_content'])
+ && isset($normalizedKeys['content-encoding'])
+ ) {
+ $headers['x-encoded-content-encoding']
+ = $headers[$normalizedKeys['content-encoding']];
+ unset($headers[$normalizedKeys['content-encoding']]);
+ if (isset($normalizedKeys['content-length'])) {
+ $headers['x-encoded-content-length']
+ = $headers[$normalizedKeys['content-length']];
+
+ $bodyLength = (int) $this->sink->getSize();
+ if ($bodyLength) {
+ $headers[$normalizedKeys['content-length']] = $bodyLength;
+ } else {
+ unset($headers[$normalizedKeys['content-length']]);
+ }
+ }
+ }
+
+ // Attach a response to the easy handle with the parsed headers.
+ $this->response = new Response(
+ $startLine[1],
+ $headers,
+ $this->sink,
+ substr($startLine[0], 5),
+ isset($startLine[2]) ? (string) $startLine[2] : null
+ );
+ }
+
+ public function __get($name)
+ {
+ $msg = $name === 'handle'
+ ? 'The EasyHandle has been released'
+ : 'Invalid property: ' . $name;
+ throw new \BadMethodCallException($msg);
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php
new file mode 100644
index 0000000000..d892061c7a
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php
@@ -0,0 +1,189 @@
+onFulfilled = $onFulfilled;
+ $this->onRejected = $onRejected;
+
+ if ($queue) {
+ call_user_func_array([$this, 'append'], $queue);
+ }
+ }
+
+ public function __invoke(RequestInterface $request, array $options)
+ {
+ if (!$this->queue) {
+ throw new \OutOfBoundsException('Mock queue is empty');
+ }
+
+ if (isset($options['delay'])) {
+ usleep($options['delay'] * 1000);
+ }
+
+ $this->lastRequest = $request;
+ $this->lastOptions = $options;
+ $response = array_shift($this->queue);
+
+ if (isset($options['on_headers'])) {
+ if (!is_callable($options['on_headers'])) {
+ throw new \InvalidArgumentException('on_headers must be callable');
+ }
+ try {
+ $options['on_headers']($response);
+ } catch (\Exception $e) {
+ $msg = 'An error was encountered during the on_headers event';
+ $response = new RequestException($msg, $request, $response, $e);
+ }
+ }
+
+ if (is_callable($response)) {
+ $response = call_user_func($response, $request, $options);
+ }
+
+ $response = $response instanceof \Exception
+ ? \GuzzleHttp\Promise\rejection_for($response)
+ : \GuzzleHttp\Promise\promise_for($response);
+
+ return $response->then(
+ function ($value) use ($request, $options) {
+ $this->invokeStats($request, $options, $value);
+ if ($this->onFulfilled) {
+ call_user_func($this->onFulfilled, $value);
+ }
+ if (isset($options['sink'])) {
+ $contents = (string) $value->getBody();
+ $sink = $options['sink'];
+
+ if (is_resource($sink)) {
+ fwrite($sink, $contents);
+ } elseif (is_string($sink)) {
+ file_put_contents($sink, $contents);
+ } elseif ($sink instanceof \Psr\Http\Message\StreamInterface) {
+ $sink->write($contents);
+ }
+ }
+
+ return $value;
+ },
+ function ($reason) use ($request, $options) {
+ $this->invokeStats($request, $options, null, $reason);
+ if ($this->onRejected) {
+ call_user_func($this->onRejected, $reason);
+ }
+ return \GuzzleHttp\Promise\rejection_for($reason);
+ }
+ );
+ }
+
+ /**
+ * Adds one or more variadic requests, exceptions, callables, or promises
+ * to the queue.
+ */
+ public function append()
+ {
+ foreach (func_get_args() as $value) {
+ if ($value instanceof ResponseInterface
+ || $value instanceof \Exception
+ || $value instanceof PromiseInterface
+ || is_callable($value)
+ ) {
+ $this->queue[] = $value;
+ } else {
+ throw new \InvalidArgumentException('Expected a response or '
+ . 'exception. Found ' . \GuzzleHttp\describe_type($value));
+ }
+ }
+ }
+
+ /**
+ * Get the last received request.
+ *
+ * @return RequestInterface
+ */
+ public function getLastRequest()
+ {
+ return $this->lastRequest;
+ }
+
+ /**
+ * Get the last received request options.
+ *
+ * @return array
+ */
+ public function getLastOptions()
+ {
+ return $this->lastOptions;
+ }
+
+ /**
+ * Returns the number of remaining items in the queue.
+ *
+ * @return int
+ */
+ public function count()
+ {
+ return count($this->queue);
+ }
+
+ private function invokeStats(
+ RequestInterface $request,
+ array $options,
+ ResponseInterface $response = null,
+ $reason = null
+ ) {
+ if (isset($options['on_stats'])) {
+ $stats = new TransferStats($request, $response, 0, $reason);
+ call_user_func($options['on_stats'], $stats);
+ }
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php b/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php
new file mode 100644
index 0000000000..f8b00be0b9
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php
@@ -0,0 +1,55 @@
+withoutHeader('Expect');
+
+ // Append a content-length header if body size is zero to match
+ // cURL's behavior.
+ if (0 === $request->getBody()->getSize()) {
+ $request = $request->withHeader('Content-Length', 0);
+ }
+
+ return $this->createResponse(
+ $request,
+ $options,
+ $this->createStream($request, $options),
+ $startTime
+ );
+ } catch (\InvalidArgumentException $e) {
+ throw $e;
+ } catch (\Exception $e) {
+ // Determine if the error was a networking error.
+ $message = $e->getMessage();
+ // This list can probably get more comprehensive.
+ if (strpos($message, 'getaddrinfo') // DNS lookup failed
+ || strpos($message, 'Connection refused')
+ || strpos($message, "couldn't connect to host") // error on HHVM
+ || strpos($message, "connection attempt failed")
+ ) {
+ $e = new ConnectException($e->getMessage(), $request, $e);
+ }
+ $e = RequestException::wrapException($request, $e);
+ $this->invokeStats($options, $request, $startTime, null, $e);
+
+ return \GuzzleHttp\Promise\rejection_for($e);
+ }
+ }
+
+ private function invokeStats(
+ array $options,
+ RequestInterface $request,
+ $startTime,
+ ResponseInterface $response = null,
+ $error = null
+ ) {
+ if (isset($options['on_stats'])) {
+ $stats = new TransferStats(
+ $request,
+ $response,
+ microtime(true) - $startTime,
+ $error,
+ []
+ );
+ call_user_func($options['on_stats'], $stats);
+ }
+ }
+
+ private function createResponse(
+ RequestInterface $request,
+ array $options,
+ $stream,
+ $startTime
+ ) {
+ $hdrs = $this->lastHeaders;
+ $this->lastHeaders = [];
+ $parts = explode(' ', array_shift($hdrs), 3);
+ $ver = explode('/', $parts[0])[1];
+ $status = $parts[1];
+ $reason = isset($parts[2]) ? $parts[2] : null;
+ $headers = \GuzzleHttp\headers_from_lines($hdrs);
+ list($stream, $headers) = $this->checkDecode($options, $headers, $stream);
+ $stream = Psr7\stream_for($stream);
+ $sink = $stream;
+
+ if (strcasecmp('HEAD', $request->getMethod())) {
+ $sink = $this->createSink($stream, $options);
+ }
+
+ $response = new Psr7\Response($status, $headers, $sink, $ver, $reason);
+
+ if (isset($options['on_headers'])) {
+ try {
+ $options['on_headers']($response);
+ } catch (\Exception $e) {
+ $msg = 'An error was encountered during the on_headers event';
+ $ex = new RequestException($msg, $request, $response, $e);
+ return \GuzzleHttp\Promise\rejection_for($ex);
+ }
+ }
+
+ // Do not drain when the request is a HEAD request because they have
+ // no body.
+ if ($sink !== $stream) {
+ $this->drain(
+ $stream,
+ $sink,
+ $response->getHeaderLine('Content-Length')
+ );
+ }
+
+ $this->invokeStats($options, $request, $startTime, $response, null);
+
+ return new FulfilledPromise($response);
+ }
+
+ private function createSink(StreamInterface $stream, array $options)
+ {
+ if (!empty($options['stream'])) {
+ return $stream;
+ }
+
+ $sink = isset($options['sink'])
+ ? $options['sink']
+ : fopen('php://temp', 'r+');
+
+ return is_string($sink)
+ ? new Psr7\LazyOpenStream($sink, 'w+')
+ : Psr7\stream_for($sink);
+ }
+
+ private function checkDecode(array $options, array $headers, $stream)
+ {
+ // Automatically decode responses when instructed.
+ if (!empty($options['decode_content'])) {
+ $normalizedKeys = \GuzzleHttp\normalize_header_keys($headers);
+ if (isset($normalizedKeys['content-encoding'])) {
+ $encoding = $headers[$normalizedKeys['content-encoding']];
+ if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') {
+ $stream = new Psr7\InflateStream(
+ Psr7\stream_for($stream)
+ );
+ $headers['x-encoded-content-encoding']
+ = $headers[$normalizedKeys['content-encoding']];
+ // Remove content-encoding header
+ unset($headers[$normalizedKeys['content-encoding']]);
+ // Fix content-length header
+ if (isset($normalizedKeys['content-length'])) {
+ $headers['x-encoded-content-length']
+ = $headers[$normalizedKeys['content-length']];
+
+ $length = (int) $stream->getSize();
+ if ($length === 0) {
+ unset($headers[$normalizedKeys['content-length']]);
+ } else {
+ $headers[$normalizedKeys['content-length']] = [$length];
+ }
+ }
+ }
+ }
+ }
+
+ return [$stream, $headers];
+ }
+
+ /**
+ * Drains the source stream into the "sink" client option.
+ *
+ * @param StreamInterface $source
+ * @param StreamInterface $sink
+ * @param string $contentLength Header specifying the amount of
+ * data to read.
+ *
+ * @return StreamInterface
+ * @throws \RuntimeException when the sink option is invalid.
+ */
+ private function drain(
+ StreamInterface $source,
+ StreamInterface $sink,
+ $contentLength
+ ) {
+ // If a content-length header is provided, then stop reading once
+ // that number of bytes has been read. This can prevent infinitely
+ // reading from a stream when dealing with servers that do not honor
+ // Connection: Close headers.
+ Psr7\copy_to_stream(
+ $source,
+ $sink,
+ (strlen($contentLength) > 0 && (int) $contentLength > 0) ? (int) $contentLength : -1
+ );
+
+ $sink->seek(0);
+ $source->close();
+
+ return $sink;
+ }
+
+ /**
+ * Create a resource and check to ensure it was created successfully
+ *
+ * @param callable $callback Callable that returns stream resource
+ *
+ * @return resource
+ * @throws \RuntimeException on error
+ */
+ private function createResource(callable $callback)
+ {
+ $errors = null;
+ set_error_handler(function ($_, $msg, $file, $line) use (&$errors) {
+ $errors[] = [
+ 'message' => $msg,
+ 'file' => $file,
+ 'line' => $line
+ ];
+ return true;
+ });
+
+ $resource = $callback();
+ restore_error_handler();
+
+ if (!$resource) {
+ $message = 'Error creating resource: ';
+ foreach ($errors as $err) {
+ foreach ($err as $key => $value) {
+ $message .= "[$key] $value" . PHP_EOL;
+ }
+ }
+ throw new \RuntimeException(trim($message));
+ }
+
+ return $resource;
+ }
+
+ private function createStream(RequestInterface $request, array $options)
+ {
+ static $methods;
+ if (!$methods) {
+ $methods = array_flip(get_class_methods(__CLASS__));
+ }
+
+ // HTTP/1.1 streams using the PHP stream wrapper require a
+ // Connection: close header
+ if ($request->getProtocolVersion() == '1.1'
+ && !$request->hasHeader('Connection')
+ ) {
+ $request = $request->withHeader('Connection', 'close');
+ }
+
+ // Ensure SSL is verified by default
+ if (!isset($options['verify'])) {
+ $options['verify'] = true;
+ }
+
+ $params = [];
+ $context = $this->getDefaultContext($request);
+
+ if (isset($options['on_headers']) && !is_callable($options['on_headers'])) {
+ throw new \InvalidArgumentException('on_headers must be callable');
+ }
+
+ if (!empty($options)) {
+ foreach ($options as $key => $value) {
+ $method = "add_{$key}";
+ if (isset($methods[$method])) {
+ $this->{$method}($request, $context, $value, $params);
+ }
+ }
+ }
+
+ if (isset($options['stream_context'])) {
+ if (!is_array($options['stream_context'])) {
+ throw new \InvalidArgumentException('stream_context must be an array');
+ }
+ $context = array_replace_recursive(
+ $context,
+ $options['stream_context']
+ );
+ }
+
+ // Microsoft NTLM authentication only supported with curl handler
+ if (isset($options['auth'])
+ && is_array($options['auth'])
+ && isset($options['auth'][2])
+ && 'ntlm' == $options['auth'][2]
+ ) {
+ throw new \InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler');
+ }
+
+ $uri = $this->resolveHost($request, $options);
+
+ $context = $this->createResource(
+ function () use ($context, $params) {
+ return stream_context_create($context, $params);
+ }
+ );
+
+ return $this->createResource(
+ function () use ($uri, &$http_response_header, $context, $options) {
+ $resource = fopen((string) $uri, 'r', null, $context);
+ $this->lastHeaders = $http_response_header;
+
+ if (isset($options['read_timeout'])) {
+ $readTimeout = $options['read_timeout'];
+ $sec = (int) $readTimeout;
+ $usec = ($readTimeout - $sec) * 100000;
+ stream_set_timeout($resource, $sec, $usec);
+ }
+
+ return $resource;
+ }
+ );
+ }
+
+ private function resolveHost(RequestInterface $request, array $options)
+ {
+ $uri = $request->getUri();
+
+ if (isset($options['force_ip_resolve']) && !filter_var($uri->getHost(), FILTER_VALIDATE_IP)) {
+ if ('v4' === $options['force_ip_resolve']) {
+ $records = dns_get_record($uri->getHost(), DNS_A);
+ if (!isset($records[0]['ip'])) {
+ throw new ConnectException(sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request);
+ }
+ $uri = $uri->withHost($records[0]['ip']);
+ } elseif ('v6' === $options['force_ip_resolve']) {
+ $records = dns_get_record($uri->getHost(), DNS_AAAA);
+ if (!isset($records[0]['ipv6'])) {
+ throw new ConnectException(sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request);
+ }
+ $uri = $uri->withHost('[' . $records[0]['ipv6'] . ']');
+ }
+ }
+
+ return $uri;
+ }
+
+ private function getDefaultContext(RequestInterface $request)
+ {
+ $headers = '';
+ foreach ($request->getHeaders() as $name => $value) {
+ foreach ($value as $val) {
+ $headers .= "$name: $val\r\n";
+ }
+ }
+
+ $context = [
+ 'http' => [
+ 'method' => $request->getMethod(),
+ 'header' => $headers,
+ 'protocol_version' => $request->getProtocolVersion(),
+ 'ignore_errors' => true,
+ 'follow_location' => 0,
+ ],
+ ];
+
+ $body = (string) $request->getBody();
+
+ if (!empty($body)) {
+ $context['http']['content'] = $body;
+ // Prevent the HTTP handler from adding a Content-Type header.
+ if (!$request->hasHeader('Content-Type')) {
+ $context['http']['header'] .= "Content-Type:\r\n";
+ }
+ }
+
+ $context['http']['header'] = rtrim($context['http']['header']);
+
+ return $context;
+ }
+
+ private function add_proxy(RequestInterface $request, &$options, $value, &$params)
+ {
+ if (!is_array($value)) {
+ $options['http']['proxy'] = $value;
+ } else {
+ $scheme = $request->getUri()->getScheme();
+ if (isset($value[$scheme])) {
+ if (!isset($value['no'])
+ || !\GuzzleHttp\is_host_in_noproxy(
+ $request->getUri()->getHost(),
+ $value['no']
+ )
+ ) {
+ $options['http']['proxy'] = $value[$scheme];
+ }
+ }
+ }
+ }
+
+ private function add_timeout(RequestInterface $request, &$options, $value, &$params)
+ {
+ if ($value > 0) {
+ $options['http']['timeout'] = $value;
+ }
+ }
+
+ private function add_verify(RequestInterface $request, &$options, $value, &$params)
+ {
+ if ($value === true) {
+ // PHP 5.6 or greater will find the system cert by default. When
+ // < 5.6, use the Guzzle bundled cacert.
+ if (PHP_VERSION_ID < 50600) {
+ $options['ssl']['cafile'] = \GuzzleHttp\default_ca_bundle();
+ }
+ } elseif (is_string($value)) {
+ $options['ssl']['cafile'] = $value;
+ if (!file_exists($value)) {
+ throw new \RuntimeException("SSL CA bundle not found: $value");
+ }
+ } elseif ($value === false) {
+ $options['ssl']['verify_peer'] = false;
+ $options['ssl']['verify_peer_name'] = false;
+ return;
+ } else {
+ throw new \InvalidArgumentException('Invalid verify request option');
+ }
+
+ $options['ssl']['verify_peer'] = true;
+ $options['ssl']['verify_peer_name'] = true;
+ $options['ssl']['allow_self_signed'] = false;
+ }
+
+ private function add_cert(RequestInterface $request, &$options, $value, &$params)
+ {
+ if (is_array($value)) {
+ $options['ssl']['passphrase'] = $value[1];
+ $value = $value[0];
+ }
+
+ if (!file_exists($value)) {
+ throw new \RuntimeException("SSL certificate not found: {$value}");
+ }
+
+ $options['ssl']['local_cert'] = $value;
+ }
+
+ private function add_progress(RequestInterface $request, &$options, $value, &$params)
+ {
+ $this->addNotification(
+ $params,
+ function ($code, $a, $b, $c, $transferred, $total) use ($value) {
+ if ($code == STREAM_NOTIFY_PROGRESS) {
+ $value($total, $transferred, null, null);
+ }
+ }
+ );
+ }
+
+ private function add_debug(RequestInterface $request, &$options, $value, &$params)
+ {
+ if ($value === false) {
+ return;
+ }
+
+ static $map = [
+ STREAM_NOTIFY_CONNECT => 'CONNECT',
+ STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED',
+ STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT',
+ STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS',
+ STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS',
+ STREAM_NOTIFY_REDIRECTED => 'REDIRECTED',
+ STREAM_NOTIFY_PROGRESS => 'PROGRESS',
+ STREAM_NOTIFY_FAILURE => 'FAILURE',
+ STREAM_NOTIFY_COMPLETED => 'COMPLETED',
+ STREAM_NOTIFY_RESOLVE => 'RESOLVE',
+ ];
+ static $args = ['severity', 'message', 'message_code',
+ 'bytes_transferred', 'bytes_max'];
+
+ $value = \GuzzleHttp\debug_resource($value);
+ $ident = $request->getMethod() . ' ' . $request->getUri()->withFragment('');
+ $this->addNotification(
+ $params,
+ function () use ($ident, $value, $map, $args) {
+ $passed = func_get_args();
+ $code = array_shift($passed);
+ fprintf($value, '<%s> [%s] ', $ident, $map[$code]);
+ foreach (array_filter($passed) as $i => $v) {
+ fwrite($value, $args[$i] . ': "' . $v . '" ');
+ }
+ fwrite($value, "\n");
+ }
+ );
+ }
+
+ private function addNotification(array &$params, callable $notify)
+ {
+ // Wrap the existing function if needed.
+ if (!isset($params['notification'])) {
+ $params['notification'] = $notify;
+ } else {
+ $params['notification'] = $this->callArray([
+ $params['notification'],
+ $notify
+ ]);
+ }
+ }
+
+ private function callArray(array $functions)
+ {
+ return function () use ($functions) {
+ $args = func_get_args();
+ foreach ($functions as $fn) {
+ call_user_func_array($fn, $args);
+ }
+ };
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/HandlerStack.php b/vendor/guzzlehttp/guzzle/src/HandlerStack.php
new file mode 100644
index 0000000000..24c46fd9fe
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/HandlerStack.php
@@ -0,0 +1,273 @@
+push(Middleware::httpErrors(), 'http_errors');
+ $stack->push(Middleware::redirect(), 'allow_redirects');
+ $stack->push(Middleware::cookies(), 'cookies');
+ $stack->push(Middleware::prepareBody(), 'prepare_body');
+
+ return $stack;
+ }
+
+ /**
+ * @param callable $handler Underlying HTTP handler.
+ */
+ public function __construct(callable $handler = null)
+ {
+ $this->handler = $handler;
+ }
+
+ /**
+ * Invokes the handler stack as a composed handler
+ *
+ * @param RequestInterface $request
+ * @param array $options
+ */
+ public function __invoke(RequestInterface $request, array $options)
+ {
+ $handler = $this->resolve();
+
+ return $handler($request, $options);
+ }
+
+ /**
+ * Dumps a string representation of the stack.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ $depth = 0;
+ $stack = [];
+ if ($this->handler) {
+ $stack[] = "0) Handler: " . $this->debugCallable($this->handler);
+ }
+
+ $result = '';
+ foreach (array_reverse($this->stack) as $tuple) {
+ $depth++;
+ $str = "{$depth}) Name: '{$tuple[1]}', ";
+ $str .= "Function: " . $this->debugCallable($tuple[0]);
+ $result = "> {$str}\n{$result}";
+ $stack[] = $str;
+ }
+
+ foreach (array_keys($stack) as $k) {
+ $result .= "< {$stack[$k]}\n";
+ }
+
+ return $result;
+ }
+
+ /**
+ * Set the HTTP handler that actually returns a promise.
+ *
+ * @param callable $handler Accepts a request and array of options and
+ * returns a Promise.
+ */
+ public function setHandler(callable $handler)
+ {
+ $this->handler = $handler;
+ $this->cached = null;
+ }
+
+ /**
+ * Returns true if the builder has a handler.
+ *
+ * @return bool
+ */
+ public function hasHandler()
+ {
+ return (bool) $this->handler;
+ }
+
+ /**
+ * Unshift a middleware to the bottom of the stack.
+ *
+ * @param callable $middleware Middleware function
+ * @param string $name Name to register for this middleware.
+ */
+ public function unshift(callable $middleware, $name = null)
+ {
+ array_unshift($this->stack, [$middleware, $name]);
+ $this->cached = null;
+ }
+
+ /**
+ * Push a middleware to the top of the stack.
+ *
+ * @param callable $middleware Middleware function
+ * @param string $name Name to register for this middleware.
+ */
+ public function push(callable $middleware, $name = '')
+ {
+ $this->stack[] = [$middleware, $name];
+ $this->cached = null;
+ }
+
+ /**
+ * Add a middleware before another middleware by name.
+ *
+ * @param string $findName Middleware to find
+ * @param callable $middleware Middleware function
+ * @param string $withName Name to register for this middleware.
+ */
+ public function before($findName, callable $middleware, $withName = '')
+ {
+ $this->splice($findName, $withName, $middleware, true);
+ }
+
+ /**
+ * Add a middleware after another middleware by name.
+ *
+ * @param string $findName Middleware to find
+ * @param callable $middleware Middleware function
+ * @param string $withName Name to register for this middleware.
+ */
+ public function after($findName, callable $middleware, $withName = '')
+ {
+ $this->splice($findName, $withName, $middleware, false);
+ }
+
+ /**
+ * Remove a middleware by instance or name from the stack.
+ *
+ * @param callable|string $remove Middleware to remove by instance or name.
+ */
+ public function remove($remove)
+ {
+ $this->cached = null;
+ $idx = is_callable($remove) ? 0 : 1;
+ $this->stack = array_values(array_filter(
+ $this->stack,
+ function ($tuple) use ($idx, $remove) {
+ return $tuple[$idx] !== $remove;
+ }
+ ));
+ }
+
+ /**
+ * Compose the middleware and handler into a single callable function.
+ *
+ * @return callable
+ */
+ public function resolve()
+ {
+ if (!$this->cached) {
+ if (!($prev = $this->handler)) {
+ throw new \LogicException('No handler has been specified');
+ }
+
+ foreach (array_reverse($this->stack) as $fn) {
+ $prev = $fn[0]($prev);
+ }
+
+ $this->cached = $prev;
+ }
+
+ return $this->cached;
+ }
+
+ /**
+ * @param $name
+ * @return int
+ */
+ private function findByName($name)
+ {
+ foreach ($this->stack as $k => $v) {
+ if ($v[1] === $name) {
+ return $k;
+ }
+ }
+
+ throw new \InvalidArgumentException("Middleware not found: $name");
+ }
+
+ /**
+ * Splices a function into the middleware list at a specific position.
+ *
+ * @param $findName
+ * @param $withName
+ * @param callable $middleware
+ * @param $before
+ */
+ private function splice($findName, $withName, callable $middleware, $before)
+ {
+ $this->cached = null;
+ $idx = $this->findByName($findName);
+ $tuple = [$middleware, $withName];
+
+ if ($before) {
+ if ($idx === 0) {
+ array_unshift($this->stack, $tuple);
+ } else {
+ $replacement = [$tuple, $this->stack[$idx]];
+ array_splice($this->stack, $idx, 1, $replacement);
+ }
+ } elseif ($idx === count($this->stack) - 1) {
+ $this->stack[] = $tuple;
+ } else {
+ $replacement = [$this->stack[$idx], $tuple];
+ array_splice($this->stack, $idx, 1, $replacement);
+ }
+ }
+
+ /**
+ * Provides a debug string for a given callable.
+ *
+ * @param array|callable $fn Function to write as a string.
+ *
+ * @return string
+ */
+ private function debugCallable($fn)
+ {
+ if (is_string($fn)) {
+ return "callable({$fn})";
+ }
+
+ if (is_array($fn)) {
+ return is_string($fn[0])
+ ? "callable({$fn[0]}::{$fn[1]})"
+ : "callable(['" . get_class($fn[0]) . "', '{$fn[1]}'])";
+ }
+
+ return 'callable(' . spl_object_hash($fn) . ')';
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/MessageFormatter.php b/vendor/guzzlehttp/guzzle/src/MessageFormatter.php
new file mode 100644
index 0000000000..663ac73916
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/MessageFormatter.php
@@ -0,0 +1,180 @@
+>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}";
+ const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}';
+
+ /** @var string Template used to format log messages */
+ private $template;
+
+ /**
+ * @param string $template Log message template
+ */
+ public function __construct($template = self::CLF)
+ {
+ $this->template = $template ?: self::CLF;
+ }
+
+ /**
+ * Returns a formatted message string.
+ *
+ * @param RequestInterface $request Request that was sent
+ * @param ResponseInterface $response Response that was received
+ * @param \Exception $error Exception that was received
+ *
+ * @return string
+ */
+ public function format(
+ RequestInterface $request,
+ ResponseInterface $response = null,
+ \Exception $error = null
+ ) {
+ $cache = [];
+
+ return preg_replace_callback(
+ '/{\s*([A-Za-z_\-\.0-9]+)\s*}/',
+ function (array $matches) use ($request, $response, $error, &$cache) {
+ if (isset($cache[$matches[1]])) {
+ return $cache[$matches[1]];
+ }
+
+ $result = '';
+ switch ($matches[1]) {
+ case 'request':
+ $result = Psr7\str($request);
+ break;
+ case 'response':
+ $result = $response ? Psr7\str($response) : '';
+ break;
+ case 'req_headers':
+ $result = trim($request->getMethod()
+ . ' ' . $request->getRequestTarget())
+ . ' HTTP/' . $request->getProtocolVersion() . "\r\n"
+ . $this->headers($request);
+ break;
+ case 'res_headers':
+ $result = $response ?
+ sprintf(
+ 'HTTP/%s %d %s',
+ $response->getProtocolVersion(),
+ $response->getStatusCode(),
+ $response->getReasonPhrase()
+ ) . "\r\n" . $this->headers($response)
+ : 'NULL';
+ break;
+ case 'req_body':
+ $result = $request->getBody();
+ break;
+ case 'res_body':
+ $result = $response ? $response->getBody() : 'NULL';
+ break;
+ case 'ts':
+ case 'date_iso_8601':
+ $result = gmdate('c');
+ break;
+ case 'date_common_log':
+ $result = date('d/M/Y:H:i:s O');
+ break;
+ case 'method':
+ $result = $request->getMethod();
+ break;
+ case 'version':
+ $result = $request->getProtocolVersion();
+ break;
+ case 'uri':
+ case 'url':
+ $result = $request->getUri();
+ break;
+ case 'target':
+ $result = $request->getRequestTarget();
+ break;
+ case 'req_version':
+ $result = $request->getProtocolVersion();
+ break;
+ case 'res_version':
+ $result = $response
+ ? $response->getProtocolVersion()
+ : 'NULL';
+ break;
+ case 'host':
+ $result = $request->getHeaderLine('Host');
+ break;
+ case 'hostname':
+ $result = gethostname();
+ break;
+ case 'code':
+ $result = $response ? $response->getStatusCode() : 'NULL';
+ break;
+ case 'phrase':
+ $result = $response ? $response->getReasonPhrase() : 'NULL';
+ break;
+ case 'error':
+ $result = $error ? $error->getMessage() : 'NULL';
+ break;
+ default:
+ // handle prefixed dynamic headers
+ if (strpos($matches[1], 'req_header_') === 0) {
+ $result = $request->getHeaderLine(substr($matches[1], 11));
+ } elseif (strpos($matches[1], 'res_header_') === 0) {
+ $result = $response
+ ? $response->getHeaderLine(substr($matches[1], 11))
+ : 'NULL';
+ }
+ }
+
+ $cache[$matches[1]] = $result;
+ return $result;
+ },
+ $this->template
+ );
+ }
+
+ private function headers(MessageInterface $message)
+ {
+ $result = '';
+ foreach ($message->getHeaders() as $name => $values) {
+ $result .= $name . ': ' . implode(', ', $values) . "\r\n";
+ }
+
+ return trim($result);
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Middleware.php b/vendor/guzzlehttp/guzzle/src/Middleware.php
new file mode 100644
index 0000000000..d4ad75c94f
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Middleware.php
@@ -0,0 +1,255 @@
+withCookieHeader($request);
+ return $handler($request, $options)
+ ->then(
+ function ($response) use ($cookieJar, $request) {
+ $cookieJar->extractCookies($request, $response);
+ return $response;
+ }
+ );
+ };
+ };
+ }
+
+ /**
+ * Middleware that throws exceptions for 4xx or 5xx responses when the
+ * "http_error" request option is set to true.
+ *
+ * @return callable Returns a function that accepts the next handler.
+ */
+ public static function httpErrors()
+ {
+ return function (callable $handler) {
+ return function ($request, array $options) use ($handler) {
+ if (empty($options['http_errors'])) {
+ return $handler($request, $options);
+ }
+ return $handler($request, $options)->then(
+ function (ResponseInterface $response) use ($request, $handler) {
+ $code = $response->getStatusCode();
+ if ($code < 400) {
+ return $response;
+ }
+ throw RequestException::create($request, $response);
+ }
+ );
+ };
+ };
+ }
+
+ /**
+ * Middleware that pushes history data to an ArrayAccess container.
+ *
+ * @param array|\ArrayAccess $container Container to hold the history (by reference).
+ *
+ * @return callable Returns a function that accepts the next handler.
+ * @throws \InvalidArgumentException if container is not an array or ArrayAccess.
+ */
+ public static function history(&$container)
+ {
+ if (!is_array($container) && !$container instanceof \ArrayAccess) {
+ throw new \InvalidArgumentException('history container must be an array or object implementing ArrayAccess');
+ }
+
+ return function (callable $handler) use (&$container) {
+ return function ($request, array $options) use ($handler, &$container) {
+ return $handler($request, $options)->then(
+ function ($value) use ($request, &$container, $options) {
+ $container[] = [
+ 'request' => $request,
+ 'response' => $value,
+ 'error' => null,
+ 'options' => $options
+ ];
+ return $value;
+ },
+ function ($reason) use ($request, &$container, $options) {
+ $container[] = [
+ 'request' => $request,
+ 'response' => null,
+ 'error' => $reason,
+ 'options' => $options
+ ];
+ return \GuzzleHttp\Promise\rejection_for($reason);
+ }
+ );
+ };
+ };
+ }
+
+ /**
+ * Middleware that invokes a callback before and after sending a request.
+ *
+ * The provided listener cannot modify or alter the response. It simply
+ * "taps" into the chain to be notified before returning the promise. The
+ * before listener accepts a request and options array, and the after
+ * listener accepts a request, options array, and response promise.
+ *
+ * @param callable $before Function to invoke before forwarding the request.
+ * @param callable $after Function invoked after forwarding.
+ *
+ * @return callable Returns a function that accepts the next handler.
+ */
+ public static function tap(callable $before = null, callable $after = null)
+ {
+ return function (callable $handler) use ($before, $after) {
+ return function ($request, array $options) use ($handler, $before, $after) {
+ if ($before) {
+ $before($request, $options);
+ }
+ $response = $handler($request, $options);
+ if ($after) {
+ $after($request, $options, $response);
+ }
+ return $response;
+ };
+ };
+ }
+
+ /**
+ * Middleware that handles request redirects.
+ *
+ * @return callable Returns a function that accepts the next handler.
+ */
+ public static function redirect()
+ {
+ return function (callable $handler) {
+ return new RedirectMiddleware($handler);
+ };
+ }
+
+ /**
+ * Middleware that retries requests based on the boolean result of
+ * invoking the provided "decider" function.
+ *
+ * If no delay function is provided, a simple implementation of exponential
+ * backoff will be utilized.
+ *
+ * @param callable $decider Function that accepts the number of retries,
+ * a request, [response], and [exception] and
+ * returns true if the request is to be retried.
+ * @param callable $delay Function that accepts the number of retries and
+ * returns the number of milliseconds to delay.
+ *
+ * @return callable Returns a function that accepts the next handler.
+ */
+ public static function retry(callable $decider, callable $delay = null)
+ {
+ return function (callable $handler) use ($decider, $delay) {
+ return new RetryMiddleware($decider, $handler, $delay);
+ };
+ }
+
+ /**
+ * Middleware that logs requests, responses, and errors using a message
+ * formatter.
+ *
+ * @param LoggerInterface $logger Logs messages.
+ * @param MessageFormatter $formatter Formatter used to create message strings.
+ * @param string $logLevel Level at which to log requests.
+ *
+ * @return callable Returns a function that accepts the next handler.
+ */
+ public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = LogLevel::INFO)
+ {
+ return function (callable $handler) use ($logger, $formatter, $logLevel) {
+ return function ($request, array $options) use ($handler, $logger, $formatter, $logLevel) {
+ return $handler($request, $options)->then(
+ function ($response) use ($logger, $request, $formatter, $logLevel) {
+ $message = $formatter->format($request, $response);
+ $logger->log($logLevel, $message);
+ return $response;
+ },
+ function ($reason) use ($logger, $request, $formatter) {
+ $response = $reason instanceof RequestException
+ ? $reason->getResponse()
+ : null;
+ $message = $formatter->format($request, $response, $reason);
+ $logger->notice($message);
+ return \GuzzleHttp\Promise\rejection_for($reason);
+ }
+ );
+ };
+ };
+ }
+
+ /**
+ * This middleware adds a default content-type if possible, a default
+ * content-length or transfer-encoding header, and the expect header.
+ *
+ * @return callable
+ */
+ public static function prepareBody()
+ {
+ return function (callable $handler) {
+ return new PrepareBodyMiddleware($handler);
+ };
+ }
+
+ /**
+ * Middleware that applies a map function to the request before passing to
+ * the next handler.
+ *
+ * @param callable $fn Function that accepts a RequestInterface and returns
+ * a RequestInterface.
+ * @return callable
+ */
+ public static function mapRequest(callable $fn)
+ {
+ return function (callable $handler) use ($fn) {
+ return function ($request, array $options) use ($handler, $fn) {
+ return $handler($fn($request), $options);
+ };
+ };
+ }
+
+ /**
+ * Middleware that applies a map function to the resolved promise's
+ * response.
+ *
+ * @param callable $fn Function that accepts a ResponseInterface and
+ * returns a ResponseInterface.
+ * @return callable
+ */
+ public static function mapResponse(callable $fn)
+ {
+ return function (callable $handler) use ($fn) {
+ return function ($request, array $options) use ($handler, $fn) {
+ return $handler($request, $options)->then($fn);
+ };
+ };
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/Pool.php b/vendor/guzzlehttp/guzzle/src/Pool.php
new file mode 100644
index 0000000000..8f1be33cd3
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/Pool.php
@@ -0,0 +1,123 @@
+ $rfn) {
+ if ($rfn instanceof RequestInterface) {
+ yield $key => $client->sendAsync($rfn, $opts);
+ } elseif (is_callable($rfn)) {
+ yield $key => $rfn($opts);
+ } else {
+ throw new \InvalidArgumentException('Each value yielded by '
+ . 'the iterator must be a Psr7\Http\Message\RequestInterface '
+ . 'or a callable that returns a promise that fulfills '
+ . 'with a Psr7\Message\Http\ResponseInterface object.');
+ }
+ }
+ };
+
+ $this->each = new EachPromise($requests(), $config);
+ }
+
+ public function promise()
+ {
+ return $this->each->promise();
+ }
+
+ /**
+ * Sends multiple requests concurrently and returns an array of responses
+ * and exceptions that uses the same ordering as the provided requests.
+ *
+ * IMPORTANT: This method keeps every request and response in memory, and
+ * as such, is NOT recommended when sending a large number or an
+ * indeterminate number of requests concurrently.
+ *
+ * @param ClientInterface $client Client used to send the requests
+ * @param array|\Iterator $requests Requests to send concurrently.
+ * @param array $options Passes through the options available in
+ * {@see GuzzleHttp\Pool::__construct}
+ *
+ * @return array Returns an array containing the response or an exception
+ * in the same order that the requests were sent.
+ * @throws \InvalidArgumentException if the event format is incorrect.
+ */
+ public static function batch(
+ ClientInterface $client,
+ $requests,
+ array $options = []
+ ) {
+ $res = [];
+ self::cmpCallback($options, 'fulfilled', $res);
+ self::cmpCallback($options, 'rejected', $res);
+ $pool = new static($client, $requests, $options);
+ $pool->promise()->wait();
+ ksort($res);
+
+ return $res;
+ }
+
+ private static function cmpCallback(array &$options, $name, array &$results)
+ {
+ if (!isset($options[$name])) {
+ $options[$name] = function ($v, $k) use (&$results) {
+ $results[$k] = $v;
+ };
+ } else {
+ $currentFn = $options[$name];
+ $options[$name] = function ($v, $k) use (&$results, $currentFn) {
+ $currentFn($v, $k);
+ $results[$k] = $v;
+ };
+ }
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php b/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php
new file mode 100644
index 0000000000..2eb95f9b2d
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php
@@ -0,0 +1,106 @@
+nextHandler = $nextHandler;
+ }
+
+ /**
+ * @param RequestInterface $request
+ * @param array $options
+ *
+ * @return PromiseInterface
+ */
+ public function __invoke(RequestInterface $request, array $options)
+ {
+ $fn = $this->nextHandler;
+
+ // Don't do anything if the request has no body.
+ if ($request->getBody()->getSize() === 0) {
+ return $fn($request, $options);
+ }
+
+ $modify = [];
+
+ // Add a default content-type if possible.
+ if (!$request->hasHeader('Content-Type')) {
+ if ($uri = $request->getBody()->getMetadata('uri')) {
+ if ($type = Psr7\mimetype_from_filename($uri)) {
+ $modify['set_headers']['Content-Type'] = $type;
+ }
+ }
+ }
+
+ // Add a default content-length or transfer-encoding header.
+ if (!$request->hasHeader('Content-Length')
+ && !$request->hasHeader('Transfer-Encoding')
+ ) {
+ $size = $request->getBody()->getSize();
+ if ($size !== null) {
+ $modify['set_headers']['Content-Length'] = $size;
+ } else {
+ $modify['set_headers']['Transfer-Encoding'] = 'chunked';
+ }
+ }
+
+ // Add the expect header if needed.
+ $this->addExpectHeader($request, $options, $modify);
+
+ return $fn(Psr7\modify_request($request, $modify), $options);
+ }
+
+ private function addExpectHeader(
+ RequestInterface $request,
+ array $options,
+ array &$modify
+ ) {
+ // Determine if the Expect header should be used
+ if ($request->hasHeader('Expect')) {
+ return;
+ }
+
+ $expect = isset($options['expect']) ? $options['expect'] : null;
+
+ // Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0
+ if ($expect === false || $request->getProtocolVersion() < 1.1) {
+ return;
+ }
+
+ // The expect header is unconditionally enabled
+ if ($expect === true) {
+ $modify['set_headers']['Expect'] = '100-Continue';
+ return;
+ }
+
+ // By default, send the expect header when the payload is > 1mb
+ if ($expect === null) {
+ $expect = 1048576;
+ }
+
+ // Always add if the body cannot be rewound, the size cannot be
+ // determined, or the size is greater than the cutoff threshold
+ $body = $request->getBody();
+ $size = $body->getSize();
+
+ if ($size === null || $size >= (int) $expect || !$body->isSeekable()) {
+ $modify['set_headers']['Expect'] = '100-Continue';
+ }
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php b/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php
new file mode 100644
index 0000000000..131b77179a
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php
@@ -0,0 +1,237 @@
+ 5,
+ 'protocols' => ['http', 'https'],
+ 'strict' => false,
+ 'referer' => false,
+ 'track_redirects' => false,
+ ];
+
+ /** @var callable */
+ private $nextHandler;
+
+ /**
+ * @param callable $nextHandler Next handler to invoke.
+ */
+ public function __construct(callable $nextHandler)
+ {
+ $this->nextHandler = $nextHandler;
+ }
+
+ /**
+ * @param RequestInterface $request
+ * @param array $options
+ *
+ * @return PromiseInterface
+ */
+ public function __invoke(RequestInterface $request, array $options)
+ {
+ $fn = $this->nextHandler;
+
+ if (empty($options['allow_redirects'])) {
+ return $fn($request, $options);
+ }
+
+ if ($options['allow_redirects'] === true) {
+ $options['allow_redirects'] = self::$defaultSettings;
+ } elseif (!is_array($options['allow_redirects'])) {
+ throw new \InvalidArgumentException('allow_redirects must be true, false, or array');
+ } else {
+ // Merge the default settings with the provided settings
+ $options['allow_redirects'] += self::$defaultSettings;
+ }
+
+ if (empty($options['allow_redirects']['max'])) {
+ return $fn($request, $options);
+ }
+
+ return $fn($request, $options)
+ ->then(function (ResponseInterface $response) use ($request, $options) {
+ return $this->checkRedirect($request, $options, $response);
+ });
+ }
+
+ /**
+ * @param RequestInterface $request
+ * @param array $options
+ * @param ResponseInterface|PromiseInterface $response
+ *
+ * @return ResponseInterface|PromiseInterface
+ */
+ public function checkRedirect(
+ RequestInterface $request,
+ array $options,
+ ResponseInterface $response
+ ) {
+ if (substr($response->getStatusCode(), 0, 1) != '3'
+ || !$response->hasHeader('Location')
+ ) {
+ return $response;
+ }
+
+ $this->guardMax($request, $options);
+ $nextRequest = $this->modifyRequest($request, $options, $response);
+
+ if (isset($options['allow_redirects']['on_redirect'])) {
+ call_user_func(
+ $options['allow_redirects']['on_redirect'],
+ $request,
+ $response,
+ $nextRequest->getUri()
+ );
+ }
+
+ /** @var PromiseInterface|ResponseInterface $promise */
+ $promise = $this($nextRequest, $options);
+
+ // Add headers to be able to track history of redirects.
+ if (!empty($options['allow_redirects']['track_redirects'])) {
+ return $this->withTracking(
+ $promise,
+ (string) $nextRequest->getUri(),
+ $response->getStatusCode()
+ );
+ }
+
+ return $promise;
+ }
+
+ private function withTracking(PromiseInterface $promise, $uri, $statusCode)
+ {
+ return $promise->then(
+ function (ResponseInterface $response) use ($uri, $statusCode) {
+ // Note that we are pushing to the front of the list as this
+ // would be an earlier response than what is currently present
+ // in the history header.
+ $historyHeader = $response->getHeader(self::HISTORY_HEADER);
+ $statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER);
+ array_unshift($historyHeader, $uri);
+ array_unshift($statusHeader, $statusCode);
+ return $response->withHeader(self::HISTORY_HEADER, $historyHeader)
+ ->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader);
+ }
+ );
+ }
+
+ private function guardMax(RequestInterface $request, array &$options)
+ {
+ $current = isset($options['__redirect_count'])
+ ? $options['__redirect_count']
+ : 0;
+ $options['__redirect_count'] = $current + 1;
+ $max = $options['allow_redirects']['max'];
+
+ if ($options['__redirect_count'] > $max) {
+ throw new TooManyRedirectsException(
+ "Will not follow more than {$max} redirects",
+ $request
+ );
+ }
+ }
+
+ /**
+ * @param RequestInterface $request
+ * @param array $options
+ * @param ResponseInterface $response
+ *
+ * @return RequestInterface
+ */
+ public function modifyRequest(
+ RequestInterface $request,
+ array $options,
+ ResponseInterface $response
+ ) {
+ // Request modifications to apply.
+ $modify = [];
+ $protocols = $options['allow_redirects']['protocols'];
+
+ // Use a GET request if this is an entity enclosing request and we are
+ // not forcing RFC compliance, but rather emulating what all browsers
+ // would do.
+ $statusCode = $response->getStatusCode();
+ if ($statusCode == 303 ||
+ ($statusCode <= 302 && $request->getBody() && !$options['allow_redirects']['strict'])
+ ) {
+ $modify['method'] = 'GET';
+ $modify['body'] = '';
+ }
+
+ $modify['uri'] = $this->redirectUri($request, $response, $protocols);
+ Psr7\rewind_body($request);
+
+ // Add the Referer header if it is told to do so and only
+ // add the header if we are not redirecting from https to http.
+ if ($options['allow_redirects']['referer']
+ && $modify['uri']->getScheme() === $request->getUri()->getScheme()
+ ) {
+ $uri = $request->getUri()->withUserInfo('', '');
+ $modify['set_headers']['Referer'] = (string) $uri;
+ } else {
+ $modify['remove_headers'][] = 'Referer';
+ }
+
+ // Remove Authorization header if host is different.
+ if ($request->getUri()->getHost() !== $modify['uri']->getHost()) {
+ $modify['remove_headers'][] = 'Authorization';
+ }
+
+ return Psr7\modify_request($request, $modify);
+ }
+
+ /**
+ * Set the appropriate URL on the request based on the location header
+ *
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
+ * @param array $protocols
+ *
+ * @return UriInterface
+ */
+ private function redirectUri(
+ RequestInterface $request,
+ ResponseInterface $response,
+ array $protocols
+ ) {
+ $location = Psr7\UriResolver::resolve(
+ $request->getUri(),
+ new Psr7\Uri($response->getHeaderLine('Location'))
+ );
+
+ // Ensure that the redirect URI is allowed based on the protocols.
+ if (!in_array($location->getScheme(), $protocols)) {
+ throw new BadResponseException(
+ sprintf(
+ 'Redirect URI, %s, does not use one of the allowed redirect protocols: %s',
+ $location,
+ implode(', ', $protocols)
+ ),
+ $request,
+ $response
+ );
+ }
+
+ return $location;
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/RequestOptions.php b/vendor/guzzlehttp/guzzle/src/RequestOptions.php
new file mode 100644
index 0000000000..c6aacfb157
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/RequestOptions.php
@@ -0,0 +1,255 @@
+decider = $decider;
+ $this->nextHandler = $nextHandler;
+ $this->delay = $delay ?: __CLASS__ . '::exponentialDelay';
+ }
+
+ /**
+ * Default exponential backoff delay function.
+ *
+ * @param $retries
+ *
+ * @return int
+ */
+ public static function exponentialDelay($retries)
+ {
+ return (int) pow(2, $retries - 1);
+ }
+
+ /**
+ * @param RequestInterface $request
+ * @param array $options
+ *
+ * @return PromiseInterface
+ */
+ public function __invoke(RequestInterface $request, array $options)
+ {
+ if (!isset($options['retries'])) {
+ $options['retries'] = 0;
+ }
+
+ $fn = $this->nextHandler;
+ return $fn($request, $options)
+ ->then(
+ $this->onFulfilled($request, $options),
+ $this->onRejected($request, $options)
+ );
+ }
+
+ private function onFulfilled(RequestInterface $req, array $options)
+ {
+ return function ($value) use ($req, $options) {
+ if (!call_user_func(
+ $this->decider,
+ $options['retries'],
+ $req,
+ $value,
+ null
+ )) {
+ return $value;
+ }
+ return $this->doRetry($req, $options, $value);
+ };
+ }
+
+ private function onRejected(RequestInterface $req, array $options)
+ {
+ return function ($reason) use ($req, $options) {
+ if (!call_user_func(
+ $this->decider,
+ $options['retries'],
+ $req,
+ null,
+ $reason
+ )) {
+ return \GuzzleHttp\Promise\rejection_for($reason);
+ }
+ return $this->doRetry($req, $options);
+ };
+ }
+
+ private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null)
+ {
+ $options['delay'] = call_user_func($this->delay, ++$options['retries'], $response);
+
+ return $this($request, $options);
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/TransferStats.php b/vendor/guzzlehttp/guzzle/src/TransferStats.php
new file mode 100644
index 0000000000..15f717e1ea
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/TransferStats.php
@@ -0,0 +1,126 @@
+request = $request;
+ $this->response = $response;
+ $this->transferTime = $transferTime;
+ $this->handlerErrorData = $handlerErrorData;
+ $this->handlerStats = $handlerStats;
+ }
+
+ /**
+ * @return RequestInterface
+ */
+ public function getRequest()
+ {
+ return $this->request;
+ }
+
+ /**
+ * Returns the response that was received (if any).
+ *
+ * @return ResponseInterface|null
+ */
+ public function getResponse()
+ {
+ return $this->response;
+ }
+
+ /**
+ * Returns true if a response was received.
+ *
+ * @return bool
+ */
+ public function hasResponse()
+ {
+ return $this->response !== null;
+ }
+
+ /**
+ * Gets handler specific error data.
+ *
+ * This might be an exception, a integer representing an error code, or
+ * anything else. Relying on this value assumes that you know what handler
+ * you are using.
+ *
+ * @return mixed
+ */
+ public function getHandlerErrorData()
+ {
+ return $this->handlerErrorData;
+ }
+
+ /**
+ * Get the effective URI the request was sent to.
+ *
+ * @return UriInterface
+ */
+ public function getEffectiveUri()
+ {
+ return $this->request->getUri();
+ }
+
+ /**
+ * Get the estimated time the request was being transferred by the handler.
+ *
+ * @return float Time in seconds.
+ */
+ public function getTransferTime()
+ {
+ return $this->transferTime;
+ }
+
+ /**
+ * Gets an array of all of the handler specific transfer data.
+ *
+ * @return array
+ */
+ public function getHandlerStats()
+ {
+ return $this->handlerStats;
+ }
+
+ /**
+ * Get a specific handler statistic from the handler by name.
+ *
+ * @param string $stat Handler specific transfer stat to retrieve.
+ *
+ * @return mixed|null
+ */
+ public function getHandlerStat($stat)
+ {
+ return isset($this->handlerStats[$stat])
+ ? $this->handlerStats[$stat]
+ : null;
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/UriTemplate.php b/vendor/guzzlehttp/guzzle/src/UriTemplate.php
new file mode 100644
index 0000000000..96dcfd09cd
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/UriTemplate.php
@@ -0,0 +1,237 @@
+ ['prefix' => '', 'joiner' => ',', 'query' => false],
+ '+' => ['prefix' => '', 'joiner' => ',', 'query' => false],
+ '#' => ['prefix' => '#', 'joiner' => ',', 'query' => false],
+ '.' => ['prefix' => '.', 'joiner' => '.', 'query' => false],
+ '/' => ['prefix' => '/', 'joiner' => '/', 'query' => false],
+ ';' => ['prefix' => ';', 'joiner' => ';', 'query' => true],
+ '?' => ['prefix' => '?', 'joiner' => '&', 'query' => true],
+ '&' => ['prefix' => '&', 'joiner' => '&', 'query' => true]
+ ];
+
+ /** @var array Delimiters */
+ private static $delims = [':', '/', '?', '#', '[', ']', '@', '!', '$',
+ '&', '\'', '(', ')', '*', '+', ',', ';', '='];
+
+ /** @var array Percent encoded delimiters */
+ private static $delimsPct = ['%3A', '%2F', '%3F', '%23', '%5B', '%5D',
+ '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C',
+ '%3B', '%3D'];
+
+ public function expand($template, array $variables)
+ {
+ if (false === strpos($template, '{')) {
+ return $template;
+ }
+
+ $this->template = $template;
+ $this->variables = $variables;
+
+ return preg_replace_callback(
+ '/\{([^\}]+)\}/',
+ [$this, 'expandMatch'],
+ $this->template
+ );
+ }
+
+ /**
+ * Parse an expression into parts
+ *
+ * @param string $expression Expression to parse
+ *
+ * @return array Returns an associative array of parts
+ */
+ private function parseExpression($expression)
+ {
+ $result = [];
+
+ if (isset(self::$operatorHash[$expression[0]])) {
+ $result['operator'] = $expression[0];
+ $expression = substr($expression, 1);
+ } else {
+ $result['operator'] = '';
+ }
+
+ foreach (explode(',', $expression) as $value) {
+ $value = trim($value);
+ $varspec = [];
+ if ($colonPos = strpos($value, ':')) {
+ $varspec['value'] = substr($value, 0, $colonPos);
+ $varspec['modifier'] = ':';
+ $varspec['position'] = (int) substr($value, $colonPos + 1);
+ } elseif (substr($value, -1) === '*') {
+ $varspec['modifier'] = '*';
+ $varspec['value'] = substr($value, 0, -1);
+ } else {
+ $varspec['value'] = (string) $value;
+ $varspec['modifier'] = '';
+ }
+ $result['values'][] = $varspec;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Process an expansion
+ *
+ * @param array $matches Matches met in the preg_replace_callback
+ *
+ * @return string Returns the replacement string
+ */
+ private function expandMatch(array $matches)
+ {
+ static $rfc1738to3986 = ['+' => '%20', '%7e' => '~'];
+
+ $replacements = [];
+ $parsed = self::parseExpression($matches[1]);
+ $prefix = self::$operatorHash[$parsed['operator']]['prefix'];
+ $joiner = self::$operatorHash[$parsed['operator']]['joiner'];
+ $useQuery = self::$operatorHash[$parsed['operator']]['query'];
+
+ foreach ($parsed['values'] as $value) {
+ if (!isset($this->variables[$value['value']])) {
+ continue;
+ }
+
+ $variable = $this->variables[$value['value']];
+ $actuallyUseQuery = $useQuery;
+ $expanded = '';
+
+ if (is_array($variable)) {
+ $isAssoc = $this->isAssoc($variable);
+ $kvp = [];
+ foreach ($variable as $key => $var) {
+ if ($isAssoc) {
+ $key = rawurlencode($key);
+ $isNestedArray = is_array($var);
+ } else {
+ $isNestedArray = false;
+ }
+
+ if (!$isNestedArray) {
+ $var = rawurlencode($var);
+ if ($parsed['operator'] === '+' ||
+ $parsed['operator'] === '#'
+ ) {
+ $var = $this->decodeReserved($var);
+ }
+ }
+
+ if ($value['modifier'] === '*') {
+ if ($isAssoc) {
+ if ($isNestedArray) {
+ // Nested arrays must allow for deeply nested
+ // structures.
+ $var = strtr(
+ http_build_query([$key => $var]),
+ $rfc1738to3986
+ );
+ } else {
+ $var = $key . '=' . $var;
+ }
+ } elseif ($key > 0 && $actuallyUseQuery) {
+ $var = $value['value'] . '=' . $var;
+ }
+ }
+
+ $kvp[$key] = $var;
+ }
+
+ if (empty($variable)) {
+ $actuallyUseQuery = false;
+ } elseif ($value['modifier'] === '*') {
+ $expanded = implode($joiner, $kvp);
+ if ($isAssoc) {
+ // Don't prepend the value name when using the explode
+ // modifier with an associative array.
+ $actuallyUseQuery = false;
+ }
+ } else {
+ if ($isAssoc) {
+ // When an associative array is encountered and the
+ // explode modifier is not set, then the result must be
+ // a comma separated list of keys followed by their
+ // respective values.
+ foreach ($kvp as $k => &$v) {
+ $v = $k . ',' . $v;
+ }
+ }
+ $expanded = implode(',', $kvp);
+ }
+ } else {
+ if ($value['modifier'] === ':') {
+ $variable = substr($variable, 0, $value['position']);
+ }
+ $expanded = rawurlencode($variable);
+ if ($parsed['operator'] === '+' || $parsed['operator'] === '#') {
+ $expanded = $this->decodeReserved($expanded);
+ }
+ }
+
+ if ($actuallyUseQuery) {
+ if (!$expanded && $joiner !== '&') {
+ $expanded = $value['value'];
+ } else {
+ $expanded = $value['value'] . '=' . $expanded;
+ }
+ }
+
+ $replacements[] = $expanded;
+ }
+
+ $ret = implode($joiner, $replacements);
+ if ($ret && $prefix) {
+ return $prefix . $ret;
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Determines if an array is associative.
+ *
+ * This makes the assumption that input arrays are sequences or hashes.
+ * This assumption is a tradeoff for accuracy in favor of speed, but it
+ * should work in almost every case where input is supplied for a URI
+ * template.
+ *
+ * @param array $array Array to check
+ *
+ * @return bool
+ */
+ private function isAssoc(array $array)
+ {
+ return $array && array_keys($array)[0] !== 0;
+ }
+
+ /**
+ * Removes percent encoding on reserved characters (used with + and #
+ * modifiers).
+ *
+ * @param string $string String to fix
+ *
+ * @return string
+ */
+ private function decodeReserved($string)
+ {
+ return str_replace(self::$delimsPct, self::$delims, $string);
+ }
+}
diff --git a/vendor/guzzlehttp/guzzle/src/functions.php b/vendor/guzzlehttp/guzzle/src/functions.php
new file mode 100644
index 0000000000..a3ac450db9
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/functions.php
@@ -0,0 +1,333 @@
+expand($template, $variables);
+}
+
+/**
+ * Debug function used to describe the provided value type and class.
+ *
+ * @param mixed $input
+ *
+ * @return string Returns a string containing the type of the variable and
+ * if a class is provided, the class name.
+ */
+function describe_type($input)
+{
+ switch (gettype($input)) {
+ case 'object':
+ return 'object(' . get_class($input) . ')';
+ case 'array':
+ return 'array(' . count($input) . ')';
+ default:
+ ob_start();
+ var_dump($input);
+ // normalize float vs double
+ return str_replace('double(', 'float(', rtrim(ob_get_clean()));
+ }
+}
+
+/**
+ * Parses an array of header lines into an associative array of headers.
+ *
+ * @param array $lines Header lines array of strings in the following
+ * format: "Name: Value"
+ * @return array
+ */
+function headers_from_lines($lines)
+{
+ $headers = [];
+
+ foreach ($lines as $line) {
+ $parts = explode(':', $line, 2);
+ $headers[trim($parts[0])][] = isset($parts[1])
+ ? trim($parts[1])
+ : null;
+ }
+
+ return $headers;
+}
+
+/**
+ * Returns a debug stream based on the provided variable.
+ *
+ * @param mixed $value Optional value
+ *
+ * @return resource
+ */
+function debug_resource($value = null)
+{
+ if (is_resource($value)) {
+ return $value;
+ } elseif (defined('STDOUT')) {
+ return STDOUT;
+ }
+
+ return fopen('php://output', 'w');
+}
+
+/**
+ * Chooses and creates a default handler to use based on the environment.
+ *
+ * The returned handler is not wrapped by any default middlewares.
+ *
+ * @throws \RuntimeException if no viable Handler is available.
+ * @return callable Returns the best handler for the given system.
+ */
+function choose_handler()
+{
+ $handler = null;
+ if (function_exists('curl_multi_exec') && function_exists('curl_exec')) {
+ $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler());
+ } elseif (function_exists('curl_exec')) {
+ $handler = new CurlHandler();
+ } elseif (function_exists('curl_multi_exec')) {
+ $handler = new CurlMultiHandler();
+ }
+
+ if (ini_get('allow_url_fopen')) {
+ $handler = $handler
+ ? Proxy::wrapStreaming($handler, new StreamHandler())
+ : new StreamHandler();
+ } elseif (!$handler) {
+ throw new \RuntimeException('GuzzleHttp requires cURL, the '
+ . 'allow_url_fopen ini setting, or a custom HTTP handler.');
+ }
+
+ return $handler;
+}
+
+/**
+ * Get the default User-Agent string to use with Guzzle
+ *
+ * @return string
+ */
+function default_user_agent()
+{
+ static $defaultAgent = '';
+
+ if (!$defaultAgent) {
+ $defaultAgent = 'GuzzleHttp/' . Client::VERSION;
+ if (extension_loaded('curl') && function_exists('curl_version')) {
+ $defaultAgent .= ' curl/' . \curl_version()['version'];
+ }
+ $defaultAgent .= ' PHP/' . PHP_VERSION;
+ }
+
+ return $defaultAgent;
+}
+
+/**
+ * Returns the default cacert bundle for the current system.
+ *
+ * First, the openssl.cafile and curl.cainfo php.ini settings are checked.
+ * If those settings are not configured, then the common locations for
+ * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X
+ * and Windows are checked. If any of these file locations are found on
+ * disk, they will be utilized.
+ *
+ * Note: the result of this function is cached for subsequent calls.
+ *
+ * @return string
+ * @throws \RuntimeException if no bundle can be found.
+ */
+function default_ca_bundle()
+{
+ static $cached = null;
+ static $cafiles = [
+ // Red Hat, CentOS, Fedora (provided by the ca-certificates package)
+ '/etc/pki/tls/certs/ca-bundle.crt',
+ // Ubuntu, Debian (provided by the ca-certificates package)
+ '/etc/ssl/certs/ca-certificates.crt',
+ // FreeBSD (provided by the ca_root_nss package)
+ '/usr/local/share/certs/ca-root-nss.crt',
+ // SLES 12 (provided by the ca-certificates package)
+ '/var/lib/ca-certificates/ca-bundle.pem',
+ // OS X provided by homebrew (using the default path)
+ '/usr/local/etc/openssl/cert.pem',
+ // Google app engine
+ '/etc/ca-certificates.crt',
+ // Windows?
+ 'C:\\windows\\system32\\curl-ca-bundle.crt',
+ 'C:\\windows\\curl-ca-bundle.crt',
+ ];
+
+ if ($cached) {
+ return $cached;
+ }
+
+ if ($ca = ini_get('openssl.cafile')) {
+ return $cached = $ca;
+ }
+
+ if ($ca = ini_get('curl.cainfo')) {
+ return $cached = $ca;
+ }
+
+ foreach ($cafiles as $filename) {
+ if (file_exists($filename)) {
+ return $cached = $filename;
+ }
+ }
+
+ throw new \RuntimeException(<<< EOT
+No system CA bundle could be found in any of the the common system locations.
+PHP versions earlier than 5.6 are not properly configured to use the system's
+CA bundle by default. In order to verify peer certificates, you will need to
+supply the path on disk to a certificate bundle to the 'verify' request
+option: http://docs.guzzlephp.org/en/latest/clients.html#verify. If you do not
+need a specific certificate bundle, then Mozilla provides a commonly used CA
+bundle which can be downloaded here (provided by the maintainer of cURL):
+https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt. Once
+you have a CA bundle available on disk, you can set the 'openssl.cafile' PHP
+ini setting to point to the path to the file, allowing you to omit the 'verify'
+request option. See http://curl.haxx.se/docs/sslcerts.html for more
+information.
+EOT
+ );
+}
+
+/**
+ * Creates an associative array of lowercase header names to the actual
+ * header casing.
+ *
+ * @param array $headers
+ *
+ * @return array
+ */
+function normalize_header_keys(array $headers)
+{
+ $result = [];
+ foreach (array_keys($headers) as $key) {
+ $result[strtolower($key)] = $key;
+ }
+
+ return $result;
+}
+
+/**
+ * Returns true if the provided host matches any of the no proxy areas.
+ *
+ * This method will strip a port from the host if it is present. Each pattern
+ * can be matched with an exact match (e.g., "foo.com" == "foo.com") or a
+ * partial match: (e.g., "foo.com" == "baz.foo.com" and ".foo.com" ==
+ * "baz.foo.com", but ".foo.com" != "foo.com").
+ *
+ * Areas are matched in the following cases:
+ * 1. "*" (without quotes) always matches any hosts.
+ * 2. An exact match.
+ * 3. The area starts with "." and the area is the last part of the host. e.g.
+ * '.mit.edu' will match any host that ends with '.mit.edu'.
+ *
+ * @param string $host Host to check against the patterns.
+ * @param array $noProxyArray An array of host patterns.
+ *
+ * @return bool
+ */
+function is_host_in_noproxy($host, array $noProxyArray)
+{
+ if (strlen($host) === 0) {
+ throw new \InvalidArgumentException('Empty host provided');
+ }
+
+ // Strip port if present.
+ if (strpos($host, ':')) {
+ $host = explode($host, ':', 2)[0];
+ }
+
+ foreach ($noProxyArray as $area) {
+ // Always match on wildcards.
+ if ($area === '*') {
+ return true;
+ } elseif (empty($area)) {
+ // Don't match on empty values.
+ continue;
+ } elseif ($area === $host) {
+ // Exact matches.
+ return true;
+ } else {
+ // Special match if the area when prefixed with ".". Remove any
+ // existing leading "." and add a new leading ".".
+ $area = '.' . ltrim($area, '.');
+ if (substr($host, -(strlen($area))) === $area) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Wrapper for json_decode that throws when an error occurs.
+ *
+ * @param string $json JSON data to parse
+ * @param bool $assoc When true, returned objects will be converted
+ * into associative arrays.
+ * @param int $depth User specified recursion depth.
+ * @param int $options Bitmask of JSON decode options.
+ *
+ * @return mixed
+ * @throws \InvalidArgumentException if the JSON cannot be decoded.
+ * @link http://www.php.net/manual/en/function.json-decode.php
+ */
+function json_decode($json, $assoc = false, $depth = 512, $options = 0)
+{
+ $data = \json_decode($json, $assoc, $depth, $options);
+ if (JSON_ERROR_NONE !== json_last_error()) {
+ throw new \InvalidArgumentException(
+ 'json_decode error: ' . json_last_error_msg()
+ );
+ }
+
+ return $data;
+}
+
+/**
+ * Wrapper for JSON encoding that throws when an error occurs.
+ *
+ * @param mixed $value The value being encoded
+ * @param int $options JSON encode option bitmask
+ * @param int $depth Set the maximum depth. Must be greater than zero.
+ *
+ * @return string
+ * @throws \InvalidArgumentException if the JSON cannot be encoded.
+ * @link http://www.php.net/manual/en/function.json-encode.php
+ */
+function json_encode($value, $options = 0, $depth = 512)
+{
+ $json = \json_encode($value, $options, $depth);
+ if (JSON_ERROR_NONE !== json_last_error()) {
+ throw new \InvalidArgumentException(
+ 'json_encode error: ' . json_last_error_msg()
+ );
+ }
+
+ return $json;
+}
diff --git a/vendor/guzzlehttp/guzzle/src/functions_include.php b/vendor/guzzlehttp/guzzle/src/functions_include.php
new file mode 100644
index 0000000000..a93393acc4
--- /dev/null
+++ b/vendor/guzzlehttp/guzzle/src/functions_include.php
@@ -0,0 +1,6 @@
+
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/guzzlehttp/promises/Makefile b/vendor/guzzlehttp/promises/Makefile
new file mode 100644
index 0000000000..8d5b3ef95e
--- /dev/null
+++ b/vendor/guzzlehttp/promises/Makefile
@@ -0,0 +1,13 @@
+all: clean test
+
+test:
+ vendor/bin/phpunit
+
+coverage:
+ vendor/bin/phpunit --coverage-html=artifacts/coverage
+
+view-coverage:
+ open artifacts/coverage/index.html
+
+clean:
+ rm -rf artifacts/*
diff --git a/vendor/guzzlehttp/promises/README.md b/vendor/guzzlehttp/promises/README.md
new file mode 100644
index 0000000000..7b607e28b1
--- /dev/null
+++ b/vendor/guzzlehttp/promises/README.md
@@ -0,0 +1,504 @@
+# Guzzle Promises
+
+[Promises/A+](https://promisesaplus.com/) implementation that handles promise
+chaining and resolution iteratively, allowing for "infinite" promise chaining
+while keeping the stack size constant. Read [this blog post](https://blog.domenic.me/youre-missing-the-point-of-promises/)
+for a general introduction to promises.
+
+- [Features](#features)
+- [Quick start](#quick-start)
+- [Synchronous wait](#synchronous-wait)
+- [Cancellation](#cancellation)
+- [API](#api)
+ - [Promise](#promise)
+ - [FulfilledPromise](#fulfilledpromise)
+ - [RejectedPromise](#rejectedpromise)
+- [Promise interop](#promise-interop)
+- [Implementation notes](#implementation-notes)
+
+
+# Features
+
+- [Promises/A+](https://promisesaplus.com/) implementation.
+- Promise resolution and chaining is handled iteratively, allowing for
+ "infinite" promise chaining.
+- Promises have a synchronous `wait` method.
+- Promises can be cancelled.
+- Works with any object that has a `then` function.
+- C# style async/await coroutine promises using
+ `GuzzleHttp\Promise\coroutine()`.
+
+
+# Quick start
+
+A *promise* represents the eventual result of an asynchronous operation. The
+primary way of interacting with a promise is through its `then` method, which
+registers callbacks to receive either a promise's eventual value or the reason
+why the promise cannot be fulfilled.
+
+
+## Callbacks
+
+Callbacks are registered with the `then` method by providing an optional
+`$onFulfilled` followed by an optional `$onRejected` function.
+
+
+```php
+use GuzzleHttp\Promise\Promise;
+
+$promise = new Promise();
+$promise->then(
+ // $onFulfilled
+ function ($value) {
+ echo 'The promise was fulfilled.';
+ },
+ // $onRejected
+ function ($reason) {
+ echo 'The promise was rejected.';
+ }
+);
+```
+
+*Resolving* a promise means that you either fulfill a promise with a *value* or
+reject a promise with a *reason*. Resolving a promises triggers callbacks
+registered with the promises's `then` method. These callbacks are triggered
+only once and in the order in which they were added.
+
+
+## Resolving a promise
+
+Promises are fulfilled using the `resolve($value)` method. Resolving a promise
+with any value other than a `GuzzleHttp\Promise\RejectedPromise` will trigger
+all of the onFulfilled callbacks (resolving a promise with a rejected promise
+will reject the promise and trigger the `$onRejected` callbacks).
+
+```php
+use GuzzleHttp\Promise\Promise;
+
+$promise = new Promise();
+$promise
+ ->then(function ($value) {
+ // Return a value and don't break the chain
+ return "Hello, " . $value;
+ })
+ // This then is executed after the first then and receives the value
+ // returned from the first then.
+ ->then(function ($value) {
+ echo $value;
+ });
+
+// Resolving the promise triggers the $onFulfilled callbacks and outputs
+// "Hello, reader".
+$promise->resolve('reader.');
+```
+
+
+## Promise forwarding
+
+Promises can be chained one after the other. Each then in the chain is a new
+promise. The return value of a promise is what's forwarded to the next
+promise in the chain. Returning a promise in a `then` callback will cause the
+subsequent promises in the chain to only be fulfilled when the returned promise
+has been fulfilled. The next promise in the chain will be invoked with the
+resolved value of the promise.
+
+```php
+use GuzzleHttp\Promise\Promise;
+
+$promise = new Promise();
+$nextPromise = new Promise();
+
+$promise
+ ->then(function ($value) use ($nextPromise) {
+ echo $value;
+ return $nextPromise;
+ })
+ ->then(function ($value) {
+ echo $value;
+ });
+
+// Triggers the first callback and outputs "A"
+$promise->resolve('A');
+// Triggers the second callback and outputs "B"
+$nextPromise->resolve('B');
+```
+
+## Promise rejection
+
+When a promise is rejected, the `$onRejected` callbacks are invoked with the
+rejection reason.
+
+```php
+use GuzzleHttp\Promise\Promise;
+
+$promise = new Promise();
+$promise->then(null, function ($reason) {
+ echo $reason;
+});
+
+$promise->reject('Error!');
+// Outputs "Error!"
+```
+
+## Rejection forwarding
+
+If an exception is thrown in an `$onRejected` callback, subsequent
+`$onRejected` callbacks are invoked with the thrown exception as the reason.
+
+```php
+use GuzzleHttp\Promise\Promise;
+
+$promise = new Promise();
+$promise->then(null, function ($reason) {
+ throw new \Exception($reason);
+})->then(null, function ($reason) {
+ assert($reason->getMessage() === 'Error!');
+});
+
+$promise->reject('Error!');
+```
+
+You can also forward a rejection down the promise chain by returning a
+`GuzzleHttp\Promise\RejectedPromise` in either an `$onFulfilled` or
+`$onRejected` callback.
+
+```php
+use GuzzleHttp\Promise\Promise;
+use GuzzleHttp\Promise\RejectedPromise;
+
+$promise = new Promise();
+$promise->then(null, function ($reason) {
+ return new RejectedPromise($reason);
+})->then(null, function ($reason) {
+ assert($reason === 'Error!');
+});
+
+$promise->reject('Error!');
+```
+
+If an exception is not thrown in a `$onRejected` callback and the callback
+does not return a rejected promise, downstream `$onFulfilled` callbacks are
+invoked using the value returned from the `$onRejected` callback.
+
+```php
+use GuzzleHttp\Promise\Promise;
+use GuzzleHttp\Promise\RejectedPromise;
+
+$promise = new Promise();
+$promise
+ ->then(null, function ($reason) {
+ return "It's ok";
+ })
+ ->then(function ($value) {
+ assert($value === "It's ok");
+ });
+
+$promise->reject('Error!');
+```
+
+# Synchronous wait
+
+You can synchronously force promises to complete using a promise's `wait`
+method. When creating a promise, you can provide a wait function that is used
+to synchronously force a promise to complete. When a wait function is invoked
+it is expected to deliver a value to the promise or reject the promise. If the
+wait function does not deliver a value, then an exception is thrown. The wait
+function provided to a promise constructor is invoked when the `wait` function
+of the promise is called.
+
+```php
+$promise = new Promise(function () use (&$promise) {
+ $promise->resolve('foo');
+});
+
+// Calling wait will return the value of the promise.
+echo $promise->wait(); // outputs "foo"
+```
+
+If an exception is encountered while invoking the wait function of a promise,
+the promise is rejected with the exception and the exception is thrown.
+
+```php
+$promise = new Promise(function () use (&$promise) {
+ throw new \Exception('foo');
+});
+
+$promise->wait(); // throws the exception.
+```
+
+Calling `wait` on a promise that has been fulfilled will not trigger the wait
+function. It will simply return the previously resolved value.
+
+```php
+$promise = new Promise(function () { die('this is not called!'); });
+$promise->resolve('foo');
+echo $promise->wait(); // outputs "foo"
+```
+
+Calling `wait` on a promise that has been rejected will throw an exception. If
+the rejection reason is an instance of `\Exception` the reason is thrown.
+Otherwise, a `GuzzleHttp\Promise\RejectionException` is thrown and the reason
+can be obtained by calling the `getReason` method of the exception.
+
+```php
+$promise = new Promise();
+$promise->reject('foo');
+$promise->wait();
+```
+
+> PHP Fatal error: Uncaught exception 'GuzzleHttp\Promise\RejectionException' with message 'The promise was rejected with value: foo'
+
+
+## Unwrapping a promise
+
+When synchronously waiting on a promise, you are joining the state of the
+promise into the current state of execution (i.e., return the value of the
+promise if it was fulfilled or throw an exception if it was rejected). This is
+called "unwrapping" the promise. Waiting on a promise will by default unwrap
+the promise state.
+
+You can force a promise to resolve and *not* unwrap the state of the promise
+by passing `false` to the first argument of the `wait` function:
+
+```php
+$promise = new Promise();
+$promise->reject('foo');
+// This will not throw an exception. It simply ensures the promise has
+// been resolved.
+$promise->wait(false);
+```
+
+When unwrapping a promise, the resolved value of the promise will be waited
+upon until the unwrapped value is not a promise. This means that if you resolve
+promise A with a promise B and unwrap promise A, the value returned by the
+wait function will be the value delivered to promise B.
+
+**Note**: when you do not unwrap the promise, no value is returned.
+
+
+# Cancellation
+
+You can cancel a promise that has not yet been fulfilled using the `cancel()`
+method of a promise. When creating a promise you can provide an optional
+cancel function that when invoked cancels the action of computing a resolution
+of the promise.
+
+
+# API
+
+
+## Promise
+
+When creating a promise object, you can provide an optional `$waitFn` and
+`$cancelFn`. `$waitFn` is a function that is invoked with no arguments and is
+expected to resolve the promise. `$cancelFn` is a function with no arguments
+that is expected to cancel the computation of a promise. It is invoked when the
+`cancel()` method of a promise is called.
+
+```php
+use GuzzleHttp\Promise\Promise;
+
+$promise = new Promise(
+ function () use (&$promise) {
+ $promise->resolve('waited');
+ },
+ function () {
+ // do something that will cancel the promise computation (e.g., close
+ // a socket, cancel a database query, etc...)
+ }
+);
+
+assert('waited' === $promise->wait());
+```
+
+A promise has the following methods:
+
+- `then(callable $onFulfilled, callable $onRejected) : PromiseInterface`
+
+ Appends fulfillment and rejection handlers to the promise, and returns a new promise resolving to the return value of the called handler.
+
+- `otherwise(callable $onRejected) : PromiseInterface`
+
+ Appends a rejection handler callback to the promise, and returns a new promise resolving to the return value of the callback if it is called, or to its original fulfillment value if the promise is instead fulfilled.
+
+- `wait($unwrap = true) : mixed`
+
+ Synchronously waits on the promise to complete.
+
+ `$unwrap` controls whether or not the value of the promise is returned for a
+ fulfilled promise or if an exception is thrown if the promise is rejected.
+ This is set to `true` by default.
+
+- `cancel()`
+
+ Attempts to cancel the promise if possible. The promise being cancelled and
+ the parent most ancestor that has not yet been resolved will also be
+ cancelled. Any promises waiting on the cancelled promise to resolve will also
+ be cancelled.
+
+- `getState() : string`
+
+ Returns the state of the promise. One of `pending`, `fulfilled`, or
+ `rejected`.
+
+- `resolve($value)`
+
+ Fulfills the promise with the given `$value`.
+
+- `reject($reason)`
+
+ Rejects the promise with the given `$reason`.
+
+
+## FulfilledPromise
+
+A fulfilled promise can be created to represent a promise that has been
+fulfilled.
+
+```php
+use GuzzleHttp\Promise\FulfilledPromise;
+
+$promise = new FulfilledPromise('value');
+
+// Fulfilled callbacks are immediately invoked.
+$promise->then(function ($value) {
+ echo $value;
+});
+```
+
+
+## RejectedPromise
+
+A rejected promise can be created to represent a promise that has been
+rejected.
+
+```php
+use GuzzleHttp\Promise\RejectedPromise;
+
+$promise = new RejectedPromise('Error');
+
+// Rejected callbacks are immediately invoked.
+$promise->then(null, function ($reason) {
+ echo $reason;
+});
+```
+
+
+# Promise interop
+
+This library works with foreign promises that have a `then` method. This means
+you can use Guzzle promises with [React promises](https://github.com/reactphp/promise)
+for example. When a foreign promise is returned inside of a then method
+callback, promise resolution will occur recursively.
+
+```php
+// Create a React promise
+$deferred = new React\Promise\Deferred();
+$reactPromise = $deferred->promise();
+
+// Create a Guzzle promise that is fulfilled with a React promise.
+$guzzlePromise = new \GuzzleHttp\Promise\Promise();
+$guzzlePromise->then(function ($value) use ($reactPromise) {
+ // Do something something with the value...
+ // Return the React promise
+ return $reactPromise;
+});
+```
+
+Please note that wait and cancel chaining is no longer possible when forwarding
+a foreign promise. You will need to wrap a third-party promise with a Guzzle
+promise in order to utilize wait and cancel functions with foreign promises.
+
+
+## Event Loop Integration
+
+In order to keep the stack size constant, Guzzle promises are resolved
+asynchronously using a task queue. When waiting on promises synchronously, the
+task queue will be automatically run to ensure that the blocking promise and
+any forwarded promises are resolved. When using promises asynchronously in an
+event loop, you will need to run the task queue on each tick of the loop. If
+you do not run the task queue, then promises will not be resolved.
+
+You can run the task queue using the `run()` method of the global task queue
+instance.
+
+```php
+// Get the global task queue
+$queue = \GuzzleHttp\Promise\queue();
+$queue->run();
+```
+
+For example, you could use Guzzle promises with React using a periodic timer:
+
+```php
+$loop = React\EventLoop\Factory::create();
+$loop->addPeriodicTimer(0, [$queue, 'run']);
+```
+
+*TODO*: Perhaps adding a `futureTick()` on each tick would be faster?
+
+
+# Implementation notes
+
+
+## Promise resolution and chaining is handled iteratively
+
+By shuffling pending handlers from one owner to another, promises are
+resolved iteratively, allowing for "infinite" then chaining.
+
+```php
+then(function ($v) {
+ // The stack size remains constant (a good thing)
+ echo xdebug_get_stack_depth() . ', ';
+ return $v + 1;
+ });
+}
+
+$parent->resolve(0);
+var_dump($p->wait()); // int(1000)
+
+```
+
+When a promise is fulfilled or rejected with a non-promise value, the promise
+then takes ownership of the handlers of each child promise and delivers values
+down the chain without using recursion.
+
+When a promise is resolved with another promise, the original promise transfers
+all of its pending handlers to the new promise. When the new promise is
+eventually resolved, all of the pending handlers are delivered the forwarded
+value.
+
+
+## A promise is the deferred.
+
+Some promise libraries implement promises using a deferred object to represent
+a computation and a promise object to represent the delivery of the result of
+the computation. This is a nice separation of computation and delivery because
+consumers of the promise cannot modify the value that will be eventually
+delivered.
+
+One side effect of being able to implement promise resolution and chaining
+iteratively is that you need to be able for one promise to reach into the state
+of another promise to shuffle around ownership of handlers. In order to achieve
+this without making the handlers of a promise publicly mutable, a promise is
+also the deferred value, allowing promises of the same parent class to reach
+into and modify the private properties of promises of the same type. While this
+does allow consumers of the value to modify the resolution or rejection of the
+deferred, it is a small price to pay for keeping the stack size constant.
+
+```php
+$promise = new Promise();
+$promise->then(function ($value) { echo $value; });
+// The promise is the deferred value, so you can deliver a value to it.
+$promise->resolve('foo');
+// prints "foo"
+```
diff --git a/vendor/guzzlehttp/promises/composer.json b/vendor/guzzlehttp/promises/composer.json
new file mode 100644
index 0000000000..ec41a61e6e
--- /dev/null
+++ b/vendor/guzzlehttp/promises/composer.json
@@ -0,0 +1,34 @@
+{
+ "name": "guzzlehttp/promises",
+ "description": "Guzzle promises library",
+ "keywords": ["promise"],
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "require": {
+ "php": ">=5.5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ },
+ "files": ["src/functions_include.php"]
+ },
+ "scripts": {
+ "test": "vendor/bin/phpunit",
+ "test-ci": "vendor/bin/phpunit --coverage-text"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ }
+}
diff --git a/vendor/guzzlehttp/promises/src/AggregateException.php b/vendor/guzzlehttp/promises/src/AggregateException.php
new file mode 100644
index 0000000000..6a5690c376
--- /dev/null
+++ b/vendor/guzzlehttp/promises/src/AggregateException.php
@@ -0,0 +1,16 @@
+then(function ($v) { echo $v; });
+ *
+ * @param callable $generatorFn Generator function to wrap into a promise.
+ *
+ * @return Promise
+ * @link https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration
+ */
+final class Coroutine implements PromiseInterface
+{
+ /**
+ * @var PromiseInterface|null
+ */
+ private $currentPromise;
+
+ /**
+ * @var Generator
+ */
+ private $generator;
+
+ /**
+ * @var Promise
+ */
+ private $result;
+
+ public function __construct(callable $generatorFn)
+ {
+ $this->generator = $generatorFn();
+ $this->result = new Promise(function () {
+ while (isset($this->currentPromise)) {
+ $this->currentPromise->wait();
+ }
+ });
+ $this->nextCoroutine($this->generator->current());
+ }
+
+ public function then(
+ callable $onFulfilled = null,
+ callable $onRejected = null
+ ) {
+ return $this->result->then($onFulfilled, $onRejected);
+ }
+
+ public function otherwise(callable $onRejected)
+ {
+ return $this->result->otherwise($onRejected);
+ }
+
+ public function wait($unwrap = true)
+ {
+ return $this->result->wait($unwrap);
+ }
+
+ public function getState()
+ {
+ return $this->result->getState();
+ }
+
+ public function resolve($value)
+ {
+ $this->result->resolve($value);
+ }
+
+ public function reject($reason)
+ {
+ $this->result->reject($reason);
+ }
+
+ public function cancel()
+ {
+ $this->currentPromise->cancel();
+ $this->result->cancel();
+ }
+
+ private function nextCoroutine($yielded)
+ {
+ $this->currentPromise = promise_for($yielded)
+ ->then([$this, '_handleSuccess'], [$this, '_handleFailure']);
+ }
+
+ /**
+ * @internal
+ */
+ public function _handleSuccess($value)
+ {
+ unset($this->currentPromise);
+ try {
+ $next = $this->generator->send($value);
+ if ($this->generator->valid()) {
+ $this->nextCoroutine($next);
+ } else {
+ $this->result->resolve($value);
+ }
+ } catch (Exception $exception) {
+ $this->result->reject($exception);
+ } catch (Throwable $throwable) {
+ $this->result->reject($throwable);
+ }
+ }
+
+ /**
+ * @internal
+ */
+ public function _handleFailure($reason)
+ {
+ unset($this->currentPromise);
+ try {
+ $nextYield = $this->generator->throw(exception_for($reason));
+ // The throw was caught, so keep iterating on the coroutine
+ $this->nextCoroutine($nextYield);
+ } catch (Exception $exception) {
+ $this->result->reject($exception);
+ } catch (Throwable $throwable) {
+ $this->result->reject($throwable);
+ }
+ }
+}
diff --git a/vendor/guzzlehttp/promises/src/EachPromise.php b/vendor/guzzlehttp/promises/src/EachPromise.php
new file mode 100644
index 0000000000..d0ddf603fb
--- /dev/null
+++ b/vendor/guzzlehttp/promises/src/EachPromise.php
@@ -0,0 +1,229 @@
+iterable = iter_for($iterable);
+
+ if (isset($config['concurrency'])) {
+ $this->concurrency = $config['concurrency'];
+ }
+
+ if (isset($config['fulfilled'])) {
+ $this->onFulfilled = $config['fulfilled'];
+ }
+
+ if (isset($config['rejected'])) {
+ $this->onRejected = $config['rejected'];
+ }
+ }
+
+ public function promise()
+ {
+ if ($this->aggregate) {
+ return $this->aggregate;
+ }
+
+ try {
+ $this->createPromise();
+ $this->iterable->rewind();
+ $this->refillPending();
+ } catch (\Throwable $e) {
+ $this->aggregate->reject($e);
+ } catch (\Exception $e) {
+ $this->aggregate->reject($e);
+ }
+
+ return $this->aggregate;
+ }
+
+ private function createPromise()
+ {
+ $this->mutex = false;
+ $this->aggregate = new Promise(function () {
+ reset($this->pending);
+ if (empty($this->pending) && !$this->iterable->valid()) {
+ $this->aggregate->resolve(null);
+ return;
+ }
+
+ // Consume a potentially fluctuating list of promises while
+ // ensuring that indexes are maintained (precluding array_shift).
+ while ($promise = current($this->pending)) {
+ next($this->pending);
+ $promise->wait();
+ if ($this->aggregate->getState() !== PromiseInterface::PENDING) {
+ return;
+ }
+ }
+ });
+
+ // Clear the references when the promise is resolved.
+ $clearFn = function () {
+ $this->iterable = $this->concurrency = $this->pending = null;
+ $this->onFulfilled = $this->onRejected = null;
+ };
+
+ $this->aggregate->then($clearFn, $clearFn);
+ }
+
+ private function refillPending()
+ {
+ if (!$this->concurrency) {
+ // Add all pending promises.
+ while ($this->addPending() && $this->advanceIterator());
+ return;
+ }
+
+ // Add only up to N pending promises.
+ $concurrency = is_callable($this->concurrency)
+ ? call_user_func($this->concurrency, count($this->pending))
+ : $this->concurrency;
+ $concurrency = max($concurrency - count($this->pending), 0);
+ // Concurrency may be set to 0 to disallow new promises.
+ if (!$concurrency) {
+ return;
+ }
+ // Add the first pending promise.
+ $this->addPending();
+ // Note this is special handling for concurrency=1 so that we do
+ // not advance the iterator after adding the first promise. This
+ // helps work around issues with generators that might not have the
+ // next value to yield until promise callbacks are called.
+ while (--$concurrency
+ && $this->advanceIterator()
+ && $this->addPending());
+ }
+
+ private function addPending()
+ {
+ if (!$this->iterable || !$this->iterable->valid()) {
+ return false;
+ }
+
+ $promise = promise_for($this->iterable->current());
+ $idx = $this->iterable->key();
+
+ $this->pending[$idx] = $promise->then(
+ function ($value) use ($idx) {
+ if ($this->onFulfilled) {
+ call_user_func(
+ $this->onFulfilled, $value, $idx, $this->aggregate
+ );
+ }
+ $this->step($idx);
+ },
+ function ($reason) use ($idx) {
+ if ($this->onRejected) {
+ call_user_func(
+ $this->onRejected, $reason, $idx, $this->aggregate
+ );
+ }
+ $this->step($idx);
+ }
+ );
+
+ return true;
+ }
+
+ private function advanceIterator()
+ {
+ // Place a lock on the iterator so that we ensure to not recurse,
+ // preventing fatal generator errors.
+ if ($this->mutex) {
+ return false;
+ }
+
+ $this->mutex = true;
+
+ try {
+ $this->iterable->next();
+ $this->mutex = false;
+ return true;
+ } catch (\Throwable $e) {
+ $this->aggregate->reject($e);
+ $this->mutex = false;
+ return false;
+ } catch (\Exception $e) {
+ $this->aggregate->reject($e);
+ $this->mutex = false;
+ return false;
+ }
+ }
+
+ private function step($idx)
+ {
+ // If the promise was already resolved, then ignore this step.
+ if ($this->aggregate->getState() !== PromiseInterface::PENDING) {
+ return;
+ }
+
+ unset($this->pending[$idx]);
+
+ // Only refill pending promises if we are not locked, preventing the
+ // EachPromise to recursively invoke the provided iterator, which
+ // cause a fatal error: "Cannot resume an already running generator"
+ if ($this->advanceIterator() && !$this->checkIfFinished()) {
+ // Add more pending promises if possible.
+ $this->refillPending();
+ }
+ }
+
+ private function checkIfFinished()
+ {
+ if (!$this->pending && !$this->iterable->valid()) {
+ // Resolve the promise if there's nothing left to do.
+ $this->aggregate->resolve(null);
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/vendor/guzzlehttp/promises/src/FulfilledPromise.php b/vendor/guzzlehttp/promises/src/FulfilledPromise.php
new file mode 100644
index 0000000000..dbbeeb9f71
--- /dev/null
+++ b/vendor/guzzlehttp/promises/src/FulfilledPromise.php
@@ -0,0 +1,82 @@
+value = $value;
+ }
+
+ public function then(
+ callable $onFulfilled = null,
+ callable $onRejected = null
+ ) {
+ // Return itself if there is no onFulfilled function.
+ if (!$onFulfilled) {
+ return $this;
+ }
+
+ $queue = queue();
+ $p = new Promise([$queue, 'run']);
+ $value = $this->value;
+ $queue->add(static function () use ($p, $value, $onFulfilled) {
+ if ($p->getState() === self::PENDING) {
+ try {
+ $p->resolve($onFulfilled($value));
+ } catch (\Throwable $e) {
+ $p->reject($e);
+ } catch (\Exception $e) {
+ $p->reject($e);
+ }
+ }
+ });
+
+ return $p;
+ }
+
+ public function otherwise(callable $onRejected)
+ {
+ return $this->then(null, $onRejected);
+ }
+
+ public function wait($unwrap = true, $defaultDelivery = null)
+ {
+ return $unwrap ? $this->value : null;
+ }
+
+ public function getState()
+ {
+ return self::FULFILLED;
+ }
+
+ public function resolve($value)
+ {
+ if ($value !== $this->value) {
+ throw new \LogicException("Cannot resolve a fulfilled promise");
+ }
+ }
+
+ public function reject($reason)
+ {
+ throw new \LogicException("Cannot reject a fulfilled promise");
+ }
+
+ public function cancel()
+ {
+ // pass
+ }
+}
diff --git a/vendor/guzzlehttp/promises/src/Promise.php b/vendor/guzzlehttp/promises/src/Promise.php
new file mode 100644
index 0000000000..844ada073c
--- /dev/null
+++ b/vendor/guzzlehttp/promises/src/Promise.php
@@ -0,0 +1,280 @@
+waitFn = $waitFn;
+ $this->cancelFn = $cancelFn;
+ }
+
+ public function then(
+ callable $onFulfilled = null,
+ callable $onRejected = null
+ ) {
+ if ($this->state === self::PENDING) {
+ $p = new Promise(null, [$this, 'cancel']);
+ $this->handlers[] = [$p, $onFulfilled, $onRejected];
+ $p->waitList = $this->waitList;
+ $p->waitList[] = $this;
+ return $p;
+ }
+
+ // Return a fulfilled promise and immediately invoke any callbacks.
+ if ($this->state === self::FULFILLED) {
+ return $onFulfilled
+ ? promise_for($this->result)->then($onFulfilled)
+ : promise_for($this->result);
+ }
+
+ // It's either cancelled or rejected, so return a rejected promise
+ // and immediately invoke any callbacks.
+ $rejection = rejection_for($this->result);
+ return $onRejected ? $rejection->then(null, $onRejected) : $rejection;
+ }
+
+ public function otherwise(callable $onRejected)
+ {
+ return $this->then(null, $onRejected);
+ }
+
+ public function wait($unwrap = true)
+ {
+ $this->waitIfPending();
+
+ $inner = $this->result instanceof PromiseInterface
+ ? $this->result->wait($unwrap)
+ : $this->result;
+
+ if ($unwrap) {
+ if ($this->result instanceof PromiseInterface
+ || $this->state === self::FULFILLED
+ ) {
+ return $inner;
+ } else {
+ // It's rejected so "unwrap" and throw an exception.
+ throw exception_for($inner);
+ }
+ }
+ }
+
+ public function getState()
+ {
+ return $this->state;
+ }
+
+ public function cancel()
+ {
+ if ($this->state !== self::PENDING) {
+ return;
+ }
+
+ $this->waitFn = $this->waitList = null;
+
+ if ($this->cancelFn) {
+ $fn = $this->cancelFn;
+ $this->cancelFn = null;
+ try {
+ $fn();
+ } catch (\Throwable $e) {
+ $this->reject($e);
+ } catch (\Exception $e) {
+ $this->reject($e);
+ }
+ }
+
+ // Reject the promise only if it wasn't rejected in a then callback.
+ if ($this->state === self::PENDING) {
+ $this->reject(new CancellationException('Promise has been cancelled'));
+ }
+ }
+
+ public function resolve($value)
+ {
+ $this->settle(self::FULFILLED, $value);
+ }
+
+ public function reject($reason)
+ {
+ $this->settle(self::REJECTED, $reason);
+ }
+
+ private function settle($state, $value)
+ {
+ if ($this->state !== self::PENDING) {
+ // Ignore calls with the same resolution.
+ if ($state === $this->state && $value === $this->result) {
+ return;
+ }
+ throw $this->state === $state
+ ? new \LogicException("The promise is already {$state}.")
+ : new \LogicException("Cannot change a {$this->state} promise to {$state}");
+ }
+
+ if ($value === $this) {
+ throw new \LogicException('Cannot fulfill or reject a promise with itself');
+ }
+
+ // Clear out the state of the promise but stash the handlers.
+ $this->state = $state;
+ $this->result = $value;
+ $handlers = $this->handlers;
+ $this->handlers = null;
+ $this->waitList = $this->waitFn = null;
+ $this->cancelFn = null;
+
+ if (!$handlers) {
+ return;
+ }
+
+ // If the value was not a settled promise or a thenable, then resolve
+ // it in the task queue using the correct ID.
+ if (!method_exists($value, 'then')) {
+ $id = $state === self::FULFILLED ? 1 : 2;
+ // It's a success, so resolve the handlers in the queue.
+ queue()->add(static function () use ($id, $value, $handlers) {
+ foreach ($handlers as $handler) {
+ self::callHandler($id, $value, $handler);
+ }
+ });
+ } elseif ($value instanceof Promise
+ && $value->getState() === self::PENDING
+ ) {
+ // We can just merge our handlers onto the next promise.
+ $value->handlers = array_merge($value->handlers, $handlers);
+ } else {
+ // Resolve the handlers when the forwarded promise is resolved.
+ $value->then(
+ static function ($value) use ($handlers) {
+ foreach ($handlers as $handler) {
+ self::callHandler(1, $value, $handler);
+ }
+ },
+ static function ($reason) use ($handlers) {
+ foreach ($handlers as $handler) {
+ self::callHandler(2, $reason, $handler);
+ }
+ }
+ );
+ }
+ }
+
+ /**
+ * Call a stack of handlers using a specific callback index and value.
+ *
+ * @param int $index 1 (resolve) or 2 (reject).
+ * @param mixed $value Value to pass to the callback.
+ * @param array $handler Array of handler data (promise and callbacks).
+ *
+ * @return array Returns the next group to resolve.
+ */
+ private static function callHandler($index, $value, array $handler)
+ {
+ /** @var PromiseInterface $promise */
+ $promise = $handler[0];
+
+ // The promise may have been cancelled or resolved before placing
+ // this thunk in the queue.
+ if ($promise->getState() !== self::PENDING) {
+ return;
+ }
+
+ try {
+ if (isset($handler[$index])) {
+ $promise->resolve($handler[$index]($value));
+ } elseif ($index === 1) {
+ // Forward resolution values as-is.
+ $promise->resolve($value);
+ } else {
+ // Forward rejections down the chain.
+ $promise->reject($value);
+ }
+ } catch (\Throwable $reason) {
+ $promise->reject($reason);
+ } catch (\Exception $reason) {
+ $promise->reject($reason);
+ }
+ }
+
+ private function waitIfPending()
+ {
+ if ($this->state !== self::PENDING) {
+ return;
+ } elseif ($this->waitFn) {
+ $this->invokeWaitFn();
+ } elseif ($this->waitList) {
+ $this->invokeWaitList();
+ } else {
+ // If there's not wait function, then reject the promise.
+ $this->reject('Cannot wait on a promise that has '
+ . 'no internal wait function. You must provide a wait '
+ . 'function when constructing the promise to be able to '
+ . 'wait on a promise.');
+ }
+
+ queue()->run();
+
+ if ($this->state === self::PENDING) {
+ $this->reject('Invoking the wait callback did not resolve the promise');
+ }
+ }
+
+ private function invokeWaitFn()
+ {
+ try {
+ $wfn = $this->waitFn;
+ $this->waitFn = null;
+ $wfn(true);
+ } catch (\Exception $reason) {
+ if ($this->state === self::PENDING) {
+ // The promise has not been resolved yet, so reject the promise
+ // with the exception.
+ $this->reject($reason);
+ } else {
+ // The promise was already resolved, so there's a problem in
+ // the application.
+ throw $reason;
+ }
+ }
+ }
+
+ private function invokeWaitList()
+ {
+ $waitList = $this->waitList;
+ $this->waitList = null;
+
+ foreach ($waitList as $result) {
+ while (true) {
+ $result->waitIfPending();
+
+ if ($result->result instanceof Promise) {
+ $result = $result->result;
+ } else {
+ if ($result->result instanceof PromiseInterface) {
+ $result->result->wait(false);
+ }
+ break;
+ }
+ }
+ }
+ }
+}
diff --git a/vendor/guzzlehttp/promises/src/PromiseInterface.php b/vendor/guzzlehttp/promises/src/PromiseInterface.php
new file mode 100644
index 0000000000..8f5f4b99b2
--- /dev/null
+++ b/vendor/guzzlehttp/promises/src/PromiseInterface.php
@@ -0,0 +1,93 @@
+reason = $reason;
+ }
+
+ public function then(
+ callable $onFulfilled = null,
+ callable $onRejected = null
+ ) {
+ // If there's no onRejected callback then just return self.
+ if (!$onRejected) {
+ return $this;
+ }
+
+ $queue = queue();
+ $reason = $this->reason;
+ $p = new Promise([$queue, 'run']);
+ $queue->add(static function () use ($p, $reason, $onRejected) {
+ if ($p->getState() === self::PENDING) {
+ try {
+ // Return a resolved promise if onRejected does not throw.
+ $p->resolve($onRejected($reason));
+ } catch (\Throwable $e) {
+ // onRejected threw, so return a rejected promise.
+ $p->reject($e);
+ } catch (\Exception $e) {
+ // onRejected threw, so return a rejected promise.
+ $p->reject($e);
+ }
+ }
+ });
+
+ return $p;
+ }
+
+ public function otherwise(callable $onRejected)
+ {
+ return $this->then(null, $onRejected);
+ }
+
+ public function wait($unwrap = true, $defaultDelivery = null)
+ {
+ if ($unwrap) {
+ throw exception_for($this->reason);
+ }
+ }
+
+ public function getState()
+ {
+ return self::REJECTED;
+ }
+
+ public function resolve($value)
+ {
+ throw new \LogicException("Cannot resolve a rejected promise");
+ }
+
+ public function reject($reason)
+ {
+ if ($reason !== $this->reason) {
+ throw new \LogicException("Cannot reject a rejected promise");
+ }
+ }
+
+ public function cancel()
+ {
+ // pass
+ }
+}
diff --git a/vendor/guzzlehttp/promises/src/RejectionException.php b/vendor/guzzlehttp/promises/src/RejectionException.php
new file mode 100644
index 0000000000..07c1136da1
--- /dev/null
+++ b/vendor/guzzlehttp/promises/src/RejectionException.php
@@ -0,0 +1,47 @@
+reason = $reason;
+
+ $message = 'The promise was rejected';
+
+ if ($description) {
+ $message .= ' with reason: ' . $description;
+ } elseif (is_string($reason)
+ || (is_object($reason) && method_exists($reason, '__toString'))
+ ) {
+ $message .= ' with reason: ' . $this->reason;
+ } elseif ($reason instanceof \JsonSerializable) {
+ $message .= ' with reason: '
+ . json_encode($this->reason, JSON_PRETTY_PRINT);
+ }
+
+ parent::__construct($message);
+ }
+
+ /**
+ * Returns the rejection reason.
+ *
+ * @return mixed
+ */
+ public function getReason()
+ {
+ return $this->reason;
+ }
+}
diff --git a/vendor/guzzlehttp/promises/src/TaskQueue.php b/vendor/guzzlehttp/promises/src/TaskQueue.php
new file mode 100644
index 0000000000..6e8a2a083c
--- /dev/null
+++ b/vendor/guzzlehttp/promises/src/TaskQueue.php
@@ -0,0 +1,66 @@
+run();
+ */
+class TaskQueue implements TaskQueueInterface
+{
+ private $enableShutdown = true;
+ private $queue = [];
+
+ public function __construct($withShutdown = true)
+ {
+ if ($withShutdown) {
+ register_shutdown_function(function () {
+ if ($this->enableShutdown) {
+ // Only run the tasks if an E_ERROR didn't occur.
+ $err = error_get_last();
+ if (!$err || ($err['type'] ^ E_ERROR)) {
+ $this->run();
+ }
+ }
+ });
+ }
+ }
+
+ public function isEmpty()
+ {
+ return !$this->queue;
+ }
+
+ public function add(callable $task)
+ {
+ $this->queue[] = $task;
+ }
+
+ public function run()
+ {
+ /** @var callable $task */
+ while ($task = array_shift($this->queue)) {
+ $task();
+ }
+ }
+
+ /**
+ * The task queue will be run and exhausted by default when the process
+ * exits IFF the exit is not the result of a PHP E_ERROR error.
+ *
+ * You can disable running the automatic shutdown of the queue by calling
+ * this function. If you disable the task queue shutdown process, then you
+ * MUST either run the task queue (as a result of running your event loop
+ * or manually using the run() method) or wait on each outstanding promise.
+ *
+ * Note: This shutdown will occur before any destructors are triggered.
+ */
+ public function disableShutdown()
+ {
+ $this->enableShutdown = false;
+ }
+}
diff --git a/vendor/guzzlehttp/promises/src/TaskQueueInterface.php b/vendor/guzzlehttp/promises/src/TaskQueueInterface.php
new file mode 100644
index 0000000000..ac8306e197
--- /dev/null
+++ b/vendor/guzzlehttp/promises/src/TaskQueueInterface.php
@@ -0,0 +1,25 @@
+
+ * while ($eventLoop->isRunning()) {
+ * GuzzleHttp\Promise\queue()->run();
+ * }
+ *
+ *
+ * @param TaskQueueInterface $assign Optionally specify a new queue instance.
+ *
+ * @return TaskQueueInterface
+ */
+function queue(TaskQueueInterface $assign = null)
+{
+ static $queue;
+
+ if ($assign) {
+ $queue = $assign;
+ } elseif (!$queue) {
+ $queue = new TaskQueue();
+ }
+
+ return $queue;
+}
+
+/**
+ * Adds a function to run in the task queue when it is next `run()` and returns
+ * a promise that is fulfilled or rejected with the result.
+ *
+ * @param callable $task Task function to run.
+ *
+ * @return PromiseInterface
+ */
+function task(callable $task)
+{
+ $queue = queue();
+ $promise = new Promise([$queue, 'run']);
+ $queue->add(function () use ($task, $promise) {
+ try {
+ $promise->resolve($task());
+ } catch (\Throwable $e) {
+ $promise->reject($e);
+ } catch (\Exception $e) {
+ $promise->reject($e);
+ }
+ });
+
+ return $promise;
+}
+
+/**
+ * Creates a promise for a value if the value is not a promise.
+ *
+ * @param mixed $value Promise or value.
+ *
+ * @return PromiseInterface
+ */
+function promise_for($value)
+{
+ if ($value instanceof PromiseInterface) {
+ return $value;
+ }
+
+ // Return a Guzzle promise that shadows the given promise.
+ if (method_exists($value, 'then')) {
+ $wfn = method_exists($value, 'wait') ? [$value, 'wait'] : null;
+ $cfn = method_exists($value, 'cancel') ? [$value, 'cancel'] : null;
+ $promise = new Promise($wfn, $cfn);
+ $value->then([$promise, 'resolve'], [$promise, 'reject']);
+ return $promise;
+ }
+
+ return new FulfilledPromise($value);
+}
+
+/**
+ * Creates a rejected promise for a reason if the reason is not a promise. If
+ * the provided reason is a promise, then it is returned as-is.
+ *
+ * @param mixed $reason Promise or reason.
+ *
+ * @return PromiseInterface
+ */
+function rejection_for($reason)
+{
+ if ($reason instanceof PromiseInterface) {
+ return $reason;
+ }
+
+ return new RejectedPromise($reason);
+}
+
+/**
+ * Create an exception for a rejected promise value.
+ *
+ * @param mixed $reason
+ *
+ * @return \Exception|\Throwable
+ */
+function exception_for($reason)
+{
+ return $reason instanceof \Exception || $reason instanceof \Throwable
+ ? $reason
+ : new RejectionException($reason);
+}
+
+/**
+ * Returns an iterator for the given value.
+ *
+ * @param mixed $value
+ *
+ * @return \Iterator
+ */
+function iter_for($value)
+{
+ if ($value instanceof \Iterator) {
+ return $value;
+ } elseif (is_array($value)) {
+ return new \ArrayIterator($value);
+ } else {
+ return new \ArrayIterator([$value]);
+ }
+}
+
+/**
+ * Synchronously waits on a promise to resolve and returns an inspection state
+ * array.
+ *
+ * Returns a state associative array containing a "state" key mapping to a
+ * valid promise state. If the state of the promise is "fulfilled", the array
+ * will contain a "value" key mapping to the fulfilled value of the promise. If
+ * the promise is rejected, the array will contain a "reason" key mapping to
+ * the rejection reason of the promise.
+ *
+ * @param PromiseInterface $promise Promise or value.
+ *
+ * @return array
+ */
+function inspect(PromiseInterface $promise)
+{
+ try {
+ return [
+ 'state' => PromiseInterface::FULFILLED,
+ 'value' => $promise->wait()
+ ];
+ } catch (RejectionException $e) {
+ return ['state' => PromiseInterface::REJECTED, 'reason' => $e->getReason()];
+ } catch (\Throwable $e) {
+ return ['state' => PromiseInterface::REJECTED, 'reason' => $e];
+ } catch (\Exception $e) {
+ return ['state' => PromiseInterface::REJECTED, 'reason' => $e];
+ }
+}
+
+/**
+ * Waits on all of the provided promises, but does not unwrap rejected promises
+ * as thrown exception.
+ *
+ * Returns an array of inspection state arrays.
+ *
+ * @param PromiseInterface[] $promises Traversable of promises to wait upon.
+ *
+ * @return array
+ * @see GuzzleHttp\Promise\inspect for the inspection state array format.
+ */
+function inspect_all($promises)
+{
+ $results = [];
+ foreach ($promises as $key => $promise) {
+ $results[$key] = inspect($promise);
+ }
+
+ return $results;
+}
+
+/**
+ * Waits on all of the provided promises and returns the fulfilled values.
+ *
+ * Returns an array that contains the value of each promise (in the same order
+ * the promises were provided). An exception is thrown if any of the promises
+ * are rejected.
+ *
+ * @param mixed $promises Iterable of PromiseInterface objects to wait on.
+ *
+ * @return array
+ * @throws \Exception on error
+ * @throws \Throwable on error in PHP >=7
+ */
+function unwrap($promises)
+{
+ $results = [];
+ foreach ($promises as $key => $promise) {
+ $results[$key] = $promise->wait();
+ }
+
+ return $results;
+}
+
+/**
+ * Given an array of promises, return a promise that is fulfilled when all the
+ * items in the array are fulfilled.
+ *
+ * The promise's fulfillment value is an array with fulfillment values at
+ * respective positions to the original array. If any promise in the array
+ * rejects, the returned promise is rejected with the rejection reason.
+ *
+ * @param mixed $promises Promises or values.
+ *
+ * @return PromiseInterface
+ */
+function all($promises)
+{
+ $results = [];
+ return each(
+ $promises,
+ function ($value, $idx) use (&$results) {
+ $results[$idx] = $value;
+ },
+ function ($reason, $idx, Promise $aggregate) {
+ $aggregate->reject($reason);
+ }
+ )->then(function () use (&$results) {
+ ksort($results);
+ return $results;
+ });
+}
+
+/**
+ * Initiate a competitive race between multiple promises or values (values will
+ * become immediately fulfilled promises).
+ *
+ * When count amount of promises have been fulfilled, the returned promise is
+ * fulfilled with an array that contains the fulfillment values of the winners
+ * in order of resolution.
+ *
+ * This prommise is rejected with a {@see GuzzleHttp\Promise\AggregateException}
+ * if the number of fulfilled promises is less than the desired $count.
+ *
+ * @param int $count Total number of promises.
+ * @param mixed $promises Promises or values.
+ *
+ * @return PromiseInterface
+ */
+function some($count, $promises)
+{
+ $results = [];
+ $rejections = [];
+
+ return each(
+ $promises,
+ function ($value, $idx, PromiseInterface $p) use (&$results, $count) {
+ if ($p->getState() !== PromiseInterface::PENDING) {
+ return;
+ }
+ $results[$idx] = $value;
+ if (count($results) >= $count) {
+ $p->resolve(null);
+ }
+ },
+ function ($reason) use (&$rejections) {
+ $rejections[] = $reason;
+ }
+ )->then(
+ function () use (&$results, &$rejections, $count) {
+ if (count($results) !== $count) {
+ throw new AggregateException(
+ 'Not enough promises to fulfill count',
+ $rejections
+ );
+ }
+ ksort($results);
+ return array_values($results);
+ }
+ );
+}
+
+/**
+ * Like some(), with 1 as count. However, if the promise fulfills, the
+ * fulfillment value is not an array of 1 but the value directly.
+ *
+ * @param mixed $promises Promises or values.
+ *
+ * @return PromiseInterface
+ */
+function any($promises)
+{
+ return some(1, $promises)->then(function ($values) { return $values[0]; });
+}
+
+/**
+ * Returns a promise that is fulfilled when all of the provided promises have
+ * been fulfilled or rejected.
+ *
+ * The returned promise is fulfilled with an array of inspection state arrays.
+ *
+ * @param mixed $promises Promises or values.
+ *
+ * @return PromiseInterface
+ * @see GuzzleHttp\Promise\inspect for the inspection state array format.
+ */
+function settle($promises)
+{
+ $results = [];
+
+ return each(
+ $promises,
+ function ($value, $idx) use (&$results) {
+ $results[$idx] = ['state' => PromiseInterface::FULFILLED, 'value' => $value];
+ },
+ function ($reason, $idx) use (&$results) {
+ $results[$idx] = ['state' => PromiseInterface::REJECTED, 'reason' => $reason];
+ }
+ )->then(function () use (&$results) {
+ ksort($results);
+ return $results;
+ });
+}
+
+/**
+ * Given an iterator that yields promises or values, returns a promise that is
+ * fulfilled with a null value when the iterator has been consumed or the
+ * aggregate promise has been fulfilled or rejected.
+ *
+ * $onFulfilled is a function that accepts the fulfilled value, iterator
+ * index, and the aggregate promise. The callback can invoke any necessary side
+ * effects and choose to resolve or reject the aggregate promise if needed.
+ *
+ * $onRejected is a function that accepts the rejection reason, iterator
+ * index, and the aggregate promise. The callback can invoke any necessary side
+ * effects and choose to resolve or reject the aggregate promise if needed.
+ *
+ * @param mixed $iterable Iterator or array to iterate over.
+ * @param callable $onFulfilled
+ * @param callable $onRejected
+ *
+ * @return PromiseInterface
+ */
+function each(
+ $iterable,
+ callable $onFulfilled = null,
+ callable $onRejected = null
+) {
+ return (new EachPromise($iterable, [
+ 'fulfilled' => $onFulfilled,
+ 'rejected' => $onRejected
+ ]))->promise();
+}
+
+/**
+ * Like each, but only allows a certain number of outstanding promises at any
+ * given time.
+ *
+ * $concurrency may be an integer or a function that accepts the number of
+ * pending promises and returns a numeric concurrency limit value to allow for
+ * dynamic a concurrency size.
+ *
+ * @param mixed $iterable
+ * @param int|callable $concurrency
+ * @param callable $onFulfilled
+ * @param callable $onRejected
+ *
+ * @return PromiseInterface
+ */
+function each_limit(
+ $iterable,
+ $concurrency,
+ callable $onFulfilled = null,
+ callable $onRejected = null
+) {
+ return (new EachPromise($iterable, [
+ 'fulfilled' => $onFulfilled,
+ 'rejected' => $onRejected,
+ 'concurrency' => $concurrency
+ ]))->promise();
+}
+
+/**
+ * Like each_limit, but ensures that no promise in the given $iterable argument
+ * is rejected. If any promise is rejected, then the aggregate promise is
+ * rejected with the encountered rejection.
+ *
+ * @param mixed $iterable
+ * @param int|callable $concurrency
+ * @param callable $onFulfilled
+ *
+ * @return PromiseInterface
+ */
+function each_limit_all(
+ $iterable,
+ $concurrency,
+ callable $onFulfilled = null
+) {
+ return each_limit(
+ $iterable,
+ $concurrency,
+ $onFulfilled,
+ function ($reason, $idx, PromiseInterface $aggregate) {
+ $aggregate->reject($reason);
+ }
+ );
+}
+
+/**
+ * Returns true if a promise is fulfilled.
+ *
+ * @param PromiseInterface $promise
+ *
+ * @return bool
+ */
+function is_fulfilled(PromiseInterface $promise)
+{
+ return $promise->getState() === PromiseInterface::FULFILLED;
+}
+
+/**
+ * Returns true if a promise is rejected.
+ *
+ * @param PromiseInterface $promise
+ *
+ * @return bool
+ */
+function is_rejected(PromiseInterface $promise)
+{
+ return $promise->getState() === PromiseInterface::REJECTED;
+}
+
+/**
+ * Returns true if a promise is fulfilled or rejected.
+ *
+ * @param PromiseInterface $promise
+ *
+ * @return bool
+ */
+function is_settled(PromiseInterface $promise)
+{
+ return $promise->getState() !== PromiseInterface::PENDING;
+}
+
+/**
+ * @see Coroutine
+ *
+ * @param callable $generatorFn
+ *
+ * @return PromiseInterface
+ */
+function coroutine(callable $generatorFn)
+{
+ return new Coroutine($generatorFn);
+}
diff --git a/vendor/guzzlehttp/promises/src/functions_include.php b/vendor/guzzlehttp/promises/src/functions_include.php
new file mode 100644
index 0000000000..34cd1710aa
--- /dev/null
+++ b/vendor/guzzlehttp/promises/src/functions_include.php
@@ -0,0 +1,6 @@
+withPath('foo')->withHost('example.com')` will throw an exception
+ because the path of a URI with an authority must start with a slash "/" or be empty
+ - `(new Uri())->withScheme('http')` will return `'http://localhost'`
+* Fix compatibility of URIs with `file` scheme and empty host.
+* Added common URI utility methods based on RFC 3986 (see documentation in the readme):
+ - `Uri::isDefaultPort`
+ - `Uri::isAbsolute`
+ - `Uri::isNetworkPathReference`
+ - `Uri::isAbsolutePathReference`
+ - `Uri::isRelativePathReference`
+ - `Uri::isSameDocumentReference`
+ - `Uri::composeComponents`
+ - `UriNormalizer::normalize`
+ - `UriNormalizer::isEquivalent`
+ - `UriResolver::relativize`
+* Deprecated `Uri::resolve` in favor of `UriResolver::resolve`
+* Deprecated `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments`
+
+## 1.3.1 - 2016-06-25
+
+* Fix `Uri::__toString` for network path references, e.g. `//example.org`.
+* Fix missing lowercase normalization for host.
+* Fix handling of URI components in case they are `'0'` in a lot of places,
+ e.g. as a user info password.
+* Fix `Uri::withAddedHeader` to correctly merge headers with different case.
+* Fix trimming of header values in `Uri::withAddedHeader`. Header values may
+ be surrounded by whitespace which should be ignored according to RFC 7230
+ Section 3.2.4. This does not apply to header names.
+* Fix `Uri::withAddedHeader` with an array of header values.
+* Fix `Uri::resolve` when base path has no slash and handling of fragment.
+* Fix handling of encoding in `Uri::with(out)QueryValue` so one can pass the
+ key/value both in encoded as well as decoded form to those methods. This is
+ consistent with withPath, withQuery etc.
+* Fix `ServerRequest::withoutAttribute` when attribute value is null.
+
+## 1.3.0 - 2016-04-13
+
+* Added remaining interfaces needed for full PSR7 compatibility
+ (ServerRequestInterface, UploadedFileInterface, etc.).
+* Added support for stream_for from scalars.
+* Can now extend Uri.
+* Fixed a bug in validating request methods by making it more permissive.
+
+## 1.2.3 - 2016-02-18
+
+* Fixed support in `GuzzleHttp\Psr7\CachingStream` for seeking forward on remote
+ streams, which can sometimes return fewer bytes than requested with `fread`.
+* Fixed handling of gzipped responses with FNAME headers.
+
+## 1.2.2 - 2016-01-22
+
+* Added support for URIs without any authority.
+* Added support for HTTP 451 'Unavailable For Legal Reasons.'
+* Added support for using '0' as a filename.
+* Added support for including non-standard ports in Host headers.
+
+## 1.2.1 - 2015-11-02
+
+* Now supporting negative offsets when seeking to SEEK_END.
+
+## 1.2.0 - 2015-08-15
+
+* Body as `"0"` is now properly added to a response.
+* Now allowing forward seeking in CachingStream.
+* Now properly parsing HTTP requests that contain proxy targets in
+ `parse_request`.
+* functions.php is now conditionally required.
+* user-info is no longer dropped when resolving URIs.
+
+## 1.1.0 - 2015-06-24
+
+* URIs can now be relative.
+* `multipart/form-data` headers are now overridden case-insensitively.
+* URI paths no longer encode the following characters because they are allowed
+ in URIs: "(", ")", "*", "!", "'"
+* A port is no longer added to a URI when the scheme is missing and no port is
+ present.
+
+## 1.0.0 - 2015-05-19
+
+Initial release.
+
+Currently unsupported:
+
+- `Psr\Http\Message\ServerRequestInterface`
+- `Psr\Http\Message\UploadedFileInterface`
diff --git a/vendor/guzzlehttp/psr7/LICENSE b/vendor/guzzlehttp/psr7/LICENSE
new file mode 100644
index 0000000000..581d95f920
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2015 Michael Dowling, https://github.com/mtdowling
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/guzzlehttp/psr7/README.md b/vendor/guzzlehttp/psr7/README.md
new file mode 100644
index 0000000000..16499358ea
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/README.md
@@ -0,0 +1,739 @@
+# PSR-7 Message Implementation
+
+This repository contains a full [PSR-7](http://www.php-fig.org/psr/psr-7/)
+message implementation, several stream decorators, and some helpful
+functionality like query string parsing.
+
+
+[![Build Status](https://travis-ci.org/guzzle/psr7.svg?branch=master)](https://travis-ci.org/guzzle/psr7)
+
+
+# Stream implementation
+
+This package comes with a number of stream implementations and stream
+decorators.
+
+
+## AppendStream
+
+`GuzzleHttp\Psr7\AppendStream`
+
+Reads from multiple streams, one after the other.
+
+```php
+use GuzzleHttp\Psr7;
+
+$a = Psr7\stream_for('abc, ');
+$b = Psr7\stream_for('123.');
+$composed = new Psr7\AppendStream([$a, $b]);
+
+$composed->addStream(Psr7\stream_for(' Above all listen to me'));
+
+echo $composed; // abc, 123. Above all listen to me.
+```
+
+
+## BufferStream
+
+`GuzzleHttp\Psr7\BufferStream`
+
+Provides a buffer stream that can be written to fill a buffer, and read
+from to remove bytes from the buffer.
+
+This stream returns a "hwm" metadata value that tells upstream consumers
+what the configured high water mark of the stream is, or the maximum
+preferred size of the buffer.
+
+```php
+use GuzzleHttp\Psr7;
+
+// When more than 1024 bytes are in the buffer, it will begin returning
+// false to writes. This is an indication that writers should slow down.
+$buffer = new Psr7\BufferStream(1024);
+```
+
+
+## CachingStream
+
+The CachingStream is used to allow seeking over previously read bytes on
+non-seekable streams. This can be useful when transferring a non-seekable
+entity body fails due to needing to rewind the stream (for example, resulting
+from a redirect). Data that is read from the remote stream will be buffered in
+a PHP temp stream so that previously read bytes are cached first in memory,
+then on disk.
+
+```php
+use GuzzleHttp\Psr7;
+
+$original = Psr7\stream_for(fopen('http://www.google.com', 'r'));
+$stream = new Psr7\CachingStream($original);
+
+$stream->read(1024);
+echo $stream->tell();
+// 1024
+
+$stream->seek(0);
+echo $stream->tell();
+// 0
+```
+
+
+## DroppingStream
+
+`GuzzleHttp\Psr7\DroppingStream`
+
+Stream decorator that begins dropping data once the size of the underlying
+stream becomes too full.
+
+```php
+use GuzzleHttp\Psr7;
+
+// Create an empty stream
+$stream = Psr7\stream_for();
+
+// Start dropping data when the stream has more than 10 bytes
+$dropping = new Psr7\DroppingStream($stream, 10);
+
+$dropping->write('01234567890123456789');
+echo $stream; // 0123456789
+```
+
+
+## FnStream
+
+`GuzzleHttp\Psr7\FnStream`
+
+Compose stream implementations based on a hash of functions.
+
+Allows for easy testing and extension of a provided stream without needing
+to create a concrete class for a simple extension point.
+
+```php
+
+use GuzzleHttp\Psr7;
+
+$stream = Psr7\stream_for('hi');
+$fnStream = Psr7\FnStream::decorate($stream, [
+ 'rewind' => function () use ($stream) {
+ echo 'About to rewind - ';
+ $stream->rewind();
+ echo 'rewound!';
+ }
+]);
+
+$fnStream->rewind();
+// Outputs: About to rewind - rewound!
+```
+
+
+## InflateStream
+
+`GuzzleHttp\Psr7\InflateStream`
+
+Uses PHP's zlib.inflate filter to inflate deflate or gzipped content.
+
+This stream decorator skips the first 10 bytes of the given stream to remove
+the gzip header, converts the provided stream to a PHP stream resource,
+then appends the zlib.inflate filter. The stream is then converted back
+to a Guzzle stream resource to be used as a Guzzle stream.
+
+
+## LazyOpenStream
+
+`GuzzleHttp\Psr7\LazyOpenStream`
+
+Lazily reads or writes to a file that is opened only after an IO operation
+take place on the stream.
+
+```php
+use GuzzleHttp\Psr7;
+
+$stream = new Psr7\LazyOpenStream('/path/to/file', 'r');
+// The file has not yet been opened...
+
+echo $stream->read(10);
+// The file is opened and read from only when needed.
+```
+
+
+## LimitStream
+
+`GuzzleHttp\Psr7\LimitStream`
+
+LimitStream can be used to read a subset or slice of an existing stream object.
+This can be useful for breaking a large file into smaller pieces to be sent in
+chunks (e.g. Amazon S3's multipart upload API).
+
+```php
+use GuzzleHttp\Psr7;
+
+$original = Psr7\stream_for(fopen('/tmp/test.txt', 'r+'));
+echo $original->getSize();
+// >>> 1048576
+
+// Limit the size of the body to 1024 bytes and start reading from byte 2048
+$stream = new Psr7\LimitStream($original, 1024, 2048);
+echo $stream->getSize();
+// >>> 1024
+echo $stream->tell();
+// >>> 0
+```
+
+
+## MultipartStream
+
+`GuzzleHttp\Psr7\MultipartStream`
+
+Stream that when read returns bytes for a streaming multipart or
+multipart/form-data stream.
+
+
+## NoSeekStream
+
+`GuzzleHttp\Psr7\NoSeekStream`
+
+NoSeekStream wraps a stream and does not allow seeking.
+
+```php
+use GuzzleHttp\Psr7;
+
+$original = Psr7\stream_for('foo');
+$noSeek = new Psr7\NoSeekStream($original);
+
+echo $noSeek->read(3);
+// foo
+var_export($noSeek->isSeekable());
+// false
+$noSeek->seek(0);
+var_export($noSeek->read(3));
+// NULL
+```
+
+
+## PumpStream
+
+`GuzzleHttp\Psr7\PumpStream`
+
+Provides a read only stream that pumps data from a PHP callable.
+
+When invoking the provided callable, the PumpStream will pass the amount of
+data requested to read to the callable. The callable can choose to ignore
+this value and return fewer or more bytes than requested. Any extra data
+returned by the provided callable is buffered internally until drained using
+the read() function of the PumpStream. The provided callable MUST return
+false when there is no more data to read.
+
+
+## Implementing stream decorators
+
+Creating a stream decorator is very easy thanks to the
+`GuzzleHttp\Psr7\StreamDecoratorTrait`. This trait provides methods that
+implement `Psr\Http\Message\StreamInterface` by proxying to an underlying
+stream. Just `use` the `StreamDecoratorTrait` and implement your custom
+methods.
+
+For example, let's say we wanted to call a specific function each time the last
+byte is read from a stream. This could be implemented by overriding the
+`read()` method.
+
+```php
+use Psr\Http\Message\StreamInterface;
+use GuzzleHttp\Psr7\StreamDecoratorTrait;
+
+class EofCallbackStream implements StreamInterface
+{
+ use StreamDecoratorTrait;
+
+ private $callback;
+
+ public function __construct(StreamInterface $stream, callable $cb)
+ {
+ $this->stream = $stream;
+ $this->callback = $cb;
+ }
+
+ public function read($length)
+ {
+ $result = $this->stream->read($length);
+
+ // Invoke the callback when EOF is hit.
+ if ($this->eof()) {
+ call_user_func($this->callback);
+ }
+
+ return $result;
+ }
+}
+```
+
+This decorator could be added to any existing stream and used like so:
+
+```php
+use GuzzleHttp\Psr7;
+
+$original = Psr7\stream_for('foo');
+
+$eofStream = new EofCallbackStream($original, function () {
+ echo 'EOF!';
+});
+
+$eofStream->read(2);
+$eofStream->read(1);
+// echoes "EOF!"
+$eofStream->seek(0);
+$eofStream->read(3);
+// echoes "EOF!"
+```
+
+
+## PHP StreamWrapper
+
+You can use the `GuzzleHttp\Psr7\StreamWrapper` class if you need to use a
+PSR-7 stream as a PHP stream resource.
+
+Use the `GuzzleHttp\Psr7\StreamWrapper::getResource()` method to create a PHP
+stream from a PSR-7 stream.
+
+```php
+use GuzzleHttp\Psr7\StreamWrapper;
+
+$stream = GuzzleHttp\Psr7\stream_for('hello!');
+$resource = StreamWrapper::getResource($stream);
+echo fread($resource, 6); // outputs hello!
+```
+
+
+# Function API
+
+There are various functions available under the `GuzzleHttp\Psr7` namespace.
+
+
+## `function str`
+
+`function str(MessageInterface $message)`
+
+Returns the string representation of an HTTP message.
+
+```php
+$request = new GuzzleHttp\Psr7\Request('GET', 'http://example.com');
+echo GuzzleHttp\Psr7\str($request);
+```
+
+
+## `function uri_for`
+
+`function uri_for($uri)`
+
+This function accepts a string or `Psr\Http\Message\UriInterface` and returns a
+UriInterface for the given value. If the value is already a `UriInterface`, it
+is returned as-is.
+
+```php
+$uri = GuzzleHttp\Psr7\uri_for('http://example.com');
+assert($uri === GuzzleHttp\Psr7\uri_for($uri));
+```
+
+
+## `function stream_for`
+
+`function stream_for($resource = '', array $options = [])`
+
+Create a new stream based on the input type.
+
+Options is an associative array that can contain the following keys:
+
+* - metadata: Array of custom metadata.
+* - size: Size of the stream.
+
+This method accepts the following `$resource` types:
+
+- `Psr\Http\Message\StreamInterface`: Returns the value as-is.
+- `string`: Creates a stream object that uses the given string as the contents.
+- `resource`: Creates a stream object that wraps the given PHP stream resource.
+- `Iterator`: If the provided value implements `Iterator`, then a read-only
+ stream object will be created that wraps the given iterable. Each time the
+ stream is read from, data from the iterator will fill a buffer and will be
+ continuously called until the buffer is equal to the requested read size.
+ Subsequent read calls will first read from the buffer and then call `next`
+ on the underlying iterator until it is exhausted.
+- `object` with `__toString()`: If the object has the `__toString()` method,
+ the object will be cast to a string and then a stream will be returned that
+ uses the string value.
+- `NULL`: When `null` is passed, an empty stream object is returned.
+- `callable` When a callable is passed, a read-only stream object will be
+ created that invokes the given callable. The callable is invoked with the
+ number of suggested bytes to read. The callable can return any number of
+ bytes, but MUST return `false` when there is no more data to return. The
+ stream object that wraps the callable will invoke the callable until the
+ number of requested bytes are available. Any additional bytes will be
+ buffered and used in subsequent reads.
+
+```php
+$stream = GuzzleHttp\Psr7\stream_for('foo');
+$stream = GuzzleHttp\Psr7\stream_for(fopen('/path/to/file', 'r'));
+
+$generator function ($bytes) {
+ for ($i = 0; $i < $bytes; $i++) {
+ yield ' ';
+ }
+}
+
+$stream = GuzzleHttp\Psr7\stream_for($generator(100));
+```
+
+
+## `function parse_header`
+
+`function parse_header($header)`
+
+Parse an array of header values containing ";" separated data into an array of
+associative arrays representing the header key value pair data of the header.
+When a parameter does not contain a value, but just contains a key, this
+function will inject a key with a '' string value.
+
+
+## `function normalize_header`
+
+`function normalize_header($header)`
+
+Converts an array of header values that may contain comma separated headers
+into an array of headers with no comma separated values.
+
+
+## `function modify_request`
+
+`function modify_request(RequestInterface $request, array $changes)`
+
+Clone and modify a request with the given changes. This method is useful for
+reducing the number of clones needed to mutate a message.
+
+The changes can be one of:
+
+- method: (string) Changes the HTTP method.
+- set_headers: (array) Sets the given headers.
+- remove_headers: (array) Remove the given headers.
+- body: (mixed) Sets the given body.
+- uri: (UriInterface) Set the URI.
+- query: (string) Set the query string value of the URI.
+- version: (string) Set the protocol version.
+
+
+## `function rewind_body`
+
+`function rewind_body(MessageInterface $message)`
+
+Attempts to rewind a message body and throws an exception on failure. The body
+of the message will only be rewound if a call to `tell()` returns a value other
+than `0`.
+
+
+## `function try_fopen`
+
+`function try_fopen($filename, $mode)`
+
+Safely opens a PHP stream resource using a filename.
+
+When fopen fails, PHP normally raises a warning. This function adds an error
+handler that checks for errors and throws an exception instead.
+
+
+## `function copy_to_string`
+
+`function copy_to_string(StreamInterface $stream, $maxLen = -1)`
+
+Copy the contents of a stream into a string until the given number of bytes
+have been read.
+
+
+## `function copy_to_stream`
+
+`function copy_to_stream(StreamInterface $source, StreamInterface $dest, $maxLen = -1)`
+
+Copy the contents of a stream into another stream until the given number of
+bytes have been read.
+
+
+## `function hash`
+
+`function hash(StreamInterface $stream, $algo, $rawOutput = false)`
+
+Calculate a hash of a Stream. This method reads the entire stream to calculate
+a rolling hash (based on PHP's hash_init functions).
+
+
+## `function readline`
+
+`function readline(StreamInterface $stream, $maxLength = null)`
+
+Read a line from the stream up to the maximum allowed buffer length.
+
+
+## `function parse_request`
+
+`function parse_request($message)`
+
+Parses a request message string into a request object.
+
+
+## `function parse_response`
+
+`function parse_response($message)`
+
+Parses a response message string into a response object.
+
+
+## `function parse_query`
+
+`function parse_query($str, $urlEncoding = true)`
+
+Parse a query string into an associative array.
+
+If multiple values are found for the same key, the value of that key value pair
+will become an array. This function does not parse nested PHP style arrays into
+an associative array (e.g., `foo[a]=1&foo[b]=2` will be parsed into
+`['foo[a]' => '1', 'foo[b]' => '2']`).
+
+
+## `function build_query`
+
+`function build_query(array $params, $encoding = PHP_QUERY_RFC3986)`
+
+Build a query string from an array of key value pairs.
+
+This function can use the return value of parse_query() to build a query string.
+This function does not modify the provided keys when an array is encountered
+(like http_build_query would).
+
+
+## `function mimetype_from_filename`
+
+`function mimetype_from_filename($filename)`
+
+Determines the mimetype of a file by looking at its extension.
+
+
+## `function mimetype_from_extension`
+
+`function mimetype_from_extension($extension)`
+
+Maps a file extensions to a mimetype.
+
+
+# Additional URI Methods
+
+Aside from the standard `Psr\Http\Message\UriInterface` implementation in form of the `GuzzleHttp\Psr7\Uri` class,
+this library also provides additional functionality when working with URIs as static methods.
+
+## URI Types
+
+An instance of `Psr\Http\Message\UriInterface` can either be an absolute URI or a relative reference.
+An absolute URI has a scheme. A relative reference is used to express a URI relative to another URI,
+the base URI. Relative references can be divided into several forms according to
+[RFC 3986 Section 4.2](https://tools.ietf.org/html/rfc3986#section-4.2):
+
+- network-path references, e.g. `//example.com/path`
+- absolute-path references, e.g. `/path`
+- relative-path references, e.g. `subpath`
+
+The following methods can be used to identify the type of the URI.
+
+### `GuzzleHttp\Psr7\Uri::isAbsolute`
+
+`public static function isAbsolute(UriInterface $uri): bool`
+
+Whether the URI is absolute, i.e. it has a scheme.
+
+### `GuzzleHttp\Psr7\Uri::isNetworkPathReference`
+
+`public static function isNetworkPathReference(UriInterface $uri): bool`
+
+Whether the URI is a network-path reference. A relative reference that begins with two slash characters is
+termed an network-path reference.
+
+### `GuzzleHttp\Psr7\Uri::isAbsolutePathReference`
+
+`public static function isAbsolutePathReference(UriInterface $uri): bool`
+
+Whether the URI is a absolute-path reference. A relative reference that begins with a single slash character is
+termed an absolute-path reference.
+
+### `GuzzleHttp\Psr7\Uri::isRelativePathReference`
+
+`public static function isRelativePathReference(UriInterface $uri): bool`
+
+Whether the URI is a relative-path reference. A relative reference that does not begin with a slash character is
+termed a relative-path reference.
+
+### `GuzzleHttp\Psr7\Uri::isSameDocumentReference`
+
+`public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool`
+
+Whether the URI is a same-document reference. A same-document reference refers to a URI that is, aside from its
+fragment component, identical to the base URI. When no base URI is given, only an empty URI reference
+(apart from its fragment) is considered a same-document reference.
+
+## URI Components
+
+Additional methods to work with URI components.
+
+### `GuzzleHttp\Psr7\Uri::isDefaultPort`
+
+`public static function isDefaultPort(UriInterface $uri): bool`
+
+Whether the URI has the default port of the current scheme. `Psr\Http\Message\UriInterface::getPort` may return null
+or the standard port. This method can be used independently of the implementation.
+
+### `GuzzleHttp\Psr7\Uri::composeComponents`
+
+`public static function composeComponents($scheme, $authority, $path, $query, $fragment): string`
+
+Composes a URI reference string from its various components according to
+[RFC 3986 Section 5.3](https://tools.ietf.org/html/rfc3986#section-5.3). Usually this method does not need to be called
+manually but instead is used indirectly via `Psr\Http\Message\UriInterface::__toString`.
+
+### `GuzzleHttp\Psr7\Uri::fromParts`
+
+`public static function fromParts(array $parts): UriInterface`
+
+Creates a URI from a hash of [`parse_url`](http://php.net/manual/en/function.parse-url.php) components.
+
+
+### `GuzzleHttp\Psr7\Uri::withQueryValue`
+
+`public static function withQueryValue(UriInterface $uri, $key, $value): UriInterface`
+
+Creates a new URI with a specific query string value. Any existing query string values that exactly match the
+provided key are removed and replaced with the given key value pair. A value of null will set the query string
+key without a value, e.g. "key" instead of "key=value".
+
+
+### `GuzzleHttp\Psr7\Uri::withoutQueryValue`
+
+`public static function withoutQueryValue(UriInterface $uri, $key): UriInterface`
+
+Creates a new URI with a specific query string value removed. Any existing query string values that exactly match the
+provided key are removed.
+
+## Reference Resolution
+
+`GuzzleHttp\Psr7\UriResolver` provides methods to resolve a URI reference in the context of a base URI according
+to [RFC 3986 Section 5](https://tools.ietf.org/html/rfc3986#section-5). This is for example also what web browsers
+do when resolving a link in a website based on the current request URI.
+
+### `GuzzleHttp\Psr7\UriResolver::resolve`
+
+`public static function resolve(UriInterface $base, UriInterface $rel): UriInterface`
+
+Converts the relative URI into a new URI that is resolved against the base URI.
+
+### `GuzzleHttp\Psr7\UriResolver::removeDotSegments`
+
+`public static function removeDotSegments(string $path): string`
+
+Removes dot segments from a path and returns the new path according to
+[RFC 3986 Section 5.2.4](https://tools.ietf.org/html/rfc3986#section-5.2.4).
+
+### `GuzzleHttp\Psr7\UriResolver::relativize`
+
+`public static function relativize(UriInterface $base, UriInterface $target): UriInterface`
+
+Returns the target URI as a relative reference from the base URI. This method is the counterpart to resolve():
+
+```php
+(string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target))
+```
+
+One use-case is to use the current request URI as base URI and then generate relative links in your documents
+to reduce the document size or offer self-contained downloadable document archives.
+
+```php
+$base = new Uri('http://example.com/a/b/');
+echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'.
+echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'.
+echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'.
+echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'.
+```
+
+## Normalization and Comparison
+
+`GuzzleHttp\Psr7\UriNormalizer` provides methods to normalize and compare URIs according to
+[RFC 3986 Section 6](https://tools.ietf.org/html/rfc3986#section-6).
+
+### `GuzzleHttp\Psr7\UriNormalizer::normalize`
+
+`public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS): UriInterface`
+
+Returns a normalized URI. The scheme and host component are already normalized to lowercase per PSR-7 UriInterface.
+This methods adds additional normalizations that can be configured with the `$flags` parameter which is a bitmask
+of normalizations to apply. The following normalizations are available:
+
+- `UriNormalizer::PRESERVING_NORMALIZATIONS`
+
+ Default normalizations which only include the ones that preserve semantics.
+
+- `UriNormalizer::CAPITALIZE_PERCENT_ENCODING`
+
+ All letters within a percent-encoding triplet (e.g., "%3A") are case-insensitive, and should be capitalized.
+
+ Example: `http://example.org/a%c2%b1b` → `http://example.org/a%C2%B1b`
+
+- `UriNormalizer::DECODE_UNRESERVED_CHARACTERS`
+
+ Decodes percent-encoded octets of unreserved characters. For consistency, percent-encoded octets in the ranges of
+ ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39), hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should
+ not be created by URI producers and, when found in a URI, should be decoded to their corresponding unreserved
+ characters by URI normalizers.
+
+ Example: `http://example.org/%7Eusern%61me/` → `http://example.org/~username/`
+
+- `UriNormalizer::CONVERT_EMPTY_PATH`
+
+ Converts the empty path to "/" for http and https URIs.
+
+ Example: `http://example.org` → `http://example.org/`
+
+- `UriNormalizer::REMOVE_DEFAULT_HOST`
+
+ Removes the default host of the given URI scheme from the URI. Only the "file" scheme defines the default host
+ "localhost". All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile` are equivalent according to
+ RFC 3986.
+
+ Example: `file://localhost/myfile` → `file:///myfile`
+
+- `UriNormalizer::REMOVE_DEFAULT_PORT`
+
+ Removes the default port of the given URI scheme from the URI.
+
+ Example: `http://example.org:80/` → `http://example.org/`
+
+- `UriNormalizer::REMOVE_DOT_SEGMENTS`
+
+ Removes unnecessary dot-segments. Dot-segments in relative-path references are not removed as it would
+ change the semantics of the URI reference.
+
+ Example: `http://example.org/../a/b/../c/./d.html` → `http://example.org/a/c/d.html`
+
+- `UriNormalizer::REMOVE_DUPLICATE_SLASHES`
+
+ Paths which include two or more adjacent slashes are converted to one. Webservers usually ignore duplicate slashes
+ and treat those URIs equivalent. But in theory those URIs do not need to be equivalent. So this normalization
+ may change the semantics. Encoded slashes (%2F) are not removed.
+
+ Example: `http://example.org//foo///bar.html` → `http://example.org/foo/bar.html`
+
+- `UriNormalizer::SORT_QUERY_PARAMETERS`
+
+ Sort query parameters with their values in alphabetical order. However, the order of parameters in a URI may be
+ significant (this is not defined by the standard). So this normalization is not safe and may change the semantics
+ of the URI.
+
+ Example: `?lang=en&article=fred` → `?article=fred&lang=en`
+
+### `GuzzleHttp\Psr7\UriNormalizer::isEquivalent`
+
+`public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS): bool`
+
+Whether two URIs can be considered equivalent. Both URIs are normalized automatically before comparison with the given
+`$normalizations` bitmask. The method also accepts relative URI references and returns true when they are equivalent.
+This of course assumes they will be resolved against the same base URI. If this is not the case, determination of
+equivalence or difference of relative references does not mean anything.
diff --git a/vendor/guzzlehttp/psr7/composer.json b/vendor/guzzlehttp/psr7/composer.json
new file mode 100644
index 0000000000..b1c5a90ba7
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/composer.json
@@ -0,0 +1,39 @@
+{
+ "name": "guzzlehttp/psr7",
+ "type": "library",
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": ["request", "response", "message", "stream", "http", "uri", "url"],
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Schultze",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "require": {
+ "php": ">=5.4.0",
+ "psr/http-message": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ },
+ "files": ["src/functions_include.php"]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/AppendStream.php b/vendor/guzzlehttp/psr7/src/AppendStream.php
new file mode 100644
index 0000000000..23039fd794
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/AppendStream.php
@@ -0,0 +1,233 @@
+addStream($stream);
+ }
+ }
+
+ public function __toString()
+ {
+ try {
+ $this->rewind();
+ return $this->getContents();
+ } catch (\Exception $e) {
+ return '';
+ }
+ }
+
+ /**
+ * Add a stream to the AppendStream
+ *
+ * @param StreamInterface $stream Stream to append. Must be readable.
+ *
+ * @throws \InvalidArgumentException if the stream is not readable
+ */
+ public function addStream(StreamInterface $stream)
+ {
+ if (!$stream->isReadable()) {
+ throw new \InvalidArgumentException('Each stream must be readable');
+ }
+
+ // The stream is only seekable if all streams are seekable
+ if (!$stream->isSeekable()) {
+ $this->seekable = false;
+ }
+
+ $this->streams[] = $stream;
+ }
+
+ public function getContents()
+ {
+ return copy_to_string($this);
+ }
+
+ /**
+ * Closes each attached stream.
+ *
+ * {@inheritdoc}
+ */
+ public function close()
+ {
+ $this->pos = $this->current = 0;
+
+ foreach ($this->streams as $stream) {
+ $stream->close();
+ }
+
+ $this->streams = [];
+ }
+
+ /**
+ * Detaches each attached stream
+ *
+ * {@inheritdoc}
+ */
+ public function detach()
+ {
+ $this->close();
+ $this->detached = true;
+ }
+
+ public function tell()
+ {
+ return $this->pos;
+ }
+
+ /**
+ * Tries to calculate the size by adding the size of each stream.
+ *
+ * If any of the streams do not return a valid number, then the size of the
+ * append stream cannot be determined and null is returned.
+ *
+ * {@inheritdoc}
+ */
+ public function getSize()
+ {
+ $size = 0;
+
+ foreach ($this->streams as $stream) {
+ $s = $stream->getSize();
+ if ($s === null) {
+ return null;
+ }
+ $size += $s;
+ }
+
+ return $size;
+ }
+
+ public function eof()
+ {
+ return !$this->streams ||
+ ($this->current >= count($this->streams) - 1 &&
+ $this->streams[$this->current]->eof());
+ }
+
+ public function rewind()
+ {
+ $this->seek(0);
+ }
+
+ /**
+ * Attempts to seek to the given position. Only supports SEEK_SET.
+ *
+ * {@inheritdoc}
+ */
+ public function seek($offset, $whence = SEEK_SET)
+ {
+ if (!$this->seekable) {
+ throw new \RuntimeException('This AppendStream is not seekable');
+ } elseif ($whence !== SEEK_SET) {
+ throw new \RuntimeException('The AppendStream can only seek with SEEK_SET');
+ }
+
+ $this->pos = $this->current = 0;
+
+ // Rewind each stream
+ foreach ($this->streams as $i => $stream) {
+ try {
+ $stream->rewind();
+ } catch (\Exception $e) {
+ throw new \RuntimeException('Unable to seek stream '
+ . $i . ' of the AppendStream', 0, $e);
+ }
+ }
+
+ // Seek to the actual position by reading from each stream
+ while ($this->pos < $offset && !$this->eof()) {
+ $result = $this->read(min(8096, $offset - $this->pos));
+ if ($result === '') {
+ break;
+ }
+ }
+ }
+
+ /**
+ * Reads from all of the appended streams until the length is met or EOF.
+ *
+ * {@inheritdoc}
+ */
+ public function read($length)
+ {
+ $buffer = '';
+ $total = count($this->streams) - 1;
+ $remaining = $length;
+ $progressToNext = false;
+
+ while ($remaining > 0) {
+
+ // Progress to the next stream if needed.
+ if ($progressToNext || $this->streams[$this->current]->eof()) {
+ $progressToNext = false;
+ if ($this->current === $total) {
+ break;
+ }
+ $this->current++;
+ }
+
+ $result = $this->streams[$this->current]->read($remaining);
+
+ // Using a loose comparison here to match on '', false, and null
+ if ($result == null) {
+ $progressToNext = true;
+ continue;
+ }
+
+ $buffer .= $result;
+ $remaining = $length - strlen($buffer);
+ }
+
+ $this->pos += strlen($buffer);
+
+ return $buffer;
+ }
+
+ public function isReadable()
+ {
+ return true;
+ }
+
+ public function isWritable()
+ {
+ return false;
+ }
+
+ public function isSeekable()
+ {
+ return $this->seekable;
+ }
+
+ public function write($string)
+ {
+ throw new \RuntimeException('Cannot write to an AppendStream');
+ }
+
+ public function getMetadata($key = null)
+ {
+ return $key ? null : [];
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/BufferStream.php b/vendor/guzzlehttp/psr7/src/BufferStream.php
new file mode 100644
index 0000000000..af4d4c2277
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/BufferStream.php
@@ -0,0 +1,137 @@
+hwm = $hwm;
+ }
+
+ public function __toString()
+ {
+ return $this->getContents();
+ }
+
+ public function getContents()
+ {
+ $buffer = $this->buffer;
+ $this->buffer = '';
+
+ return $buffer;
+ }
+
+ public function close()
+ {
+ $this->buffer = '';
+ }
+
+ public function detach()
+ {
+ $this->close();
+ }
+
+ public function getSize()
+ {
+ return strlen($this->buffer);
+ }
+
+ public function isReadable()
+ {
+ return true;
+ }
+
+ public function isWritable()
+ {
+ return true;
+ }
+
+ public function isSeekable()
+ {
+ return false;
+ }
+
+ public function rewind()
+ {
+ $this->seek(0);
+ }
+
+ public function seek($offset, $whence = SEEK_SET)
+ {
+ throw new \RuntimeException('Cannot seek a BufferStream');
+ }
+
+ public function eof()
+ {
+ return strlen($this->buffer) === 0;
+ }
+
+ public function tell()
+ {
+ throw new \RuntimeException('Cannot determine the position of a BufferStream');
+ }
+
+ /**
+ * Reads data from the buffer.
+ */
+ public function read($length)
+ {
+ $currentLength = strlen($this->buffer);
+
+ if ($length >= $currentLength) {
+ // No need to slice the buffer because we don't have enough data.
+ $result = $this->buffer;
+ $this->buffer = '';
+ } else {
+ // Slice up the result to provide a subset of the buffer.
+ $result = substr($this->buffer, 0, $length);
+ $this->buffer = substr($this->buffer, $length);
+ }
+
+ return $result;
+ }
+
+ /**
+ * Writes data to the buffer.
+ */
+ public function write($string)
+ {
+ $this->buffer .= $string;
+
+ // TODO: What should happen here?
+ if (strlen($this->buffer) >= $this->hwm) {
+ return false;
+ }
+
+ return strlen($string);
+ }
+
+ public function getMetadata($key = null)
+ {
+ if ($key == 'hwm') {
+ return $this->hwm;
+ }
+
+ return $key ? null : [];
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/CachingStream.php b/vendor/guzzlehttp/psr7/src/CachingStream.php
new file mode 100644
index 0000000000..ed68f0861a
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/CachingStream.php
@@ -0,0 +1,138 @@
+remoteStream = $stream;
+ $this->stream = $target ?: new Stream(fopen('php://temp', 'r+'));
+ }
+
+ public function getSize()
+ {
+ return max($this->stream->getSize(), $this->remoteStream->getSize());
+ }
+
+ public function rewind()
+ {
+ $this->seek(0);
+ }
+
+ public function seek($offset, $whence = SEEK_SET)
+ {
+ if ($whence == SEEK_SET) {
+ $byte = $offset;
+ } elseif ($whence == SEEK_CUR) {
+ $byte = $offset + $this->tell();
+ } elseif ($whence == SEEK_END) {
+ $size = $this->remoteStream->getSize();
+ if ($size === null) {
+ $size = $this->cacheEntireStream();
+ }
+ $byte = $size + $offset;
+ } else {
+ throw new \InvalidArgumentException('Invalid whence');
+ }
+
+ $diff = $byte - $this->stream->getSize();
+
+ if ($diff > 0) {
+ // Read the remoteStream until we have read in at least the amount
+ // of bytes requested, or we reach the end of the file.
+ while ($diff > 0 && !$this->remoteStream->eof()) {
+ $this->read($diff);
+ $diff = $byte - $this->stream->getSize();
+ }
+ } else {
+ // We can just do a normal seek since we've already seen this byte.
+ $this->stream->seek($byte);
+ }
+ }
+
+ public function read($length)
+ {
+ // Perform a regular read on any previously read data from the buffer
+ $data = $this->stream->read($length);
+ $remaining = $length - strlen($data);
+
+ // More data was requested so read from the remote stream
+ if ($remaining) {
+ // If data was written to the buffer in a position that would have
+ // been filled from the remote stream, then we must skip bytes on
+ // the remote stream to emulate overwriting bytes from that
+ // position. This mimics the behavior of other PHP stream wrappers.
+ $remoteData = $this->remoteStream->read(
+ $remaining + $this->skipReadBytes
+ );
+
+ if ($this->skipReadBytes) {
+ $len = strlen($remoteData);
+ $remoteData = substr($remoteData, $this->skipReadBytes);
+ $this->skipReadBytes = max(0, $this->skipReadBytes - $len);
+ }
+
+ $data .= $remoteData;
+ $this->stream->write($remoteData);
+ }
+
+ return $data;
+ }
+
+ public function write($string)
+ {
+ // When appending to the end of the currently read stream, you'll want
+ // to skip bytes from being read from the remote stream to emulate
+ // other stream wrappers. Basically replacing bytes of data of a fixed
+ // length.
+ $overflow = (strlen($string) + $this->tell()) - $this->remoteStream->tell();
+ if ($overflow > 0) {
+ $this->skipReadBytes += $overflow;
+ }
+
+ return $this->stream->write($string);
+ }
+
+ public function eof()
+ {
+ return $this->stream->eof() && $this->remoteStream->eof();
+ }
+
+ /**
+ * Close both the remote stream and buffer stream
+ */
+ public function close()
+ {
+ $this->remoteStream->close() && $this->stream->close();
+ }
+
+ private function cacheEntireStream()
+ {
+ $target = new FnStream(['write' => 'strlen']);
+ copy_to_stream($this, $target);
+
+ return $this->tell();
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/DroppingStream.php b/vendor/guzzlehttp/psr7/src/DroppingStream.php
new file mode 100644
index 0000000000..8935c80d72
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/DroppingStream.php
@@ -0,0 +1,42 @@
+stream = $stream;
+ $this->maxLength = $maxLength;
+ }
+
+ public function write($string)
+ {
+ $diff = $this->maxLength - $this->stream->getSize();
+
+ // Begin returning 0 when the underlying stream is too large.
+ if ($diff <= 0) {
+ return 0;
+ }
+
+ // Write the stream or a subset of the stream if needed.
+ if (strlen($string) < $diff) {
+ return $this->stream->write($string);
+ }
+
+ return $this->stream->write(substr($string, 0, $diff));
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/FnStream.php b/vendor/guzzlehttp/psr7/src/FnStream.php
new file mode 100644
index 0000000000..cc9b4453f7
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/FnStream.php
@@ -0,0 +1,149 @@
+methods = $methods;
+
+ // Create the functions on the class
+ foreach ($methods as $name => $fn) {
+ $this->{'_fn_' . $name} = $fn;
+ }
+ }
+
+ /**
+ * Lazily determine which methods are not implemented.
+ * @throws \BadMethodCallException
+ */
+ public function __get($name)
+ {
+ throw new \BadMethodCallException(str_replace('_fn_', '', $name)
+ . '() is not implemented in the FnStream');
+ }
+
+ /**
+ * The close method is called on the underlying stream only if possible.
+ */
+ public function __destruct()
+ {
+ if (isset($this->_fn_close)) {
+ call_user_func($this->_fn_close);
+ }
+ }
+
+ /**
+ * Adds custom functionality to an underlying stream by intercepting
+ * specific method calls.
+ *
+ * @param StreamInterface $stream Stream to decorate
+ * @param array $methods Hash of method name to a closure
+ *
+ * @return FnStream
+ */
+ public static function decorate(StreamInterface $stream, array $methods)
+ {
+ // If any of the required methods were not provided, then simply
+ // proxy to the decorated stream.
+ foreach (array_diff(self::$slots, array_keys($methods)) as $diff) {
+ $methods[$diff] = [$stream, $diff];
+ }
+
+ return new self($methods);
+ }
+
+ public function __toString()
+ {
+ return call_user_func($this->_fn___toString);
+ }
+
+ public function close()
+ {
+ return call_user_func($this->_fn_close);
+ }
+
+ public function detach()
+ {
+ return call_user_func($this->_fn_detach);
+ }
+
+ public function getSize()
+ {
+ return call_user_func($this->_fn_getSize);
+ }
+
+ public function tell()
+ {
+ return call_user_func($this->_fn_tell);
+ }
+
+ public function eof()
+ {
+ return call_user_func($this->_fn_eof);
+ }
+
+ public function isSeekable()
+ {
+ return call_user_func($this->_fn_isSeekable);
+ }
+
+ public function rewind()
+ {
+ call_user_func($this->_fn_rewind);
+ }
+
+ public function seek($offset, $whence = SEEK_SET)
+ {
+ call_user_func($this->_fn_seek, $offset, $whence);
+ }
+
+ public function isWritable()
+ {
+ return call_user_func($this->_fn_isWritable);
+ }
+
+ public function write($string)
+ {
+ return call_user_func($this->_fn_write, $string);
+ }
+
+ public function isReadable()
+ {
+ return call_user_func($this->_fn_isReadable);
+ }
+
+ public function read($length)
+ {
+ return call_user_func($this->_fn_read, $length);
+ }
+
+ public function getContents()
+ {
+ return call_user_func($this->_fn_getContents);
+ }
+
+ public function getMetadata($key = null)
+ {
+ return call_user_func($this->_fn_getMetadata, $key);
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/InflateStream.php b/vendor/guzzlehttp/psr7/src/InflateStream.php
new file mode 100644
index 0000000000..0051d3fec5
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/InflateStream.php
@@ -0,0 +1,52 @@
+read(10);
+ $filenameHeaderLength = $this->getLengthOfPossibleFilenameHeader($stream, $header);
+ // Skip the header, that is 10 + length of filename + 1 (nil) bytes
+ $stream = new LimitStream($stream, -1, 10 + $filenameHeaderLength);
+ $resource = StreamWrapper::getResource($stream);
+ stream_filter_append($resource, 'zlib.inflate', STREAM_FILTER_READ);
+ $this->stream = new Stream($resource);
+ }
+
+ /**
+ * @param StreamInterface $stream
+ * @param $header
+ * @return int
+ */
+ private function getLengthOfPossibleFilenameHeader(StreamInterface $stream, $header)
+ {
+ $filename_header_length = 0;
+
+ if (substr(bin2hex($header), 6, 2) === '08') {
+ // we have a filename, read until nil
+ $filename_header_length = 1;
+ while ($stream->read(1) !== chr(0)) {
+ $filename_header_length++;
+ }
+ }
+
+ return $filename_header_length;
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/LazyOpenStream.php b/vendor/guzzlehttp/psr7/src/LazyOpenStream.php
new file mode 100644
index 0000000000..02cec3af49
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/LazyOpenStream.php
@@ -0,0 +1,39 @@
+filename = $filename;
+ $this->mode = $mode;
+ }
+
+ /**
+ * Creates the underlying stream lazily when required.
+ *
+ * @return StreamInterface
+ */
+ protected function createStream()
+ {
+ return stream_for(try_fopen($this->filename, $this->mode));
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/LimitStream.php b/vendor/guzzlehttp/psr7/src/LimitStream.php
new file mode 100644
index 0000000000..3c13d4f411
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/LimitStream.php
@@ -0,0 +1,155 @@
+stream = $stream;
+ $this->setLimit($limit);
+ $this->setOffset($offset);
+ }
+
+ public function eof()
+ {
+ // Always return true if the underlying stream is EOF
+ if ($this->stream->eof()) {
+ return true;
+ }
+
+ // No limit and the underlying stream is not at EOF
+ if ($this->limit == -1) {
+ return false;
+ }
+
+ return $this->stream->tell() >= $this->offset + $this->limit;
+ }
+
+ /**
+ * Returns the size of the limited subset of data
+ * {@inheritdoc}
+ */
+ public function getSize()
+ {
+ if (null === ($length = $this->stream->getSize())) {
+ return null;
+ } elseif ($this->limit == -1) {
+ return $length - $this->offset;
+ } else {
+ return min($this->limit, $length - $this->offset);
+ }
+ }
+
+ /**
+ * Allow for a bounded seek on the read limited stream
+ * {@inheritdoc}
+ */
+ public function seek($offset, $whence = SEEK_SET)
+ {
+ if ($whence !== SEEK_SET || $offset < 0) {
+ throw new \RuntimeException(sprintf(
+ 'Cannot seek to offset % with whence %s',
+ $offset,
+ $whence
+ ));
+ }
+
+ $offset += $this->offset;
+
+ if ($this->limit !== -1) {
+ if ($offset > $this->offset + $this->limit) {
+ $offset = $this->offset + $this->limit;
+ }
+ }
+
+ $this->stream->seek($offset);
+ }
+
+ /**
+ * Give a relative tell()
+ * {@inheritdoc}
+ */
+ public function tell()
+ {
+ return $this->stream->tell() - $this->offset;
+ }
+
+ /**
+ * Set the offset to start limiting from
+ *
+ * @param int $offset Offset to seek to and begin byte limiting from
+ *
+ * @throws \RuntimeException if the stream cannot be seeked.
+ */
+ public function setOffset($offset)
+ {
+ $current = $this->stream->tell();
+
+ if ($current !== $offset) {
+ // If the stream cannot seek to the offset position, then read to it
+ if ($this->stream->isSeekable()) {
+ $this->stream->seek($offset);
+ } elseif ($current > $offset) {
+ throw new \RuntimeException("Could not seek to stream offset $offset");
+ } else {
+ $this->stream->read($offset - $current);
+ }
+ }
+
+ $this->offset = $offset;
+ }
+
+ /**
+ * Set the limit of bytes that the decorator allows to be read from the
+ * stream.
+ *
+ * @param int $limit Number of bytes to allow to be read from the stream.
+ * Use -1 for no limit.
+ */
+ public function setLimit($limit)
+ {
+ $this->limit = $limit;
+ }
+
+ public function read($length)
+ {
+ if ($this->limit == -1) {
+ return $this->stream->read($length);
+ }
+
+ // Check if the current position is less than the total allowed
+ // bytes + original offset
+ $remaining = ($this->offset + $this->limit) - $this->stream->tell();
+ if ($remaining > 0) {
+ // Only return the amount of requested data, ensuring that the byte
+ // limit is not exceeded
+ return $this->stream->read(min($remaining, $length));
+ }
+
+ return '';
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/MessageTrait.php b/vendor/guzzlehttp/psr7/src/MessageTrait.php
new file mode 100644
index 0000000000..1e4da649ad
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/MessageTrait.php
@@ -0,0 +1,183 @@
+ array of values */
+ private $headers = [];
+
+ /** @var array Map of lowercase header name => original name at registration */
+ private $headerNames = [];
+
+ /** @var string */
+ private $protocol = '1.1';
+
+ /** @var StreamInterface */
+ private $stream;
+
+ public function getProtocolVersion()
+ {
+ return $this->protocol;
+ }
+
+ public function withProtocolVersion($version)
+ {
+ if ($this->protocol === $version) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->protocol = $version;
+ return $new;
+ }
+
+ public function getHeaders()
+ {
+ return $this->headers;
+ }
+
+ public function hasHeader($header)
+ {
+ return isset($this->headerNames[strtolower($header)]);
+ }
+
+ public function getHeader($header)
+ {
+ $header = strtolower($header);
+
+ if (!isset($this->headerNames[$header])) {
+ return [];
+ }
+
+ $header = $this->headerNames[$header];
+
+ return $this->headers[$header];
+ }
+
+ public function getHeaderLine($header)
+ {
+ return implode(', ', $this->getHeader($header));
+ }
+
+ public function withHeader($header, $value)
+ {
+ if (!is_array($value)) {
+ $value = [$value];
+ }
+
+ $value = $this->trimHeaderValues($value);
+ $normalized = strtolower($header);
+
+ $new = clone $this;
+ if (isset($new->headerNames[$normalized])) {
+ unset($new->headers[$new->headerNames[$normalized]]);
+ }
+ $new->headerNames[$normalized] = $header;
+ $new->headers[$header] = $value;
+
+ return $new;
+ }
+
+ public function withAddedHeader($header, $value)
+ {
+ if (!is_array($value)) {
+ $value = [$value];
+ }
+
+ $value = $this->trimHeaderValues($value);
+ $normalized = strtolower($header);
+
+ $new = clone $this;
+ if (isset($new->headerNames[$normalized])) {
+ $header = $this->headerNames[$normalized];
+ $new->headers[$header] = array_merge($this->headers[$header], $value);
+ } else {
+ $new->headerNames[$normalized] = $header;
+ $new->headers[$header] = $value;
+ }
+
+ return $new;
+ }
+
+ public function withoutHeader($header)
+ {
+ $normalized = strtolower($header);
+
+ if (!isset($this->headerNames[$normalized])) {
+ return $this;
+ }
+
+ $header = $this->headerNames[$normalized];
+
+ $new = clone $this;
+ unset($new->headers[$header], $new->headerNames[$normalized]);
+
+ return $new;
+ }
+
+ public function getBody()
+ {
+ if (!$this->stream) {
+ $this->stream = stream_for('');
+ }
+
+ return $this->stream;
+ }
+
+ public function withBody(StreamInterface $body)
+ {
+ if ($body === $this->stream) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->stream = $body;
+ return $new;
+ }
+
+ private function setHeaders(array $headers)
+ {
+ $this->headerNames = $this->headers = [];
+ foreach ($headers as $header => $value) {
+ if (!is_array($value)) {
+ $value = [$value];
+ }
+
+ $value = $this->trimHeaderValues($value);
+ $normalized = strtolower($header);
+ if (isset($this->headerNames[$normalized])) {
+ $header = $this->headerNames[$normalized];
+ $this->headers[$header] = array_merge($this->headers[$header], $value);
+ } else {
+ $this->headerNames[$normalized] = $header;
+ $this->headers[$header] = $value;
+ }
+ }
+ }
+
+ /**
+ * Trims whitespace from the header values.
+ *
+ * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field.
+ *
+ * header-field = field-name ":" OWS field-value OWS
+ * OWS = *( SP / HTAB )
+ *
+ * @param string[] $values Header values
+ *
+ * @return string[] Trimmed header values
+ *
+ * @see https://tools.ietf.org/html/rfc7230#section-3.2.4
+ */
+ private function trimHeaderValues(array $values)
+ {
+ return array_map(function ($value) {
+ return trim($value, " \t");
+ }, $values);
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/MultipartStream.php b/vendor/guzzlehttp/psr7/src/MultipartStream.php
new file mode 100644
index 0000000000..c0fd584f75
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/MultipartStream.php
@@ -0,0 +1,153 @@
+boundary = $boundary ?: sha1(uniqid('', true));
+ $this->stream = $this->createStream($elements);
+ }
+
+ /**
+ * Get the boundary
+ *
+ * @return string
+ */
+ public function getBoundary()
+ {
+ return $this->boundary;
+ }
+
+ public function isWritable()
+ {
+ return false;
+ }
+
+ /**
+ * Get the headers needed before transferring the content of a POST file
+ */
+ private function getHeaders(array $headers)
+ {
+ $str = '';
+ foreach ($headers as $key => $value) {
+ $str .= "{$key}: {$value}\r\n";
+ }
+
+ return "--{$this->boundary}\r\n" . trim($str) . "\r\n\r\n";
+ }
+
+ /**
+ * Create the aggregate stream that will be used to upload the POST data
+ */
+ protected function createStream(array $elements)
+ {
+ $stream = new AppendStream();
+
+ foreach ($elements as $element) {
+ $this->addElement($stream, $element);
+ }
+
+ // Add the trailing boundary with CRLF
+ $stream->addStream(stream_for("--{$this->boundary}--\r\n"));
+
+ return $stream;
+ }
+
+ private function addElement(AppendStream $stream, array $element)
+ {
+ foreach (['contents', 'name'] as $key) {
+ if (!array_key_exists($key, $element)) {
+ throw new \InvalidArgumentException("A '{$key}' key is required");
+ }
+ }
+
+ $element['contents'] = stream_for($element['contents']);
+
+ if (empty($element['filename'])) {
+ $uri = $element['contents']->getMetadata('uri');
+ if (substr($uri, 0, 6) !== 'php://') {
+ $element['filename'] = $uri;
+ }
+ }
+
+ list($body, $headers) = $this->createElement(
+ $element['name'],
+ $element['contents'],
+ isset($element['filename']) ? $element['filename'] : null,
+ isset($element['headers']) ? $element['headers'] : []
+ );
+
+ $stream->addStream(stream_for($this->getHeaders($headers)));
+ $stream->addStream($body);
+ $stream->addStream(stream_for("\r\n"));
+ }
+
+ /**
+ * @return array
+ */
+ private function createElement($name, StreamInterface $stream, $filename, array $headers)
+ {
+ // Set a default content-disposition header if one was no provided
+ $disposition = $this->getHeader($headers, 'content-disposition');
+ if (!$disposition) {
+ $headers['Content-Disposition'] = ($filename === '0' || $filename)
+ ? sprintf('form-data; name="%s"; filename="%s"',
+ $name,
+ basename($filename))
+ : "form-data; name=\"{$name}\"";
+ }
+
+ // Set a default content-length header if one was no provided
+ $length = $this->getHeader($headers, 'content-length');
+ if (!$length) {
+ if ($length = $stream->getSize()) {
+ $headers['Content-Length'] = (string) $length;
+ }
+ }
+
+ // Set a default Content-Type if one was not supplied
+ $type = $this->getHeader($headers, 'content-type');
+ if (!$type && ($filename === '0' || $filename)) {
+ if ($type = mimetype_from_filename($filename)) {
+ $headers['Content-Type'] = $type;
+ }
+ }
+
+ return [$stream, $headers];
+ }
+
+ private function getHeader(array $headers, $key)
+ {
+ $lowercaseHeader = strtolower($key);
+ foreach ($headers as $k => $v) {
+ if (strtolower($k) === $lowercaseHeader) {
+ return $v;
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/NoSeekStream.php b/vendor/guzzlehttp/psr7/src/NoSeekStream.php
new file mode 100644
index 0000000000..233221805e
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/NoSeekStream.php
@@ -0,0 +1,22 @@
+source = $source;
+ $this->size = isset($options['size']) ? $options['size'] : null;
+ $this->metadata = isset($options['metadata']) ? $options['metadata'] : [];
+ $this->buffer = new BufferStream();
+ }
+
+ public function __toString()
+ {
+ try {
+ return copy_to_string($this);
+ } catch (\Exception $e) {
+ return '';
+ }
+ }
+
+ public function close()
+ {
+ $this->detach();
+ }
+
+ public function detach()
+ {
+ $this->tellPos = false;
+ $this->source = null;
+ }
+
+ public function getSize()
+ {
+ return $this->size;
+ }
+
+ public function tell()
+ {
+ return $this->tellPos;
+ }
+
+ public function eof()
+ {
+ return !$this->source;
+ }
+
+ public function isSeekable()
+ {
+ return false;
+ }
+
+ public function rewind()
+ {
+ $this->seek(0);
+ }
+
+ public function seek($offset, $whence = SEEK_SET)
+ {
+ throw new \RuntimeException('Cannot seek a PumpStream');
+ }
+
+ public function isWritable()
+ {
+ return false;
+ }
+
+ public function write($string)
+ {
+ throw new \RuntimeException('Cannot write to a PumpStream');
+ }
+
+ public function isReadable()
+ {
+ return true;
+ }
+
+ public function read($length)
+ {
+ $data = $this->buffer->read($length);
+ $readLen = strlen($data);
+ $this->tellPos += $readLen;
+ $remaining = $length - $readLen;
+
+ if ($remaining) {
+ $this->pump($remaining);
+ $data .= $this->buffer->read($remaining);
+ $this->tellPos += strlen($data) - $readLen;
+ }
+
+ return $data;
+ }
+
+ public function getContents()
+ {
+ $result = '';
+ while (!$this->eof()) {
+ $result .= $this->read(1000000);
+ }
+
+ return $result;
+ }
+
+ public function getMetadata($key = null)
+ {
+ if (!$key) {
+ return $this->metadata;
+ }
+
+ return isset($this->metadata[$key]) ? $this->metadata[$key] : null;
+ }
+
+ private function pump($length)
+ {
+ if ($this->source) {
+ do {
+ $data = call_user_func($this->source, $length);
+ if ($data === false || $data === null) {
+ $this->source = null;
+ return;
+ }
+ $this->buffer->write($data);
+ $length -= strlen($data);
+ } while ($length > 0);
+ }
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/Request.php b/vendor/guzzlehttp/psr7/src/Request.php
new file mode 100644
index 0000000000..08285484da
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/Request.php
@@ -0,0 +1,142 @@
+method = strtoupper($method);
+ $this->uri = $uri;
+ $this->setHeaders($headers);
+ $this->protocol = $version;
+
+ if (!$this->hasHeader('Host')) {
+ $this->updateHostFromUri();
+ }
+
+ if ($body !== '' && $body !== null) {
+ $this->stream = stream_for($body);
+ }
+ }
+
+ public function getRequestTarget()
+ {
+ if ($this->requestTarget !== null) {
+ return $this->requestTarget;
+ }
+
+ $target = $this->uri->getPath();
+ if ($target == '') {
+ $target = '/';
+ }
+ if ($this->uri->getQuery() != '') {
+ $target .= '?' . $this->uri->getQuery();
+ }
+
+ return $target;
+ }
+
+ public function withRequestTarget($requestTarget)
+ {
+ if (preg_match('#\s#', $requestTarget)) {
+ throw new InvalidArgumentException(
+ 'Invalid request target provided; cannot contain whitespace'
+ );
+ }
+
+ $new = clone $this;
+ $new->requestTarget = $requestTarget;
+ return $new;
+ }
+
+ public function getMethod()
+ {
+ return $this->method;
+ }
+
+ public function withMethod($method)
+ {
+ $new = clone $this;
+ $new->method = strtoupper($method);
+ return $new;
+ }
+
+ public function getUri()
+ {
+ return $this->uri;
+ }
+
+ public function withUri(UriInterface $uri, $preserveHost = false)
+ {
+ if ($uri === $this->uri) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->uri = $uri;
+
+ if (!$preserveHost) {
+ $new->updateHostFromUri();
+ }
+
+ return $new;
+ }
+
+ private function updateHostFromUri()
+ {
+ $host = $this->uri->getHost();
+
+ if ($host == '') {
+ return;
+ }
+
+ if (($port = $this->uri->getPort()) !== null) {
+ $host .= ':' . $port;
+ }
+
+ if (isset($this->headerNames['host'])) {
+ $header = $this->headerNames['host'];
+ } else {
+ $header = 'Host';
+ $this->headerNames['host'] = 'Host';
+ }
+ // Ensure Host is the first header.
+ // See: http://tools.ietf.org/html/rfc7230#section-5.4
+ $this->headers = [$header => [$host]] + $this->headers;
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/Response.php b/vendor/guzzlehttp/psr7/src/Response.php
new file mode 100644
index 0000000000..2830c6c9ee
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/Response.php
@@ -0,0 +1,132 @@
+ 'Continue',
+ 101 => 'Switching Protocols',
+ 102 => 'Processing',
+ 200 => 'OK',
+ 201 => 'Created',
+ 202 => 'Accepted',
+ 203 => 'Non-Authoritative Information',
+ 204 => 'No Content',
+ 205 => 'Reset Content',
+ 206 => 'Partial Content',
+ 207 => 'Multi-status',
+ 208 => 'Already Reported',
+ 300 => 'Multiple Choices',
+ 301 => 'Moved Permanently',
+ 302 => 'Found',
+ 303 => 'See Other',
+ 304 => 'Not Modified',
+ 305 => 'Use Proxy',
+ 306 => 'Switch Proxy',
+ 307 => 'Temporary Redirect',
+ 400 => 'Bad Request',
+ 401 => 'Unauthorized',
+ 402 => 'Payment Required',
+ 403 => 'Forbidden',
+ 404 => 'Not Found',
+ 405 => 'Method Not Allowed',
+ 406 => 'Not Acceptable',
+ 407 => 'Proxy Authentication Required',
+ 408 => 'Request Time-out',
+ 409 => 'Conflict',
+ 410 => 'Gone',
+ 411 => 'Length Required',
+ 412 => 'Precondition Failed',
+ 413 => 'Request Entity Too Large',
+ 414 => 'Request-URI Too Large',
+ 415 => 'Unsupported Media Type',
+ 416 => 'Requested range not satisfiable',
+ 417 => 'Expectation Failed',
+ 418 => 'I\'m a teapot',
+ 422 => 'Unprocessable Entity',
+ 423 => 'Locked',
+ 424 => 'Failed Dependency',
+ 425 => 'Unordered Collection',
+ 426 => 'Upgrade Required',
+ 428 => 'Precondition Required',
+ 429 => 'Too Many Requests',
+ 431 => 'Request Header Fields Too Large',
+ 451 => 'Unavailable For Legal Reasons',
+ 500 => 'Internal Server Error',
+ 501 => 'Not Implemented',
+ 502 => 'Bad Gateway',
+ 503 => 'Service Unavailable',
+ 504 => 'Gateway Time-out',
+ 505 => 'HTTP Version not supported',
+ 506 => 'Variant Also Negotiates',
+ 507 => 'Insufficient Storage',
+ 508 => 'Loop Detected',
+ 511 => 'Network Authentication Required',
+ ];
+
+ /** @var string */
+ private $reasonPhrase = '';
+
+ /** @var int */
+ private $statusCode = 200;
+
+ /**
+ * @param int $status Status code
+ * @param array $headers Response headers
+ * @param string|null|resource|StreamInterface $body Response body
+ * @param string $version Protocol version
+ * @param string|null $reason Reason phrase (when empty a default will be used based on the status code)
+ */
+ public function __construct(
+ $status = 200,
+ array $headers = [],
+ $body = null,
+ $version = '1.1',
+ $reason = null
+ ) {
+ $this->statusCode = (int) $status;
+
+ if ($body !== '' && $body !== null) {
+ $this->stream = stream_for($body);
+ }
+
+ $this->setHeaders($headers);
+ if ($reason == '' && isset(self::$phrases[$this->statusCode])) {
+ $this->reasonPhrase = self::$phrases[$this->statusCode];
+ } else {
+ $this->reasonPhrase = (string) $reason;
+ }
+
+ $this->protocol = $version;
+ }
+
+ public function getStatusCode()
+ {
+ return $this->statusCode;
+ }
+
+ public function getReasonPhrase()
+ {
+ return $this->reasonPhrase;
+ }
+
+ public function withStatus($code, $reasonPhrase = '')
+ {
+ $new = clone $this;
+ $new->statusCode = (int) $code;
+ if ($reasonPhrase == '' && isset(self::$phrases[$new->statusCode])) {
+ $reasonPhrase = self::$phrases[$new->statusCode];
+ }
+ $new->reasonPhrase = $reasonPhrase;
+ return $new;
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/ServerRequest.php b/vendor/guzzlehttp/psr7/src/ServerRequest.php
new file mode 100644
index 0000000000..575aab8489
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/ServerRequest.php
@@ -0,0 +1,358 @@
+serverParams = $serverParams;
+
+ parent::__construct($method, $uri, $headers, $body, $version);
+ }
+
+ /**
+ * Return an UploadedFile instance array.
+ *
+ * @param array $files A array which respect $_FILES structure
+ * @throws InvalidArgumentException for unrecognized values
+ * @return array
+ */
+ public static function normalizeFiles(array $files)
+ {
+ $normalized = [];
+
+ foreach ($files as $key => $value) {
+ if ($value instanceof UploadedFileInterface) {
+ $normalized[$key] = $value;
+ } elseif (is_array($value) && isset($value['tmp_name'])) {
+ $normalized[$key] = self::createUploadedFileFromSpec($value);
+ } elseif (is_array($value)) {
+ $normalized[$key] = self::normalizeFiles($value);
+ continue;
+ } else {
+ throw new InvalidArgumentException('Invalid value in files specification');
+ }
+ }
+
+ return $normalized;
+ }
+
+ /**
+ * Create and return an UploadedFile instance from a $_FILES specification.
+ *
+ * If the specification represents an array of values, this method will
+ * delegate to normalizeNestedFileSpec() and return that return value.
+ *
+ * @param array $value $_FILES struct
+ * @return array|UploadedFileInterface
+ */
+ private static function createUploadedFileFromSpec(array $value)
+ {
+ if (is_array($value['tmp_name'])) {
+ return self::normalizeNestedFileSpec($value);
+ }
+
+ return new UploadedFile(
+ $value['tmp_name'],
+ (int) $value['size'],
+ (int) $value['error'],
+ $value['name'],
+ $value['type']
+ );
+ }
+
+ /**
+ * Normalize an array of file specifications.
+ *
+ * Loops through all nested files and returns a normalized array of
+ * UploadedFileInterface instances.
+ *
+ * @param array $files
+ * @return UploadedFileInterface[]
+ */
+ private static function normalizeNestedFileSpec(array $files = [])
+ {
+ $normalizedFiles = [];
+
+ foreach (array_keys($files['tmp_name']) as $key) {
+ $spec = [
+ 'tmp_name' => $files['tmp_name'][$key],
+ 'size' => $files['size'][$key],
+ 'error' => $files['error'][$key],
+ 'name' => $files['name'][$key],
+ 'type' => $files['type'][$key],
+ ];
+ $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec);
+ }
+
+ return $normalizedFiles;
+ }
+
+ /**
+ * Return a ServerRequest populated with superglobals:
+ * $_GET
+ * $_POST
+ * $_COOKIE
+ * $_FILES
+ * $_SERVER
+ *
+ * @return ServerRequestInterface
+ */
+ public static function fromGlobals()
+ {
+ $method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET';
+ $headers = function_exists('getallheaders') ? getallheaders() : [];
+ $uri = self::getUriFromGlobals();
+ $body = new LazyOpenStream('php://input', 'r+');
+ $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1';
+
+ $serverRequest = new ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER);
+
+ return $serverRequest
+ ->withCookieParams($_COOKIE)
+ ->withQueryParams($_GET)
+ ->withParsedBody($_POST)
+ ->withUploadedFiles(self::normalizeFiles($_FILES));
+ }
+
+ /**
+ * Get a Uri populated with values from $_SERVER.
+ *
+ * @return UriInterface
+ */
+ public static function getUriFromGlobals() {
+ $uri = new Uri('');
+
+ $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http');
+
+ $hasPort = false;
+ if (isset($_SERVER['HTTP_HOST'])) {
+ $hostHeaderParts = explode(':', $_SERVER['HTTP_HOST']);
+ $uri = $uri->withHost($hostHeaderParts[0]);
+ if (isset($hostHeaderParts[1])) {
+ $hasPort = true;
+ $uri = $uri->withPort($hostHeaderParts[1]);
+ }
+ } elseif (isset($_SERVER['SERVER_NAME'])) {
+ $uri = $uri->withHost($_SERVER['SERVER_NAME']);
+ } elseif (isset($_SERVER['SERVER_ADDR'])) {
+ $uri = $uri->withHost($_SERVER['SERVER_ADDR']);
+ }
+
+ if (!$hasPort && isset($_SERVER['SERVER_PORT'])) {
+ $uri = $uri->withPort($_SERVER['SERVER_PORT']);
+ }
+
+ $hasQuery = false;
+ if (isset($_SERVER['REQUEST_URI'])) {
+ $requestUriParts = explode('?', $_SERVER['REQUEST_URI']);
+ $uri = $uri->withPath($requestUriParts[0]);
+ if (isset($requestUriParts[1])) {
+ $hasQuery = true;
+ $uri = $uri->withQuery($requestUriParts[1]);
+ }
+ }
+
+ if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) {
+ $uri = $uri->withQuery($_SERVER['QUERY_STRING']);
+ }
+
+ return $uri;
+ }
+
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getServerParams()
+ {
+ return $this->serverParams;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getUploadedFiles()
+ {
+ return $this->uploadedFiles;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function withUploadedFiles(array $uploadedFiles)
+ {
+ $new = clone $this;
+ $new->uploadedFiles = $uploadedFiles;
+
+ return $new;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCookieParams()
+ {
+ return $this->cookieParams;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function withCookieParams(array $cookies)
+ {
+ $new = clone $this;
+ $new->cookieParams = $cookies;
+
+ return $new;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getQueryParams()
+ {
+ return $this->queryParams;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function withQueryParams(array $query)
+ {
+ $new = clone $this;
+ $new->queryParams = $query;
+
+ return $new;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getParsedBody()
+ {
+ return $this->parsedBody;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function withParsedBody($data)
+ {
+ $new = clone $this;
+ $new->parsedBody = $data;
+
+ return $new;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAttributes()
+ {
+ return $this->attributes;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAttribute($attribute, $default = null)
+ {
+ if (false === array_key_exists($attribute, $this->attributes)) {
+ return $default;
+ }
+
+ return $this->attributes[$attribute];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function withAttribute($attribute, $value)
+ {
+ $new = clone $this;
+ $new->attributes[$attribute] = $value;
+
+ return $new;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function withoutAttribute($attribute)
+ {
+ if (false === array_key_exists($attribute, $this->attributes)) {
+ return $this;
+ }
+
+ $new = clone $this;
+ unset($new->attributes[$attribute]);
+
+ return $new;
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/Stream.php b/vendor/guzzlehttp/psr7/src/Stream.php
new file mode 100644
index 0000000000..e33662879f
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/Stream.php
@@ -0,0 +1,257 @@
+ [
+ 'r' => true, 'w+' => true, 'r+' => true, 'x+' => true, 'c+' => true,
+ 'rb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true,
+ 'c+b' => true, 'rt' => true, 'w+t' => true, 'r+t' => true,
+ 'x+t' => true, 'c+t' => true, 'a+' => true
+ ],
+ 'write' => [
+ 'w' => true, 'w+' => true, 'rw' => true, 'r+' => true, 'x+' => true,
+ 'c+' => true, 'wb' => true, 'w+b' => true, 'r+b' => true,
+ 'x+b' => true, 'c+b' => true, 'w+t' => true, 'r+t' => true,
+ 'x+t' => true, 'c+t' => true, 'a' => true, 'a+' => true
+ ]
+ ];
+
+ /**
+ * This constructor accepts an associative array of options.
+ *
+ * - size: (int) If a read stream would otherwise have an indeterminate
+ * size, but the size is known due to foreknowledge, then you can
+ * provide that size, in bytes.
+ * - metadata: (array) Any additional metadata to return when the metadata
+ * of the stream is accessed.
+ *
+ * @param resource $stream Stream resource to wrap.
+ * @param array $options Associative array of options.
+ *
+ * @throws \InvalidArgumentException if the stream is not a stream resource
+ */
+ public function __construct($stream, $options = [])
+ {
+ if (!is_resource($stream)) {
+ throw new \InvalidArgumentException('Stream must be a resource');
+ }
+
+ if (isset($options['size'])) {
+ $this->size = $options['size'];
+ }
+
+ $this->customMetadata = isset($options['metadata'])
+ ? $options['metadata']
+ : [];
+
+ $this->stream = $stream;
+ $meta = stream_get_meta_data($this->stream);
+ $this->seekable = $meta['seekable'];
+ $this->readable = isset(self::$readWriteHash['read'][$meta['mode']]);
+ $this->writable = isset(self::$readWriteHash['write'][$meta['mode']]);
+ $this->uri = $this->getMetadata('uri');
+ }
+
+ public function __get($name)
+ {
+ if ($name == 'stream') {
+ throw new \RuntimeException('The stream is detached');
+ }
+
+ throw new \BadMethodCallException('No value for ' . $name);
+ }
+
+ /**
+ * Closes the stream when the destructed
+ */
+ public function __destruct()
+ {
+ $this->close();
+ }
+
+ public function __toString()
+ {
+ try {
+ $this->seek(0);
+ return (string) stream_get_contents($this->stream);
+ } catch (\Exception $e) {
+ return '';
+ }
+ }
+
+ public function getContents()
+ {
+ $contents = stream_get_contents($this->stream);
+
+ if ($contents === false) {
+ throw new \RuntimeException('Unable to read stream contents');
+ }
+
+ return $contents;
+ }
+
+ public function close()
+ {
+ if (isset($this->stream)) {
+ if (is_resource($this->stream)) {
+ fclose($this->stream);
+ }
+ $this->detach();
+ }
+ }
+
+ public function detach()
+ {
+ if (!isset($this->stream)) {
+ return null;
+ }
+
+ $result = $this->stream;
+ unset($this->stream);
+ $this->size = $this->uri = null;
+ $this->readable = $this->writable = $this->seekable = false;
+
+ return $result;
+ }
+
+ public function getSize()
+ {
+ if ($this->size !== null) {
+ return $this->size;
+ }
+
+ if (!isset($this->stream)) {
+ return null;
+ }
+
+ // Clear the stat cache if the stream has a URI
+ if ($this->uri) {
+ clearstatcache(true, $this->uri);
+ }
+
+ $stats = fstat($this->stream);
+ if (isset($stats['size'])) {
+ $this->size = $stats['size'];
+ return $this->size;
+ }
+
+ return null;
+ }
+
+ public function isReadable()
+ {
+ return $this->readable;
+ }
+
+ public function isWritable()
+ {
+ return $this->writable;
+ }
+
+ public function isSeekable()
+ {
+ return $this->seekable;
+ }
+
+ public function eof()
+ {
+ return !$this->stream || feof($this->stream);
+ }
+
+ public function tell()
+ {
+ $result = ftell($this->stream);
+
+ if ($result === false) {
+ throw new \RuntimeException('Unable to determine stream position');
+ }
+
+ return $result;
+ }
+
+ public function rewind()
+ {
+ $this->seek(0);
+ }
+
+ public function seek($offset, $whence = SEEK_SET)
+ {
+ if (!$this->seekable) {
+ throw new \RuntimeException('Stream is not seekable');
+ } elseif (fseek($this->stream, $offset, $whence) === -1) {
+ throw new \RuntimeException('Unable to seek to stream position '
+ . $offset . ' with whence ' . var_export($whence, true));
+ }
+ }
+
+ public function read($length)
+ {
+ if (!$this->readable) {
+ throw new \RuntimeException('Cannot read from non-readable stream');
+ }
+ if ($length < 0) {
+ throw new \RuntimeException('Length parameter cannot be negative');
+ }
+
+ if (0 === $length) {
+ return '';
+ }
+
+ $string = fread($this->stream, $length);
+ if (false === $string) {
+ throw new \RuntimeException('Unable to read from stream');
+ }
+
+ return $string;
+ }
+
+ public function write($string)
+ {
+ if (!$this->writable) {
+ throw new \RuntimeException('Cannot write to a non-writable stream');
+ }
+
+ // We can't know the size after writing anything
+ $this->size = null;
+ $result = fwrite($this->stream, $string);
+
+ if ($result === false) {
+ throw new \RuntimeException('Unable to write to stream');
+ }
+
+ return $result;
+ }
+
+ public function getMetadata($key = null)
+ {
+ if (!isset($this->stream)) {
+ return $key ? null : [];
+ } elseif (!$key) {
+ return $this->customMetadata + stream_get_meta_data($this->stream);
+ } elseif (isset($this->customMetadata[$key])) {
+ return $this->customMetadata[$key];
+ }
+
+ $meta = stream_get_meta_data($this->stream);
+
+ return isset($meta[$key]) ? $meta[$key] : null;
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php b/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php
new file mode 100644
index 0000000000..daec6f52ea
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php
@@ -0,0 +1,149 @@
+stream = $stream;
+ }
+
+ /**
+ * Magic method used to create a new stream if streams are not added in
+ * the constructor of a decorator (e.g., LazyOpenStream).
+ *
+ * @param string $name Name of the property (allows "stream" only).
+ *
+ * @return StreamInterface
+ */
+ public function __get($name)
+ {
+ if ($name == 'stream') {
+ $this->stream = $this->createStream();
+ return $this->stream;
+ }
+
+ throw new \UnexpectedValueException("$name not found on class");
+ }
+
+ public function __toString()
+ {
+ try {
+ if ($this->isSeekable()) {
+ $this->seek(0);
+ }
+ return $this->getContents();
+ } catch (\Exception $e) {
+ // Really, PHP? https://bugs.php.net/bug.php?id=53648
+ trigger_error('StreamDecorator::__toString exception: '
+ . (string) $e, E_USER_ERROR);
+ return '';
+ }
+ }
+
+ public function getContents()
+ {
+ return copy_to_string($this);
+ }
+
+ /**
+ * Allow decorators to implement custom methods
+ *
+ * @param string $method Missing method name
+ * @param array $args Method arguments
+ *
+ * @return mixed
+ */
+ public function __call($method, array $args)
+ {
+ $result = call_user_func_array([$this->stream, $method], $args);
+
+ // Always return the wrapped object if the result is a return $this
+ return $result === $this->stream ? $this : $result;
+ }
+
+ public function close()
+ {
+ $this->stream->close();
+ }
+
+ public function getMetadata($key = null)
+ {
+ return $this->stream->getMetadata($key);
+ }
+
+ public function detach()
+ {
+ return $this->stream->detach();
+ }
+
+ public function getSize()
+ {
+ return $this->stream->getSize();
+ }
+
+ public function eof()
+ {
+ return $this->stream->eof();
+ }
+
+ public function tell()
+ {
+ return $this->stream->tell();
+ }
+
+ public function isReadable()
+ {
+ return $this->stream->isReadable();
+ }
+
+ public function isWritable()
+ {
+ return $this->stream->isWritable();
+ }
+
+ public function isSeekable()
+ {
+ return $this->stream->isSeekable();
+ }
+
+ public function rewind()
+ {
+ $this->seek(0);
+ }
+
+ public function seek($offset, $whence = SEEK_SET)
+ {
+ $this->stream->seek($offset, $whence);
+ }
+
+ public function read($length)
+ {
+ return $this->stream->read($length);
+ }
+
+ public function write($string)
+ {
+ return $this->stream->write($string);
+ }
+
+ /**
+ * Implement in subclasses to dynamically create streams when requested.
+ *
+ * @return StreamInterface
+ * @throws \BadMethodCallException
+ */
+ protected function createStream()
+ {
+ throw new \BadMethodCallException('Not implemented');
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/StreamWrapper.php b/vendor/guzzlehttp/psr7/src/StreamWrapper.php
new file mode 100644
index 0000000000..cf7b2232e4
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/StreamWrapper.php
@@ -0,0 +1,121 @@
+isReadable()) {
+ $mode = $stream->isWritable() ? 'r+' : 'r';
+ } elseif ($stream->isWritable()) {
+ $mode = 'w';
+ } else {
+ throw new \InvalidArgumentException('The stream must be readable, '
+ . 'writable, or both.');
+ }
+
+ return fopen('guzzle://stream', $mode, null, stream_context_create([
+ 'guzzle' => ['stream' => $stream]
+ ]));
+ }
+
+ /**
+ * Registers the stream wrapper if needed
+ */
+ public static function register()
+ {
+ if (!in_array('guzzle', stream_get_wrappers())) {
+ stream_wrapper_register('guzzle', __CLASS__);
+ }
+ }
+
+ public function stream_open($path, $mode, $options, &$opened_path)
+ {
+ $options = stream_context_get_options($this->context);
+
+ if (!isset($options['guzzle']['stream'])) {
+ return false;
+ }
+
+ $this->mode = $mode;
+ $this->stream = $options['guzzle']['stream'];
+
+ return true;
+ }
+
+ public function stream_read($count)
+ {
+ return $this->stream->read($count);
+ }
+
+ public function stream_write($data)
+ {
+ return (int) $this->stream->write($data);
+ }
+
+ public function stream_tell()
+ {
+ return $this->stream->tell();
+ }
+
+ public function stream_eof()
+ {
+ return $this->stream->eof();
+ }
+
+ public function stream_seek($offset, $whence)
+ {
+ $this->stream->seek($offset, $whence);
+
+ return true;
+ }
+
+ public function stream_stat()
+ {
+ static $modeMap = [
+ 'r' => 33060,
+ 'r+' => 33206,
+ 'w' => 33188
+ ];
+
+ return [
+ 'dev' => 0,
+ 'ino' => 0,
+ 'mode' => $modeMap[$this->mode],
+ 'nlink' => 0,
+ 'uid' => 0,
+ 'gid' => 0,
+ 'rdev' => 0,
+ 'size' => $this->stream->getSize() ?: 0,
+ 'atime' => 0,
+ 'mtime' => 0,
+ 'ctime' => 0,
+ 'blksize' => 0,
+ 'blocks' => 0
+ ];
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/UploadedFile.php b/vendor/guzzlehttp/psr7/src/UploadedFile.php
new file mode 100644
index 0000000000..e62bd5c807
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/UploadedFile.php
@@ -0,0 +1,316 @@
+setError($errorStatus);
+ $this->setSize($size);
+ $this->setClientFilename($clientFilename);
+ $this->setClientMediaType($clientMediaType);
+
+ if ($this->isOk()) {
+ $this->setStreamOrFile($streamOrFile);
+ }
+ }
+
+ /**
+ * Depending on the value set file or stream variable
+ *
+ * @param mixed $streamOrFile
+ * @throws InvalidArgumentException
+ */
+ private function setStreamOrFile($streamOrFile)
+ {
+ if (is_string($streamOrFile)) {
+ $this->file = $streamOrFile;
+ } elseif (is_resource($streamOrFile)) {
+ $this->stream = new Stream($streamOrFile);
+ } elseif ($streamOrFile instanceof StreamInterface) {
+ $this->stream = $streamOrFile;
+ } else {
+ throw new InvalidArgumentException(
+ 'Invalid stream or file provided for UploadedFile'
+ );
+ }
+ }
+
+ /**
+ * @param int $error
+ * @throws InvalidArgumentException
+ */
+ private function setError($error)
+ {
+ if (false === is_int($error)) {
+ throw new InvalidArgumentException(
+ 'Upload file error status must be an integer'
+ );
+ }
+
+ if (false === in_array($error, UploadedFile::$errors)) {
+ throw new InvalidArgumentException(
+ 'Invalid error status for UploadedFile'
+ );
+ }
+
+ $this->error = $error;
+ }
+
+ /**
+ * @param int $size
+ * @throws InvalidArgumentException
+ */
+ private function setSize($size)
+ {
+ if (false === is_int($size)) {
+ throw new InvalidArgumentException(
+ 'Upload file size must be an integer'
+ );
+ }
+
+ $this->size = $size;
+ }
+
+ /**
+ * @param mixed $param
+ * @return boolean
+ */
+ private function isStringOrNull($param)
+ {
+ return in_array(gettype($param), ['string', 'NULL']);
+ }
+
+ /**
+ * @param mixed $param
+ * @return boolean
+ */
+ private function isStringNotEmpty($param)
+ {
+ return is_string($param) && false === empty($param);
+ }
+
+ /**
+ * @param string|null $clientFilename
+ * @throws InvalidArgumentException
+ */
+ private function setClientFilename($clientFilename)
+ {
+ if (false === $this->isStringOrNull($clientFilename)) {
+ throw new InvalidArgumentException(
+ 'Upload file client filename must be a string or null'
+ );
+ }
+
+ $this->clientFilename = $clientFilename;
+ }
+
+ /**
+ * @param string|null $clientMediaType
+ * @throws InvalidArgumentException
+ */
+ private function setClientMediaType($clientMediaType)
+ {
+ if (false === $this->isStringOrNull($clientMediaType)) {
+ throw new InvalidArgumentException(
+ 'Upload file client media type must be a string or null'
+ );
+ }
+
+ $this->clientMediaType = $clientMediaType;
+ }
+
+ /**
+ * Return true if there is no upload error
+ *
+ * @return boolean
+ */
+ private function isOk()
+ {
+ return $this->error === UPLOAD_ERR_OK;
+ }
+
+ /**
+ * @return boolean
+ */
+ public function isMoved()
+ {
+ return $this->moved;
+ }
+
+ /**
+ * @throws RuntimeException if is moved or not ok
+ */
+ private function validateActive()
+ {
+ if (false === $this->isOk()) {
+ throw new RuntimeException('Cannot retrieve stream due to upload error');
+ }
+
+ if ($this->isMoved()) {
+ throw new RuntimeException('Cannot retrieve stream after it has already been moved');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ * @throws RuntimeException if the upload was not successful.
+ */
+ public function getStream()
+ {
+ $this->validateActive();
+
+ if ($this->stream instanceof StreamInterface) {
+ return $this->stream;
+ }
+
+ return new LazyOpenStream($this->file, 'r+');
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see http://php.net/is_uploaded_file
+ * @see http://php.net/move_uploaded_file
+ * @param string $targetPath Path to which to move the uploaded file.
+ * @throws RuntimeException if the upload was not successful.
+ * @throws InvalidArgumentException if the $path specified is invalid.
+ * @throws RuntimeException on any error during the move operation, or on
+ * the second or subsequent call to the method.
+ */
+ public function moveTo($targetPath)
+ {
+ $this->validateActive();
+
+ if (false === $this->isStringNotEmpty($targetPath)) {
+ throw new InvalidArgumentException(
+ 'Invalid path provided for move operation; must be a non-empty string'
+ );
+ }
+
+ if ($this->file) {
+ $this->moved = php_sapi_name() == 'cli'
+ ? rename($this->file, $targetPath)
+ : move_uploaded_file($this->file, $targetPath);
+ } else {
+ copy_to_stream(
+ $this->getStream(),
+ new LazyOpenStream($targetPath, 'w')
+ );
+
+ $this->moved = true;
+ }
+
+ if (false === $this->moved) {
+ throw new RuntimeException(
+ sprintf('Uploaded file could not be moved to %s', $targetPath)
+ );
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @return int|null The file size in bytes or null if unknown.
+ */
+ public function getSize()
+ {
+ return $this->size;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @see http://php.net/manual/en/features.file-upload.errors.php
+ * @return int One of PHP's UPLOAD_ERR_XXX constants.
+ */
+ public function getError()
+ {
+ return $this->error;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @return string|null The filename sent by the client or null if none
+ * was provided.
+ */
+ public function getClientFilename()
+ {
+ return $this->clientFilename;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getClientMediaType()
+ {
+ return $this->clientMediaType;
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/Uri.php b/vendor/guzzlehttp/psr7/src/Uri.php
new file mode 100644
index 0000000000..f46c1db9e0
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/Uri.php
@@ -0,0 +1,702 @@
+ 80,
+ 'https' => 443,
+ 'ftp' => 21,
+ 'gopher' => 70,
+ 'nntp' => 119,
+ 'news' => 119,
+ 'telnet' => 23,
+ 'tn3270' => 23,
+ 'imap' => 143,
+ 'pop' => 110,
+ 'ldap' => 389,
+ ];
+
+ private static $charUnreserved = 'a-zA-Z0-9_\-\.~';
+ private static $charSubDelims = '!\$&\'\(\)\*\+,;=';
+ private static $replaceQuery = ['=' => '%3D', '&' => '%26'];
+
+ /** @var string Uri scheme. */
+ private $scheme = '';
+
+ /** @var string Uri user info. */
+ private $userInfo = '';
+
+ /** @var string Uri host. */
+ private $host = '';
+
+ /** @var int|null Uri port. */
+ private $port;
+
+ /** @var string Uri path. */
+ private $path = '';
+
+ /** @var string Uri query string. */
+ private $query = '';
+
+ /** @var string Uri fragment. */
+ private $fragment = '';
+
+ /**
+ * @param string $uri URI to parse
+ */
+ public function __construct($uri = '')
+ {
+ // weak type check to also accept null until we can add scalar type hints
+ if ($uri != '') {
+ $parts = parse_url($uri);
+ if ($parts === false) {
+ throw new \InvalidArgumentException("Unable to parse URI: $uri");
+ }
+ $this->applyParts($parts);
+ }
+ }
+
+ public function __toString()
+ {
+ return self::composeComponents(
+ $this->scheme,
+ $this->getAuthority(),
+ $this->path,
+ $this->query,
+ $this->fragment
+ );
+ }
+
+ /**
+ * Composes a URI reference string from its various components.
+ *
+ * Usually this method does not need to be called manually but instead is used indirectly via
+ * `Psr\Http\Message\UriInterface::__toString`.
+ *
+ * PSR-7 UriInterface treats an empty component the same as a missing component as
+ * getQuery(), getFragment() etc. always return a string. This explains the slight
+ * difference to RFC 3986 Section 5.3.
+ *
+ * Another adjustment is that the authority separator is added even when the authority is missing/empty
+ * for the "file" scheme. This is because PHP stream functions like `file_get_contents` only work with
+ * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But
+ * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to
+ * that format).
+ *
+ * @param string $scheme
+ * @param string $authority
+ * @param string $path
+ * @param string $query
+ * @param string $fragment
+ *
+ * @return string
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-5.3
+ */
+ public static function composeComponents($scheme, $authority, $path, $query, $fragment)
+ {
+ $uri = '';
+
+ // weak type checks to also accept null until we can add scalar type hints
+ if ($scheme != '') {
+ $uri .= $scheme . ':';
+ }
+
+ if ($authority != ''|| $scheme === 'file') {
+ $uri .= '//' . $authority;
+ }
+
+ $uri .= $path;
+
+ if ($query != '') {
+ $uri .= '?' . $query;
+ }
+
+ if ($fragment != '') {
+ $uri .= '#' . $fragment;
+ }
+
+ return $uri;
+ }
+
+ /**
+ * Whether the URI has the default port of the current scheme.
+ *
+ * `Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used
+ * independently of the implementation.
+ *
+ * @param UriInterface $uri
+ *
+ * @return bool
+ */
+ public static function isDefaultPort(UriInterface $uri)
+ {
+ return $uri->getPort() === null
+ || (isset(self::$defaultPorts[$uri->getScheme()]) && $uri->getPort() === self::$defaultPorts[$uri->getScheme()]);
+ }
+
+ /**
+ * Whether the URI is absolute, i.e. it has a scheme.
+ *
+ * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true
+ * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative
+ * to another URI, the base URI. Relative references can be divided into several forms:
+ * - network-path references, e.g. '//example.com/path'
+ * - absolute-path references, e.g. '/path'
+ * - relative-path references, e.g. 'subpath'
+ *
+ * @param UriInterface $uri
+ *
+ * @return bool
+ * @see Uri::isNetworkPathReference
+ * @see Uri::isAbsolutePathReference
+ * @see Uri::isRelativePathReference
+ * @link https://tools.ietf.org/html/rfc3986#section-4
+ */
+ public static function isAbsolute(UriInterface $uri)
+ {
+ return $uri->getScheme() !== '';
+ }
+
+ /**
+ * Whether the URI is a network-path reference.
+ *
+ * A relative reference that begins with two slash characters is termed an network-path reference.
+ *
+ * @param UriInterface $uri
+ *
+ * @return bool
+ * @link https://tools.ietf.org/html/rfc3986#section-4.2
+ */
+ public static function isNetworkPathReference(UriInterface $uri)
+ {
+ return $uri->getScheme() === '' && $uri->getAuthority() !== '';
+ }
+
+ /**
+ * Whether the URI is a absolute-path reference.
+ *
+ * A relative reference that begins with a single slash character is termed an absolute-path reference.
+ *
+ * @param UriInterface $uri
+ *
+ * @return bool
+ * @link https://tools.ietf.org/html/rfc3986#section-4.2
+ */
+ public static function isAbsolutePathReference(UriInterface $uri)
+ {
+ return $uri->getScheme() === ''
+ && $uri->getAuthority() === ''
+ && isset($uri->getPath()[0])
+ && $uri->getPath()[0] === '/';
+ }
+
+ /**
+ * Whether the URI is a relative-path reference.
+ *
+ * A relative reference that does not begin with a slash character is termed a relative-path reference.
+ *
+ * @param UriInterface $uri
+ *
+ * @return bool
+ * @link https://tools.ietf.org/html/rfc3986#section-4.2
+ */
+ public static function isRelativePathReference(UriInterface $uri)
+ {
+ return $uri->getScheme() === ''
+ && $uri->getAuthority() === ''
+ && (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/');
+ }
+
+ /**
+ * Whether the URI is a same-document reference.
+ *
+ * A same-document reference refers to a URI that is, aside from its fragment
+ * component, identical to the base URI. When no base URI is given, only an empty
+ * URI reference (apart from its fragment) is considered a same-document reference.
+ *
+ * @param UriInterface $uri The URI to check
+ * @param UriInterface|null $base An optional base URI to compare against
+ *
+ * @return bool
+ * @link https://tools.ietf.org/html/rfc3986#section-4.4
+ */
+ public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null)
+ {
+ if ($base !== null) {
+ $uri = UriResolver::resolve($base, $uri);
+
+ return ($uri->getScheme() === $base->getScheme())
+ && ($uri->getAuthority() === $base->getAuthority())
+ && ($uri->getPath() === $base->getPath())
+ && ($uri->getQuery() === $base->getQuery());
+ }
+
+ return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === '';
+ }
+
+ /**
+ * Removes dot segments from a path and returns the new path.
+ *
+ * @param string $path
+ *
+ * @return string
+ *
+ * @deprecated since version 1.4. Use UriResolver::removeDotSegments instead.
+ * @see UriResolver::removeDotSegments
+ */
+ public static function removeDotSegments($path)
+ {
+ return UriResolver::removeDotSegments($path);
+ }
+
+ /**
+ * Converts the relative URI into a new URI that is resolved against the base URI.
+ *
+ * @param UriInterface $base Base URI
+ * @param string|UriInterface $rel Relative URI
+ *
+ * @return UriInterface
+ *
+ * @deprecated since version 1.4. Use UriResolver::resolve instead.
+ * @see UriResolver::resolve
+ */
+ public static function resolve(UriInterface $base, $rel)
+ {
+ if (!($rel instanceof UriInterface)) {
+ $rel = new self($rel);
+ }
+
+ return UriResolver::resolve($base, $rel);
+ }
+
+ /**
+ * Creates a new URI with a specific query string value removed.
+ *
+ * Any existing query string values that exactly match the provided key are
+ * removed.
+ *
+ * @param UriInterface $uri URI to use as a base.
+ * @param string $key Query string key to remove.
+ *
+ * @return UriInterface
+ */
+ public static function withoutQueryValue(UriInterface $uri, $key)
+ {
+ $current = $uri->getQuery();
+ if ($current === '') {
+ return $uri;
+ }
+
+ $decodedKey = rawurldecode($key);
+ $result = array_filter(explode('&', $current), function ($part) use ($decodedKey) {
+ return rawurldecode(explode('=', $part)[0]) !== $decodedKey;
+ });
+
+ return $uri->withQuery(implode('&', $result));
+ }
+
+ /**
+ * Creates a new URI with a specific query string value.
+ *
+ * Any existing query string values that exactly match the provided key are
+ * removed and replaced with the given key value pair.
+ *
+ * A value of null will set the query string key without a value, e.g. "key"
+ * instead of "key=value".
+ *
+ * @param UriInterface $uri URI to use as a base.
+ * @param string $key Key to set.
+ * @param string|null $value Value to set
+ *
+ * @return UriInterface
+ */
+ public static function withQueryValue(UriInterface $uri, $key, $value)
+ {
+ $current = $uri->getQuery();
+
+ if ($current === '') {
+ $result = [];
+ } else {
+ $decodedKey = rawurldecode($key);
+ $result = array_filter(explode('&', $current), function ($part) use ($decodedKey) {
+ return rawurldecode(explode('=', $part)[0]) !== $decodedKey;
+ });
+ }
+
+ // Query string separators ("=", "&") within the key or value need to be encoded
+ // (while preventing double-encoding) before setting the query string. All other
+ // chars that need percent-encoding will be encoded by withQuery().
+ $key = strtr($key, self::$replaceQuery);
+
+ if ($value !== null) {
+ $result[] = $key . '=' . strtr($value, self::$replaceQuery);
+ } else {
+ $result[] = $key;
+ }
+
+ return $uri->withQuery(implode('&', $result));
+ }
+
+ /**
+ * Creates a URI from a hash of `parse_url` components.
+ *
+ * @param array $parts
+ *
+ * @return UriInterface
+ * @link http://php.net/manual/en/function.parse-url.php
+ *
+ * @throws \InvalidArgumentException If the components do not form a valid URI.
+ */
+ public static function fromParts(array $parts)
+ {
+ $uri = new self();
+ $uri->applyParts($parts);
+ $uri->validateState();
+
+ return $uri;
+ }
+
+ public function getScheme()
+ {
+ return $this->scheme;
+ }
+
+ public function getAuthority()
+ {
+ $authority = $this->host;
+ if ($this->userInfo !== '') {
+ $authority = $this->userInfo . '@' . $authority;
+ }
+
+ if ($this->port !== null) {
+ $authority .= ':' . $this->port;
+ }
+
+ return $authority;
+ }
+
+ public function getUserInfo()
+ {
+ return $this->userInfo;
+ }
+
+ public function getHost()
+ {
+ return $this->host;
+ }
+
+ public function getPort()
+ {
+ return $this->port;
+ }
+
+ public function getPath()
+ {
+ return $this->path;
+ }
+
+ public function getQuery()
+ {
+ return $this->query;
+ }
+
+ public function getFragment()
+ {
+ return $this->fragment;
+ }
+
+ public function withScheme($scheme)
+ {
+ $scheme = $this->filterScheme($scheme);
+
+ if ($this->scheme === $scheme) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->scheme = $scheme;
+ $new->removeDefaultPort();
+ $new->validateState();
+
+ return $new;
+ }
+
+ public function withUserInfo($user, $password = null)
+ {
+ $info = $user;
+ if ($password != '') {
+ $info .= ':' . $password;
+ }
+
+ if ($this->userInfo === $info) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->userInfo = $info;
+ $new->validateState();
+
+ return $new;
+ }
+
+ public function withHost($host)
+ {
+ $host = $this->filterHost($host);
+
+ if ($this->host === $host) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->host = $host;
+ $new->validateState();
+
+ return $new;
+ }
+
+ public function withPort($port)
+ {
+ $port = $this->filterPort($port);
+
+ if ($this->port === $port) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->port = $port;
+ $new->removeDefaultPort();
+ $new->validateState();
+
+ return $new;
+ }
+
+ public function withPath($path)
+ {
+ $path = $this->filterPath($path);
+
+ if ($this->path === $path) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->path = $path;
+ $new->validateState();
+
+ return $new;
+ }
+
+ public function withQuery($query)
+ {
+ $query = $this->filterQueryAndFragment($query);
+
+ if ($this->query === $query) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->query = $query;
+
+ return $new;
+ }
+
+ public function withFragment($fragment)
+ {
+ $fragment = $this->filterQueryAndFragment($fragment);
+
+ if ($this->fragment === $fragment) {
+ return $this;
+ }
+
+ $new = clone $this;
+ $new->fragment = $fragment;
+
+ return $new;
+ }
+
+ /**
+ * Apply parse_url parts to a URI.
+ *
+ * @param array $parts Array of parse_url parts to apply.
+ */
+ private function applyParts(array $parts)
+ {
+ $this->scheme = isset($parts['scheme'])
+ ? $this->filterScheme($parts['scheme'])
+ : '';
+ $this->userInfo = isset($parts['user']) ? $parts['user'] : '';
+ $this->host = isset($parts['host'])
+ ? $this->filterHost($parts['host'])
+ : '';
+ $this->port = isset($parts['port'])
+ ? $this->filterPort($parts['port'])
+ : null;
+ $this->path = isset($parts['path'])
+ ? $this->filterPath($parts['path'])
+ : '';
+ $this->query = isset($parts['query'])
+ ? $this->filterQueryAndFragment($parts['query'])
+ : '';
+ $this->fragment = isset($parts['fragment'])
+ ? $this->filterQueryAndFragment($parts['fragment'])
+ : '';
+ if (isset($parts['pass'])) {
+ $this->userInfo .= ':' . $parts['pass'];
+ }
+
+ $this->removeDefaultPort();
+ }
+
+ /**
+ * @param string $scheme
+ *
+ * @return string
+ *
+ * @throws \InvalidArgumentException If the scheme is invalid.
+ */
+ private function filterScheme($scheme)
+ {
+ if (!is_string($scheme)) {
+ throw new \InvalidArgumentException('Scheme must be a string');
+ }
+
+ return strtolower($scheme);
+ }
+
+ /**
+ * @param string $host
+ *
+ * @return string
+ *
+ * @throws \InvalidArgumentException If the host is invalid.
+ */
+ private function filterHost($host)
+ {
+ if (!is_string($host)) {
+ throw new \InvalidArgumentException('Host must be a string');
+ }
+
+ return strtolower($host);
+ }
+
+ /**
+ * @param int|null $port
+ *
+ * @return int|null
+ *
+ * @throws \InvalidArgumentException If the port is invalid.
+ */
+ private function filterPort($port)
+ {
+ if ($port === null) {
+ return null;
+ }
+
+ $port = (int) $port;
+ if (1 > $port || 0xffff < $port) {
+ throw new \InvalidArgumentException(
+ sprintf('Invalid port: %d. Must be between 1 and 65535', $port)
+ );
+ }
+
+ return $port;
+ }
+
+ private function removeDefaultPort()
+ {
+ if ($this->port !== null && self::isDefaultPort($this)) {
+ $this->port = null;
+ }
+ }
+
+ /**
+ * Filters the path of a URI
+ *
+ * @param string $path
+ *
+ * @return string
+ *
+ * @throws \InvalidArgumentException If the path is invalid.
+ */
+ private function filterPath($path)
+ {
+ if (!is_string($path)) {
+ throw new \InvalidArgumentException('Path must be a string');
+ }
+
+ return preg_replace_callback(
+ '/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\/]++|%(?![A-Fa-f0-9]{2}))/',
+ [$this, 'rawurlencodeMatchZero'],
+ $path
+ );
+ }
+
+ /**
+ * Filters the query string or fragment of a URI.
+ *
+ * @param string $str
+ *
+ * @return string
+ *
+ * @throws \InvalidArgumentException If the query or fragment is invalid.
+ */
+ private function filterQueryAndFragment($str)
+ {
+ if (!is_string($str)) {
+ throw new \InvalidArgumentException('Query and fragment must be a string');
+ }
+
+ return preg_replace_callback(
+ '/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/',
+ [$this, 'rawurlencodeMatchZero'],
+ $str
+ );
+ }
+
+ private function rawurlencodeMatchZero(array $match)
+ {
+ return rawurlencode($match[0]);
+ }
+
+ private function validateState()
+ {
+ if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) {
+ $this->host = self::HTTP_DEFAULT_HOST;
+ }
+
+ if ($this->getAuthority() === '') {
+ if (0 === strpos($this->path, '//')) {
+ throw new \InvalidArgumentException('The path of a URI without an authority must not start with two slashes "//"');
+ }
+ if ($this->scheme === '' && false !== strpos(explode('/', $this->path, 2)[0], ':')) {
+ throw new \InvalidArgumentException('A relative URI must not have a path beginning with a segment containing a colon');
+ }
+ } elseif (isset($this->path[0]) && $this->path[0] !== '/') {
+ @trigger_error(
+ 'The path of a URI with an authority must start with a slash "/" or be empty. Automagically fixing the URI ' .
+ 'by adding a leading slash to the path is deprecated since version 1.4 and will throw an exception instead.',
+ E_USER_DEPRECATED
+ );
+ $this->path = '/'. $this->path;
+ //throw new \InvalidArgumentException('The path of a URI with an authority must start with a slash "/" or be empty');
+ }
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/UriNormalizer.php b/vendor/guzzlehttp/psr7/src/UriNormalizer.php
new file mode 100644
index 0000000000..384c29e508
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/UriNormalizer.php
@@ -0,0 +1,216 @@
+getPath() === '' &&
+ ($uri->getScheme() === 'http' || $uri->getScheme() === 'https')
+ ) {
+ $uri = $uri->withPath('/');
+ }
+
+ if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') {
+ $uri = $uri->withHost('');
+ }
+
+ if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) {
+ $uri = $uri->withPort(null);
+ }
+
+ if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) {
+ $uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath()));
+ }
+
+ if ($flags & self::REMOVE_DUPLICATE_SLASHES) {
+ $uri = $uri->withPath(preg_replace('#//++#', '/', $uri->getPath()));
+ }
+
+ if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') {
+ $queryKeyValues = explode('&', $uri->getQuery());
+ sort($queryKeyValues);
+ $uri = $uri->withQuery(implode('&', $queryKeyValues));
+ }
+
+ return $uri;
+ }
+
+ /**
+ * Whether two URIs can be considered equivalent.
+ *
+ * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also
+ * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be
+ * resolved against the same base URI. If this is not the case, determination of equivalence or difference of
+ * relative references does not mean anything.
+ *
+ * @param UriInterface $uri1 An URI to compare
+ * @param UriInterface $uri2 An URI to compare
+ * @param int $normalizations A bitmask of normalizations to apply, see constants
+ *
+ * @return bool
+ * @link https://tools.ietf.org/html/rfc3986#section-6.1
+ */
+ public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS)
+ {
+ return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations);
+ }
+
+ private static function capitalizePercentEncoding(UriInterface $uri)
+ {
+ $regex = '/(?:%[A-Fa-f0-9]{2})++/';
+
+ $callback = function (array $match) {
+ return strtoupper($match[0]);
+ };
+
+ return
+ $uri->withPath(
+ preg_replace_callback($regex, $callback, $uri->getPath())
+ )->withQuery(
+ preg_replace_callback($regex, $callback, $uri->getQuery())
+ );
+ }
+
+ private static function decodeUnreservedCharacters(UriInterface $uri)
+ {
+ $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i';
+
+ $callback = function (array $match) {
+ return rawurldecode($match[0]);
+ };
+
+ return
+ $uri->withPath(
+ preg_replace_callback($regex, $callback, $uri->getPath())
+ )->withQuery(
+ preg_replace_callback($regex, $callback, $uri->getQuery())
+ );
+ }
+
+ private function __construct()
+ {
+ // cannot be instantiated
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/UriResolver.php b/vendor/guzzlehttp/psr7/src/UriResolver.php
new file mode 100644
index 0000000000..c1cb8a275a
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/UriResolver.php
@@ -0,0 +1,219 @@
+getScheme() != '') {
+ return $rel->withPath(self::removeDotSegments($rel->getPath()));
+ }
+
+ if ($rel->getAuthority() != '') {
+ $targetAuthority = $rel->getAuthority();
+ $targetPath = self::removeDotSegments($rel->getPath());
+ $targetQuery = $rel->getQuery();
+ } else {
+ $targetAuthority = $base->getAuthority();
+ if ($rel->getPath() === '') {
+ $targetPath = $base->getPath();
+ $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery();
+ } else {
+ if ($rel->getPath()[0] === '/') {
+ $targetPath = $rel->getPath();
+ } else {
+ if ($targetAuthority != '' && $base->getPath() === '') {
+ $targetPath = '/' . $rel->getPath();
+ } else {
+ $lastSlashPos = strrpos($base->getPath(), '/');
+ if ($lastSlashPos === false) {
+ $targetPath = $rel->getPath();
+ } else {
+ $targetPath = substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath();
+ }
+ }
+ }
+ $targetPath = self::removeDotSegments($targetPath);
+ $targetQuery = $rel->getQuery();
+ }
+ }
+
+ return new Uri(Uri::composeComponents(
+ $base->getScheme(),
+ $targetAuthority,
+ $targetPath,
+ $targetQuery,
+ $rel->getFragment()
+ ));
+ }
+
+ /**
+ * Returns the target URI as a relative reference from the base URI.
+ *
+ * This method is the counterpart to resolve():
+ *
+ * (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target))
+ *
+ * One use-case is to use the current request URI as base URI and then generate relative links in your documents
+ * to reduce the document size or offer self-contained downloadable document archives.
+ *
+ * $base = new Uri('http://example.com/a/b/');
+ * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'.
+ * echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'.
+ * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'.
+ * echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'.
+ *
+ * This method also accepts a target that is already relative and will try to relativize it further. Only a
+ * relative-path reference will be returned as-is.
+ *
+ * echo UriResolver::relativize($base, new Uri('/a/b/c')); // prints 'c' as well
+ *
+ * @param UriInterface $base Base URI
+ * @param UriInterface $target Target URI
+ *
+ * @return UriInterface The relative URI reference
+ */
+ public static function relativize(UriInterface $base, UriInterface $target)
+ {
+ if ($target->getScheme() !== '' &&
+ ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '')
+ ) {
+ return $target;
+ }
+
+ if (Uri::isRelativePathReference($target)) {
+ // As the target is already highly relative we return it as-is. It would be possible to resolve
+ // the target with `$target = self::resolve($base, $target);` and then try make it more relative
+ // by removing a duplicate query. But let's not do that automatically.
+ return $target;
+ }
+
+ if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) {
+ return $target->withScheme('');
+ }
+
+ // We must remove the path before removing the authority because if the path starts with two slashes, the URI
+ // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also
+ // invalid.
+ $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost('');
+
+ if ($base->getPath() !== $target->getPath()) {
+ return $emptyPathUri->withPath(self::getRelativePath($base, $target));
+ }
+
+ if ($base->getQuery() === $target->getQuery()) {
+ // Only the target fragment is left. And it must be returned even if base and target fragment are the same.
+ return $emptyPathUri->withQuery('');
+ }
+
+ // If the base URI has a query but the target has none, we cannot return an empty path reference as it would
+ // inherit the base query component when resolving.
+ if ($target->getQuery() === '') {
+ $segments = explode('/', $target->getPath());
+ $lastSegment = end($segments);
+
+ return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment);
+ }
+
+ return $emptyPathUri;
+ }
+
+ private static function getRelativePath(UriInterface $base, UriInterface $target)
+ {
+ $sourceSegments = explode('/', $base->getPath());
+ $targetSegments = explode('/', $target->getPath());
+ array_pop($sourceSegments);
+ $targetLastSegment = array_pop($targetSegments);
+ foreach ($sourceSegments as $i => $segment) {
+ if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) {
+ unset($sourceSegments[$i], $targetSegments[$i]);
+ } else {
+ break;
+ }
+ }
+ $targetSegments[] = $targetLastSegment;
+ $relativePath = str_repeat('../', count($sourceSegments)) . implode('/', $targetSegments);
+
+ // A reference to am empty last segment or an empty first sub-segment must be prefixed with "./".
+ // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used
+ // as the first segment of a relative-path reference, as it would be mistaken for a scheme name.
+ if ('' === $relativePath || false !== strpos(explode('/', $relativePath, 2)[0], ':')) {
+ $relativePath = "./$relativePath";
+ } elseif ('/' === $relativePath[0]) {
+ if ($base->getAuthority() != '' && $base->getPath() === '') {
+ // In this case an extra slash is added by resolve() automatically. So we must not add one here.
+ $relativePath = ".$relativePath";
+ } else {
+ $relativePath = "./$relativePath";
+ }
+ }
+
+ return $relativePath;
+ }
+
+ private function __construct()
+ {
+ // cannot be instantiated
+ }
+}
diff --git a/vendor/guzzlehttp/psr7/src/functions.php b/vendor/guzzlehttp/psr7/src/functions.php
new file mode 100644
index 0000000000..e40348d6ab
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/functions.php
@@ -0,0 +1,828 @@
+getMethod() . ' '
+ . $message->getRequestTarget())
+ . ' HTTP/' . $message->getProtocolVersion();
+ if (!$message->hasHeader('host')) {
+ $msg .= "\r\nHost: " . $message->getUri()->getHost();
+ }
+ } elseif ($message instanceof ResponseInterface) {
+ $msg = 'HTTP/' . $message->getProtocolVersion() . ' '
+ . $message->getStatusCode() . ' '
+ . $message->getReasonPhrase();
+ } else {
+ throw new \InvalidArgumentException('Unknown message type');
+ }
+
+ foreach ($message->getHeaders() as $name => $values) {
+ $msg .= "\r\n{$name}: " . implode(', ', $values);
+ }
+
+ return "{$msg}\r\n\r\n" . $message->getBody();
+}
+
+/**
+ * Returns a UriInterface for the given value.
+ *
+ * This function accepts a string or {@see Psr\Http\Message\UriInterface} and
+ * returns a UriInterface for the given value. If the value is already a
+ * `UriInterface`, it is returned as-is.
+ *
+ * @param string|UriInterface $uri
+ *
+ * @return UriInterface
+ * @throws \InvalidArgumentException
+ */
+function uri_for($uri)
+{
+ if ($uri instanceof UriInterface) {
+ return $uri;
+ } elseif (is_string($uri)) {
+ return new Uri($uri);
+ }
+
+ throw new \InvalidArgumentException('URI must be a string or UriInterface');
+}
+
+/**
+ * Create a new stream based on the input type.
+ *
+ * Options is an associative array that can contain the following keys:
+ * - metadata: Array of custom metadata.
+ * - size: Size of the stream.
+ *
+ * @param resource|string|null|int|float|bool|StreamInterface|callable $resource Entity body data
+ * @param array $options Additional options
+ *
+ * @return Stream
+ * @throws \InvalidArgumentException if the $resource arg is not valid.
+ */
+function stream_for($resource = '', array $options = [])
+{
+ if (is_scalar($resource)) {
+ $stream = fopen('php://temp', 'r+');
+ if ($resource !== '') {
+ fwrite($stream, $resource);
+ fseek($stream, 0);
+ }
+ return new Stream($stream, $options);
+ }
+
+ switch (gettype($resource)) {
+ case 'resource':
+ return new Stream($resource, $options);
+ case 'object':
+ if ($resource instanceof StreamInterface) {
+ return $resource;
+ } elseif ($resource instanceof \Iterator) {
+ return new PumpStream(function () use ($resource) {
+ if (!$resource->valid()) {
+ return false;
+ }
+ $result = $resource->current();
+ $resource->next();
+ return $result;
+ }, $options);
+ } elseif (method_exists($resource, '__toString')) {
+ return stream_for((string) $resource, $options);
+ }
+ break;
+ case 'NULL':
+ return new Stream(fopen('php://temp', 'r+'), $options);
+ }
+
+ if (is_callable($resource)) {
+ return new PumpStream($resource, $options);
+ }
+
+ throw new \InvalidArgumentException('Invalid resource type: ' . gettype($resource));
+}
+
+/**
+ * Parse an array of header values containing ";" separated data into an
+ * array of associative arrays representing the header key value pair
+ * data of the header. When a parameter does not contain a value, but just
+ * contains a key, this function will inject a key with a '' string value.
+ *
+ * @param string|array $header Header to parse into components.
+ *
+ * @return array Returns the parsed header values.
+ */
+function parse_header($header)
+{
+ static $trimmed = "\"' \n\t\r";
+ $params = $matches = [];
+
+ foreach (normalize_header($header) as $val) {
+ $part = [];
+ foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) {
+ if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) {
+ $m = $matches[0];
+ if (isset($m[1])) {
+ $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed);
+ } else {
+ $part[] = trim($m[0], $trimmed);
+ }
+ }
+ }
+ if ($part) {
+ $params[] = $part;
+ }
+ }
+
+ return $params;
+}
+
+/**
+ * Converts an array of header values that may contain comma separated
+ * headers into an array of headers with no comma separated values.
+ *
+ * @param string|array $header Header to normalize.
+ *
+ * @return array Returns the normalized header field values.
+ */
+function normalize_header($header)
+{
+ if (!is_array($header)) {
+ return array_map('trim', explode(',', $header));
+ }
+
+ $result = [];
+ foreach ($header as $value) {
+ foreach ((array) $value as $v) {
+ if (strpos($v, ',') === false) {
+ $result[] = $v;
+ continue;
+ }
+ foreach (preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $v) as $vv) {
+ $result[] = trim($vv);
+ }
+ }
+ }
+
+ return $result;
+}
+
+/**
+ * Clone and modify a request with the given changes.
+ *
+ * The changes can be one of:
+ * - method: (string) Changes the HTTP method.
+ * - set_headers: (array) Sets the given headers.
+ * - remove_headers: (array) Remove the given headers.
+ * - body: (mixed) Sets the given body.
+ * - uri: (UriInterface) Set the URI.
+ * - query: (string) Set the query string value of the URI.
+ * - version: (string) Set the protocol version.
+ *
+ * @param RequestInterface $request Request to clone and modify.
+ * @param array $changes Changes to apply.
+ *
+ * @return RequestInterface
+ */
+function modify_request(RequestInterface $request, array $changes)
+{
+ if (!$changes) {
+ return $request;
+ }
+
+ $headers = $request->getHeaders();
+
+ if (!isset($changes['uri'])) {
+ $uri = $request->getUri();
+ } else {
+ // Remove the host header if one is on the URI
+ if ($host = $changes['uri']->getHost()) {
+ $changes['set_headers']['Host'] = $host;
+
+ if ($port = $changes['uri']->getPort()) {
+ $standardPorts = ['http' => 80, 'https' => 443];
+ $scheme = $changes['uri']->getScheme();
+ if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) {
+ $changes['set_headers']['Host'] .= ':'.$port;
+ }
+ }
+ }
+ $uri = $changes['uri'];
+ }
+
+ if (!empty($changes['remove_headers'])) {
+ $headers = _caseless_remove($changes['remove_headers'], $headers);
+ }
+
+ if (!empty($changes['set_headers'])) {
+ $headers = _caseless_remove(array_keys($changes['set_headers']), $headers);
+ $headers = $changes['set_headers'] + $headers;
+ }
+
+ if (isset($changes['query'])) {
+ $uri = $uri->withQuery($changes['query']);
+ }
+
+ if ($request instanceof ServerRequestInterface) {
+ return new ServerRequest(
+ isset($changes['method']) ? $changes['method'] : $request->getMethod(),
+ $uri,
+ $headers,
+ isset($changes['body']) ? $changes['body'] : $request->getBody(),
+ isset($changes['version'])
+ ? $changes['version']
+ : $request->getProtocolVersion(),
+ $request->getServerParams()
+ );
+ }
+
+ return new Request(
+ isset($changes['method']) ? $changes['method'] : $request->getMethod(),
+ $uri,
+ $headers,
+ isset($changes['body']) ? $changes['body'] : $request->getBody(),
+ isset($changes['version'])
+ ? $changes['version']
+ : $request->getProtocolVersion()
+ );
+}
+
+/**
+ * Attempts to rewind a message body and throws an exception on failure.
+ *
+ * The body of the message will only be rewound if a call to `tell()` returns a
+ * value other than `0`.
+ *
+ * @param MessageInterface $message Message to rewind
+ *
+ * @throws \RuntimeException
+ */
+function rewind_body(MessageInterface $message)
+{
+ $body = $message->getBody();
+
+ if ($body->tell()) {
+ $body->rewind();
+ }
+}
+
+/**
+ * Safely opens a PHP stream resource using a filename.
+ *
+ * When fopen fails, PHP normally raises a warning. This function adds an
+ * error handler that checks for errors and throws an exception instead.
+ *
+ * @param string $filename File to open
+ * @param string $mode Mode used to open the file
+ *
+ * @return resource
+ * @throws \RuntimeException if the file cannot be opened
+ */
+function try_fopen($filename, $mode)
+{
+ $ex = null;
+ set_error_handler(function () use ($filename, $mode, &$ex) {
+ $ex = new \RuntimeException(sprintf(
+ 'Unable to open %s using mode %s: %s',
+ $filename,
+ $mode,
+ func_get_args()[1]
+ ));
+ });
+
+ $handle = fopen($filename, $mode);
+ restore_error_handler();
+
+ if ($ex) {
+ /** @var $ex \RuntimeException */
+ throw $ex;
+ }
+
+ return $handle;
+}
+
+/**
+ * Copy the contents of a stream into a string until the given number of
+ * bytes have been read.
+ *
+ * @param StreamInterface $stream Stream to read
+ * @param int $maxLen Maximum number of bytes to read. Pass -1
+ * to read the entire stream.
+ * @return string
+ * @throws \RuntimeException on error.
+ */
+function copy_to_string(StreamInterface $stream, $maxLen = -1)
+{
+ $buffer = '';
+
+ if ($maxLen === -1) {
+ while (!$stream->eof()) {
+ $buf = $stream->read(1048576);
+ // Using a loose equality here to match on '' and false.
+ if ($buf == null) {
+ break;
+ }
+ $buffer .= $buf;
+ }
+ return $buffer;
+ }
+
+ $len = 0;
+ while (!$stream->eof() && $len < $maxLen) {
+ $buf = $stream->read($maxLen - $len);
+ // Using a loose equality here to match on '' and false.
+ if ($buf == null) {
+ break;
+ }
+ $buffer .= $buf;
+ $len = strlen($buffer);
+ }
+
+ return $buffer;
+}
+
+/**
+ * Copy the contents of a stream into another stream until the given number
+ * of bytes have been read.
+ *
+ * @param StreamInterface $source Stream to read from
+ * @param StreamInterface $dest Stream to write to
+ * @param int $maxLen Maximum number of bytes to read. Pass -1
+ * to read the entire stream.
+ *
+ * @throws \RuntimeException on error.
+ */
+function copy_to_stream(
+ StreamInterface $source,
+ StreamInterface $dest,
+ $maxLen = -1
+) {
+ $bufferSize = 8192;
+
+ if ($maxLen === -1) {
+ while (!$source->eof()) {
+ if (!$dest->write($source->read($bufferSize))) {
+ break;
+ }
+ }
+ } else {
+ $remaining = $maxLen;
+ while ($remaining > 0 && !$source->eof()) {
+ $buf = $source->read(min($bufferSize, $remaining));
+ $len = strlen($buf);
+ if (!$len) {
+ break;
+ }
+ $remaining -= $len;
+ $dest->write($buf);
+ }
+ }
+}
+
+/**
+ * Calculate a hash of a Stream
+ *
+ * @param StreamInterface $stream Stream to calculate the hash for
+ * @param string $algo Hash algorithm (e.g. md5, crc32, etc)
+ * @param bool $rawOutput Whether or not to use raw output
+ *
+ * @return string Returns the hash of the stream
+ * @throws \RuntimeException on error.
+ */
+function hash(
+ StreamInterface $stream,
+ $algo,
+ $rawOutput = false
+) {
+ $pos = $stream->tell();
+
+ if ($pos > 0) {
+ $stream->rewind();
+ }
+
+ $ctx = hash_init($algo);
+ while (!$stream->eof()) {
+ hash_update($ctx, $stream->read(1048576));
+ }
+
+ $out = hash_final($ctx, (bool) $rawOutput);
+ $stream->seek($pos);
+
+ return $out;
+}
+
+/**
+ * Read a line from the stream up to the maximum allowed buffer length
+ *
+ * @param StreamInterface $stream Stream to read from
+ * @param int $maxLength Maximum buffer length
+ *
+ * @return string|bool
+ */
+function readline(StreamInterface $stream, $maxLength = null)
+{
+ $buffer = '';
+ $size = 0;
+
+ while (!$stream->eof()) {
+ // Using a loose equality here to match on '' and false.
+ if (null == ($byte = $stream->read(1))) {
+ return $buffer;
+ }
+ $buffer .= $byte;
+ // Break when a new line is found or the max length - 1 is reached
+ if ($byte === "\n" || ++$size === $maxLength - 1) {
+ break;
+ }
+ }
+
+ return $buffer;
+}
+
+/**
+ * Parses a request message string into a request object.
+ *
+ * @param string $message Request message string.
+ *
+ * @return Request
+ */
+function parse_request($message)
+{
+ $data = _parse_message($message);
+ $matches = [];
+ if (!preg_match('/^[\S]+\s+([a-zA-Z]+:\/\/|\/).*/', $data['start-line'], $matches)) {
+ throw new \InvalidArgumentException('Invalid request string');
+ }
+ $parts = explode(' ', $data['start-line'], 3);
+ $version = isset($parts[2]) ? explode('/', $parts[2])[1] : '1.1';
+
+ $request = new Request(
+ $parts[0],
+ $matches[1] === '/' ? _parse_request_uri($parts[1], $data['headers']) : $parts[1],
+ $data['headers'],
+ $data['body'],
+ $version
+ );
+
+ return $matches[1] === '/' ? $request : $request->withRequestTarget($parts[1]);
+}
+
+/**
+ * Parses a response message string into a response object.
+ *
+ * @param string $message Response message string.
+ *
+ * @return Response
+ */
+function parse_response($message)
+{
+ $data = _parse_message($message);
+ // According to https://tools.ietf.org/html/rfc7230#section-3.1.2 the space
+ // between status-code and reason-phrase is required. But browsers accept
+ // responses without space and reason as well.
+ if (!preg_match('/^HTTP\/.* [0-9]{3}( .*|$)/', $data['start-line'])) {
+ throw new \InvalidArgumentException('Invalid response string');
+ }
+ $parts = explode(' ', $data['start-line'], 3);
+
+ return new Response(
+ $parts[1],
+ $data['headers'],
+ $data['body'],
+ explode('/', $parts[0])[1],
+ isset($parts[2]) ? $parts[2] : null
+ );
+}
+
+/**
+ * Parse a query string into an associative array.
+ *
+ * If multiple values are found for the same key, the value of that key
+ * value pair will become an array. This function does not parse nested
+ * PHP style arrays into an associative array (e.g., foo[a]=1&foo[b]=2 will
+ * be parsed into ['foo[a]' => '1', 'foo[b]' => '2']).
+ *
+ * @param string $str Query string to parse
+ * @param bool|string $urlEncoding How the query string is encoded
+ *
+ * @return array
+ */
+function parse_query($str, $urlEncoding = true)
+{
+ $result = [];
+
+ if ($str === '') {
+ return $result;
+ }
+
+ if ($urlEncoding === true) {
+ $decoder = function ($value) {
+ return rawurldecode(str_replace('+', ' ', $value));
+ };
+ } elseif ($urlEncoding == PHP_QUERY_RFC3986) {
+ $decoder = 'rawurldecode';
+ } elseif ($urlEncoding == PHP_QUERY_RFC1738) {
+ $decoder = 'urldecode';
+ } else {
+ $decoder = function ($str) { return $str; };
+ }
+
+ foreach (explode('&', $str) as $kvp) {
+ $parts = explode('=', $kvp, 2);
+ $key = $decoder($parts[0]);
+ $value = isset($parts[1]) ? $decoder($parts[1]) : null;
+ if (!isset($result[$key])) {
+ $result[$key] = $value;
+ } else {
+ if (!is_array($result[$key])) {
+ $result[$key] = [$result[$key]];
+ }
+ $result[$key][] = $value;
+ }
+ }
+
+ return $result;
+}
+
+/**
+ * Build a query string from an array of key value pairs.
+ *
+ * This function can use the return value of parse_query() to build a query
+ * string. This function does not modify the provided keys when an array is
+ * encountered (like http_build_query would).
+ *
+ * @param array $params Query string parameters.
+ * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986
+ * to encode using RFC3986, or PHP_QUERY_RFC1738
+ * to encode using RFC1738.
+ * @return string
+ */
+function build_query(array $params, $encoding = PHP_QUERY_RFC3986)
+{
+ if (!$params) {
+ return '';
+ }
+
+ if ($encoding === false) {
+ $encoder = function ($str) { return $str; };
+ } elseif ($encoding === PHP_QUERY_RFC3986) {
+ $encoder = 'rawurlencode';
+ } elseif ($encoding === PHP_QUERY_RFC1738) {
+ $encoder = 'urlencode';
+ } else {
+ throw new \InvalidArgumentException('Invalid type');
+ }
+
+ $qs = '';
+ foreach ($params as $k => $v) {
+ $k = $encoder($k);
+ if (!is_array($v)) {
+ $qs .= $k;
+ if ($v !== null) {
+ $qs .= '=' . $encoder($v);
+ }
+ $qs .= '&';
+ } else {
+ foreach ($v as $vv) {
+ $qs .= $k;
+ if ($vv !== null) {
+ $qs .= '=' . $encoder($vv);
+ }
+ $qs .= '&';
+ }
+ }
+ }
+
+ return $qs ? (string) substr($qs, 0, -1) : '';
+}
+
+/**
+ * Determines the mimetype of a file by looking at its extension.
+ *
+ * @param $filename
+ *
+ * @return null|string
+ */
+function mimetype_from_filename($filename)
+{
+ return mimetype_from_extension(pathinfo($filename, PATHINFO_EXTENSION));
+}
+
+/**
+ * Maps a file extensions to a mimetype.
+ *
+ * @param $extension string The file extension.
+ *
+ * @return string|null
+ * @link http://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x/conf/mime.types
+ */
+function mimetype_from_extension($extension)
+{
+ static $mimetypes = [
+ '7z' => 'application/x-7z-compressed',
+ 'aac' => 'audio/x-aac',
+ 'ai' => 'application/postscript',
+ 'aif' => 'audio/x-aiff',
+ 'asc' => 'text/plain',
+ 'asf' => 'video/x-ms-asf',
+ 'atom' => 'application/atom+xml',
+ 'avi' => 'video/x-msvideo',
+ 'bmp' => 'image/bmp',
+ 'bz2' => 'application/x-bzip2',
+ 'cer' => 'application/pkix-cert',
+ 'crl' => 'application/pkix-crl',
+ 'crt' => 'application/x-x509-ca-cert',
+ 'css' => 'text/css',
+ 'csv' => 'text/csv',
+ 'cu' => 'application/cu-seeme',
+ 'deb' => 'application/x-debian-package',
+ 'doc' => 'application/msword',
+ 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+ 'dvi' => 'application/x-dvi',
+ 'eot' => 'application/vnd.ms-fontobject',
+ 'eps' => 'application/postscript',
+ 'epub' => 'application/epub+zip',
+ 'etx' => 'text/x-setext',
+ 'flac' => 'audio/flac',
+ 'flv' => 'video/x-flv',
+ 'gif' => 'image/gif',
+ 'gz' => 'application/gzip',
+ 'htm' => 'text/html',
+ 'html' => 'text/html',
+ 'ico' => 'image/x-icon',
+ 'ics' => 'text/calendar',
+ 'ini' => 'text/plain',
+ 'iso' => 'application/x-iso9660-image',
+ 'jar' => 'application/java-archive',
+ 'jpe' => 'image/jpeg',
+ 'jpeg' => 'image/jpeg',
+ 'jpg' => 'image/jpeg',
+ 'js' => 'text/javascript',
+ 'json' => 'application/json',
+ 'latex' => 'application/x-latex',
+ 'log' => 'text/plain',
+ 'm4a' => 'audio/mp4',
+ 'm4v' => 'video/mp4',
+ 'mid' => 'audio/midi',
+ 'midi' => 'audio/midi',
+ 'mov' => 'video/quicktime',
+ 'mp3' => 'audio/mpeg',
+ 'mp4' => 'video/mp4',
+ 'mp4a' => 'audio/mp4',
+ 'mp4v' => 'video/mp4',
+ 'mpe' => 'video/mpeg',
+ 'mpeg' => 'video/mpeg',
+ 'mpg' => 'video/mpeg',
+ 'mpg4' => 'video/mp4',
+ 'oga' => 'audio/ogg',
+ 'ogg' => 'audio/ogg',
+ 'ogv' => 'video/ogg',
+ 'ogx' => 'application/ogg',
+ 'pbm' => 'image/x-portable-bitmap',
+ 'pdf' => 'application/pdf',
+ 'pgm' => 'image/x-portable-graymap',
+ 'png' => 'image/png',
+ 'pnm' => 'image/x-portable-anymap',
+ 'ppm' => 'image/x-portable-pixmap',
+ 'ppt' => 'application/vnd.ms-powerpoint',
+ 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+ 'ps' => 'application/postscript',
+ 'qt' => 'video/quicktime',
+ 'rar' => 'application/x-rar-compressed',
+ 'ras' => 'image/x-cmu-raster',
+ 'rss' => 'application/rss+xml',
+ 'rtf' => 'application/rtf',
+ 'sgm' => 'text/sgml',
+ 'sgml' => 'text/sgml',
+ 'svg' => 'image/svg+xml',
+ 'swf' => 'application/x-shockwave-flash',
+ 'tar' => 'application/x-tar',
+ 'tif' => 'image/tiff',
+ 'tiff' => 'image/tiff',
+ 'torrent' => 'application/x-bittorrent',
+ 'ttf' => 'application/x-font-ttf',
+ 'txt' => 'text/plain',
+ 'wav' => 'audio/x-wav',
+ 'webm' => 'video/webm',
+ 'wma' => 'audio/x-ms-wma',
+ 'wmv' => 'video/x-ms-wmv',
+ 'woff' => 'application/x-font-woff',
+ 'wsdl' => 'application/wsdl+xml',
+ 'xbm' => 'image/x-xbitmap',
+ 'xls' => 'application/vnd.ms-excel',
+ 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+ 'xml' => 'application/xml',
+ 'xpm' => 'image/x-xpixmap',
+ 'xwd' => 'image/x-xwindowdump',
+ 'yaml' => 'text/yaml',
+ 'yml' => 'text/yaml',
+ 'zip' => 'application/zip',
+ ];
+
+ $extension = strtolower($extension);
+
+ return isset($mimetypes[$extension])
+ ? $mimetypes[$extension]
+ : null;
+}
+
+/**
+ * Parses an HTTP message into an associative array.
+ *
+ * The array contains the "start-line" key containing the start line of
+ * the message, "headers" key containing an associative array of header
+ * array values, and a "body" key containing the body of the message.
+ *
+ * @param string $message HTTP request or response to parse.
+ *
+ * @return array
+ * @internal
+ */
+function _parse_message($message)
+{
+ if (!$message) {
+ throw new \InvalidArgumentException('Invalid message');
+ }
+
+ // Iterate over each line in the message, accounting for line endings
+ $lines = preg_split('/(\\r?\\n)/', $message, -1, PREG_SPLIT_DELIM_CAPTURE);
+ $result = ['start-line' => array_shift($lines), 'headers' => [], 'body' => ''];
+ array_shift($lines);
+
+ for ($i = 0, $totalLines = count($lines); $i < $totalLines; $i += 2) {
+ $line = $lines[$i];
+ // If two line breaks were encountered, then this is the end of body
+ if (empty($line)) {
+ if ($i < $totalLines - 1) {
+ $result['body'] = implode('', array_slice($lines, $i + 2));
+ }
+ break;
+ }
+ if (strpos($line, ':')) {
+ $parts = explode(':', $line, 2);
+ $key = trim($parts[0]);
+ $value = isset($parts[1]) ? trim($parts[1]) : '';
+ $result['headers'][$key][] = $value;
+ }
+ }
+
+ return $result;
+}
+
+/**
+ * Constructs a URI for an HTTP request message.
+ *
+ * @param string $path Path from the start-line
+ * @param array $headers Array of headers (each value an array).
+ *
+ * @return string
+ * @internal
+ */
+function _parse_request_uri($path, array $headers)
+{
+ $hostKey = array_filter(array_keys($headers), function ($k) {
+ return strtolower($k) === 'host';
+ });
+
+ // If no host is found, then a full URI cannot be constructed.
+ if (!$hostKey) {
+ return $path;
+ }
+
+ $host = $headers[reset($hostKey)][0];
+ $scheme = substr($host, -4) === ':443' ? 'https' : 'http';
+
+ return $scheme . '://' . $host . '/' . ltrim($path, '/');
+}
+
+/** @internal */
+function _caseless_remove($keys, array $data)
+{
+ $result = [];
+
+ foreach ($keys as &$key) {
+ $key = strtolower($key);
+ }
+
+ foreach ($data as $k => $v) {
+ if (!in_array(strtolower($k), $keys)) {
+ $result[$k] = $v;
+ }
+ }
+
+ return $result;
+}
diff --git a/vendor/guzzlehttp/psr7/src/functions_include.php b/vendor/guzzlehttp/psr7/src/functions_include.php
new file mode 100644
index 0000000000..96a4a83a01
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/functions_include.php
@@ -0,0 +1,6 @@
+=5.4.0",
+ "ext-fileinfo": "*",
+ "guzzlehttp/psr7": "~1.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8 || ^5.7",
+ "mockery/mockery": "~0.9.2"
+ },
+ "suggest": {
+ "ext-gd": "to use GD library based image processing.",
+ "ext-imagick": "to use Imagick based image processing.",
+ "intervention/imagecache": "Caching extension for the Intervention Image library"
+ },
+ "autoload": {
+ "psr-4": {
+ "Intervention\\Image\\": "src/Intervention/Image"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.4-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Intervention\\Image\\ImageServiceProvider"
+ ],
+ "aliases": {
+ "Image": "Intervention\\Image\\Facades\\Image"
+ }
+ }
+ },
+ "minimum-stability": "stable"
+}
diff --git a/vendor/intervention/image/provides.json b/vendor/intervention/image/provides.json
new file mode 100644
index 0000000000..a8cd1b6a54
--- /dev/null
+++ b/vendor/intervention/image/provides.json
@@ -0,0 +1,11 @@
+{
+ "providers": [
+ "Intervention\\Image\\ImageServiceProvider"
+ ],
+ "aliases": [
+ {
+ "alias": "Image",
+ "facade": "Intervention\\Image\\Facades\\Image"
+ }
+ ]
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/AbstractColor.php b/vendor/intervention/image/src/Intervention/Image/AbstractColor.php
new file mode 100644
index 0000000000..28cbaf29dc
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/AbstractColor.php
@@ -0,0 +1,226 @@
+parse($value);
+ }
+
+ /**
+ * Parses given value as color
+ *
+ * @param mixed $value
+ * @return \Intervention\Image\AbstractColor
+ */
+ public function parse($value)
+ {
+ switch (true) {
+
+ case is_string($value):
+ $this->initFromString($value);
+ break;
+
+ case is_int($value):
+ $this->initFromInteger($value);
+ break;
+
+ case is_array($value):
+ $this->initFromArray($value);
+ break;
+
+ case is_object($value):
+ $this->initFromObject($value);
+ break;
+
+ case is_null($value):
+ $this->initFromArray([255, 255, 255, 0]);
+ break;
+
+ default:
+ throw new \Intervention\Image\Exception\NotReadableException(
+ "Color format ({$value}) cannot be read."
+ );
+ }
+
+ return $this;
+ }
+
+ /**
+ * Formats current color instance into given format
+ *
+ * @param string $type
+ * @return mixed
+ */
+ public function format($type)
+ {
+ switch (strtolower($type)) {
+
+ case 'rgba':
+ return $this->getRgba();
+
+ case 'hex':
+ return $this->getHex('#');
+
+ case 'int':
+ case 'integer':
+ return $this->getInt();
+
+ case 'array':
+ return $this->getArray();
+
+ case 'obj':
+ case 'object':
+ return $this;
+
+ default:
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ "Color format ({$type}) is not supported."
+ );
+ }
+ }
+
+ /**
+ * Reads RGBA values from string into array
+ *
+ * @param string $value
+ * @return array
+ */
+ protected function rgbaFromString($value)
+ {
+ $result = false;
+
+ // parse color string in hexidecimal format like #cccccc or cccccc or ccc
+ $hexPattern = '/^#?([a-f0-9]{1,2})([a-f0-9]{1,2})([a-f0-9]{1,2})$/i';
+
+ // parse color string in format rgb(140, 140, 140)
+ $rgbPattern = '/^rgb ?\(([0-9]{1,3}), ?([0-9]{1,3}), ?([0-9]{1,3})\)$/i';
+
+ // parse color string in format rgba(255, 0, 0, 0.5)
+ $rgbaPattern = '/^rgba ?\(([0-9]{1,3}), ?([0-9]{1,3}), ?([0-9]{1,3}), ?([0-9.]{1,4})\)$/i';
+
+ if (preg_match($hexPattern, $value, $matches)) {
+ $result = [];
+ $result[0] = strlen($matches[1]) == '1' ? hexdec($matches[1].$matches[1]) : hexdec($matches[1]);
+ $result[1] = strlen($matches[2]) == '1' ? hexdec($matches[2].$matches[2]) : hexdec($matches[2]);
+ $result[2] = strlen($matches[3]) == '1' ? hexdec($matches[3].$matches[3]) : hexdec($matches[3]);
+ $result[3] = 1;
+ } elseif (preg_match($rgbPattern, $value, $matches)) {
+ $result = [];
+ $result[0] = ($matches[1] >= 0 && $matches[1] <= 255) ? intval($matches[1]) : 0;
+ $result[1] = ($matches[2] >= 0 && $matches[2] <= 255) ? intval($matches[2]) : 0;
+ $result[2] = ($matches[3] >= 0 && $matches[3] <= 255) ? intval($matches[3]) : 0;
+ $result[3] = 1;
+ } elseif (preg_match($rgbaPattern, $value, $matches)) {
+ $result = [];
+ $result[0] = ($matches[1] >= 0 && $matches[1] <= 255) ? intval($matches[1]) : 0;
+ $result[1] = ($matches[2] >= 0 && $matches[2] <= 255) ? intval($matches[2]) : 0;
+ $result[2] = ($matches[3] >= 0 && $matches[3] <= 255) ? intval($matches[3]) : 0;
+ $result[3] = ($matches[4] >= 0 && $matches[4] <= 1) ? $matches[4] : 0;
+ } else {
+ throw new \Intervention\Image\Exception\NotReadableException(
+ "Unable to read color ({$value})."
+ );
+ }
+
+ return $result;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/AbstractDecoder.php b/vendor/intervention/image/src/Intervention/Image/AbstractDecoder.php
new file mode 100644
index 0000000000..54e1ee9d7c
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/AbstractDecoder.php
@@ -0,0 +1,358 @@
+data = $data;
+ }
+
+ /**
+ * Init from given URL
+ *
+ * @param string $url
+ * @return \Intervention\Image\Image
+ */
+ public function initFromUrl($url)
+ {
+
+ $options = [
+ 'http' => [
+ 'method'=>"GET",
+ 'header'=>"Accept-language: en\r\n".
+ "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2\r\n"
+ ]
+ ];
+
+ $context = stream_context_create($options);
+
+
+ if ($data = @file_get_contents($url, false, $context)) {
+ return $this->initFromBinary($data);
+ }
+
+ throw new \Intervention\Image\Exception\NotReadableException(
+ "Unable to init from given url (".$url.")."
+ );
+ }
+
+ /**
+ * Init from given stream
+ *
+ * @param StreamInterface|resource $stream
+ * @return \Intervention\Image\Image
+ */
+ public function initFromStream($stream)
+ {
+ if (!$stream instanceof StreamInterface) {
+ $stream = new Stream($stream);
+ }
+
+ try {
+ $offset = $stream->tell();
+ } catch (\RuntimeException $e) {
+ $offset = 0;
+ }
+
+ $shouldAndCanSeek = $offset !== 0 && $stream->isSeekable();
+
+ if ($shouldAndCanSeek) {
+ $stream->rewind();
+ }
+
+ try {
+ $data = $stream->getContents();
+ } catch (\RuntimeException $e) {
+ $data = null;
+ }
+
+ if ($shouldAndCanSeek) {
+ $stream->seek($offset);
+ }
+
+ if ($data) {
+ return $this->initFromBinary($data);
+ }
+
+ throw new \Intervention\Image\Exception\NotReadableException(
+ "Unable to init from given stream"
+ );
+ }
+
+ /**
+ * Determines if current source data is GD resource
+ *
+ * @return boolean
+ */
+ public function isGdResource()
+ {
+ if (is_resource($this->data)) {
+ return (get_resource_type($this->data) == 'gd');
+ }
+
+ return false;
+ }
+
+ /**
+ * Determines if current source data is Imagick object
+ *
+ * @return boolean
+ */
+ public function isImagick()
+ {
+ return is_a($this->data, 'Imagick');
+ }
+
+ /**
+ * Determines if current source data is Intervention\Image\Image object
+ *
+ * @return boolean
+ */
+ public function isInterventionImage()
+ {
+ return is_a($this->data, '\Intervention\Image\Image');
+ }
+
+ /**
+ * Determines if current data is SplFileInfo object
+ *
+ * @return boolean
+ */
+ public function isSplFileInfo()
+ {
+ return is_a($this->data, 'SplFileInfo');
+ }
+
+ /**
+ * Determines if current data is Symfony UploadedFile component
+ *
+ * @return boolean
+ */
+ public function isSymfonyUpload()
+ {
+ return is_a($this->data, 'Symfony\Component\HttpFoundation\File\UploadedFile');
+ }
+
+ /**
+ * Determines if current source data is file path
+ *
+ * @return boolean
+ */
+ public function isFilePath()
+ {
+ if (is_string($this->data)) {
+ try {
+ return is_file($this->data);
+ } catch (\Exception $e) {
+ return false;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Determines if current source data is url
+ *
+ * @return boolean
+ */
+ public function isUrl()
+ {
+ return (bool) filter_var($this->data, FILTER_VALIDATE_URL);
+ }
+
+ /**
+ * Determines if current source data is a stream resource
+ *
+ * @return boolean
+ */
+ public function isStream()
+ {
+ if ($this->data instanceof StreamInterface) return true;
+ if (!is_resource($this->data)) return false;
+ if (get_resource_type($this->data) !== 'stream') return false;
+
+ return true;
+ }
+
+ /**
+ * Determines if current source data is binary data
+ *
+ * @return boolean
+ */
+ public function isBinary()
+ {
+ if (is_string($this->data)) {
+ $mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $this->data);
+ return (substr($mime, 0, 4) != 'text' && $mime != 'application/x-empty');
+ }
+
+ return false;
+ }
+
+ /**
+ * Determines if current source data is data-url
+ *
+ * @return boolean
+ */
+ public function isDataUrl()
+ {
+ $data = $this->decodeDataUrl($this->data);
+
+ return is_null($data) ? false : true;
+ }
+
+ /**
+ * Determines if current source data is base64 encoded
+ *
+ * @return boolean
+ */
+ public function isBase64()
+ {
+ if (!is_string($this->data)) {
+ return false;
+ }
+
+ return base64_encode(base64_decode($this->data)) === $this->data;
+ }
+
+ /**
+ * Initiates new Image from Intervention\Image\Image
+ *
+ * @param Image $object
+ * @return \Intervention\Image\Image
+ */
+ public function initFromInterventionImage($object)
+ {
+ return $object;
+ }
+
+ /**
+ * Parses and decodes binary image data from data-url
+ *
+ * @param string $data_url
+ * @return string
+ */
+ private function decodeDataUrl($data_url)
+ {
+ if (!is_string($data_url)) {
+ return null;
+ }
+
+ $pattern = "/^data:(?:image\/[a-zA-Z\-\.]+)(?:charset=\".+\")?;base64,(?P.+)$/";
+ preg_match($pattern, $data_url, $matches);
+
+ if (is_array($matches) && array_key_exists('data', $matches)) {
+ return base64_decode($matches['data']);
+ }
+
+ return null;
+ }
+
+ /**
+ * Initiates new image from mixed data
+ *
+ * @param mixed $data
+ * @return \Intervention\Image\Image
+ */
+ public function init($data)
+ {
+ $this->data = $data;
+
+ switch (true) {
+
+ case $this->isGdResource():
+ return $this->initFromGdResource($this->data);
+
+ case $this->isImagick():
+ return $this->initFromImagick($this->data);
+
+ case $this->isInterventionImage():
+ return $this->initFromInterventionImage($this->data);
+
+ case $this->isSplFileInfo():
+ return $this->initFromPath($this->data->getRealPath());
+
+ case $this->isBinary():
+ return $this->initFromBinary($this->data);
+
+ case $this->isUrl():
+ return $this->initFromUrl($this->data);
+
+ case $this->isStream():
+ return $this->initFromStream($this->data);
+
+ case $this->isDataUrl():
+ return $this->initFromBinary($this->decodeDataUrl($this->data));
+
+ case $this->isFilePath():
+ return $this->initFromPath($this->data);
+
+ // isBase64 has to be after isFilePath to prevent false positives
+ case $this->isBase64():
+ return $this->initFromBinary(base64_decode($this->data));
+
+ default:
+ throw new Exception\NotReadableException("Image source not readable");
+ }
+ }
+
+ /**
+ * Decoder object transforms to string source data
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return (string) $this->data;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/AbstractDriver.php b/vendor/intervention/image/src/Intervention/Image/AbstractDriver.php
new file mode 100644
index 0000000000..29ad9d5980
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/AbstractDriver.php
@@ -0,0 +1,134 @@
+decoder->init($data);
+ }
+
+ /**
+ * Encodes given image
+ *
+ * @param Image $image
+ * @param string $format
+ * @param int $quality
+ * @return \Intervention\Image\Image
+ */
+ public function encode($image, $format, $quality)
+ {
+ return $this->encoder->process($image, $format, $quality);
+ }
+
+ /**
+ * Executes named command on given image
+ *
+ * @param Image $image
+ * @param string $name
+ * @param array $arguments
+ * @return \Intervention\Image\Commands\AbstractCommand
+ */
+ public function executeCommand($image, $name, $arguments)
+ {
+ $commandName = $this->getCommandClassName($name);
+ $command = new $commandName($arguments);
+ $command->execute($image);
+
+ return $command;
+ }
+
+ /**
+ * Returns classname of given command name
+ *
+ * @param string $name
+ * @return string
+ */
+ private function getCommandClassName($name)
+ {
+ $name = mb_convert_case($name[0], MB_CASE_UPPER, 'utf-8') . mb_substr($name, 1, mb_strlen($name));
+
+ $drivername = $this->getDriverName();
+ $classnameLocal = sprintf('\Intervention\Image\%s\Commands\%sCommand', $drivername, ucfirst($name));
+ $classnameGlobal = sprintf('\Intervention\Image\Commands\%sCommand', ucfirst($name));
+
+ if (class_exists($classnameLocal)) {
+ return $classnameLocal;
+ } elseif (class_exists($classnameGlobal)) {
+ return $classnameGlobal;
+ }
+
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ "Command ({$name}) is not available for driver ({$drivername})."
+ );
+ }
+
+ /**
+ * Returns name of current driver instance
+ *
+ * @return string
+ */
+ public function getDriverName()
+ {
+ $reflect = new \ReflectionClass($this);
+ $namespace = $reflect->getNamespaceName();
+
+ return substr(strrchr($namespace, "\\"), 1);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/AbstractEncoder.php b/vendor/intervention/image/src/Intervention/Image/AbstractEncoder.php
new file mode 100644
index 0000000000..357b8f4875
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/AbstractEncoder.php
@@ -0,0 +1,241 @@
+setImage($image);
+ $this->setFormat($format);
+ $this->setQuality($quality);
+
+ switch (strtolower($this->format)) {
+
+ case 'data-url':
+ $this->result = $this->processDataUrl();
+ break;
+
+ case 'gif':
+ case 'image/gif':
+ $this->result = $this->processGif();
+ break;
+
+ case 'png':
+ case 'image/png':
+ case 'image/x-png':
+ $this->result = $this->processPng();
+ break;
+
+ case 'jpg':
+ case 'jpeg':
+ case 'image/jpg':
+ case 'image/jpeg':
+ case 'image/pjpeg':
+ $this->result = $this->processJpeg();
+ break;
+
+ case 'tif':
+ case 'tiff':
+ case 'image/tiff':
+ case 'image/tif':
+ case 'image/x-tif':
+ case 'image/x-tiff':
+ $this->result = $this->processTiff();
+ break;
+
+ case 'bmp':
+ case 'bmp':
+ case 'ms-bmp':
+ case 'x-bitmap':
+ case 'x-bmp':
+ case 'x-ms-bmp':
+ case 'x-win-bitmap':
+ case 'x-windows-bmp':
+ case 'x-xbitmap':
+ case 'image/ms-bmp':
+ case 'image/x-bitmap':
+ case 'image/x-bmp':
+ case 'image/x-ms-bmp':
+ case 'image/x-win-bitmap':
+ case 'image/x-windows-bmp':
+ case 'image/x-xbitmap':
+ $this->result = $this->processBmp();
+ break;
+
+ case 'ico':
+ case 'image/x-ico':
+ case 'image/x-icon':
+ case 'image/vnd.microsoft.icon':
+ $this->result = $this->processIco();
+ break;
+
+ case 'psd':
+ case 'image/vnd.adobe.photoshop':
+ $this->result = $this->processPsd();
+ break;
+
+ case 'webp':
+ case 'image/webp':
+ case 'image/x-webp':
+ $this->result = $this->processWebp();
+ break;
+
+ default:
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ "Encoding format ({$format}) is not supported."
+ );
+ }
+
+ $this->setImage(null);
+
+ return $image->setEncoded($this->result);
+ }
+
+ /**
+ * Processes and returns encoded image as data-url string
+ *
+ * @return string
+ */
+ protected function processDataUrl()
+ {
+ $mime = $this->image->mime ? $this->image->mime : 'image/png';
+
+ return sprintf('data:%s;base64,%s',
+ $mime,
+ base64_encode($this->process($this->image, $mime, $this->quality))
+ );
+ }
+
+ /**
+ * Sets image to process
+ *
+ * @param Image $image
+ */
+ protected function setImage($image)
+ {
+ $this->image = $image;
+ }
+
+ /**
+ * Determines output format
+ *
+ * @param string $format
+ */
+ protected function setFormat($format = null)
+ {
+ if ($format == '' && $this->image instanceof Image) {
+ $format = $this->image->mime;
+ }
+
+ $this->format = $format ? $format : 'jpg';
+
+ return $this;
+ }
+
+ /**
+ * Determines output quality
+ *
+ * @param int $quality
+ */
+ protected function setQuality($quality)
+ {
+ $quality = is_null($quality) ? 90 : $quality;
+ $quality = $quality === 0 ? 1 : $quality;
+
+ if ($quality < 0 || $quality > 100) {
+ throw new \Intervention\Image\Exception\InvalidArgumentException(
+ 'Quality must range from 0 to 100.'
+ );
+ }
+
+ $this->quality = intval($quality);
+
+ return $this;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/AbstractFont.php b/vendor/intervention/image/src/Intervention/Image/AbstractFont.php
new file mode 100644
index 0000000000..0b9b979984
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/AbstractFont.php
@@ -0,0 +1,267 @@
+text = $text;
+ }
+
+ /**
+ * Set text to be written
+ *
+ * @param String $text
+ * @return void
+ */
+ public function text($text)
+ {
+ $this->text = $text;
+
+ return $this;
+ }
+
+ /**
+ * Get text to be written
+ *
+ * @return String
+ */
+ public function getText()
+ {
+ return $this->text;
+ }
+
+ /**
+ * Set font size in pixels
+ *
+ * @param int $size
+ * @return void
+ */
+ public function size($size)
+ {
+ $this->size = $size;
+
+ return $this;
+ }
+
+ /**
+ * Get font size in pixels
+ *
+ * @return int
+ */
+ public function getSize()
+ {
+ return $this->size;
+ }
+
+ /**
+ * Set color of text to be written
+ *
+ * @param mixed $color
+ * @return void
+ */
+ public function color($color)
+ {
+ $this->color = $color;
+
+ return $this;
+ }
+
+ /**
+ * Get color of text
+ *
+ * @return mixed
+ */
+ public function getColor()
+ {
+ return $this->color;
+ }
+
+ /**
+ * Set rotation angle of text
+ *
+ * @param int $angle
+ * @return void
+ */
+ public function angle($angle)
+ {
+ $this->angle = $angle;
+
+ return $this;
+ }
+
+ /**
+ * Get rotation angle of text
+ *
+ * @return int
+ */
+ public function getAngle()
+ {
+ return $this->angle;
+ }
+
+ /**
+ * Set horizontal text alignment
+ *
+ * @param string $align
+ * @return void
+ */
+ public function align($align)
+ {
+ $this->align = $align;
+
+ return $this;
+ }
+
+ /**
+ * Get horizontal text alignment
+ *
+ * @return string
+ */
+ public function getAlign()
+ {
+ return $this->align;
+ }
+
+ /**
+ * Set vertical text alignment
+ *
+ * @param string $valign
+ * @return void
+ */
+ public function valign($valign)
+ {
+ $this->valign = $valign;
+
+ return $this;
+ }
+
+ /**
+ * Get vertical text alignment
+ *
+ * @return string
+ */
+ public function getValign()
+ {
+ return $this->valign;
+ }
+
+ /**
+ * Set path to font file
+ *
+ * @param string $file
+ * @return void
+ */
+ public function file($file)
+ {
+ $this->file = $file;
+
+ return $this;
+ }
+
+ /**
+ * Get path to font file
+ *
+ * @return string
+ */
+ public function getFile()
+ {
+ return $this->file;
+ }
+
+ /**
+ * Checks if current font has access to an applicable font file
+ *
+ * @return boolean
+ */
+ protected function hasApplicableFontFile()
+ {
+ if (is_string($this->file)) {
+ return file_exists($this->file);
+ }
+
+ return false;
+ }
+
+ /**
+ * Counts lines of text to be written
+ *
+ * @return int
+ */
+ public function countLines()
+ {
+ return count(explode(PHP_EOL, $this->text));
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/AbstractShape.php b/vendor/intervention/image/src/Intervention/Image/AbstractShape.php
new file mode 100644
index 0000000000..cd4a9f1c68
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/AbstractShape.php
@@ -0,0 +1,71 @@
+background = $color;
+ }
+
+ /**
+ * Set border width and color of current shape
+ *
+ * @param int $width
+ * @param string $color
+ * @return void
+ */
+ public function border($width, $color = null)
+ {
+ $this->border_width = is_numeric($width) ? intval($width) : 0;
+ $this->border_color = is_null($color) ? '#000000' : $color;
+ }
+
+ /**
+ * Determines if current shape has border
+ *
+ * @return boolean
+ */
+ public function hasBorder()
+ {
+ return ($this->border_width >= 1);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Commands/AbstractCommand.php b/vendor/intervention/image/src/Intervention/Image/Commands/AbstractCommand.php
new file mode 100644
index 0000000000..cf9ca1083a
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Commands/AbstractCommand.php
@@ -0,0 +1,79 @@
+arguments = $arguments;
+ }
+
+ /**
+ * Creates new argument instance from given argument key
+ *
+ * @param int $key
+ * @return \Intervention\Image\Commands\Argument
+ */
+ public function argument($key)
+ {
+ return new \Intervention\Image\Commands\Argument($this, $key);
+ }
+
+ /**
+ * Returns output data of current command
+ *
+ * @return mixed
+ */
+ public function getOutput()
+ {
+ return $this->output ? $this->output : null;
+ }
+
+ /**
+ * Determines if current instance has output data
+ *
+ * @return boolean
+ */
+ public function hasOutput()
+ {
+ return ! is_null($this->output);
+ }
+
+ /**
+ * Sets output data of current command
+ *
+ * @param mixed $value
+ */
+ public function setOutput($value)
+ {
+ $this->output = $value;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Commands/Argument.php b/vendor/intervention/image/src/Intervention/Image/Commands/Argument.php
new file mode 100644
index 0000000000..40a8f629de
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Commands/Argument.php
@@ -0,0 +1,225 @@
+command = $command;
+ $this->key = $key;
+ }
+
+ /**
+ * Returns name of current arguments command
+ *
+ * @return string
+ */
+ public function getCommandName()
+ {
+ preg_match("/\\\\([\w]+)Command$/", get_class($this->command), $matches);
+ return isset($matches[1]) ? lcfirst($matches[1]).'()' : 'Method';
+ }
+
+ /**
+ * Returns value of current argument
+ *
+ * @param mixed $default
+ * @return mixed
+ */
+ public function value($default = null)
+ {
+ $arguments = $this->command->arguments;
+
+ if (is_array($arguments)) {
+ return isset($arguments[$this->key]) ? $arguments[$this->key] : $default;
+ }
+
+ return $default;
+ }
+
+ /**
+ * Defines current argument as required
+ *
+ * @return \Intervention\Image\Commands\Argument
+ */
+ public function required()
+ {
+ if ( ! array_key_exists($this->key, $this->command->arguments)) {
+ throw new \Intervention\Image\Exception\InvalidArgumentException(
+ sprintf("Missing argument %d for %s", $this->key + 1, $this->getCommandName())
+ );
+ }
+
+ return $this;
+ }
+
+ /**
+ * Determines that current argument must be of given type
+ *
+ * @return \Intervention\Image\Commands\Argument
+ */
+ public function type($type)
+ {
+ $fail = false;
+
+ $value = $this->value();
+
+ if (is_null($value)) {
+ return $this;
+ }
+
+ switch (strtolower($type)) {
+
+ case 'bool':
+ case 'boolean':
+ $fail = ! is_bool($value);
+ $message = sprintf('%s accepts only boolean values as argument %d.', $this->getCommandName(), $this->key + 1);
+ break;
+
+ case 'int':
+ case 'integer':
+ $fail = ! is_integer($value);
+ $message = sprintf('%s accepts only integer values as argument %d.', $this->getCommandName(), $this->key + 1);
+ break;
+
+ case 'num':
+ case 'numeric':
+ $fail = ! is_numeric($value);
+ $message = sprintf('%s accepts only numeric values as argument %d.', $this->getCommandName(), $this->key + 1);
+ break;
+
+ case 'str':
+ case 'string':
+ $fail = ! is_string($value);
+ $message = sprintf('%s accepts only string values as argument %d.', $this->getCommandName(), $this->key + 1);
+ break;
+
+ case 'array':
+ $fail = ! is_array($value);
+ $message = sprintf('%s accepts only array as argument %d.', $this->getCommandName(), $this->key + 1);
+ break;
+
+ case 'closure':
+ $fail = ! is_a($value, '\Closure');
+ $message = sprintf('%s accepts only Closure as argument %d.', $this->getCommandName(), $this->key + 1);
+ break;
+
+ case 'digit':
+ $fail = ! $this->isDigit($value);
+ $message = sprintf('%s accepts only integer values as argument %d.', $this->getCommandName(), $this->key + 1);
+ break;
+ }
+
+ if ($fail) {
+
+ $message = isset($message) ? $message : sprintf("Missing argument for %d.", $this->key);
+
+ throw new \Intervention\Image\Exception\InvalidArgumentException(
+ $message
+ );
+ }
+
+ return $this;
+ }
+
+ /**
+ * Determines that current argument value must be numeric between given values
+ *
+ * @return \Intervention\Image\Commands\Argument
+ */
+ public function between($x, $y)
+ {
+ $value = $this->type('numeric')->value();
+
+ if (is_null($value)) {
+ return $this;
+ }
+
+ $alpha = min($x, $y);
+ $omega = max($x, $y);
+
+ if ($value < $alpha || $value > $omega) {
+ throw new \Intervention\Image\Exception\InvalidArgumentException(
+ sprintf('Argument %d must be between %s and %s.', $this->key, $x, $y)
+ );
+ }
+
+ return $this;
+ }
+
+ /**
+ * Determines that current argument must be over a minimum value
+ *
+ * @return \Intervention\Image\Commands\Argument
+ */
+ public function min($value)
+ {
+ $v = $this->type('numeric')->value();
+
+ if (is_null($v)) {
+ return $this;
+ }
+
+ if ($v < $value) {
+ throw new \Intervention\Image\Exception\InvalidArgumentException(
+ sprintf('Argument %d must be at least %s.', $this->key, $value)
+ );
+ }
+
+ return $this;
+ }
+
+ /**
+ * Determines that current argument must be under a maxiumum value
+ *
+ * @return \Intervention\Image\Commands\Argument
+ */
+ public function max($value)
+ {
+ $v = $this->type('numeric')->value();
+
+ if (is_null($v)) {
+ return $this;
+ }
+
+ if ($v > $value) {
+ throw new \Intervention\Image\Exception\InvalidArgumentException(
+ sprintf('Argument %d may not be greater than %s.', $this->key, $value)
+ );
+ }
+
+ return $this;
+ }
+
+ /**
+ * Checks if value is "PHP" integer (120 but also 120.0)
+ *
+ * @param mixed $value
+ * @return boolean
+ */
+ private function isDigit($value)
+ {
+ return is_numeric($value) ? intval($value) == $value : false;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Commands/ChecksumCommand.php b/vendor/intervention/image/src/Intervention/Image/Commands/ChecksumCommand.php
new file mode 100644
index 0000000000..9acc403082
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Commands/ChecksumCommand.php
@@ -0,0 +1,29 @@
+getSize();
+
+ for ($x=0; $x <= ($size->width-1); $x++) {
+ for ($y=0; $y <= ($size->height-1); $y++) {
+ $colors[] = $image->pickColor($x, $y, 'array');
+ }
+ }
+
+ $this->setOutput(md5(serialize($colors)));
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Commands/CircleCommand.php b/vendor/intervention/image/src/Intervention/Image/Commands/CircleCommand.php
new file mode 100644
index 0000000000..2fc38ddf82
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Commands/CircleCommand.php
@@ -0,0 +1,35 @@
+argument(0)->type('numeric')->required()->value();
+ $x = $this->argument(1)->type('numeric')->required()->value();
+ $y = $this->argument(2)->type('numeric')->required()->value();
+ $callback = $this->argument(3)->type('closure')->value();
+
+ $circle_classname = sprintf('\Intervention\Image\%s\Shapes\CircleShape',
+ $image->getDriver()->getDriverName());
+
+ $circle = new $circle_classname($diameter);
+
+ if ($callback instanceof Closure) {
+ $callback($circle);
+ }
+
+ $circle->applyToImage($image, $x, $y);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Commands/EllipseCommand.php b/vendor/intervention/image/src/Intervention/Image/Commands/EllipseCommand.php
new file mode 100644
index 0000000000..4f364eca10
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Commands/EllipseCommand.php
@@ -0,0 +1,36 @@
+argument(0)->type('numeric')->required()->value();
+ $height = $this->argument(1)->type('numeric')->required()->value();
+ $x = $this->argument(2)->type('numeric')->required()->value();
+ $y = $this->argument(3)->type('numeric')->required()->value();
+ $callback = $this->argument(4)->type('closure')->value();
+
+ $ellipse_classname = sprintf('\Intervention\Image\%s\Shapes\EllipseShape',
+ $image->getDriver()->getDriverName());
+
+ $ellipse = new $ellipse_classname($width, $height);
+
+ if ($callback instanceof Closure) {
+ $callback($ellipse);
+ }
+
+ $ellipse->applyToImage($image, $x, $y);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Commands/ExifCommand.php b/vendor/intervention/image/src/Intervention/Image/Commands/ExifCommand.php
new file mode 100644
index 0000000000..2986cae8c8
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Commands/ExifCommand.php
@@ -0,0 +1,37 @@
+argument(0)->value();
+
+ // try to read exif data from image file
+ $data = @exif_read_data($image->dirname .'/'. $image->basename);
+
+ if (! is_null($key) && is_array($data)) {
+ $data = array_key_exists($key, $data) ? $data[$key] : false;
+ }
+
+ $this->setOutput($data);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Commands/IptcCommand.php b/vendor/intervention/image/src/Intervention/Image/Commands/IptcCommand.php
new file mode 100644
index 0000000000..88e8fd35b5
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Commands/IptcCommand.php
@@ -0,0 +1,64 @@
+argument(0)->value();
+
+ $info = [];
+ @getimagesize($image->dirname .'/'. $image->basename, $info);
+
+ $data = [];
+
+ if (array_key_exists('APP13', $info)) {
+ $iptc = iptcparse($info['APP13']);
+
+ if (is_array($iptc)) {
+ $data['DocumentTitle'] = isset($iptc["2#005"][0]) ? $iptc["2#005"][0] : null;
+ $data['Urgency'] = isset($iptc["2#010"][0]) ? $iptc["2#010"][0] : null;
+ $data['Category'] = isset($iptc["2#015"][0]) ? $iptc["2#015"][0] : null;
+ $data['Subcategories'] = isset($iptc["2#020"][0]) ? $iptc["2#020"][0] : null;
+ $data['Keywords'] = isset($iptc["2#025"][0]) ? $iptc["2#025"] : null;
+ $data['SpecialInstructions'] = isset($iptc["2#040"][0]) ? $iptc["2#040"][0] : null;
+ $data['CreationDate'] = isset($iptc["2#055"][0]) ? $iptc["2#055"][0] : null;
+ $data['CreationTime'] = isset($iptc["2#060"][0]) ? $iptc["2#060"][0] : null;
+ $data['AuthorByline'] = isset($iptc["2#080"][0]) ? $iptc["2#080"][0] : null;
+ $data['AuthorTitle'] = isset($iptc["2#085"][0]) ? $iptc["2#085"][0] : null;
+ $data['City'] = isset($iptc["2#090"][0]) ? $iptc["2#090"][0] : null;
+ $data['SubLocation'] = isset($iptc["2#092"][0]) ? $iptc["2#092"][0] : null;
+ $data['State'] = isset($iptc["2#095"][0]) ? $iptc["2#095"][0] : null;
+ $data['Country'] = isset($iptc["2#101"][0]) ? $iptc["2#101"][0] : null;
+ $data['OTR'] = isset($iptc["2#103"][0]) ? $iptc["2#103"][0] : null;
+ $data['Headline'] = isset($iptc["2#105"][0]) ? $iptc["2#105"][0] : null;
+ $data['Source'] = isset($iptc["2#110"][0]) ? $iptc["2#110"][0] : null;
+ $data['PhotoSource'] = isset($iptc["2#115"][0]) ? $iptc["2#115"][0] : null;
+ $data['Copyright'] = isset($iptc["2#116"][0]) ? $iptc["2#116"][0] : null;
+ $data['Caption'] = isset($iptc["2#120"][0]) ? $iptc["2#120"][0] : null;
+ $data['CaptionWriter'] = isset($iptc["2#122"][0]) ? $iptc["2#122"][0] : null;
+ }
+ }
+
+ if (! is_null($key) && is_array($data)) {
+ $data = array_key_exists($key, $data) ? $data[$key] : false;
+ }
+
+ $this->setOutput($data);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Commands/LineCommand.php b/vendor/intervention/image/src/Intervention/Image/Commands/LineCommand.php
new file mode 100644
index 0000000000..0089c649af
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Commands/LineCommand.php
@@ -0,0 +1,36 @@
+argument(0)->type('numeric')->required()->value();
+ $y1 = $this->argument(1)->type('numeric')->required()->value();
+ $x2 = $this->argument(2)->type('numeric')->required()->value();
+ $y2 = $this->argument(3)->type('numeric')->required()->value();
+ $callback = $this->argument(4)->type('closure')->value();
+
+ $line_classname = sprintf('\Intervention\Image\%s\Shapes\LineShape',
+ $image->getDriver()->getDriverName());
+
+ $line = new $line_classname($x2, $y2);
+
+ if ($callback instanceof Closure) {
+ $callback($line);
+ }
+
+ $line->applyToImage($image, $x1, $y1);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Commands/OrientateCommand.php b/vendor/intervention/image/src/Intervention/Image/Commands/OrientateCommand.php
new file mode 100644
index 0000000000..552482cb4c
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Commands/OrientateCommand.php
@@ -0,0 +1,48 @@
+exif('Orientation')) {
+
+ case 2:
+ $image->flip();
+ break;
+
+ case 3:
+ $image->rotate(180);
+ break;
+
+ case 4:
+ $image->rotate(180)->flip();
+ break;
+
+ case 5:
+ $image->rotate(270)->flip();
+ break;
+
+ case 6:
+ $image->rotate(270);
+ break;
+
+ case 7:
+ $image->rotate(90)->flip();
+ break;
+
+ case 8:
+ $image->rotate(90);
+ break;
+ }
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Commands/PolygonCommand.php b/vendor/intervention/image/src/Intervention/Image/Commands/PolygonCommand.php
new file mode 100644
index 0000000000..e46e3fffb3
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Commands/PolygonCommand.php
@@ -0,0 +1,48 @@
+argument(0)->type('array')->required()->value();
+ $callback = $this->argument(1)->type('closure')->value();
+
+ $vertices_count = count($points);
+
+ // check if number if coordinates is even
+ if ($vertices_count % 2 !== 0) {
+ throw new \Intervention\Image\Exception\InvalidArgumentException(
+ "The number of given polygon vertices must be even."
+ );
+ }
+
+ if ($vertices_count < 6) {
+ throw new \Intervention\Image\Exception\InvalidArgumentException(
+ "You must have at least 3 points in your array."
+ );
+ }
+
+ $polygon_classname = sprintf('\Intervention\Image\%s\Shapes\PolygonShape',
+ $image->getDriver()->getDriverName());
+
+ $polygon = new $polygon_classname($points);
+
+ if ($callback instanceof Closure) {
+ $callback($polygon);
+ }
+
+ $polygon->applyToImage($image);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Commands/PsrResponseCommand.php b/vendor/intervention/image/src/Intervention/Image/Commands/PsrResponseCommand.php
new file mode 100644
index 0000000000..d75cd903b8
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Commands/PsrResponseCommand.php
@@ -0,0 +1,45 @@
+argument(0)->value();
+ $quality = $this->argument(1)->between(0, 100)->value();
+
+ //Encoded property will be populated at this moment
+ $stream = $image->stream($format, $quality);
+
+ $mimetype = finfo_buffer(
+ finfo_open(FILEINFO_MIME_TYPE),
+ $image->getEncoded()
+ );
+
+ $this->setOutput(new Response(
+ 200,
+ [
+ 'Content-Type' => $mimetype,
+ 'Content-Length' => strlen($image->getEncoded())
+ ],
+ $stream
+ ));
+
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/vendor/intervention/image/src/Intervention/Image/Commands/RectangleCommand.php b/vendor/intervention/image/src/Intervention/Image/Commands/RectangleCommand.php
new file mode 100644
index 0000000000..3a2074c57b
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Commands/RectangleCommand.php
@@ -0,0 +1,36 @@
+argument(0)->type('numeric')->required()->value();
+ $y1 = $this->argument(1)->type('numeric')->required()->value();
+ $x2 = $this->argument(2)->type('numeric')->required()->value();
+ $y2 = $this->argument(3)->type('numeric')->required()->value();
+ $callback = $this->argument(4)->type('closure')->value();
+
+ $rectangle_classname = sprintf('\Intervention\Image\%s\Shapes\RectangleShape',
+ $image->getDriver()->getDriverName());
+
+ $rectangle = new $rectangle_classname($x1, $y1, $x2, $y2);
+
+ if ($callback instanceof Closure) {
+ $callback($rectangle);
+ }
+
+ $rectangle->applyToImage($image, $x1, $y1);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Commands/ResponseCommand.php b/vendor/intervention/image/src/Intervention/Image/Commands/ResponseCommand.php
new file mode 100644
index 0000000000..7903b5af4b
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Commands/ResponseCommand.php
@@ -0,0 +1,26 @@
+argument(0)->value();
+ $quality = $this->argument(1)->between(0, 100)->value();
+
+ $response = new Response($image, $format, $quality);
+
+ $this->setOutput($response->make());
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Commands/StreamCommand.php b/vendor/intervention/image/src/Intervention/Image/Commands/StreamCommand.php
new file mode 100644
index 0000000000..111c475690
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Commands/StreamCommand.php
@@ -0,0 +1,25 @@
+argument(0)->value();
+ $quality = $this->argument(1)->between(0, 100)->value();
+
+ $this->setOutput(\GuzzleHttp\Psr7\stream_for(
+ $image->encode($format, $quality)->getEncoded()
+ ));
+
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/vendor/intervention/image/src/Intervention/Image/Commands/TextCommand.php b/vendor/intervention/image/src/Intervention/Image/Commands/TextCommand.php
new file mode 100644
index 0000000000..4aebd8e892
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Commands/TextCommand.php
@@ -0,0 +1,34 @@
+argument(0)->required()->value();
+ $x = $this->argument(1)->type('numeric')->value(0);
+ $y = $this->argument(2)->type('numeric')->value(0);
+ $callback = $this->argument(3)->type('closure')->value();
+
+ $fontclassname = sprintf('\Intervention\Image\%s\Font',
+ $image->getDriver()->getDriverName());
+
+ $font = new $fontclassname($text);
+
+ if ($callback instanceof Closure) {
+ $callback($font);
+ }
+
+ $font->applyToImage($image, $x, $y);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Constraint.php b/vendor/intervention/image/src/Intervention/Image/Constraint.php
new file mode 100644
index 0000000000..44bdd67a63
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Constraint.php
@@ -0,0 +1,92 @@
+size = $size;
+ }
+
+ /**
+ * Returns current size of constraint
+ *
+ * @return \Intervention\Image\Size
+ */
+ public function getSize()
+ {
+ return $this->size;
+ }
+
+ /**
+ * Fix the given argument in current constraint
+ *
+ * @param int $type
+ * @return void
+ */
+ public function fix($type)
+ {
+ $this->fixed = ($this->fixed & ~(1 << $type)) | (1 << $type);
+ }
+
+ /**
+ * Checks if given argument is fixed in current constraint
+ *
+ * @param int $type
+ * @return boolean
+ */
+ public function isFixed($type)
+ {
+ return (bool) ($this->fixed & (1 << $type));
+ }
+
+ /**
+ * Fixes aspect ratio in current constraint
+ *
+ * @return void
+ */
+ public function aspectRatio()
+ {
+ $this->fix(self::ASPECTRATIO);
+ }
+
+ /**
+ * Fixes possibility to size up in current constraint
+ *
+ * @return void
+ */
+ public function upsize()
+ {
+ $this->fix(self::UPSIZE);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Exception/ImageException.php b/vendor/intervention/image/src/Intervention/Image/Exception/ImageException.php
new file mode 100644
index 0000000000..83e6b91f28
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Exception/ImageException.php
@@ -0,0 +1,8 @@
+dirname = array_key_exists('dirname', $info) ? $info['dirname'] : null;
+ $this->basename = array_key_exists('basename', $info) ? $info['basename'] : null;
+ $this->extension = array_key_exists('extension', $info) ? $info['extension'] : null;
+ $this->filename = array_key_exists('filename', $info) ? $info['filename'] : null;
+
+ if (file_exists($path) && is_file($path)) {
+ $this->mime = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $path);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Get file size
+ *
+ * @return mixed
+ */
+ public function filesize()
+ {
+ $path = $this->basePath();
+
+ if (file_exists($path) && is_file($path)) {
+ return filesize($path);
+ }
+
+ return false;
+ }
+
+ /**
+ * Get fully qualified path
+ *
+ * @return string
+ */
+ public function basePath()
+ {
+ if ($this->dirname && $this->basename) {
+ return ($this->dirname .'/'. $this->basename);
+ }
+
+ return null;
+ }
+
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Filters/DemoFilter.php b/vendor/intervention/image/src/Intervention/Image/Filters/DemoFilter.php
new file mode 100644
index 0000000000..f5aac05bf8
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Filters/DemoFilter.php
@@ -0,0 +1,42 @@
+size = is_numeric($size) ? intval($size) : self::DEFAULT_SIZE;
+ }
+
+ /**
+ * Applies filter effects to given image
+ *
+ * @param \Intervention\Image\Image $image
+ * @return \Intervention\Image\Image
+ */
+ public function applyFilter(\Intervention\Image\Image $image)
+ {
+ $image->pixelate($this->size);
+ $image->greyscale();
+
+ return $image;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Filters/FilterInterface.php b/vendor/intervention/image/src/Intervention/Image/Filters/FilterInterface.php
new file mode 100644
index 0000000000..27c0beef4d
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Filters/FilterInterface.php
@@ -0,0 +1,14 @@
+a = ($value >> 24) & 0xFF;
+ $this->r = ($value >> 16) & 0xFF;
+ $this->g = ($value >> 8) & 0xFF;
+ $this->b = $value & 0xFF;
+ }
+
+ /**
+ * Initiates color object from given array
+ *
+ * @param array $value
+ * @return \Intervention\Image\AbstractColor
+ */
+ public function initFromArray($array)
+ {
+ $array = array_values($array);
+
+ if (count($array) == 4) {
+
+ // color array with alpha value
+ list($r, $g, $b, $a) = $array;
+ $this->a = $this->alpha2gd($a);
+
+ } elseif (count($array) == 3) {
+
+ // color array without alpha value
+ list($r, $g, $b) = $array;
+ $this->a = 0;
+
+ }
+
+ $this->r = $r;
+ $this->g = $g;
+ $this->b = $b;
+ }
+
+ /**
+ * Initiates color object from given string
+ *
+ * @param string $value
+ * @return \Intervention\Image\AbstractColor
+ */
+ public function initFromString($value)
+ {
+ if ($color = $this->rgbaFromString($value)) {
+ $this->r = $color[0];
+ $this->g = $color[1];
+ $this->b = $color[2];
+ $this->a = $this->alpha2gd($color[3]);
+ }
+ }
+
+ /**
+ * Initiates color object from given R, G and B values
+ *
+ * @param int $r
+ * @param int $g
+ * @param int $b
+ * @return \Intervention\Image\AbstractColor
+ */
+ public function initFromRgb($r, $g, $b)
+ {
+ $this->r = intval($r);
+ $this->g = intval($g);
+ $this->b = intval($b);
+ $this->a = 0;
+ }
+
+ /**
+ * Initiates color object from given R, G, B and A values
+ *
+ * @param int $r
+ * @param int $g
+ * @param int $b
+ * @param float $a
+ * @return \Intervention\Image\AbstractColor
+ */
+ public function initFromRgba($r, $g, $b, $a = 1)
+ {
+ $this->r = intval($r);
+ $this->g = intval($g);
+ $this->b = intval($b);
+ $this->a = $this->alpha2gd($a);
+ }
+
+ /**
+ * Initiates color object from given ImagickPixel object
+ *
+ * @param ImagickPixel $value
+ * @return \Intervention\Image\AbstractColor
+ */
+ public function initFromObject($value)
+ {
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ "GD colors cannot init from ImagickPixel objects."
+ );
+ }
+
+ /**
+ * Calculates integer value of current color instance
+ *
+ * @return int
+ */
+ public function getInt()
+ {
+ return ($this->a << 24) + ($this->r << 16) + ($this->g << 8) + $this->b;
+ }
+
+ /**
+ * Calculates hexadecimal value of current color instance
+ *
+ * @param string $prefix
+ * @return string
+ */
+ public function getHex($prefix = '')
+ {
+ return sprintf('%s%02x%02x%02x', $prefix, $this->r, $this->g, $this->b);
+ }
+
+ /**
+ * Calculates RGB(A) in array format of current color instance
+ *
+ * @return array
+ */
+ public function getArray()
+ {
+ return [$this->r, $this->g, $this->b, round(1 - $this->a / 127, 2)];
+ }
+
+ /**
+ * Calculates RGBA in string format of current color instance
+ *
+ * @return string
+ */
+ public function getRgba()
+ {
+ return sprintf('rgba(%d, %d, %d, %.2F)', $this->r, $this->g, $this->b, round(1 - $this->a / 127, 2));
+ }
+
+ /**
+ * Determines if current color is different from given color
+ *
+ * @param AbstractColor $color
+ * @param int $tolerance
+ * @return boolean
+ */
+ public function differs(AbstractColor $color, $tolerance = 0)
+ {
+ $color_tolerance = round($tolerance * 2.55);
+ $alpha_tolerance = round($tolerance * 1.27);
+
+ $delta = [
+ 'r' => abs($color->r - $this->r),
+ 'g' => abs($color->g - $this->g),
+ 'b' => abs($color->b - $this->b),
+ 'a' => abs($color->a - $this->a)
+ ];
+
+ return (
+ $delta['r'] > $color_tolerance or
+ $delta['g'] > $color_tolerance or
+ $delta['b'] > $color_tolerance or
+ $delta['a'] > $alpha_tolerance
+ );
+ }
+
+ /**
+ * Convert rgba alpha (0-1) value to gd value (0-127)
+ *
+ * @param float $input
+ * @return int
+ */
+ private function alpha2gd($input)
+ {
+ $oldMin = 0;
+ $oldMax = 1;
+
+ $newMin = 127;
+ $newMax = 0;
+
+ return ceil(((($input- $oldMin) * ($newMax - $newMin)) / ($oldMax - $oldMin)) + $newMin);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/BackupCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/BackupCommand.php
new file mode 100644
index 0000000000..98b3c72507
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/BackupCommand.php
@@ -0,0 +1,23 @@
+argument(0)->value();
+
+ // clone current image resource
+ $clone = clone $image;
+ $image->setBackup($clone->getCore(), $backupName);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/BlurCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/BlurCommand.php
new file mode 100644
index 0000000000..d53f59d7c6
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/BlurCommand.php
@@ -0,0 +1,23 @@
+argument(0)->between(0, 100)->value(1);
+
+ for ($i=0; $i < intval($amount); $i++) {
+ imagefilter($image->getCore(), IMG_FILTER_GAUSSIAN_BLUR);
+ }
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/BrightnessCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/BrightnessCommand.php
new file mode 100644
index 0000000000..de4263f748
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/BrightnessCommand.php
@@ -0,0 +1,19 @@
+argument(0)->between(-100, 100)->required()->value();
+
+ return imagefilter($image->getCore(), IMG_FILTER_BRIGHTNESS, ($level * 2.55));
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ColorizeCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ColorizeCommand.php
new file mode 100644
index 0000000000..8f539638b4
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ColorizeCommand.php
@@ -0,0 +1,27 @@
+argument(0)->between(-100, 100)->required()->value();
+ $green = $this->argument(1)->between(-100, 100)->required()->value();
+ $blue = $this->argument(2)->between(-100, 100)->required()->value();
+
+ // normalize colorize levels
+ $red = round($red * 2.55);
+ $green = round($green * 2.55);
+ $blue = round($blue * 2.55);
+
+ // apply filter
+ return imagefilter($image->getCore(), IMG_FILTER_COLORIZE, $red, $green, $blue);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ContrastCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ContrastCommand.php
new file mode 100644
index 0000000000..e43b761af7
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ContrastCommand.php
@@ -0,0 +1,19 @@
+argument(0)->between(-100, 100)->required()->value();
+
+ return imagefilter($image->getCore(), IMG_FILTER_CONTRAST, ($level * -1));
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/CropCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/CropCommand.php
new file mode 100644
index 0000000000..b7f595421b
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/CropCommand.php
@@ -0,0 +1,40 @@
+argument(0)->type('digit')->required()->value();
+ $height = $this->argument(1)->type('digit')->required()->value();
+ $x = $this->argument(2)->type('digit')->value();
+ $y = $this->argument(3)->type('digit')->value();
+
+ if (is_null($width) || is_null($height)) {
+ throw new \Intervention\Image\Exception\InvalidArgumentException(
+ "Width and height of cutout needs to be defined."
+ );
+ }
+
+ $cropped = new Size($width, $height);
+ $position = new Point($x, $y);
+
+ // align boxes
+ if (is_null($x) && is_null($y)) {
+ $position = $image->getSize()->align('center')->relativePosition($cropped->align('center'));
+ }
+
+ // crop image core
+ return $this->modify($image, 0, 0, $position->x, $position->y, $cropped->width, $cropped->height, $cropped->width, $cropped->height);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/DestroyCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/DestroyCommand.php
new file mode 100644
index 0000000000..18383307ac
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/DestroyCommand.php
@@ -0,0 +1,25 @@
+getCore());
+
+ // destroy backups
+ foreach ($image->getBackups() as $backup) {
+ imagedestroy($backup);
+ }
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/FillCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/FillCommand.php
new file mode 100644
index 0000000000..aaecb7fb93
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/FillCommand.php
@@ -0,0 +1,68 @@
+argument(0)->value();
+ $x = $this->argument(1)->type('digit')->value();
+ $y = $this->argument(2)->type('digit')->value();
+
+ $width = $image->getWidth();
+ $height = $image->getHeight();
+ $resource = $image->getCore();
+
+ try {
+
+ // set image tile filling
+ $source = new Decoder;
+ $tile = $source->init($filling);
+ imagesettile($image->getCore(), $tile->getCore());
+ $filling = IMG_COLOR_TILED;
+
+ } catch (\Intervention\Image\Exception\NotReadableException $e) {
+
+ // set solid color filling
+ $color = new Color($filling);
+ $filling = $color->getInt();
+ }
+
+ imagealphablending($resource, true);
+
+ if (is_int($x) && is_int($y)) {
+
+ // resource should be visible through transparency
+ $base = $image->getDriver()->newImage($width, $height)->getCore();
+ imagecopy($base, $resource, 0, 0, 0, 0, $width, $height);
+
+ // floodfill if exact position is defined
+ imagefill($resource, $x, $y, $filling);
+
+ // copy filled original over base
+ imagecopy($base, $resource, 0, 0, 0, 0, $width, $height);
+
+ // set base as new resource-core
+ $image->setCore($base);
+ imagedestroy($resource);
+
+ } else {
+ // fill whole image otherwise
+ imagefilledrectangle($resource, 0, 0, $width - 1, $height - 1, $filling);
+ }
+
+ isset($tile) ? imagedestroy($tile->getCore()) : null;
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/FitCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/FitCommand.php
new file mode 100644
index 0000000000..d861ad94cf
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/FitCommand.php
@@ -0,0 +1,32 @@
+argument(0)->type('digit')->required()->value();
+ $height = $this->argument(1)->type('digit')->value($width);
+ $constraints = $this->argument(2)->type('closure')->value();
+ $position = $this->argument(3)->type('string')->value('center');
+
+ // calculate size
+ $cropped = $image->getSize()->fit(new Size($width, $height), $position);
+ $resized = clone $cropped;
+ $resized = $resized->resize($width, $height, $constraints);
+
+ // modify image
+ $this->modify($image, 0, 0, $cropped->pivot->x, $cropped->pivot->y, $resized->getWidth(), $resized->getHeight(), $cropped->getWidth(), $cropped->getHeight());
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/FlipCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/FlipCommand.php
new file mode 100644
index 0000000000..aa8f230e86
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/FlipCommand.php
@@ -0,0 +1,37 @@
+argument(0)->value('h');
+
+ $size = $image->getSize();
+ $dst = clone $size;
+
+ switch (strtolower($mode)) {
+ case 2:
+ case 'v':
+ case 'vert':
+ case 'vertical':
+ $size->pivot->y = $size->height - 1;
+ $size->height = $size->height * (-1);
+ break;
+
+ default:
+ $size->pivot->x = $size->width - 1;
+ $size->width = $size->width * (-1);
+ break;
+ }
+
+ return $this->modify($image, 0, 0, $size->pivot->x, $size->pivot->y, $dst->width, $dst->height, $size->width, $size->height);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/GammaCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/GammaCommand.php
new file mode 100644
index 0000000000..366f118089
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/GammaCommand.php
@@ -0,0 +1,19 @@
+argument(0)->type('numeric')->required()->value();
+
+ return imagegammacorrect($image->getCore(), 1, $gamma);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/GetSizeCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/GetSizeCommand.php
new file mode 100644
index 0000000000..89ee2848f0
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/GetSizeCommand.php
@@ -0,0 +1,24 @@
+setOutput(new Size(
+ imagesx($image->getCore()),
+ imagesy($image->getCore())
+ ));
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/GreyscaleCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/GreyscaleCommand.php
new file mode 100644
index 0000000000..ded8e0d8f9
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/GreyscaleCommand.php
@@ -0,0 +1,17 @@
+getCore(), IMG_FILTER_GRAYSCALE);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/HeightenCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/HeightenCommand.php
new file mode 100644
index 0000000000..d31e9cde0c
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/HeightenCommand.php
@@ -0,0 +1,28 @@
+argument(0)->type('digit')->required()->value();
+ $additionalConstraints = $this->argument(1)->type('closure')->value();
+
+ $this->arguments[0] = null;
+ $this->arguments[1] = $height;
+ $this->arguments[2] = function ($constraint) use ($additionalConstraints) {
+ $constraint->aspectRatio();
+ if(is_callable($additionalConstraints))
+ $additionalConstraints($constraint);
+ };
+
+ return parent::execute($image);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/InsertCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/InsertCommand.php
new file mode 100644
index 0000000000..eba75f012d
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/InsertCommand.php
@@ -0,0 +1,32 @@
+argument(0)->required()->value();
+ $position = $this->argument(1)->type('string')->value();
+ $x = $this->argument(2)->type('digit')->value(0);
+ $y = $this->argument(3)->type('digit')->value(0);
+
+ // build watermark
+ $watermark = $image->getDriver()->init($source);
+
+ // define insertion point
+ $image_size = $image->getSize()->align($position, $x, $y);
+ $watermark_size = $watermark->getSize()->align($position);
+ $target = $image_size->relativePosition($watermark_size);
+
+ // insert image at position
+ imagealphablending($image->getCore(), true);
+ return imagecopy($image->getCore(), $watermark->getCore(), $target->x, $target->y, 0, 0, $watermark_size->width, $watermark_size->height);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/InterlaceCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/InterlaceCommand.php
new file mode 100644
index 0000000000..e8f4b184cf
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/InterlaceCommand.php
@@ -0,0 +1,21 @@
+argument(0)->type('bool')->value(true);
+
+ imageinterlace($image->getCore(), $mode);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/InvertCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/InvertCommand.php
new file mode 100644
index 0000000000..f72e7e3050
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/InvertCommand.php
@@ -0,0 +1,17 @@
+getCore(), IMG_FILTER_NEGATE);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/LimitColorsCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/LimitColorsCommand.php
new file mode 100644
index 0000000000..27955e79a2
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/LimitColorsCommand.php
@@ -0,0 +1,51 @@
+argument(0)->value();
+ $matte = $this->argument(1)->value();
+
+ // get current image size
+ $size = $image->getSize();
+
+ // create empty canvas
+ $resource = imagecreatetruecolor($size->width, $size->height);
+
+ // define matte
+ if (is_null($matte)) {
+ $matte = imagecolorallocatealpha($resource, 255, 255, 255, 127);
+ } else {
+ $matte = $image->getDriver()->parseColor($matte)->getInt();
+ }
+
+ // fill with matte and copy original image
+ imagefill($resource, 0, 0, $matte);
+
+ // set transparency
+ imagecolortransparent($resource, $matte);
+
+ // copy original image
+ imagecopy($resource, $image->getCore(), 0, 0, 0, 0, $size->width, $size->height);
+
+ if (is_numeric($count) && $count <= 256) {
+ // decrease colors
+ imagetruecolortopalette($resource, true, $count);
+ }
+
+ // set new resource
+ $image->setCore($resource);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/MaskCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/MaskCommand.php
new file mode 100644
index 0000000000..ef88d4dbae
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/MaskCommand.php
@@ -0,0 +1,81 @@
+argument(0)->value();
+ $mask_w_alpha = $this->argument(1)->type('bool')->value(false);
+
+ $image_size = $image->getSize();
+
+ // create empty canvas
+ $canvas = $image->getDriver()->newImage($image_size->width, $image_size->height, [0,0,0,0]);
+
+ // build mask image from source
+ $mask = $image->getDriver()->init($mask_source);
+ $mask_size = $mask->getSize();
+
+ // resize mask to size of current image (if necessary)
+ if ($mask_size != $image_size) {
+ $mask->resize($image_size->width, $image_size->height);
+ }
+
+ imagealphablending($canvas->getCore(), false);
+
+ if ( ! $mask_w_alpha) {
+ // mask from greyscale image
+ imagefilter($mask->getCore(), IMG_FILTER_GRAYSCALE);
+ }
+
+ // redraw old image pixel by pixel considering alpha map
+ for ($x=0; $x < $image_size->width; $x++) {
+ for ($y=0; $y < $image_size->height; $y++) {
+
+ $color = $image->pickColor($x, $y, 'array');
+ $alpha = $mask->pickColor($x, $y, 'array');
+
+ if ($mask_w_alpha) {
+ $alpha = $alpha[3]; // use alpha channel as mask
+ } else {
+
+ if ($alpha[3] == 0) { // transparent as black
+ $alpha = 0;
+ } else {
+
+ // $alpha = floatval(round((($alpha[0] + $alpha[1] + $alpha[3]) / 3) / 255, 2));
+
+ // image is greyscale, so channel doesn't matter (use red channel)
+ $alpha = floatval(round($alpha[0] / 255, 2));
+ }
+
+ }
+
+ // preserve alpha of original image...
+ if ($color[3] < $alpha) {
+ $alpha = $color[3];
+ }
+
+ // replace alpha value
+ $color[3] = $alpha;
+
+ // redraw pixel
+ $canvas->pixel($color, $x, $y);
+ }
+ }
+
+
+ // replace current image with masked instance
+ $image->setCore($canvas->getCore());
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/OpacityCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/OpacityCommand.php
new file mode 100644
index 0000000000..081e68a4a1
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/OpacityCommand.php
@@ -0,0 +1,29 @@
+argument(0)->between(0, 100)->required()->value();
+
+ // get size of image
+ $size = $image->getSize();
+
+ // build temp alpha mask
+ $mask_color = sprintf('rgba(0, 0, 0, %.1F)', $transparency / 100);
+ $mask = $image->getDriver()->newImage($size->width, $size->height, $mask_color);
+
+ // mask image
+ $image->mask($mask->getCore(), true);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/PickColorCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/PickColorCommand.php
new file mode 100644
index 0000000000..9fb4bb4226
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/PickColorCommand.php
@@ -0,0 +1,36 @@
+argument(0)->type('digit')->required()->value();
+ $y = $this->argument(1)->type('digit')->required()->value();
+ $format = $this->argument(2)->type('string')->value('array');
+
+ // pick color
+ $color = imagecolorat($image->getCore(), $x, $y);
+
+ if ( ! imageistruecolor($image->getCore())) {
+ $color = imagecolorsforindex($image->getCore(), $color);
+ $color['alpha'] = round(1 - $color['alpha'] / 127, 2);
+ }
+
+ $color = new Color($color);
+
+ // format to output
+ $this->setOutput($color->format($format));
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/PixelCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/PixelCommand.php
new file mode 100644
index 0000000000..67f3e3b959
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/PixelCommand.php
@@ -0,0 +1,24 @@
+argument(0)->required()->value();
+ $color = new Color($color);
+ $x = $this->argument(1)->type('digit')->required()->value();
+ $y = $this->argument(2)->type('digit')->required()->value();
+
+ return imagesetpixel($image->getCore(), $x, $y, $color->getInt());
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/PixelateCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/PixelateCommand.php
new file mode 100644
index 0000000000..2e2093d7d7
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/PixelateCommand.php
@@ -0,0 +1,19 @@
+argument(0)->type('digit')->value(10);
+
+ return imagefilter($image->getCore(), IMG_FILTER_PIXELATE, $size, true);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ResetCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ResetCommand.php
new file mode 100644
index 0000000000..c8d2e4a128
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ResetCommand.php
@@ -0,0 +1,35 @@
+argument(0)->value();
+
+ if (is_resource($backup = $image->getBackup($backupName))) {
+
+ // destroy current resource
+ imagedestroy($image->getCore());
+
+ // clone backup
+ $backup = $image->getDriver()->cloneCore($backup);
+
+ // reset to new resource
+ $image->setCore($backup);
+
+ return true;
+ }
+
+ throw new \Intervention\Image\Exception\RuntimeException(
+ "Backup not available. Call backup() before reset()."
+ );
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ResizeCanvasCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ResizeCanvasCommand.php
new file mode 100644
index 0000000000..70739fff9c
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ResizeCanvasCommand.php
@@ -0,0 +1,81 @@
+argument(0)->type('digit')->required()->value();
+ $height = $this->argument(1)->type('digit')->required()->value();
+ $anchor = $this->argument(2)->value('center');
+ $relative = $this->argument(3)->type('boolean')->value(false);
+ $bgcolor = $this->argument(4)->value();
+
+ $original_width = $image->getWidth();
+ $original_height = $image->getHeight();
+
+ // check of only width or height is set
+ $width = is_null($width) ? $original_width : intval($width);
+ $height = is_null($height) ? $original_height : intval($height);
+
+ // check on relative width/height
+ if ($relative) {
+ $width = $original_width + $width;
+ $height = $original_height + $height;
+ }
+
+ // check for negative width/height
+ $width = ($width <= 0) ? $width + $original_width : $width;
+ $height = ($height <= 0) ? $height + $original_height : $height;
+
+ // create new canvas
+ $canvas = $image->getDriver()->newImage($width, $height, $bgcolor);
+
+ // set copy position
+ $canvas_size = $canvas->getSize()->align($anchor);
+ $image_size = $image->getSize()->align($anchor);
+ $canvas_pos = $image_size->relativePosition($canvas_size);
+ $image_pos = $canvas_size->relativePosition($image_size);
+
+ if ($width <= $original_width) {
+ $dst_x = 0;
+ $src_x = $canvas_pos->x;
+ $src_w = $canvas_size->width;
+ } else {
+ $dst_x = $image_pos->x;
+ $src_x = 0;
+ $src_w = $original_width;
+ }
+
+ if ($height <= $original_height) {
+ $dst_y = 0;
+ $src_y = $canvas_pos->y;
+ $src_h = $canvas_size->height;
+ } else {
+ $dst_y = $image_pos->y;
+ $src_y = 0;
+ $src_h = $original_height;
+ }
+
+ // make image area transparent to keep transparency
+ // even if background-color is set
+ $transparent = imagecolorallocatealpha($canvas->getCore(), 255, 255, 255, 127);
+ imagealphablending($canvas->getCore(), false); // do not blend / just overwrite
+ imagefilledrectangle($canvas->getCore(), $dst_x, $dst_y, $dst_x + $src_w - 1, $dst_y + $src_h - 1, $transparent);
+
+ // copy image into new canvas
+ imagecopy($canvas->getCore(), $image->getCore(), $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h);
+
+ // set new core to canvas
+ $image->setCore($canvas->getCore());
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ResizeCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ResizeCommand.php
new file mode 100644
index 0000000000..b76df3a9f2
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/ResizeCommand.php
@@ -0,0 +1,82 @@
+argument(0)->value();
+ $height = $this->argument(1)->value();
+ $constraints = $this->argument(2)->type('closure')->value();
+
+ // resize box
+ $resized = $image->getSize()->resize($width, $height, $constraints);
+
+ // modify image
+ $this->modify($image, 0, 0, 0, 0, $resized->getWidth(), $resized->getHeight(), $image->getWidth(), $image->getHeight());
+
+ return true;
+ }
+
+ /**
+ * Wrapper function for 'imagecopyresampled'
+ *
+ * @param Image $image
+ * @param int $dst_x
+ * @param int $dst_y
+ * @param int $src_x
+ * @param int $src_y
+ * @param int $dst_w
+ * @param int $dst_h
+ * @param int $src_w
+ * @param int $src_h
+ * @return boolean
+ */
+ protected function modify($image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h)
+ {
+ // create new image
+ $modified = imagecreatetruecolor($dst_w, $dst_h);
+
+ // get current image
+ $resource = $image->getCore();
+
+ // preserve transparency
+ $transIndex = imagecolortransparent($resource);
+
+ if ($transIndex != -1) {
+ $rgba = imagecolorsforindex($modified, $transIndex);
+ $transColor = imagecolorallocatealpha($modified, $rgba['red'], $rgba['green'], $rgba['blue'], 127);
+ imagefill($modified, 0, 0, $transColor);
+ imagecolortransparent($modified, $transColor);
+ } else {
+ imagealphablending($modified, false);
+ imagesavealpha($modified, true);
+ }
+
+ // copy content from resource
+ $result = imagecopyresampled(
+ $modified,
+ $resource,
+ $dst_x,
+ $dst_y,
+ $src_x,
+ $src_y,
+ $dst_w,
+ $dst_h,
+ $src_w,
+ $src_h
+ );
+
+ // set new content as recource
+ $image->setCore($modified);
+
+ return $result;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/RotateCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/RotateCommand.php
new file mode 100644
index 0000000000..698f514a3c
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/RotateCommand.php
@@ -0,0 +1,29 @@
+argument(0)->type('numeric')->required()->value();
+ $color = $this->argument(1)->value();
+ $color = new Color($color);
+
+ // restrict rotations beyond 360 degrees, since the end result is the same
+ $angle %= 360;
+
+ // rotate image
+ $image->setCore(imagerotate($image->getCore(), $angle, $color->getInt()));
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/SharpenCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/SharpenCommand.php
new file mode 100644
index 0000000000..4c0cc50f5a
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/SharpenCommand.php
@@ -0,0 +1,32 @@
+argument(0)->between(0, 100)->value(10);
+
+ // build matrix
+ $min = $amount >= 10 ? $amount * -0.01 : 0;
+ $max = $amount * -0.025;
+ $abs = ((4 * $min + 4 * $max) * -1) + 1;
+ $div = 1;
+
+ $matrix = [
+ [$min, $max, $min],
+ [$max, $abs, $max],
+ [$min, $max, $min]
+ ];
+
+ // apply the matrix
+ return imageconvolution($image->getCore(), $matrix, $div, 0);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/TrimCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/TrimCommand.php
new file mode 100644
index 0000000000..2e36975270
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/TrimCommand.php
@@ -0,0 +1,176 @@
+argument(0)->type('string')->value();
+ $away = $this->argument(1)->value();
+ $tolerance = $this->argument(2)->type('numeric')->value(0);
+ $feather = $this->argument(3)->type('numeric')->value(0);
+
+ $width = $image->getWidth();
+ $height = $image->getHeight();
+
+ // default values
+ $checkTransparency = false;
+
+ // define borders to trim away
+ if (is_null($away)) {
+ $away = ['top', 'right', 'bottom', 'left'];
+ } elseif (is_string($away)) {
+ $away = [$away];
+ }
+
+ // lower border names
+ foreach ($away as $key => $value) {
+ $away[$key] = strtolower($value);
+ }
+
+ // define base color position
+ switch (strtolower($base)) {
+ case 'transparent':
+ case 'trans':
+ $checkTransparency = true;
+ $base_x = 0;
+ $base_y = 0;
+ break;
+
+ case 'bottom-right':
+ case 'right-bottom':
+ $base_x = $width - 1;
+ $base_y = $height - 1;
+ break;
+
+ default:
+ case 'top-left':
+ case 'left-top':
+ $base_x = 0;
+ $base_y = 0;
+ break;
+ }
+
+ // pick base color
+ if ($checkTransparency) {
+ $color = new Color; // color will only be used to compare alpha channel
+ } else {
+ $color = $image->pickColor($base_x, $base_y, 'object');
+ }
+
+ $top_x = 0;
+ $top_y = 0;
+ $bottom_x = $width;
+ $bottom_y = $height;
+
+ // search upper part of image for colors to trim away
+ if (in_array('top', $away)) {
+
+ for ($y=0; $y < ceil($height/2); $y++) {
+ for ($x=0; $x < $width; $x++) {
+
+ $checkColor = $image->pickColor($x, $y, 'object');
+
+ if ($checkTransparency) {
+ $checkColor->r = $color->r;
+ $checkColor->g = $color->g;
+ $checkColor->b = $color->b;
+ }
+
+ if ($color->differs($checkColor, $tolerance)) {
+ $top_y = max(0, $y - $feather);
+ break 2;
+ }
+
+ }
+ }
+
+ }
+
+ // search left part of image for colors to trim away
+ if (in_array('left', $away)) {
+
+ for ($x=0; $x < ceil($width/2); $x++) {
+ for ($y=$top_y; $y < $height; $y++) {
+
+ $checkColor = $image->pickColor($x, $y, 'object');
+
+ if ($checkTransparency) {
+ $checkColor->r = $color->r;
+ $checkColor->g = $color->g;
+ $checkColor->b = $color->b;
+ }
+
+ if ($color->differs($checkColor, $tolerance)) {
+ $top_x = max(0, $x - $feather);
+ break 2;
+ }
+
+ }
+ }
+
+ }
+
+ // search lower part of image for colors to trim away
+ if (in_array('bottom', $away)) {
+
+ for ($y=($height-1); $y >= floor($height/2)-1; $y--) {
+ for ($x=$top_x; $x < $width; $x++) {
+
+ $checkColor = $image->pickColor($x, $y, 'object');
+
+ if ($checkTransparency) {
+ $checkColor->r = $color->r;
+ $checkColor->g = $color->g;
+ $checkColor->b = $color->b;
+ }
+
+ if ($color->differs($checkColor, $tolerance)) {
+ $bottom_y = min($height, $y+1 + $feather);
+ break 2;
+ }
+
+ }
+ }
+
+ }
+
+ // search right part of image for colors to trim away
+ if (in_array('right', $away)) {
+
+ for ($x=($width-1); $x >= floor($width/2)-1; $x--) {
+ for ($y=$top_y; $y < $bottom_y; $y++) {
+
+ $checkColor = $image->pickColor($x, $y, 'object');
+
+ if ($checkTransparency) {
+ $checkColor->r = $color->r;
+ $checkColor->g = $color->g;
+ $checkColor->b = $color->b;
+ }
+
+ if ($color->differs($checkColor, $tolerance)) {
+ $bottom_x = min($width, $x+1 + $feather);
+ break 2;
+ }
+
+ }
+ }
+
+ }
+
+
+ // trim parts of image
+ return $this->modify($image, 0, 0, $top_x, $top_y, ($bottom_x-$top_x), ($bottom_y-$top_y), ($bottom_x-$top_x), ($bottom_y-$top_y));
+
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Commands/WidenCommand.php b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/WidenCommand.php
new file mode 100644
index 0000000000..43000d5dcc
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Commands/WidenCommand.php
@@ -0,0 +1,28 @@
+argument(0)->type('digit')->required()->value();
+ $additionalConstraints = $this->argument(1)->type('closure')->value();
+
+ $this->arguments[0] = $width;
+ $this->arguments[1] = null;
+ $this->arguments[2] = function ($constraint) use ($additionalConstraints) {
+ $constraint->aspectRatio();
+ if(is_callable($additionalConstraints))
+ $additionalConstraints($constraint);
+ };
+
+ return parent::execute($image);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Decoder.php b/vendor/intervention/image/src/Intervention/Image/Gd/Decoder.php
new file mode 100644
index 0000000000..4fe821e5eb
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Decoder.php
@@ -0,0 +1,153 @@
+gdResourceToTruecolor($core);
+
+ // build image
+ $image = $this->initFromGdResource($core);
+ $image->mime = $mime;
+ $image->setFileInfoFromPath($path);
+
+ return $image;
+ }
+
+ /**
+ * Initiates new image from GD resource
+ *
+ * @param Resource $resource
+ * @return \Intervention\Image\Image
+ */
+ public function initFromGdResource($resource)
+ {
+ return new Image(new Driver, $resource);
+ }
+
+ /**
+ * Initiates new image from Imagick object
+ *
+ * @param Imagick $object
+ * @return \Intervention\Image\Image
+ */
+ public function initFromImagick(\Imagick $object)
+ {
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ "Gd driver is unable to init from Imagick object."
+ );
+ }
+
+ /**
+ * Initiates new image from binary data
+ *
+ * @param string $data
+ * @return \Intervention\Image\Image
+ */
+ public function initFromBinary($binary)
+ {
+ $resource = @imagecreatefromstring($binary);
+
+ if ($resource === false) {
+ throw new \Intervention\Image\Exception\NotReadableException(
+ "Unable to init from given binary data."
+ );
+ }
+
+ $image = $this->initFromGdResource($resource);
+ $image->mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $binary);
+
+ return $image;
+ }
+
+ /**
+ * Transform GD resource into Truecolor version
+ *
+ * @param resource $resource
+ * @return bool
+ */
+ public function gdResourceToTruecolor(&$resource)
+ {
+ $width = imagesx($resource);
+ $height = imagesy($resource);
+
+ // new canvas
+ $canvas = imagecreatetruecolor($width, $height);
+
+ // fill with transparent color
+ imagealphablending($canvas, false);
+ $transparent = imagecolorallocatealpha($canvas, 255, 255, 255, 127);
+ imagefilledrectangle($canvas, 0, 0, $width, $height, $transparent);
+ imagecolortransparent($canvas, $transparent);
+ imagealphablending($canvas, true);
+
+ // copy original
+ imagecopy($canvas, $resource, 0, 0, 0, 0, $width, $height);
+ imagedestroy($resource);
+
+ $resource = $canvas;
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Driver.php b/vendor/intervention/image/src/Intervention/Image/Gd/Driver.php
new file mode 100644
index 0000000000..b5a2d72ee4
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Driver.php
@@ -0,0 +1,86 @@
+coreAvailable()) {
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ "GD Library extension not available with this PHP installation."
+ );
+ }
+
+ $this->decoder = $decoder ? $decoder : new Decoder;
+ $this->encoder = $encoder ? $encoder : new Encoder;
+ }
+
+ /**
+ * Creates new image instance
+ *
+ * @param int $width
+ * @param int $height
+ * @param mixed $background
+ * @return \Intervention\Image\Image
+ */
+ public function newImage($width, $height, $background = null)
+ {
+ // create empty resource
+ $core = imagecreatetruecolor($width, $height);
+ $image = new \Intervention\Image\Image(new static, $core);
+
+ // set background color
+ $background = new Color($background);
+ imagefill($image->getCore(), 0, 0, $background->getInt());
+
+ return $image;
+ }
+
+ /**
+ * Reads given string into color object
+ *
+ * @param string $value
+ * @return AbstractColor
+ */
+ public function parseColor($value)
+ {
+ return new Color($value);
+ }
+
+ /**
+ * Checks if core module installation is available
+ *
+ * @return boolean
+ */
+ protected function coreAvailable()
+ {
+ return (extension_loaded('gd') && function_exists('gd_info'));
+ }
+
+ /**
+ * Returns clone of given core
+ *
+ * @return mixed
+ */
+ public function cloneCore($core)
+ {
+ $width = imagesx($core);
+ $height = imagesy($core);
+ $clone = imagecreatetruecolor($width, $height);
+ imagealphablending($clone, false);
+ imagesavealpha($clone, true);
+ $transparency = imagecolorallocatealpha($clone, 0, 0, 0, 127);
+ imagefill($clone, 0, 0, $transparency);
+
+ imagecopy($clone, $core, 0, 0, 0, 0, $width, $height);
+
+ return $clone;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Encoder.php b/vendor/intervention/image/src/Intervention/Image/Gd/Encoder.php
new file mode 100644
index 0000000000..a3fd2f1276
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Encoder.php
@@ -0,0 +1,122 @@
+image->getCore(), null, $this->quality);
+ $this->image->mime = image_type_to_mime_type(IMAGETYPE_JPEG);
+ $buffer = ob_get_contents();
+ ob_end_clean();
+
+ return $buffer;
+ }
+
+ /**
+ * Processes and returns encoded image as PNG string
+ *
+ * @return string
+ */
+ protected function processPng()
+ {
+ ob_start();
+ $resource = $this->image->getCore();
+ imagealphablending($resource, false);
+ imagesavealpha($resource, true);
+ imagepng($resource, null, -1);
+ $this->image->mime = image_type_to_mime_type(IMAGETYPE_PNG);
+ $buffer = ob_get_contents();
+ ob_end_clean();
+
+ return $buffer;
+ }
+
+ /**
+ * Processes and returns encoded image as GIF string
+ *
+ * @return string
+ */
+ protected function processGif()
+ {
+ ob_start();
+ imagegif($this->image->getCore());
+ $this->image->mime = image_type_to_mime_type(IMAGETYPE_GIF);
+ $buffer = ob_get_contents();
+ ob_end_clean();
+
+ return $buffer;
+ }
+
+ protected function processWebp()
+ {
+ if ( ! function_exists('imagewebp')) {
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ "Webp format is not supported by PHP installation."
+ );
+ }
+
+ ob_start();
+ imagewebp($this->image->getCore(), null, $this->quality);
+ $this->image->mime = defined('IMAGETYPE_WEBP') ? image_type_to_mime_type(IMAGETYPE_WEBP) : 'image/webp';
+ $buffer = ob_get_contents();
+ ob_end_clean();
+
+ return $buffer;
+ }
+
+ /**
+ * Processes and returns encoded image as TIFF string
+ *
+ * @return string
+ */
+ protected function processTiff()
+ {
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ "TIFF format is not supported by Gd Driver."
+ );
+ }
+
+ /**
+ * Processes and returns encoded image as BMP string
+ *
+ * @return string
+ */
+ protected function processBmp()
+ {
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ "BMP format is not supported by Gd Driver."
+ );
+ }
+
+ /**
+ * Processes and returns encoded image as ICO string
+ *
+ * @return string
+ */
+ protected function processIco()
+ {
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ "ICO format is not supported by Gd Driver."
+ );
+ }
+
+ /**
+ * Processes and returns encoded image as PSD string
+ *
+ * @return string
+ */
+ protected function processPsd()
+ {
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ "PSD format is not supported by Gd Driver."
+ );
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Font.php b/vendor/intervention/image/src/Intervention/Image/Gd/Font.php
new file mode 100644
index 0000000000..828c7af70a
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Font.php
@@ -0,0 +1,255 @@
+size * 0.75));
+ }
+
+ /**
+ * Filter function to access internal integer font values
+ *
+ * @return int
+ */
+ private function getInternalFont()
+ {
+ $internalfont = is_null($this->file) ? 1 : $this->file;
+ $internalfont = is_numeric($internalfont) ? $internalfont : false;
+
+ if ( ! in_array($internalfont, [1, 2, 3, 4, 5])) {
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ sprintf('Internal GD font (%s) not available. Use only 1-5.', $internalfont)
+ );
+ }
+
+ return intval($internalfont);
+ }
+
+ /**
+ * Get width of an internal font character
+ *
+ * @return int
+ */
+ private function getInternalFontWidth()
+ {
+ return $this->getInternalFont() + 4;
+ }
+
+ /**
+ * Get height of an internal font character
+ *
+ * @return int
+ */
+ private function getInternalFontHeight()
+ {
+ switch ($this->getInternalFont()) {
+ case 1:
+ return 8;
+
+ case 2:
+ return 14;
+
+ case 3:
+ return 14;
+
+ case 4:
+ return 16;
+
+ case 5:
+ return 16;
+ }
+ }
+
+ /**
+ * Calculates bounding box of current font setting
+ *
+ * @return Array
+ */
+ public function getBoxSize()
+ {
+ $box = [];
+
+ if ($this->hasApplicableFontFile()) {
+
+ // get bounding box with angle 0
+ $box = imagettfbbox($this->getPointSize(), 0, $this->file, $this->text);
+
+ // rotate points manually
+ if ($this->angle != 0) {
+
+ $angle = pi() * 2 - $this->angle * pi() * 2 / 360;
+
+ for ($i=0; $i<4; $i++) {
+ $x = $box[$i * 2];
+ $y = $box[$i * 2 + 1];
+ $box[$i * 2] = cos($angle) * $x - sin($angle) * $y;
+ $box[$i * 2 + 1] = sin($angle) * $x + cos($angle) * $y;
+ }
+ }
+
+ $box['width'] = intval(abs($box[4] - $box[0]));
+ $box['height'] = intval(abs($box[5] - $box[1]));
+
+ } else {
+
+ // get current internal font size
+ $width = $this->getInternalFontWidth();
+ $height = $this->getInternalFontHeight();
+
+ if (strlen($this->text) == 0) {
+ // no text -> no boxsize
+ $box['width'] = 0;
+ $box['height'] = 0;
+ } else {
+ // calculate boxsize
+ $box['width'] = strlen($this->text) * $width;
+ $box['height'] = $height;
+ }
+ }
+
+ return $box;
+ }
+
+ /**
+ * Draws font to given image at given position
+ *
+ * @param Image $image
+ * @param int $posx
+ * @param int $posy
+ * @return void
+ */
+ public function applyToImage(Image $image, $posx = 0, $posy = 0)
+ {
+ // parse text color
+ $color = new Color($this->color);
+
+ if ($this->hasApplicableFontFile()) {
+
+ if ($this->angle != 0 || is_string($this->align) || is_string($this->valign)) {
+
+ $box = $this->getBoxSize();
+
+ $align = is_null($this->align) ? 'left' : strtolower($this->align);
+ $valign = is_null($this->valign) ? 'bottom' : strtolower($this->valign);
+
+ // correction on position depending on v/h alignment
+ switch ($align.'-'.$valign) {
+
+ case 'center-top':
+ $posx = $posx - round(($box[6]+$box[4])/2);
+ $posy = $posy - round(($box[7]+$box[5])/2);
+ break;
+
+ case 'right-top':
+ $posx = $posx - $box[4];
+ $posy = $posy - $box[5];
+ break;
+
+ case 'left-top':
+ $posx = $posx - $box[6];
+ $posy = $posy - $box[7];
+ break;
+
+ case 'center-center':
+ case 'center-middle':
+ $posx = $posx - round(($box[0]+$box[4])/2);
+ $posy = $posy - round(($box[1]+$box[5])/2);
+ break;
+
+ case 'right-center':
+ case 'right-middle':
+ $posx = $posx - round(($box[2]+$box[4])/2);
+ $posy = $posy - round(($box[3]+$box[5])/2);
+ break;
+
+ case 'left-center':
+ case 'left-middle':
+ $posx = $posx - round(($box[0]+$box[6])/2);
+ $posy = $posy - round(($box[1]+$box[7])/2);
+ break;
+
+ case 'center-bottom':
+ $posx = $posx - round(($box[0]+$box[2])/2);
+ $posy = $posy - round(($box[1]+$box[3])/2);
+ break;
+
+ case 'right-bottom':
+ $posx = $posx - $box[2];
+ $posy = $posy - $box[3];
+ break;
+
+ case 'left-bottom':
+ $posx = $posx - $box[0];
+ $posy = $posy - $box[1];
+ break;
+ }
+ }
+
+ // enable alphablending for imagettftext
+ imagealphablending($image->getCore(), true);
+
+ // draw ttf text
+ imagettftext($image->getCore(), $this->getPointSize(), $this->angle, $posx, $posy, $color->getInt(), $this->file, $this->text);
+
+ } else {
+
+ // get box size
+ $box = $this->getBoxSize();
+ $width = $box['width'];
+ $height = $box['height'];
+
+ // internal font specific position corrections
+ if ($this->getInternalFont() == 1) {
+ $top_correction = 1;
+ $bottom_correction = 2;
+ } elseif ($this->getInternalFont() == 3) {
+ $top_correction = 2;
+ $bottom_correction = 4;
+ } else {
+ $top_correction = 3;
+ $bottom_correction = 4;
+ }
+
+ // x-position corrections for horizontal alignment
+ switch (strtolower($this->align)) {
+ case 'center':
+ $posx = ceil($posx - ($width / 2));
+ break;
+
+ case 'right':
+ $posx = ceil($posx - $width) + 1;
+ break;
+ }
+
+ // y-position corrections for vertical alignment
+ switch (strtolower($this->valign)) {
+ case 'center':
+ case 'middle':
+ $posy = ceil($posy - ($height / 2));
+ break;
+
+ case 'top':
+ $posy = ceil($posy - $top_correction);
+ break;
+
+ default:
+ case 'bottom':
+ $posy = round($posy - $height + $bottom_correction);
+ break;
+ }
+
+ // draw text
+ imagestring($image->getCore(), $this->getInternalFont(), $posx, $posy, $this->text, $color->getInt());
+ }
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Shapes/CircleShape.php b/vendor/intervention/image/src/Intervention/Image/Gd/Shapes/CircleShape.php
new file mode 100644
index 0000000000..c3c42144d3
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Shapes/CircleShape.php
@@ -0,0 +1,40 @@
+width = is_numeric($diameter) ? intval($diameter) : $this->diameter;
+ $this->height = is_numeric($diameter) ? intval($diameter) : $this->diameter;
+ $this->diameter = is_numeric($diameter) ? intval($diameter) : $this->diameter;
+ }
+
+ /**
+ * Draw current circle on given image
+ *
+ * @param Image $image
+ * @param int $x
+ * @param int $y
+ * @return boolean
+ */
+ public function applyToImage(Image $image, $x = 0, $y = 0)
+ {
+ return parent::applyToImage($image, $x, $y);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Shapes/EllipseShape.php b/vendor/intervention/image/src/Intervention/Image/Gd/Shapes/EllipseShape.php
new file mode 100644
index 0000000000..c2e81c04ef
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Shapes/EllipseShape.php
@@ -0,0 +1,64 @@
+width = is_numeric($width) ? intval($width) : $this->width;
+ $this->height = is_numeric($height) ? intval($height) : $this->height;
+ }
+
+ /**
+ * Draw ellipse instance on given image
+ *
+ * @param Image $image
+ * @param int $x
+ * @param int $y
+ * @return boolean
+ */
+ public function applyToImage(Image $image, $x = 0, $y = 0)
+ {
+ // parse background color
+ $background = new Color($this->background);
+
+ if ($this->hasBorder()) {
+ // slightly smaller ellipse to keep 1px bordered edges clean
+ imagefilledellipse($image->getCore(), $x, $y, $this->width-1, $this->height-1, $background->getInt());
+
+ $border_color = new Color($this->border_color);
+ imagesetthickness($image->getCore(), $this->border_width);
+
+ // gd's imageellipse doesn't respect imagesetthickness so i use imagearc with 359.9 degrees here
+ imagearc($image->getCore(), $x, $y, $this->width, $this->height, 0, 359.99, $border_color->getInt());
+ } else {
+ imagefilledellipse($image->getCore(), $x, $y, $this->width, $this->height, $background->getInt());
+ }
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Shapes/LineShape.php b/vendor/intervention/image/src/Intervention/Image/Gd/Shapes/LineShape.php
new file mode 100644
index 0000000000..c1eedd688a
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Shapes/LineShape.php
@@ -0,0 +1,89 @@
+x = is_numeric($x) ? intval($x) : $this->x;
+ $this->y = is_numeric($y) ? intval($y) : $this->y;
+ }
+
+ /**
+ * Set current line color
+ *
+ * @param string $color
+ * @return void
+ */
+ public function color($color)
+ {
+ $this->color = $color;
+ }
+
+ /**
+ * Set current line width in pixels
+ *
+ * @param int $width
+ * @return void
+ */
+ public function width($width)
+ {
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ "Line width is not supported by GD driver."
+ );
+ }
+
+ /**
+ * Draw current instance of line to given endpoint on given image
+ *
+ * @param Image $image
+ * @param int $x
+ * @param int $y
+ * @return boolean
+ */
+ public function applyToImage(Image $image, $x = 0, $y = 0)
+ {
+ $color = new Color($this->color);
+ imageline($image->getCore(), $x, $y, $this->x, $this->y, $color->getInt());
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Shapes/PolygonShape.php b/vendor/intervention/image/src/Intervention/Image/Gd/Shapes/PolygonShape.php
new file mode 100644
index 0000000000..b11c6a11b2
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Shapes/PolygonShape.php
@@ -0,0 +1,48 @@
+points = $points;
+ }
+
+ /**
+ * Draw polygon on given image
+ *
+ * @param Image $image
+ * @param int $x
+ * @param int $y
+ * @return boolean
+ */
+ public function applyToImage(Image $image, $x = 0, $y = 0)
+ {
+ $background = new Color($this->background);
+ imagefilledpolygon($image->getCore(), $this->points, intval(count($this->points) / 2), $background->getInt());
+
+ if ($this->hasBorder()) {
+ $border_color = new Color($this->border_color);
+ imagesetthickness($image->getCore(), $this->border_width);
+ imagepolygon($image->getCore(), $this->points, intval(count($this->points) / 2), $border_color->getInt());
+ }
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Gd/Shapes/RectangleShape.php b/vendor/intervention/image/src/Intervention/Image/Gd/Shapes/RectangleShape.php
new file mode 100644
index 0000000000..7244949634
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Gd/Shapes/RectangleShape.php
@@ -0,0 +1,75 @@
+x1 = is_numeric($x1) ? intval($x1) : $this->x1;
+ $this->y1 = is_numeric($y1) ? intval($y1) : $this->y1;
+ $this->x2 = is_numeric($x2) ? intval($x2) : $this->x2;
+ $this->y2 = is_numeric($y2) ? intval($y2) : $this->y2;
+ }
+
+ /**
+ * Draw rectangle to given image at certain position
+ *
+ * @param Image $image
+ * @param int $x
+ * @param int $y
+ * @return boolean
+ */
+ public function applyToImage(Image $image, $x = 0, $y = 0)
+ {
+ $background = new Color($this->background);
+ imagefilledrectangle($image->getCore(), $this->x1, $this->y1, $this->x2, $this->y2, $background->getInt());
+
+ if ($this->hasBorder()) {
+ $border_color = new Color($this->border_color);
+ imagesetthickness($image->getCore(), $this->border_width);
+ imagerectangle($image->getCore(), $this->x1, $this->y1, $this->x2, $this->y2, $border_color->getInt());
+ }
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Image.php b/vendor/intervention/image/src/Intervention/Image/Image.php
new file mode 100644
index 0000000000..6c8dbf07a0
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Image.php
@@ -0,0 +1,363 @@
+driver = $driver;
+ $this->core = $core;
+ }
+
+ /**
+ * Magic method to catch all image calls
+ * usually any AbstractCommand
+ *
+ * @param string $name
+ * @param Array $arguments
+ * @return mixed
+ */
+ public function __call($name, $arguments)
+ {
+ $command = $this->driver->executeCommand($this, $name, $arguments);
+ return $command->hasOutput() ? $command->getOutput() : $this;
+ }
+
+ /**
+ * Starts encoding of current image
+ *
+ * @param string $format
+ * @param int $quality
+ * @return \Intervention\Image\Image
+ */
+ public function encode($format = null, $quality = 90)
+ {
+ return $this->driver->encode($this, $format, $quality);
+ }
+
+ /**
+ * Saves encoded image in filesystem
+ *
+ * @param string $path
+ * @param int $quality
+ * @return \Intervention\Image\Image
+ */
+ public function save($path = null, $quality = null)
+ {
+ $path = is_null($path) ? $this->basePath() : $path;
+
+ if (is_null($path)) {
+ throw new Exception\NotWritableException(
+ "Can't write to undefined path."
+ );
+ }
+
+ $data = $this->encode(pathinfo($path, PATHINFO_EXTENSION), $quality);
+ $saved = @file_put_contents($path, $data);
+
+ if ($saved === false) {
+ throw new Exception\NotWritableException(
+ "Can't write image data to path ({$path})"
+ );
+ }
+
+ // set new file info
+ $this->setFileInfoFromPath($path);
+
+ return $this;
+ }
+
+ /**
+ * Runs a given filter on current image
+ *
+ * @param FiltersFilterInterface $filter
+ * @return \Intervention\Image\Image
+ */
+ public function filter(Filters\FilterInterface $filter)
+ {
+ return $filter->applyFilter($this);
+ }
+
+ /**
+ * Returns current image driver
+ *
+ * @return \Intervention\Image\AbstractDriver
+ */
+ public function getDriver()
+ {
+ return $this->driver;
+ }
+
+ /**
+ * Sets current image driver
+ * @param AbstractDriver $driver
+ */
+ public function setDriver(AbstractDriver $driver)
+ {
+ $this->driver = $driver;
+
+ return $this;
+ }
+
+ /**
+ * Returns current image resource/obj
+ *
+ * @return mixed
+ */
+ public function getCore()
+ {
+ return $this->core;
+ }
+
+ /**
+ * Sets current image resource
+ *
+ * @param mixed $core
+ */
+ public function setCore($core)
+ {
+ $this->core = $core;
+
+ return $this;
+ }
+
+ /**
+ * Returns current image backup
+ *
+ * @param string $name
+ * @return mixed
+ */
+ public function getBackup($name = null)
+ {
+ $name = is_null($name) ? 'default' : $name;
+
+ if ( ! $this->backupExists($name)) {
+ throw new \Intervention\Image\Exception\RuntimeException(
+ "Backup with name ({$name}) not available. Call backup() before reset()."
+ );
+ }
+
+ return $this->backups[$name];
+ }
+
+ /**
+ * Returns all backups attached to image
+ *
+ * @return array
+ */
+ public function getBackups()
+ {
+ return $this->backups;
+ }
+
+ /**
+ * Sets current image backup
+ *
+ * @param mixed $resource
+ * @param string $name
+ * @return self
+ */
+ public function setBackup($resource, $name = null)
+ {
+ $name = is_null($name) ? 'default' : $name;
+
+ $this->backups[$name] = $resource;
+
+ return $this;
+ }
+
+ /**
+ * Checks if named backup exists
+ *
+ * @param string $name
+ * @return bool
+ */
+ private function backupExists($name)
+ {
+ return array_key_exists($name, $this->backups);
+ }
+
+ /**
+ * Checks if current image is already encoded
+ *
+ * @return boolean
+ */
+ public function isEncoded()
+ {
+ return ! empty($this->encoded);
+ }
+
+ /**
+ * Returns encoded image data of current image
+ *
+ * @return string
+ */
+ public function getEncoded()
+ {
+ return $this->encoded;
+ }
+
+ /**
+ * Sets encoded image buffer
+ *
+ * @param string $value
+ */
+ public function setEncoded($value)
+ {
+ $this->encoded = $value;
+
+ return $this;
+ }
+
+ /**
+ * Calculates current image width
+ *
+ * @return int
+ */
+ public function getWidth()
+ {
+ return $this->getSize()->width;
+ }
+
+ /**
+ * Alias of getWidth()
+ *
+ * @return int
+ */
+ public function width()
+ {
+ return $this->getWidth();
+ }
+
+ /**
+ * Calculates current image height
+ *
+ * @return int
+ */
+ public function getHeight()
+ {
+ return $this->getSize()->height;
+ }
+
+ /**
+ * Alias of getHeight
+ *
+ * @return int
+ */
+ public function height()
+ {
+ return $this->getHeight();
+ }
+
+ /**
+ * Reads mime type
+ *
+ * @return string
+ */
+ public function mime()
+ {
+ return $this->mime;
+ }
+
+ /**
+ * Returns encoded image data in string conversion
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->encoded;
+ }
+
+ /**
+ * Cloning an image
+ */
+ public function __clone()
+ {
+ $this->core = $this->driver->cloneCore($this->core);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/ImageManager.php b/vendor/intervention/image/src/Intervention/Image/ImageManager.php
new file mode 100644
index 0000000000..7c9f1c91f2
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/ImageManager.php
@@ -0,0 +1,140 @@
+ 'gd'
+ ];
+
+ /**
+ * Creates new instance of Image Manager
+ *
+ * @param array $config
+ */
+ public function __construct(array $config = [])
+ {
+ $this->checkRequirements();
+ $this->configure($config);
+ }
+
+ /**
+ * Overrides configuration settings
+ *
+ * @param array $config
+ *
+ * @return self
+ */
+ public function configure(array $config = [])
+ {
+ $this->config = array_replace($this->config, $config);
+
+ return $this;
+ }
+
+ /**
+ * Initiates an Image instance from different input types
+ *
+ * @param mixed $data
+ *
+ * @return \Intervention\Image\Image
+ */
+ public function make($data)
+ {
+ return $this->createDriver()->init($data);
+ }
+
+ /**
+ * Creates an empty image canvas
+ *
+ * @param int $width
+ * @param int $height
+ * @param mixed $background
+ *
+ * @return \Intervention\Image\Image
+ */
+ public function canvas($width, $height, $background = null)
+ {
+ return $this->createDriver()->newImage($width, $height, $background);
+ }
+
+ /**
+ * Create new cached image and run callback
+ * (requires additional package intervention/imagecache)
+ *
+ * @param Closure $callback
+ * @param int $lifetime
+ * @param boolean $returnObj
+ *
+ * @return Image
+ */
+ public function cache(Closure $callback, $lifetime = null, $returnObj = false)
+ {
+ if (class_exists('Intervention\\Image\\ImageCache')) {
+ // create imagecache
+ $imagecache = new ImageCache($this);
+
+ // run callback
+ if (is_callable($callback)) {
+ $callback($imagecache);
+ }
+
+ return $imagecache->get($lifetime, $returnObj);
+ }
+
+ throw new \Intervention\Image\Exception\MissingDependencyException(
+ "Please install package intervention/imagecache before running this function."
+ );
+ }
+
+ /**
+ * Creates a driver instance according to config settings
+ *
+ * @return \Intervention\Image\AbstractDriver
+ */
+ private function createDriver()
+ {
+ if (is_string($this->config['driver'])) {
+ $drivername = ucfirst($this->config['driver']);
+ $driverclass = sprintf('Intervention\\Image\\%s\\Driver', $drivername);
+
+ if (class_exists($driverclass)) {
+ return new $driverclass;
+ }
+
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ "Driver ({$drivername}) could not be instantiated."
+ );
+ }
+
+ if ($this->config['driver'] instanceof AbstractDriver) {
+ return $this->config['driver'];
+ }
+
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ "Unknown driver type."
+ );
+ }
+
+ /**
+ * Check if all requirements are available
+ *
+ * @return void
+ */
+ private function checkRequirements()
+ {
+ if ( ! function_exists('finfo_buffer')) {
+ throw new \Intervention\Image\Exception\MissingDependencyException(
+ "PHP Fileinfo extension must be installed/enabled to use Intervention Image."
+ );
+ }
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/ImageManagerStatic.php b/vendor/intervention/image/src/Intervention/Image/ImageManagerStatic.php
new file mode 100644
index 0000000000..ad549c8ca9
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/ImageManagerStatic.php
@@ -0,0 +1,87 @@
+configure($config);
+ }
+
+ /**
+ * Statically initiates an Image instance from different input types
+ *
+ * @param mixed $data
+ *
+ * @return \Intervention\Image\Image
+ */
+ public static function make($data)
+ {
+ return self::getManager()->make($data);
+ }
+
+ /**
+ * Statically creates an empty image canvas
+ *
+ * @param int $width
+ * @param int $height
+ * @param mixed $background
+ *
+ * @return \Intervention\Image\Image
+ */
+ public static function canvas($width, $height, $background = null)
+ {
+ return self::getManager()->canvas($width, $height, $background);
+ }
+
+ /**
+ * Create new cached image and run callback statically
+ *
+ * @param Closure $callback
+ * @param int $lifetime
+ * @param boolean $returnObj
+ *
+ * @return mixed
+ */
+ public static function cache(Closure $callback, $lifetime = null, $returnObj = false)
+ {
+ return self::getManager()->cache($callback, $lifetime, $returnObj);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/ImageServiceProvider.php b/vendor/intervention/image/src/Intervention/Image/ImageServiceProvider.php
new file mode 100644
index 0000000000..1e6351df78
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/ImageServiceProvider.php
@@ -0,0 +1,85 @@
+provider = $this->getProvider();
+ }
+
+ /**
+ * Bootstrap the application events.
+ *
+ * @return void
+ */
+ public function boot()
+ {
+ if (method_exists($this->provider, 'boot')) {
+ return $this->provider->boot();
+ }
+ }
+
+ /**
+ * Register the service provider.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ return $this->provider->register();
+ }
+
+ /**
+ * Return ServiceProvider according to Laravel version
+ *
+ * @return \Intervention\Image\Provider\ProviderInterface
+ */
+ private function getProvider()
+ {
+ if ($this->app instanceof \Laravel\Lumen\Application) {
+ $provider = '\Intervention\Image\ImageServiceProviderLumen';
+ } elseif (version_compare(\Illuminate\Foundation\Application::VERSION, '5.0', '<')) {
+ $provider = '\Intervention\Image\ImageServiceProviderLaravel4';
+ } else {
+ $provider = '\Intervention\Image\ImageServiceProviderLaravel5';
+ }
+
+ return new $provider($this->app);
+ }
+
+ /**
+ * Get the services provided by the provider.
+ *
+ * @return array
+ */
+ public function provides()
+ {
+ return ['image'];
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLaravel4.php b/vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLaravel4.php
new file mode 100755
index 0000000000..3b1388f252
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLaravel4.php
@@ -0,0 +1,112 @@
+package('intervention/image');
+
+ // try to create imagecache route only if imagecache is present
+ if (class_exists('Intervention\\Image\\ImageCache')) {
+
+ $app = $this->app;
+
+ // load imagecache config
+ $app['config']->package('intervention/imagecache', __DIR__.'/../../../../imagecache/src/config', 'imagecache');
+ $config = $app['config'];
+
+ // create dynamic manipulation route
+ if (is_string($config->get('imagecache::route'))) {
+
+ // add original to route templates
+ $config->set('imagecache::templates.original', null);
+
+ // setup image manipulator route
+ $app['router']->get($config->get('imagecache::route').'/{template}/{filename}', ['as' => 'imagecache', function ($template, $filename) use ($app, $config) {
+
+ // disable session cookies for image route
+ $app['config']->set('session.driver', 'array');
+
+ // find file
+ foreach ($config->get('imagecache::paths') as $path) {
+ // don't allow '..' in filenames
+ $image_path = $path.'/'.str_replace('..', '', $filename);
+ if (file_exists($image_path) && is_file($image_path)) {
+ break;
+ } else {
+ $image_path = false;
+ }
+ }
+
+ // abort if file not found
+ if ($image_path === false) {
+ $app->abort(404);
+ }
+
+ // define template callback
+ $callback = $config->get("imagecache::templates.{$template}");
+
+ if (is_callable($callback) || class_exists($callback)) {
+
+ // image manipulation based on callback
+ $content = $app['image']->cache(function ($image) use ($image_path, $callback) {
+
+ switch (true) {
+ case is_callable($callback):
+ return $callback($image->make($image_path));
+ break;
+
+ case class_exists($callback):
+ return $image->make($image_path)->filter(new $callback);
+ break;
+ }
+
+ }, $config->get('imagecache::lifetime'));
+
+ } else {
+
+ // get original image file contents
+ $content = file_get_contents($image_path);
+ }
+
+ // define mime type
+ $mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $content);
+
+ // return http response
+ return new IlluminateResponse($content, 200, [
+ 'Content-Type' => $mime,
+ 'Cache-Control' => 'max-age='.($config->get('imagecache::lifetime')*60).', public',
+ 'Etag' => md5($content)
+ ]);
+
+ }])->where(['template' => join('|', array_keys($config->get('imagecache::templates'))), 'filename' => '[ \w\\.\\/\\-]+']);
+ }
+ }
+ }
+
+ /**
+ * Register the service provider.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ $app = $this->app;
+
+ $app['image'] = $app->share(function ($app) {
+ return new ImageManager($app['config']->get('image::config'));
+ });
+
+ $app->alias('image', 'Intervention\Image\ImageManager');
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLaravel5.php b/vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLaravel5.php
new file mode 100644
index 0000000000..ea04fec5c6
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLaravel5.php
@@ -0,0 +1,89 @@
+publishes([
+ __DIR__.'/../../config/config.php' => config_path('image.php')
+ ]);
+
+ // setup intervention/imagecache if package is installed
+ $this->cacheIsInstalled() ? $this->bootstrapImageCache() : null;
+ }
+
+ /**
+ * Register the service provider.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ $app = $this->app;
+
+ // merge default config
+ $this->mergeConfigFrom(
+ __DIR__.'/../../config/config.php',
+ 'image'
+ );
+
+ // create image
+ $app->singleton('image', function ($app) {
+ return new ImageManager($app['config']->get('image'));
+ });
+
+ $app->alias('image', 'Intervention\Image\ImageManager');
+ }
+
+ /**
+ * Bootstrap imagecache
+ *
+ * @return void
+ */
+ private function bootstrapImageCache()
+ {
+ $app = $this->app;
+ $config = __DIR__.'/../../../../imagecache/src/config/config.php';
+
+ $this->publishes([
+ $config => config_path('imagecache.php')
+ ]);
+
+ // merge default config
+ $this->mergeConfigFrom(
+ $config,
+ 'imagecache'
+ );
+
+ // imagecache route
+ if (is_string(config('imagecache.route'))) {
+
+ $filename_pattern = '[ \w\\.\\/\\-\\@\(\)]+';
+
+ // route to access template applied image file
+ $app['router']->get(config('imagecache.route').'/{template}/{filename}', [
+ 'uses' => 'Intervention\Image\ImageCacheController@getResponse',
+ 'as' => 'imagecache'
+ ])->where(['filename' => $filename_pattern]);
+ }
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLeague.php b/vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLeague.php
new file mode 100644
index 0000000000..b756a61f5e
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLeague.php
@@ -0,0 +1,42 @@
+config = $config;
+ }
+
+ /**
+ * Register the server provider.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ $this->getContainer()->share('Intervention\Image\ImageManager', function () {
+ return new ImageManager($this->config);
+ });
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLumen.php b/vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLumen.php
new file mode 100644
index 0000000000..4a381ccd41
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLumen.php
@@ -0,0 +1,34 @@
+app;
+
+ // merge default config
+ $this->mergeConfigFrom(
+ __DIR__.'/../../config/config.php',
+ 'image'
+ );
+
+ // set configuration
+ $app->configure('image');
+
+ // create image
+ $app->singleton('image',function ($app) {
+ return new ImageManager($app['config']->get('image'));
+ });
+
+ $app->alias('image', 'Intervention\Image\ImageManager');
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Color.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Color.php
new file mode 100644
index 0000000000..91db8217cf
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Color.php
@@ -0,0 +1,277 @@
+> 24) & 0xFF;
+ $r = ($value >> 16) & 0xFF;
+ $g = ($value >> 8) & 0xFF;
+ $b = $value & 0xFF;
+ $a = $this->rgb2alpha($a);
+
+ $this->setPixel($r, $g, $b, $a);
+ }
+
+ /**
+ * Initiates color object from given array
+ *
+ * @param array $value
+ * @return \Intervention\Image\AbstractColor
+ */
+ public function initFromArray($array)
+ {
+ $array = array_values($array);
+
+ if (count($array) == 4) {
+
+ // color array with alpha value
+ list($r, $g, $b, $a) = $array;
+
+ } elseif (count($array) == 3) {
+
+ // color array without alpha value
+ list($r, $g, $b) = $array;
+ $a = 1;
+ }
+
+ $this->setPixel($r, $g, $b, $a);
+ }
+
+ /**
+ * Initiates color object from given string
+ *
+ * @param string $value
+ *
+ * @return \Intervention\Image\AbstractColor
+ */
+ public function initFromString($value)
+ {
+ if ($color = $this->rgbaFromString($value)) {
+ $this->setPixel($color[0], $color[1], $color[2], $color[3]);
+ }
+ }
+
+ /**
+ * Initiates color object from given ImagickPixel object
+ *
+ * @param ImagickPixel $value
+ *
+ * @return \Intervention\Image\AbstractColor
+ */
+ public function initFromObject($value)
+ {
+ if (is_a($value, '\ImagickPixel')) {
+ $this->pixel = $value;
+ }
+ }
+
+ /**
+ * Initiates color object from given R, G and B values
+ *
+ * @param int $r
+ * @param int $g
+ * @param int $b
+ *
+ * @return \Intervention\Image\AbstractColor
+ */
+ public function initFromRgb($r, $g, $b)
+ {
+ $this->setPixel($r, $g, $b);
+ }
+
+ /**
+ * Initiates color object from given R, G, B and A values
+ *
+ * @param int $r
+ * @param int $g
+ * @param int $b
+ * @param float $a
+ *
+ * @return \Intervention\Image\AbstractColor
+ */
+ public function initFromRgba($r, $g, $b, $a)
+ {
+ $this->setPixel($r, $g, $b, $a);
+ }
+
+ /**
+ * Calculates integer value of current color instance
+ *
+ * @return int
+ */
+ public function getInt()
+ {
+ $r = $this->getRedValue();
+ $g = $this->getGreenValue();
+ $b = $this->getBlueValue();
+ $a = intval(round($this->getAlphaValue() * 255));
+
+ return intval(($a << 24) + ($r << 16) + ($g << 8) + $b);
+ }
+
+ /**
+ * Calculates hexadecimal value of current color instance
+ *
+ * @param string $prefix
+ *
+ * @return string
+ */
+ public function getHex($prefix = '')
+ {
+ return sprintf('%s%02x%02x%02x', $prefix,
+ $this->getRedValue(),
+ $this->getGreenValue(),
+ $this->getBlueValue()
+ );
+ }
+
+ /**
+ * Calculates RGB(A) in array format of current color instance
+ *
+ * @return array
+ */
+ public function getArray()
+ {
+ return [
+ $this->getRedValue(),
+ $this->getGreenValue(),
+ $this->getBlueValue(),
+ $this->getAlphaValue()
+ ];
+ }
+
+ /**
+ * Calculates RGBA in string format of current color instance
+ *
+ * @return string
+ */
+ public function getRgba()
+ {
+ return sprintf('rgba(%d, %d, %d, %.2F)',
+ $this->getRedValue(),
+ $this->getGreenValue(),
+ $this->getBlueValue(),
+ $this->getAlphaValue()
+ );
+ }
+
+ /**
+ * Determines if current color is different from given color
+ *
+ * @param AbstractColor $color
+ * @param int $tolerance
+ * @return boolean
+ */
+ public function differs(\Intervention\Image\AbstractColor $color, $tolerance = 0)
+ {
+ $color_tolerance = round($tolerance * 2.55);
+ $alpha_tolerance = round($tolerance);
+
+ $delta = [
+ 'r' => abs($color->getRedValue() - $this->getRedValue()),
+ 'g' => abs($color->getGreenValue() - $this->getGreenValue()),
+ 'b' => abs($color->getBlueValue() - $this->getBlueValue()),
+ 'a' => abs($color->getAlphaValue() - $this->getAlphaValue())
+ ];
+
+ return (
+ $delta['r'] > $color_tolerance or
+ $delta['g'] > $color_tolerance or
+ $delta['b'] > $color_tolerance or
+ $delta['a'] > $alpha_tolerance
+ );
+ }
+
+ /**
+ * Returns RGB red value of current color
+ *
+ * @return int
+ */
+ public function getRedValue()
+ {
+ return intval(round($this->pixel->getColorValue(\Imagick::COLOR_RED) * 255));
+ }
+
+ /**
+ * Returns RGB green value of current color
+ *
+ * @return int
+ */
+ public function getGreenValue()
+ {
+ return intval(round($this->pixel->getColorValue(\Imagick::COLOR_GREEN) * 255));
+ }
+
+ /**
+ * Returns RGB blue value of current color
+ *
+ * @return int
+ */
+ public function getBlueValue()
+ {
+ return intval(round($this->pixel->getColorValue(\Imagick::COLOR_BLUE) * 255));
+ }
+
+ /**
+ * Returns RGB alpha value of current color
+ *
+ * @return float
+ */
+ public function getAlphaValue()
+ {
+ return round($this->pixel->getColorValue(\Imagick::COLOR_ALPHA), 2);
+ }
+
+ /**
+ * Initiates ImagickPixel from given RGBA values
+ *
+ * @return \ImagickPixel
+ */
+ private function setPixel($r, $g, $b, $a = null)
+ {
+ $a = is_null($a) ? 1 : $a;
+
+ return $this->pixel = new \ImagickPixel(
+ sprintf('rgba(%d, %d, %d, %.2F)', $r, $g, $b, $a)
+ );
+ }
+
+ /**
+ * Returns current color as ImagickPixel
+ *
+ * @return \ImagickPixel
+ */
+ public function getPixel()
+ {
+ return $this->pixel;
+ }
+
+ /**
+ * Calculates RGA integer alpha value into float value
+ *
+ * @param int $value
+ * @return float
+ */
+ private function rgb2alpha($value)
+ {
+ // (255 -> 1.0) / (0 -> 0.0)
+ return (float) round($value/255, 2);
+ }
+
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/BackupCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/BackupCommand.php
new file mode 100644
index 0000000000..60dedb2b7e
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/BackupCommand.php
@@ -0,0 +1,23 @@
+argument(0)->value();
+
+ // clone current image resource
+ $clone = clone $image;
+ $image->setBackup($clone->getCore(), $backupName);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/BlurCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/BlurCommand.php
new file mode 100644
index 0000000000..b037c15162
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/BlurCommand.php
@@ -0,0 +1,19 @@
+argument(0)->between(0, 100)->value(1);
+
+ return $image->getCore()->blurImage(1 * $amount, 0.5 * $amount);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/BrightnessCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/BrightnessCommand.php
new file mode 100644
index 0000000000..eefb1802cc
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/BrightnessCommand.php
@@ -0,0 +1,19 @@
+argument(0)->between(-100, 100)->required()->value();
+
+ return $image->getCore()->modulateImage(100 + $level, 100, 100);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ColorizeCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ColorizeCommand.php
new file mode 100644
index 0000000000..51142be275
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ColorizeCommand.php
@@ -0,0 +1,42 @@
+argument(0)->between(-100, 100)->required()->value();
+ $green = $this->argument(1)->between(-100, 100)->required()->value();
+ $blue = $this->argument(2)->between(-100, 100)->required()->value();
+
+ // normalize colorize levels
+ $red = $this->normalizeLevel($red);
+ $green = $this->normalizeLevel($green);
+ $blue = $this->normalizeLevel($blue);
+
+ $qrange = $image->getCore()->getQuantumRange();
+
+ // apply
+ $image->getCore()->levelImage(0, $red, $qrange['quantumRangeLong'], \Imagick::CHANNEL_RED);
+ $image->getCore()->levelImage(0, $green, $qrange['quantumRangeLong'], \Imagick::CHANNEL_GREEN);
+ $image->getCore()->levelImage(0, $blue, $qrange['quantumRangeLong'], \Imagick::CHANNEL_BLUE);
+
+ return true;
+ }
+
+ private function normalizeLevel($level)
+ {
+ if ($level > 0) {
+ return $level/5;
+ } else {
+ return ($level+100)/100;
+ }
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ContrastCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ContrastCommand.php
new file mode 100644
index 0000000000..113a2186c1
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ContrastCommand.php
@@ -0,0 +1,19 @@
+argument(0)->between(-100, 100)->required()->value();
+
+ return $image->getCore()->sigmoidalContrastImage($level > 0, $level / 4, 0);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/CropCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/CropCommand.php
new file mode 100644
index 0000000000..21c7184b71
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/CropCommand.php
@@ -0,0 +1,43 @@
+argument(0)->type('digit')->required()->value();
+ $height = $this->argument(1)->type('digit')->required()->value();
+ $x = $this->argument(2)->type('digit')->value();
+ $y = $this->argument(3)->type('digit')->value();
+
+ if (is_null($width) || is_null($height)) {
+ throw new \Intervention\Image\Exception\InvalidArgumentException(
+ "Width and height of cutout needs to be defined."
+ );
+ }
+
+ $cropped = new Size($width, $height);
+ $position = new Point($x, $y);
+
+ // align boxes
+ if (is_null($x) && is_null($y)) {
+ $position = $image->getSize()->align('center')->relativePosition($cropped->align('center'));
+ }
+
+ // crop image core
+ $image->getCore()->cropImage($cropped->width, $cropped->height, $position->x, $position->y);
+ $image->getCore()->setImagePage(0,0,0,0);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/DestroyCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/DestroyCommand.php
new file mode 100644
index 0000000000..d98062d8a3
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/DestroyCommand.php
@@ -0,0 +1,25 @@
+getCore()->clear();
+
+ // destroy backups
+ foreach ($image->getBackups() as $backup) {
+ $backup->clear();
+ }
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ExifCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ExifCommand.php
new file mode 100644
index 0000000000..924522caff
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ExifCommand.php
@@ -0,0 +1,62 @@
+preferExtension = false;
+ }
+
+ /**
+ * Read Exif data from the given image
+ *
+ * @param \Intervention\Image\Image $image
+ * @return boolean
+ */
+ public function execute($image)
+ {
+ if ($this->preferExtension && function_exists('exif_read_data')) {
+ return parent::execute($image);
+ }
+
+ $core = $image->getCore();
+
+ if ( ! method_exists($core, 'getImageProperties')) {
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ "Reading Exif data is not supported by this PHP installation."
+ );
+ }
+
+ $requestedKey = $this->argument(0)->value();
+ if ($requestedKey !== null) {
+ $this->setOutput($core->getImageProperty('exif:' . $requestedKey));
+ return true;
+ }
+
+ $exif = [];
+ $properties = $core->getImageProperties();
+ foreach ($properties as $key => $value) {
+ if (substr($key, 0, 5) !== 'exif:') {
+ continue;
+ }
+
+ $exif[substr($key, 5)] = $value;
+ }
+
+ $this->setOutput($exif);
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/FillCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/FillCommand.php
new file mode 100644
index 0000000000..bfac75fbff
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/FillCommand.php
@@ -0,0 +1,103 @@
+argument(0)->value();
+ $x = $this->argument(1)->type('digit')->value();
+ $y = $this->argument(2)->type('digit')->value();
+
+ $imagick = $image->getCore();
+
+ try {
+ // set image filling
+ $source = new Decoder;
+ $filling = $source->init($filling);
+
+ } catch (\Intervention\Image\Exception\NotReadableException $e) {
+
+ // set solid color filling
+ $filling = new Color($filling);
+ }
+
+ // flood fill if coordinates are set
+ if (is_int($x) && is_int($y)) {
+
+ // flood fill with texture
+ if ($filling instanceof Image) {
+
+ // create tile
+ $tile = clone $image->getCore();
+
+ // mask away color at position
+ $tile->transparentPaintImage($tile->getImagePixelColor($x, $y), 0, 0, false);
+
+ // create canvas
+ $canvas = clone $image->getCore();
+
+ // fill canvas with texture
+ $canvas = $canvas->textureImage($filling->getCore());
+
+ // merge canvas and tile
+ $canvas->compositeImage($tile, \Imagick::COMPOSITE_DEFAULT, 0, 0);
+
+ // replace image core
+ $image->setCore($canvas);
+
+ // flood fill with color
+ } elseif ($filling instanceof Color) {
+
+ // create canvas with filling
+ $canvas = new \Imagick;
+ $canvas->newImage($image->getWidth(), $image->getHeight(), $filling->getPixel(), 'png');
+
+ // create tile to put on top
+ $tile = clone $image->getCore();
+
+ // mask away color at pos.
+ $tile->transparentPaintImage($tile->getImagePixelColor($x, $y), 0, 0, false);
+
+ // save alpha channel of original image
+ $alpha = clone $image->getCore();
+
+ // merge original with canvas and tile
+ $image->getCore()->compositeImage($canvas, \Imagick::COMPOSITE_DEFAULT, 0, 0);
+ $image->getCore()->compositeImage($tile, \Imagick::COMPOSITE_DEFAULT, 0, 0);
+
+ // restore alpha channel of original image
+ $image->getCore()->compositeImage($alpha, \Imagick::COMPOSITE_COPYOPACITY, 0, 0);
+ }
+
+ } else {
+
+ if ($filling instanceof Image) {
+
+ // fill whole image with texture
+ $image->setCore($image->getCore()->textureImage($filling->getCore()));
+
+ } elseif ($filling instanceof Color) {
+
+ // fill whole image with color
+ $draw = new \ImagickDraw();
+ $draw->setFillColor($filling->getPixel());
+ $draw->rectangle(0, 0, $image->getWidth(), $image->getHeight());
+ $image->getCore()->drawImage($draw);
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/FitCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/FitCommand.php
new file mode 100644
index 0000000000..f2c60d2193
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/FitCommand.php
@@ -0,0 +1,41 @@
+argument(0)->type('digit')->required()->value();
+ $height = $this->argument(1)->type('digit')->value($width);
+ $constraints = $this->argument(2)->type('closure')->value();
+ $position = $this->argument(3)->type('string')->value('center');
+
+ // calculate size
+ $cropped = $image->getSize()->fit(new Size($width, $height), $position);
+ $resized = clone $cropped;
+ $resized = $resized->resize($width, $height, $constraints);
+
+ // crop image
+ $image->getCore()->cropImage(
+ $cropped->width,
+ $cropped->height,
+ $cropped->pivot->x,
+ $cropped->pivot->y
+ );
+
+ // resize image
+ $image->getCore()->scaleImage($resized->getWidth(), $resized->getHeight());
+ $image->getCore()->setImagePage(0,0,0,0);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/FlipCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/FlipCommand.php
new file mode 100644
index 0000000000..cdb03c52de
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/FlipCommand.php
@@ -0,0 +1,25 @@
+argument(0)->value('h');
+
+ if (in_array(strtolower($mode), [2, 'v', 'vert', 'vertical'])) {
+ // flip vertical
+ return $image->getCore()->flipImage();
+ } else {
+ // flip horizontal
+ return $image->getCore()->flopImage();
+ }
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/GammaCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/GammaCommand.php
new file mode 100644
index 0000000000..e70cbdd367
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/GammaCommand.php
@@ -0,0 +1,19 @@
+argument(0)->type('numeric')->required()->value();
+
+ return $image->getCore()->gammaImage($gamma);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/GetSizeCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/GetSizeCommand.php
new file mode 100644
index 0000000000..65b1078d1b
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/GetSizeCommand.php
@@ -0,0 +1,27 @@
+getCore();
+
+ $this->setOutput(new Size(
+ $core->getImageWidth(),
+ $core->getImageHeight()
+ ));
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/GreyscaleCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/GreyscaleCommand.php
new file mode 100644
index 0000000000..bb3f47260f
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/GreyscaleCommand.php
@@ -0,0 +1,17 @@
+getCore()->modulateImage(100, 0, 100);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/HeightenCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/HeightenCommand.php
new file mode 100644
index 0000000000..0b61e50c16
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/HeightenCommand.php
@@ -0,0 +1,28 @@
+argument(0)->type('digit')->required()->value();
+ $additionalConstraints = $this->argument(1)->type('closure')->value();
+
+ $this->arguments[0] = null;
+ $this->arguments[1] = $height;
+ $this->arguments[2] = function ($constraint) use ($additionalConstraints) {
+ $constraint->aspectRatio();
+ if(is_callable($additionalConstraints))
+ $additionalConstraints($constraint);
+ };
+
+ return parent::execute($image);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/InsertCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/InsertCommand.php
new file mode 100644
index 0000000000..542feb2ae7
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/InsertCommand.php
@@ -0,0 +1,31 @@
+argument(0)->required()->value();
+ $position = $this->argument(1)->type('string')->value();
+ $x = $this->argument(2)->type('digit')->value(0);
+ $y = $this->argument(3)->type('digit')->value(0);
+
+ // build watermark
+ $watermark = $image->getDriver()->init($source);
+
+ // define insertion point
+ $image_size = $image->getSize()->align($position, $x, $y);
+ $watermark_size = $watermark->getSize()->align($position);
+ $target = $image_size->relativePosition($watermark_size);
+
+ // insert image at position
+ return $image->getCore()->compositeImage($watermark->getCore(), \Imagick::COMPOSITE_DEFAULT, $target->x, $target->y);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/InterlaceCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/InterlaceCommand.php
new file mode 100644
index 0000000000..82cddd4c63
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/InterlaceCommand.php
@@ -0,0 +1,27 @@
+argument(0)->type('bool')->value(true);
+
+ if ($mode) {
+ $mode = \Imagick::INTERLACE_LINE;
+ } else {
+ $mode = \Imagick::INTERLACE_NO;
+ }
+
+ $image->getCore()->setInterlaceScheme($mode);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/InvertCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/InvertCommand.php
new file mode 100644
index 0000000000..125fbddee0
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/InvertCommand.php
@@ -0,0 +1,17 @@
+getCore()->negateImage(false);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/LimitColorsCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/LimitColorsCommand.php
new file mode 100644
index 0000000000..7308180f66
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/LimitColorsCommand.php
@@ -0,0 +1,57 @@
+argument(0)->value();
+ $matte = $this->argument(1)->value();
+
+ // get current image size
+ $size = $image->getSize();
+
+ // build 2 color alpha mask from original alpha
+ $alpha = clone $image->getCore();
+ $alpha->separateImageChannel(\Imagick::CHANNEL_ALPHA);
+ $alpha->transparentPaintImage('#ffffff', 0, 0, false);
+ $alpha->separateImageChannel(\Imagick::CHANNEL_ALPHA);
+ $alpha->negateImage(false);
+
+ if ($matte) {
+
+ // get matte color
+ $mattecolor = $image->getDriver()->parseColor($matte)->getPixel();
+
+ // create matte image
+ $canvas = new \Imagick;
+ $canvas->newImage($size->width, $size->height, $mattecolor, 'png');
+
+ // lower colors of original and copy to matte
+ $image->getCore()->quantizeImage($count, \Imagick::COLORSPACE_RGB, 0, false, false);
+ $canvas->compositeImage($image->getCore(), \Imagick::COMPOSITE_DEFAULT, 0, 0);
+
+ // copy new alpha to canvas
+ $canvas->compositeImage($alpha, \Imagick::COMPOSITE_COPYOPACITY, 0, 0);
+
+ // replace core
+ $image->setCore($canvas);
+
+ } else {
+
+ $image->getCore()->quantizeImage($count, \Imagick::COLORSPACE_RGB, 0, false, false);
+ $image->getCore()->compositeImage($alpha, \Imagick::COMPOSITE_COPYOPACITY, 0, 0);
+
+ }
+
+ return true;
+
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/MaskCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/MaskCommand.php
new file mode 100644
index 0000000000..2dfc697b08
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/MaskCommand.php
@@ -0,0 +1,58 @@
+argument(0)->value();
+ $mask_w_alpha = $this->argument(1)->type('bool')->value(false);
+
+ // get imagick
+ $imagick = $image->getCore();
+
+ // build mask image from source
+ $mask = $image->getDriver()->init($mask_source);
+
+ // resize mask to size of current image (if necessary)
+ $image_size = $image->getSize();
+ if ($mask->getSize() != $image_size) {
+ $mask->resize($image_size->width, $image_size->height);
+ }
+
+ $imagick->setImageMatte(true);
+
+ if ($mask_w_alpha) {
+
+ // just mask with alpha map
+ $imagick->compositeImage($mask->getCore(), \Imagick::COMPOSITE_DSTIN, 0, 0);
+
+ } else {
+
+ // get alpha channel of original as greyscale image
+ $original_alpha = clone $imagick;
+ $original_alpha->separateImageChannel(\Imagick::CHANNEL_ALPHA);
+
+ // use red channel from mask ask alpha
+ $mask_alpha = clone $mask->getCore();
+ $mask_alpha->compositeImage($mask->getCore(), \Imagick::COMPOSITE_DEFAULT, 0, 0);
+ // $mask_alpha->setImageAlphaChannel(\Imagick::ALPHACHANNEL_DEACTIVATE);
+ $mask_alpha->separateImageChannel(\Imagick::CHANNEL_ALL);
+
+ // combine both alphas from original and mask
+ $original_alpha->compositeImage($mask_alpha, \Imagick::COMPOSITE_COPYOPACITY, 0, 0);
+
+ // mask the image with the alpha combination
+ $imagick->compositeImage($original_alpha, \Imagick::COMPOSITE_DSTIN, 0, 0);
+ }
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/OpacityCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/OpacityCommand.php
new file mode 100644
index 0000000000..57ed006b87
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/OpacityCommand.php
@@ -0,0 +1,21 @@
+argument(0)->between(0, 100)->required()->value();
+
+ $transparency = $transparency > 0 ? (100 / $transparency) : 1000;
+
+ return $image->getCore()->evaluateImage(\Imagick::EVALUATE_DIVIDE, $transparency, \Imagick::CHANNEL_ALPHA);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/PickColorCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/PickColorCommand.php
new file mode 100644
index 0000000000..8daa0f95a2
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/PickColorCommand.php
@@ -0,0 +1,29 @@
+argument(0)->type('digit')->required()->value();
+ $y = $this->argument(1)->type('digit')->required()->value();
+ $format = $this->argument(2)->type('string')->value('array');
+
+ // pick color
+ $color = new Color($image->getCore()->getImagePixelColor($x, $y));
+
+ // format to output
+ $this->setOutput($color->format($format));
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/PixelCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/PixelCommand.php
new file mode 100644
index 0000000000..b9e6d395d3
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/PixelCommand.php
@@ -0,0 +1,30 @@
+argument(0)->required()->value();
+ $color = new Color($color);
+ $x = $this->argument(1)->type('digit')->required()->value();
+ $y = $this->argument(2)->type('digit')->required()->value();
+
+ // prepare pixel
+ $draw = new \ImagickDraw;
+ $draw->setFillColor($color->getPixel());
+ $draw->point($x, $y);
+
+ // apply pixel
+ return $image->getCore()->drawImage($draw);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/PixelateCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/PixelateCommand.php
new file mode 100644
index 0000000000..75f2218f58
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/PixelateCommand.php
@@ -0,0 +1,25 @@
+argument(0)->type('digit')->value(10);
+
+ $width = $image->getWidth();
+ $height = $image->getHeight();
+
+ $image->getCore()->scaleImage(max(1, ($width / $size)), max(1, ($height / $size)));
+ $image->getCore()->scaleImage($width, $height);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ResetCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ResetCommand.php
new file mode 100644
index 0000000000..ee5a2cdf33
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ResetCommand.php
@@ -0,0 +1,37 @@
+argument(0)->value();
+
+ $backup = $image->getBackup($backupName);
+
+ if ($backup instanceof \Imagick) {
+
+ // destroy current core
+ $image->getCore()->clear();
+
+ // clone backup
+ $backup = clone $backup;
+
+ // reset to new resource
+ $image->setCore($backup);
+
+ return true;
+ }
+
+ throw new \Intervention\Image\Exception\RuntimeException(
+ "Backup not available. Call backup({$backupName}) before reset()."
+ );
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ResizeCanvasCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ResizeCanvasCommand.php
new file mode 100644
index 0000000000..f394c15dcc
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ResizeCanvasCommand.php
@@ -0,0 +1,89 @@
+argument(0)->type('digit')->required()->value();
+ $height = $this->argument(1)->type('digit')->required()->value();
+ $anchor = $this->argument(2)->value('center');
+ $relative = $this->argument(3)->type('boolean')->value(false);
+ $bgcolor = $this->argument(4)->value();
+
+ $original_width = $image->getWidth();
+ $original_height = $image->getHeight();
+
+ // check of only width or height is set
+ $width = is_null($width) ? $original_width : intval($width);
+ $height = is_null($height) ? $original_height : intval($height);
+
+ // check on relative width/height
+ if ($relative) {
+ $width = $original_width + $width;
+ $height = $original_height + $height;
+ }
+
+ // check for negative width/height
+ $width = ($width <= 0) ? $width + $original_width : $width;
+ $height = ($height <= 0) ? $height + $original_height : $height;
+
+ // create new canvas
+ $canvas = $image->getDriver()->newImage($width, $height, $bgcolor);
+
+ // set copy position
+ $canvas_size = $canvas->getSize()->align($anchor);
+ $image_size = $image->getSize()->align($anchor);
+ $canvas_pos = $image_size->relativePosition($canvas_size);
+ $image_pos = $canvas_size->relativePosition($image_size);
+
+ if ($width <= $original_width) {
+ $dst_x = 0;
+ $src_x = $canvas_pos->x;
+ $src_w = $canvas_size->width;
+ } else {
+ $dst_x = $image_pos->x;
+ $src_x = 0;
+ $src_w = $original_width;
+ }
+
+ if ($height <= $original_height) {
+ $dst_y = 0;
+ $src_y = $canvas_pos->y;
+ $src_h = $canvas_size->height;
+ } else {
+ $dst_y = $image_pos->y;
+ $src_y = 0;
+ $src_h = $original_height;
+ }
+
+ // make image area transparent to keep transparency
+ // even if background-color is set
+ $rect = new \ImagickDraw;
+ $fill = $canvas->pickColor(0, 0, 'hex');
+ $fill = $fill == '#ff0000' ? '#00ff00' : '#ff0000';
+ $rect->setFillColor($fill);
+ $rect->rectangle($dst_x, $dst_y, $dst_x + $src_w - 1, $dst_y + $src_h - 1);
+ $canvas->getCore()->drawImage($rect);
+ $canvas->getCore()->transparentPaintImage($fill, 0, 0, false);
+
+ $canvas->getCore()->setImageColorspace($image->getCore()->getImageColorspace());
+
+ // copy image into new canvas
+ $image->getCore()->cropImage($src_w, $src_h, $src_x, $src_y);
+ $canvas->getCore()->compositeImage($image->getCore(), \Imagick::COMPOSITE_DEFAULT, $dst_x, $dst_y);
+ $canvas->getCore()->setImagePage(0,0,0,0);
+
+ // set new core to canvas
+ $image->setCore($canvas->getCore());
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ResizeCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ResizeCommand.php
new file mode 100644
index 0000000000..9ccc202c2a
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ResizeCommand.php
@@ -0,0 +1,27 @@
+argument(0)->value();
+ $height = $this->argument(1)->value();
+ $constraints = $this->argument(2)->type('closure')->value();
+
+ // resize box
+ $resized = $image->getSize()->resize($width, $height, $constraints);
+
+ // modify image
+ $image->getCore()->scaleImage($resized->getWidth(), $resized->getHeight());
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/RotateCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/RotateCommand.php
new file mode 100644
index 0000000000..c4503a6ca5
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/RotateCommand.php
@@ -0,0 +1,29 @@
+argument(0)->type('numeric')->required()->value();
+ $color = $this->argument(1)->value();
+ $color = new Color($color);
+
+ // restrict rotations beyond 360 degrees, since the end result is the same
+ $angle %= 360;
+
+ // rotate image
+ $image->getCore()->rotateImage($color->getPixel(), ($angle * -1));
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/SharpenCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/SharpenCommand.php
new file mode 100644
index 0000000000..4f2fc8c29d
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/SharpenCommand.php
@@ -0,0 +1,19 @@
+argument(0)->between(0, 100)->value(10);
+
+ return $image->getCore()->unsharpMaskImage(1, 1, $amount / 6.25, 0);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/TrimCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/TrimCommand.php
new file mode 100644
index 0000000000..f09590320e
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/TrimCommand.php
@@ -0,0 +1,120 @@
+argument(0)->type('string')->value();
+ $away = $this->argument(1)->value();
+ $tolerance = $this->argument(2)->type('numeric')->value(0);
+ $feather = $this->argument(3)->type('numeric')->value(0);
+
+ $width = $image->getWidth();
+ $height = $image->getHeight();
+
+ $checkTransparency = false;
+
+ // define borders to trim away
+ if (is_null($away)) {
+ $away = ['top', 'right', 'bottom', 'left'];
+ } elseif (is_string($away)) {
+ $away = [$away];
+ }
+
+ // lower border names
+ foreach ($away as $key => $value) {
+ $away[$key] = strtolower($value);
+ }
+
+ // define base color position
+ switch (strtolower($base)) {
+ case 'transparent':
+ case 'trans':
+ $checkTransparency = true;
+ $base_x = 0;
+ $base_y = 0;
+ break;
+
+ case 'bottom-right':
+ case 'right-bottom':
+ $base_x = $width - 1;
+ $base_y = $height - 1;
+ break;
+
+ default:
+ case 'top-left':
+ case 'left-top':
+ $base_x = 0;
+ $base_y = 0;
+ break;
+ }
+
+ // pick base color
+ if ($checkTransparency) {
+ $base_color = new Color; // color will only be used to compare alpha channel
+ } else {
+ $base_color = $image->pickColor($base_x, $base_y, 'object');
+ }
+
+ // trim on clone to get only coordinates
+ $trimed = clone $image->getCore();
+
+ // add border to trim specific color
+ $trimed->borderImage($base_color->getPixel(), 1, 1);
+
+ // trim image
+ $trimed->trimImage(65850 / 100 * $tolerance);
+
+ // get coordinates of trim
+ $imagePage = $trimed->getImagePage();
+ list($crop_x, $crop_y) = [$imagePage['x']-1, $imagePage['y']-1];
+ // $trimed->setImagePage(0, 0, 0, 0);
+ list($crop_width, $crop_height) = [$trimed->width, $trimed->height];
+
+ // adjust settings if right should not be trimed
+ if ( ! in_array('right', $away)) {
+ $crop_width = $crop_width + ($width - ($width - $crop_x));
+ }
+
+ // adjust settings if bottom should not be trimed
+ if ( ! in_array('bottom', $away)) {
+ $crop_height = $crop_height + ($height - ($height - $crop_y));
+ }
+
+ // adjust settings if left should not be trimed
+ if ( ! in_array('left', $away)) {
+ $crop_width = $crop_width + $crop_x;
+ $crop_x = 0;
+ }
+
+ // adjust settings if top should not be trimed
+ if ( ! in_array('top', $away)) {
+ $crop_height = $crop_height + $crop_y;
+ $crop_y = 0;
+ }
+
+ // add feather
+ $crop_width = min($width, ($crop_width + $feather * 2));
+ $crop_height = min($height, ($crop_height + $feather * 2));
+ $crop_x = max(0, ($crop_x - $feather));
+ $crop_y = max(0, ($crop_y - $feather));
+
+ // finally crop based on page
+ $image->getCore()->cropImage($crop_width, $crop_height, $crop_x, $crop_y);
+ $image->getCore()->setImagePage(0,0,0,0);
+
+ $trimed->destroy();
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/WidenCommand.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/WidenCommand.php
new file mode 100644
index 0000000000..a1967534ca
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Commands/WidenCommand.php
@@ -0,0 +1,28 @@
+argument(0)->type('digit')->required()->value();
+ $additionalConstraints = $this->argument(1)->type('closure')->value();
+
+ $this->arguments[0] = $width;
+ $this->arguments[1] = null;
+ $this->arguments[2] = function ($constraint) use ($additionalConstraints) {
+ $constraint->aspectRatio();
+ if(is_callable($additionalConstraints))
+ $additionalConstraints($constraint);
+ };
+
+ return parent::execute($image);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Decoder.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Decoder.php
new file mode 100644
index 0000000000..8cf2420ae5
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Decoder.php
@@ -0,0 +1,121 @@
+setBackgroundColor(new \ImagickPixel('transparent'));
+ $core->readImage($path);
+ $core->setImageType(defined('\Imagick::IMGTYPE_TRUECOLORALPHA') ? \Imagick::IMGTYPE_TRUECOLORALPHA : \Imagick::IMGTYPE_TRUECOLORMATTE);
+
+ } catch (\ImagickException $e) {
+ throw new \Intervention\Image\Exception\NotReadableException(
+ "Unable to read image from path ({$path}).",
+ 0,
+ $e
+ );
+ }
+
+ // build image
+ $image = $this->initFromImagick($core);
+ $image->setFileInfoFromPath($path);
+
+ return $image;
+ }
+
+ /**
+ * Initiates new image from GD resource
+ *
+ * @param Resource $resource
+ * @return \Intervention\Image\Image
+ */
+ public function initFromGdResource($resource)
+ {
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ 'Imagick driver is unable to init from GD resource.'
+ );
+ }
+
+ /**
+ * Initiates new image from Imagick object
+ *
+ * @param Imagick $object
+ * @return \Intervention\Image\Image
+ */
+ public function initFromImagick(\Imagick $object)
+ {
+ // currently animations are not supported
+ // so all images are turned into static
+ $object = $this->removeAnimation($object);
+
+ // reset image orientation
+ $object->setImageOrientation(\Imagick::ORIENTATION_UNDEFINED);
+
+ return new Image(new Driver, $object);
+ }
+
+ /**
+ * Initiates new image from binary data
+ *
+ * @param string $data
+ * @return \Intervention\Image\Image
+ */
+ public function initFromBinary($binary)
+ {
+ $core = new \Imagick;
+
+ try {
+ $core->setBackgroundColor(new \ImagickPixel('transparent'));
+
+ $core->readImageBlob($binary);
+
+ } catch (\ImagickException $e) {
+ throw new \Intervention\Image\Exception\NotReadableException(
+ "Unable to read image from binary data.",
+ 0,
+ $e
+ );
+ }
+
+ // build image
+ $image = $this->initFromImagick($core);
+ $image->mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $binary);
+
+ return $image;
+ }
+
+ /**
+ * Turns object into one frame Imagick object
+ * by removing all frames except first
+ *
+ * @param Imagick $object
+ * @return Imagick
+ */
+ private function removeAnimation(\Imagick $object)
+ {
+ $imagick = new \Imagick;
+
+ foreach ($object as $frame) {
+ $imagick->addImage($frame->getImage());
+ break;
+ }
+
+ $object->destroy();
+
+ return $imagick;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Driver.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Driver.php
new file mode 100644
index 0000000000..1f2fcc6c13
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Driver.php
@@ -0,0 +1,70 @@
+coreAvailable()) {
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ "ImageMagick module not available with this PHP installation."
+ );
+ }
+
+ $this->decoder = $decoder ? $decoder : new Decoder;
+ $this->encoder = $encoder ? $encoder : new Encoder;
+ }
+
+ /**
+ * Creates new image instance
+ *
+ * @param int $width
+ * @param int $height
+ * @param mixed $background
+ * @return \Intervention\Image\Image
+ */
+ public function newImage($width, $height, $background = null)
+ {
+ $background = new Color($background);
+
+ // create empty core
+ $core = new \Imagick;
+ $core->newImage($width, $height, $background->getPixel(), 'png');
+ $core->setType(\Imagick::IMGTYPE_UNDEFINED);
+ $core->setImageType(\Imagick::IMGTYPE_UNDEFINED);
+ $core->setColorspace(\Imagick::COLORSPACE_UNDEFINED);
+
+ // build image
+ $image = new \Intervention\Image\Image(new static, $core);
+
+ return $image;
+ }
+
+ /**
+ * Reads given string into color object
+ *
+ * @param string $value
+ * @return AbstractColor
+ */
+ public function parseColor($value)
+ {
+ return new Color($value);
+ }
+
+ /**
+ * Checks if core module installation is available
+ *
+ * @return boolean
+ */
+ protected function coreAvailable()
+ {
+ return (extension_loaded('imagick') && class_exists('Imagick'));
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Encoder.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Encoder.php
new file mode 100644
index 0000000000..44452f2479
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Encoder.php
@@ -0,0 +1,168 @@
+image->getCore();
+ $imagick->setImageBackgroundColor('white');
+ $imagick->setBackgroundColor('white');
+ $imagick = $imagick->mergeImageLayers(\Imagick::LAYERMETHOD_MERGE);
+ $imagick->setFormat($format);
+ $imagick->setImageFormat($format);
+ $imagick->setCompression($compression);
+ $imagick->setImageCompression($compression);
+ $imagick->setCompressionQuality($this->quality);
+ $imagick->setImageCompressionQuality($this->quality);
+
+ return $imagick->getImagesBlob();
+ }
+
+ /**
+ * Processes and returns encoded image as PNG string
+ *
+ * @return string
+ */
+ protected function processPng()
+ {
+ $format = 'png';
+ $compression = \Imagick::COMPRESSION_ZIP;
+
+ $imagick = $this->image->getCore();
+ $imagick->setFormat($format);
+ $imagick->setImageFormat($format);
+ $imagick->setCompression($compression);
+ $imagick->setImageCompression($compression);
+
+ return $imagick->getImagesBlob();
+ }
+
+ /**
+ * Processes and returns encoded image as GIF string
+ *
+ * @return string
+ */
+ protected function processGif()
+ {
+ $format = 'gif';
+ $compression = \Imagick::COMPRESSION_LZW;
+
+ $imagick = $this->image->getCore();
+ $imagick->setFormat($format);
+ $imagick->setImageFormat($format);
+ $imagick->setCompression($compression);
+ $imagick->setImageCompression($compression);
+
+ return $imagick->getImagesBlob();
+ }
+
+ protected function processWebp()
+ {
+ if ( ! \Imagick::queryFormats('WEBP')) {
+ throw new \Intervention\Image\Exception\NotSupportedException(
+ "Webp format is not supported by Imagick installation."
+ );
+ }
+
+ $format = 'webp';
+ $compression = \Imagick::COMPRESSION_JPEG;
+
+ $imagick = $this->image->getCore();
+ $imagick = $imagick->mergeImageLayers(\Imagick::LAYERMETHOD_MERGE);
+ $imagick->setFormat($format);
+ $imagick->setImageFormat($format);
+ $imagick->setCompression($compression);
+ $imagick->setImageCompression($compression);
+ $imagick->setImageCompressionQuality($this->quality);
+
+ return $imagick->getImagesBlob();
+ }
+
+ /**
+ * Processes and returns encoded image as TIFF string
+ *
+ * @return string
+ */
+ protected function processTiff()
+ {
+ $format = 'tiff';
+ $compression = \Imagick::COMPRESSION_UNDEFINED;
+
+ $imagick = $this->image->getCore();
+ $imagick->setFormat($format);
+ $imagick->setImageFormat($format);
+ $imagick->setCompression($compression);
+ $imagick->setImageCompression($compression);
+ $imagick->setCompressionQuality($this->quality);
+ $imagick->setImageCompressionQuality($this->quality);
+
+ return $imagick->getImagesBlob();
+ }
+
+ /**
+ * Processes and returns encoded image as BMP string
+ *
+ * @return string
+ */
+ protected function processBmp()
+ {
+ $format = 'bmp';
+ $compression = \Imagick::COMPRESSION_UNDEFINED;
+
+ $imagick = $this->image->getCore();
+ $imagick->setFormat($format);
+ $imagick->setImageFormat($format);
+ $imagick->setCompression($compression);
+ $imagick->setImageCompression($compression);
+
+ return $imagick->getImagesBlob();
+ }
+
+ /**
+ * Processes and returns encoded image as ICO string
+ *
+ * @return string
+ */
+ protected function processIco()
+ {
+ $format = 'ico';
+ $compression = \Imagick::COMPRESSION_UNDEFINED;
+
+ $imagick = $this->image->getCore();
+ $imagick->setFormat($format);
+ $imagick->setImageFormat($format);
+ $imagick->setCompression($compression);
+ $imagick->setImageCompression($compression);
+
+ return $imagick->getImagesBlob();
+ }
+
+ /**
+ * Processes and returns encoded image as PSD string
+ *
+ * @return string
+ */
+ protected function processPsd()
+ {
+ $format = 'psd';
+ $compression = \Imagick::COMPRESSION_UNDEFINED;
+
+ $imagick = $this->image->getCore();
+ $imagick->setFormat($format);
+ $imagick->setImageFormat($format);
+ $imagick->setCompression($compression);
+ $imagick->setImageCompression($compression);
+
+ return $imagick->getImagesBlob();
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Font.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Font.php
new file mode 100644
index 0000000000..7b926679f2
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Font.php
@@ -0,0 +1,118 @@
+setStrokeAntialias(true);
+ $draw->setTextAntialias(true);
+
+ // set font file
+ if ($this->hasApplicableFontFile()) {
+ $draw->setFont($this->file);
+ } else {
+ throw new \Intervention\Image\Exception\RuntimeException(
+ "Font file must be provided to apply text to image."
+ );
+ }
+
+ // parse text color
+ $color = new Color($this->color);
+
+ $draw->setFontSize($this->size);
+ $draw->setFillColor($color->getPixel());
+
+ // align horizontal
+ switch (strtolower($this->align)) {
+ case 'center':
+ $align = \Imagick::ALIGN_CENTER;
+ break;
+
+ case 'right':
+ $align = \Imagick::ALIGN_RIGHT;
+ break;
+
+ default:
+ $align = \Imagick::ALIGN_LEFT;
+ break;
+ }
+
+ $draw->setTextAlignment($align);
+
+ // align vertical
+ if (strtolower($this->valign) != 'bottom') {
+
+ // calculate box size
+ $dimensions = $image->getCore()->queryFontMetrics($draw, $this->text);
+
+ // corrections on y-position
+ switch (strtolower($this->valign)) {
+ case 'center':
+ case 'middle':
+ $posy = $posy + $dimensions['textHeight'] * 0.65 / 2;
+ break;
+
+ case 'top':
+ $posy = $posy + $dimensions['textHeight'] * 0.65;
+ break;
+ }
+ }
+
+ // apply to image
+ $image->getCore()->annotateImage($draw, $posx, $posy, $this->angle * (-1), $this->text);
+ }
+
+ /**
+ * Calculates bounding box of current font setting
+ *
+ * @return array
+ */
+ public function getBoxSize()
+ {
+ $box = [];
+
+ // build draw object
+ $draw = new \ImagickDraw();
+ $draw->setStrokeAntialias(true);
+ $draw->setTextAntialias(true);
+
+ // set font file
+ if ($this->hasApplicableFontFile()) {
+ $draw->setFont($this->file);
+ } else {
+ throw new \Intervention\Image\Exception\RuntimeException(
+ "Font file must be provided to apply text to image."
+ );
+ }
+
+ $draw->setFontSize($this->size);
+
+ $dimensions = (new \Imagick())->queryFontMetrics($draw, $this->text);
+
+ if (strlen($this->text) == 0) {
+ // no text -> no boxsize
+ $box['width'] = 0;
+ $box['height'] = 0;
+ } else {
+ // get boxsize
+ $box['width'] = intval(abs($dimensions['textWidth']));
+ $box['height'] = intval(abs($dimensions['textHeight']));
+ }
+
+ return $box;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/CircleShape.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/CircleShape.php
new file mode 100644
index 0000000000..24172ea116
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/CircleShape.php
@@ -0,0 +1,40 @@
+width = is_numeric($diameter) ? intval($diameter) : $this->diameter;
+ $this->height = is_numeric($diameter) ? intval($diameter) : $this->diameter;
+ $this->diameter = is_numeric($diameter) ? intval($diameter) : $this->diameter;
+ }
+
+ /**
+ * Draw current circle on given image
+ *
+ * @param Image $image
+ * @param int $x
+ * @param int $y
+ * @return boolean
+ */
+ public function applyToImage(Image $image, $x = 0, $y = 0)
+ {
+ return parent::applyToImage($image, $x, $y);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/EllipseShape.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/EllipseShape.php
new file mode 100644
index 0000000000..1b89942fd7
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/EllipseShape.php
@@ -0,0 +1,65 @@
+width = is_numeric($width) ? intval($width) : $this->width;
+ $this->height = is_numeric($height) ? intval($height) : $this->height;
+ }
+
+ /**
+ * Draw ellipse instance on given image
+ *
+ * @param Image $image
+ * @param int $x
+ * @param int $y
+ * @return boolean
+ */
+ public function applyToImage(Image $image, $x = 0, $y = 0)
+ {
+ $circle = new \ImagickDraw;
+
+ // set background
+ $bgcolor = new Color($this->background);
+ $circle->setFillColor($bgcolor->getPixel());
+
+ // set border
+ if ($this->hasBorder()) {
+ $border_color = new Color($this->border_color);
+ $circle->setStrokeWidth($this->border_width);
+ $circle->setStrokeColor($border_color->getPixel());
+ }
+
+ $circle->ellipse($x, $y, $this->width / 2, $this->height / 2, 0, 360);
+
+ $image->getCore()->drawImage($circle);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/LineShape.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/LineShape.php
new file mode 100644
index 0000000000..638b97b67d
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/LineShape.php
@@ -0,0 +1,93 @@
+x = is_numeric($x) ? intval($x) : $this->x;
+ $this->y = is_numeric($y) ? intval($y) : $this->y;
+ }
+
+ /**
+ * Set current line color
+ *
+ * @param string $color
+ * @return void
+ */
+ public function color($color)
+ {
+ $this->color = $color;
+ }
+
+ /**
+ * Set current line width in pixels
+ *
+ * @param int $width
+ * @return void
+ */
+ public function width($width)
+ {
+ $this->width = $width;
+ }
+
+ /**
+ * Draw current instance of line to given endpoint on given image
+ *
+ * @param Image $image
+ * @param int $x
+ * @param int $y
+ * @return boolean
+ */
+ public function applyToImage(Image $image, $x = 0, $y = 0)
+ {
+ $line = new \ImagickDraw;
+
+ $color = new Color($this->color);
+ $line->setStrokeColor($color->getPixel());
+ $line->setStrokeWidth($this->width);
+
+ $line->line($this->x, $this->y, $x, $y);
+ $image->getCore()->drawImage($line);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/PolygonShape.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/PolygonShape.php
new file mode 100644
index 0000000000..4c087b3741
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/PolygonShape.php
@@ -0,0 +1,80 @@
+points = $this->formatPoints($points);
+ }
+
+ /**
+ * Draw polygon on given image
+ *
+ * @param Image $image
+ * @param int $x
+ * @param int $y
+ * @return boolean
+ */
+ public function applyToImage(Image $image, $x = 0, $y = 0)
+ {
+ $polygon = new \ImagickDraw;
+
+ // set background
+ $bgcolor = new Color($this->background);
+ $polygon->setFillColor($bgcolor->getPixel());
+
+ // set border
+ if ($this->hasBorder()) {
+ $border_color = new Color($this->border_color);
+ $polygon->setStrokeWidth($this->border_width);
+ $polygon->setStrokeColor($border_color->getPixel());
+ }
+
+ $polygon->polygon($this->points);
+
+ $image->getCore()->drawImage($polygon);
+
+ return true;
+ }
+
+ /**
+ * Format polygon points to Imagick format
+ *
+ * @param Array $points
+ * @return Array
+ */
+ private function formatPoints($points)
+ {
+ $ipoints = [];
+ $count = 1;
+
+ foreach ($points as $key => $value) {
+ if ($count%2 === 0) {
+ $y = $value;
+ $ipoints[] = ['x' => $x, 'y' => $y];
+ } else {
+ $x = $value;
+ }
+ $count++;
+ }
+
+ return $ipoints;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/RectangleShape.php b/vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/RectangleShape.php
new file mode 100644
index 0000000000..2d1a09f5c2
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/RectangleShape.php
@@ -0,0 +1,83 @@
+x1 = is_numeric($x1) ? intval($x1) : $this->x1;
+ $this->y1 = is_numeric($y1) ? intval($y1) : $this->y1;
+ $this->x2 = is_numeric($x2) ? intval($x2) : $this->x2;
+ $this->y2 = is_numeric($y2) ? intval($y2) : $this->y2;
+ }
+
+ /**
+ * Draw rectangle to given image at certain position
+ *
+ * @param Image $image
+ * @param int $x
+ * @param int $y
+ * @return boolean
+ */
+ public function applyToImage(Image $image, $x = 0, $y = 0)
+ {
+ $rectangle = new \ImagickDraw;
+
+ // set background
+ $bgcolor = new Color($this->background);
+ $rectangle->setFillColor($bgcolor->getPixel());
+
+ // set border
+ if ($this->hasBorder()) {
+ $border_color = new Color($this->border_color);
+ $rectangle->setStrokeWidth($this->border_width);
+ $rectangle->setStrokeColor($border_color->getPixel());
+ }
+
+ $rectangle->rectangle($this->x1, $this->y1, $this->x2, $this->y2);
+
+ $image->getCore()->drawImage($rectangle);
+
+ return true;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Point.php b/vendor/intervention/image/src/Intervention/Image/Point.php
new file mode 100644
index 0000000000..d51452e026
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Point.php
@@ -0,0 +1,64 @@
+x = is_numeric($x) ? intval($x) : 0;
+ $this->y = is_numeric($y) ? intval($y) : 0;
+ }
+
+ /**
+ * Sets X coordinate
+ *
+ * @param int $x
+ */
+ public function setX($x)
+ {
+ $this->x = intval($x);
+ }
+
+ /**
+ * Sets Y coordinate
+ *
+ * @param int $y
+ */
+ public function setY($y)
+ {
+ $this->y = intval($y);
+ }
+
+ /**
+ * Sets both X and Y coordinate
+ *
+ * @param int $x
+ * @param int $y
+ */
+ public function setPosition($x, $y)
+ {
+ $this->setX($x);
+ $this->setY($y);
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Response.php b/vendor/intervention/image/src/Intervention/Image/Response.php
new file mode 100644
index 0000000000..8e5c7cacd2
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Response.php
@@ -0,0 +1,69 @@
+image = $image;
+ $this->format = $format ? $format : $image->mime;
+ $this->quality = $quality ? $quality : 90;
+ }
+
+ /**
+ * Builds response according to settings
+ *
+ * @return mixed
+ */
+ public function make()
+ {
+ $this->image->encode($this->format, $this->quality);
+ $data = $this->image->getEncoded();
+ $mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $data);
+ $length = strlen($data);
+
+ if (function_exists('app') && is_a($app = app(), 'Illuminate\Foundation\Application')) {
+
+ $response = \Illuminate\Support\Facades\Response::make($data);
+ $response->header('Content-Type', $mime);
+ $response->header('Content-Length', $length);
+
+ } else {
+
+ header('Content-Type: ' . $mime);
+ header('Content-Length: ' . $length);
+ $response = $data;
+ }
+
+ return $response;
+ }
+}
diff --git a/vendor/intervention/image/src/Intervention/Image/Size.php b/vendor/intervention/image/src/Intervention/Image/Size.php
new file mode 100644
index 0000000000..667784ca0b
--- /dev/null
+++ b/vendor/intervention/image/src/Intervention/Image/Size.php
@@ -0,0 +1,373 @@
+width = is_numeric($width) ? intval($width) : 1;
+ $this->height = is_numeric($height) ? intval($height) : 1;
+ $this->pivot = $pivot ? $pivot : new Point;
+ }
+
+ /**
+ * Set the width and height absolutely
+ *
+ * @param int $width
+ * @param int $height
+ */
+ public function set($width, $height)
+ {
+ $this->width = $width;
+ $this->height = $height;
+ }
+
+ /**
+ * Set current pivot point
+ *
+ * @param Point $point
+ */
+ public function setPivot(Point $point)
+ {
+ $this->pivot = $point;
+ }
+
+ /**
+ * Get the current width
+ *
+ * @return int
+ */
+ public function getWidth()
+ {
+ return $this->width;
+ }
+
+ /**
+ * Get the current height
+ *
+ * @return int
+ */
+ public function getHeight()
+ {
+ return $this->height;
+ }
+
+ /**
+ * Calculate the current aspect ratio
+ *
+ * @return float
+ */
+ public function getRatio()
+ {
+ return $this->width / $this->height;
+ }
+
+ /**
+ * Resize to desired width and/or height
+ *
+ * @param int $width
+ * @param int $height
+ * @param Closure $callback
+ * @return Size
+ */
+ public function resize($width, $height, Closure $callback = null)
+ {
+ if (is_null($width) && is_null($height)) {
+ throw new \Intervention\Image\Exception\InvalidArgumentException(
+ "Width or height needs to be defined."
+ );
+ }
+
+ // new size with dominant width
+ $dominant_w_size = clone $this;
+ $dominant_w_size->resizeHeight($height, $callback);
+ $dominant_w_size->resizeWidth($width, $callback);
+
+ // new size with dominant height
+ $dominant_h_size = clone $this;
+ $dominant_h_size->resizeWidth($width, $callback);
+ $dominant_h_size->resizeHeight($height, $callback);
+
+ // decide which size to use
+ if ($dominant_h_size->fitsInto(new self($width, $height))) {
+ $this->set($dominant_h_size->width, $dominant_h_size->height);
+ } else {
+ $this->set($dominant_w_size->width, $dominant_w_size->height);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Scale size according to given constraints
+ *
+ * @param int $width
+ * @param Closure $callback
+ * @return Size
+ */
+ private function resizeWidth($width, Closure $callback = null)
+ {
+ $constraint = $this->getConstraint($callback);
+
+ if ($constraint->isFixed(Constraint::UPSIZE)) {
+ $max_width = $constraint->getSize()->getWidth();
+ $max_height = $constraint->getSize()->getHeight();
+ }
+
+ if (is_numeric($width)) {
+
+ if ($constraint->isFixed(Constraint::UPSIZE)) {
+ $this->width = ($width > $max_width) ? $max_width : $width;
+ } else {
+ $this->width = $width;
+ }
+
+ if ($constraint->isFixed(Constraint::ASPECTRATIO)) {
+ $h = intval(round($this->width / $constraint->getSize()->getRatio()));
+
+ if ($constraint->isFixed(Constraint::UPSIZE)) {
+ $this->height = ($h > $max_height) ? $max_height : $h;
+ } else {
+ $this->height = $h;
+ }
+ }
+ }
+ }
+
+ /**
+ * Scale size according to given constraints
+ *
+ * @param int $height
+ * @param Closure $callback
+ * @return Size
+ */
+ private function resizeHeight($height, Closure $callback = null)
+ {
+ $constraint = $this->getConstraint($callback);
+
+ if ($constraint->isFixed(Constraint::UPSIZE)) {
+ $max_width = $constraint->getSize()->getWidth();
+ $max_height = $constraint->getSize()->getHeight();
+ }
+
+ if (is_numeric($height)) {
+
+ if ($constraint->isFixed(Constraint::UPSIZE)) {
+ $this->height = ($height > $max_height) ? $max_height : $height;
+ } else {
+ $this->height = $height;
+ }
+
+ if ($constraint->isFixed(Constraint::ASPECTRATIO)) {
+ $w = intval(round($this->height * $constraint->getSize()->getRatio()));
+
+ if ($constraint->isFixed(Constraint::UPSIZE)) {
+ $this->width = ($w > $max_width) ? $max_width : $w;
+ } else {
+ $this->width = $w;
+ }
+ }
+ }
+ }
+
+ /**
+ * Calculate the relative position to another Size
+ * based on the pivot point settings of both sizes.
+ *
+ * @param Size $size
+ * @return \Intervention\Image\Point
+ */
+ public function relativePosition(Size $size)
+ {
+ $x = $this->pivot->x - $size->pivot->x;
+ $y = $this->pivot->y - $size->pivot->y;
+
+ return new Point($x, $y);
+ }
+
+ /**
+ * Resize given Size to best fitting size of current size.
+ *
+ * @param Size $size
+ * @return \Intervention\Image\Size
+ */
+ public function fit(Size $size, $position = 'center')
+ {
+ // create size with auto height
+ $auto_height = clone $size;
+
+ $auto_height->resize($this->width, null, function ($constraint) {
+ $constraint->aspectRatio();
+ });
+
+ // decide which version to use
+ if ($auto_height->fitsInto($this)) {
+
+ $size = $auto_height;
+
+ } else {
+
+ // create size with auto width
+ $auto_width = clone $size;
+
+ $auto_width->resize(null, $this->height, function ($constraint) {
+ $constraint->aspectRatio();
+ });
+
+ $size = $auto_width;
+ }
+
+ $this->align($position);
+ $size->align($position);
+ $size->setPivot($this->relativePosition($size));
+
+ return $size;
+ }
+
+ /**
+ * Checks if given size fits into current size
+ *
+ * @param Size $size
+ * @return boolean
+ */
+ public function fitsInto(Size $size)
+ {
+ return ($this->width <= $size->width) && ($this->height <= $size->height);
+ }
+
+ /**
+ * Aligns current size's pivot point to given position
+ * and moves point automatically by offset.
+ *
+ * @param string $position
+ * @param int $offset_x
+ * @param int $offset_y
+ * @return \Intervention\Image\Size
+ */
+ public function align($position, $offset_x = 0, $offset_y = 0)
+ {
+ switch (strtolower($position)) {
+
+ case 'top':
+ case 'top-center':
+ case 'top-middle':
+ case 'center-top':
+ case 'middle-top':
+ $x = intval($this->width / 2);
+ $y = 0 + $offset_y;
+ break;
+
+ case 'top-right':
+ case 'right-top':
+ $x = $this->width - $offset_x;
+ $y = 0 + $offset_y;
+ break;
+
+ case 'left':
+ case 'left-center':
+ case 'left-middle':
+ case 'center-left':
+ case 'middle-left':
+ $x = 0 + $offset_x;
+ $y = intval($this->height / 2);
+ break;
+
+ case 'right':
+ case 'right-center':
+ case 'right-middle':
+ case 'center-right':
+ case 'middle-right':
+ $x = $this->width - $offset_x;
+ $y = intval($this->height / 2);
+ break;
+
+ case 'bottom-left':
+ case 'left-bottom':
+ $x = 0 + $offset_x;
+ $y = $this->height - $offset_y;
+ break;
+
+ case 'bottom':
+ case 'bottom-center':
+ case 'bottom-middle':
+ case 'center-bottom':
+ case 'middle-bottom':
+ $x = intval($this->width / 2);
+ $y = $this->height - $offset_y;
+ break;
+
+ case 'bottom-right':
+ case 'right-bottom':
+ $x = $this->width - $offset_x;
+ $y = $this->height - $offset_y;
+ break;
+
+ case 'center':
+ case 'middle':
+ case 'center-center':
+ case 'middle-middle':
+ $x = intval($this->width / 2);
+ $y = intval($this->height / 2);
+ break;
+
+ default:
+ case 'top-left':
+ case 'left-top':
+ $x = 0 + $offset_x;
+ $y = 0 + $offset_y;
+ break;
+ }
+
+ $this->pivot->setPosition($x, $y);
+
+ return $this;
+ }
+
+ /**
+ * Runs constraints on current size
+ *
+ * @param Closure $callback
+ * @return \Intervention\Image\Constraint
+ */
+ private function getConstraint(Closure $callback = null)
+ {
+ $constraint = new Constraint(clone $this);
+
+ if (is_callable($callback)) {
+ $callback($constraint);
+ }
+
+ return $constraint;
+ }
+}
diff --git a/vendor/intervention/image/src/config/config.php b/vendor/intervention/image/src/config/config.php
new file mode 100644
index 0000000000..2b1d2c3e11
--- /dev/null
+++ b/vendor/intervention/image/src/config/config.php
@@ -0,0 +1,20 @@
+ 'gd'
+
+];
diff --git a/vendor/league/flysystem/LICENSE b/vendor/league/flysystem/LICENSE
new file mode 100644
index 0000000000..0d16ccc974
--- /dev/null
+++ b/vendor/league/flysystem/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2013-2018 Frank de Jonge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/league/flysystem/composer.json b/vendor/league/flysystem/composer.json
new file mode 100644
index 0000000000..6fc135c901
--- /dev/null
+++ b/vendor/league/flysystem/composer.json
@@ -0,0 +1,64 @@
+{
+ "name": "league/flysystem",
+ "description": "Filesystem abstraction: Many filesystems, one API.",
+ "keywords": [
+ "filesystem", "filesystems", "files", "storage", "dropbox", "aws",
+ "abstraction", "s3", "ftp", "sftp", "remote", "webdav",
+ "file systems", "cloud", "cloud files", "rackspace", "copy.com"
+ ],
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Frank de Jonge",
+ "email": "info@frenky.net"
+ }
+ ],
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "require-dev": {
+ "ext-fileinfo": "*",
+ "phpspec/phpspec": "^3.4",
+ "phpunit/phpunit": "^5.7"
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Flysystem\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "League\\Flysystem\\Stub\\": "stub/"
+ },
+ "files": [
+ "tests/PHPUnitHacks.php"
+ ]
+ },
+ "suggest": {
+ "ext-fileinfo": "Required for MimeType",
+ "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
+ "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
+ "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
+ "league/flysystem-webdav": "Allows you to use WebDAV storage",
+ "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
+ "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
+ "spatie/flysystem-dropbox": "Allows you to use Dropbox storage",
+ "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications",
+ "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
+ "ext-ftp": "Allows you to use FTP server storage",
+ "ext-openssl": "Allows you to use FTPS server storage",
+ "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
+ "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter"
+ },
+ "conflict": {
+ "league/flysystem-sftp": "<1.0.6"
+ },
+ "config": {
+ "bin-dir": "bin"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ }
+}
diff --git a/vendor/league/flysystem/src/Adapter/AbstractAdapter.php b/vendor/league/flysystem/src/Adapter/AbstractAdapter.php
new file mode 100644
index 0000000000..01e8cda5a3
--- /dev/null
+++ b/vendor/league/flysystem/src/Adapter/AbstractAdapter.php
@@ -0,0 +1,71 @@
+pathPrefix = null;
+ return;
+ }
+
+ $this->pathPrefix = rtrim($prefix, '\\/') . $this->pathSeparator;
+ }
+
+ /**
+ * Get the path prefix.
+ *
+ * @return string|null path prefix or null if pathPrefix is empty
+ */
+ public function getPathPrefix()
+ {
+ return $this->pathPrefix;
+ }
+
+ /**
+ * Prefix a path.
+ *
+ * @param string $path
+ *
+ * @return string prefixed path
+ */
+ public function applyPathPrefix($path)
+ {
+ return $this->getPathPrefix() . ltrim($path, '\\/');
+ }
+
+ /**
+ * Remove a path prefix.
+ *
+ * @param string $path
+ *
+ * @return string path without the prefix
+ */
+ public function removePathPrefix($path)
+ {
+ return substr($path, strlen($this->getPathPrefix()));
+ }
+}
diff --git a/vendor/league/flysystem/src/Adapter/AbstractFtpAdapter.php b/vendor/league/flysystem/src/Adapter/AbstractFtpAdapter.php
new file mode 100644
index 0000000000..d42630736d
--- /dev/null
+++ b/vendor/league/flysystem/src/Adapter/AbstractFtpAdapter.php
@@ -0,0 +1,628 @@
+safeStorage = new SafeStorage();
+ $this->setConfig($config);
+ }
+
+ /**
+ * Set the config.
+ *
+ * @param array $config
+ *
+ * @return $this
+ */
+ public function setConfig(array $config)
+ {
+ foreach ($this->configurable as $setting) {
+ if ( ! isset($config[$setting])) {
+ continue;
+ }
+
+ $method = 'set' . ucfirst($setting);
+
+ if (method_exists($this, $method)) {
+ $this->$method($config[$setting]);
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * Returns the host.
+ *
+ * @return string
+ */
+ public function getHost()
+ {
+ return $this->host;
+ }
+
+ /**
+ * Set the host.
+ *
+ * @param string $host
+ *
+ * @return $this
+ */
+ public function setHost($host)
+ {
+ $this->host = $host;
+
+ return $this;
+ }
+
+ /**
+ * Set the public permission value.
+ *
+ * @param int $permPublic
+ *
+ * @return $this
+ */
+ public function setPermPublic($permPublic)
+ {
+ $this->permPublic = $permPublic;
+
+ return $this;
+ }
+
+ /**
+ * Set the private permission value.
+ *
+ * @param int $permPrivate
+ *
+ * @return $this
+ */
+ public function setPermPrivate($permPrivate)
+ {
+ $this->permPrivate = $permPrivate;
+
+ return $this;
+ }
+
+ /**
+ * Returns the ftp port.
+ *
+ * @return int
+ */
+ public function getPort()
+ {
+ return $this->port;
+ }
+
+ /**
+ * Returns the root folder to work from.
+ *
+ * @return string
+ */
+ public function getRoot()
+ {
+ return $this->root;
+ }
+
+ /**
+ * Set the ftp port.
+ *
+ * @param int|string $port
+ *
+ * @return $this
+ */
+ public function setPort($port)
+ {
+ $this->port = (int) $port;
+
+ return $this;
+ }
+
+ /**
+ * Set the root folder to work from.
+ *
+ * @param string $root
+ *
+ * @return $this
+ */
+ public function setRoot($root)
+ {
+ $this->root = rtrim($root, '\\/') . $this->separator;
+
+ return $this;
+ }
+
+ /**
+ * Returns the ftp username.
+ *
+ * @return string username
+ */
+ public function getUsername()
+ {
+ $username = $this->safeStorage->retrieveSafely('username');
+
+ return $username !== null ? $username : 'anonymous';
+ }
+
+ /**
+ * Set ftp username.
+ *
+ * @param string $username
+ *
+ * @return $this
+ */
+ public function setUsername($username)
+ {
+ $this->safeStorage->storeSafely('username', $username);
+
+ return $this;
+ }
+
+ /**
+ * Returns the password.
+ *
+ * @return string password
+ */
+ public function getPassword()
+ {
+ return $this->safeStorage->retrieveSafely('password');
+ }
+
+ /**
+ * Set the ftp password.
+ *
+ * @param string $password
+ *
+ * @return $this
+ */
+ public function setPassword($password)
+ {
+ $this->safeStorage->storeSafely('password', $password);
+
+ return $this;
+ }
+
+ /**
+ * Returns the amount of seconds before the connection will timeout.
+ *
+ * @return int
+ */
+ public function getTimeout()
+ {
+ return $this->timeout;
+ }
+
+ /**
+ * Set the amount of seconds before the connection should timeout.
+ *
+ * @param int $timeout
+ *
+ * @return $this
+ */
+ public function setTimeout($timeout)
+ {
+ $this->timeout = (int) $timeout;
+
+ return $this;
+ }
+
+ /**
+ * Return the FTP system type.
+ *
+ * @return string
+ */
+ public function getSystemType()
+ {
+ return $this->systemType;
+ }
+
+ /**
+ * Set the FTP system type (windows or unix).
+ *
+ * @param string $systemType
+ *
+ * @return $this
+ */
+ public function setSystemType($systemType)
+ {
+ $this->systemType = strtolower($systemType);
+
+ return $this;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function listContents($directory = '', $recursive = false)
+ {
+ return $this->listDirectoryContents($directory, $recursive);
+ }
+
+ abstract protected function listDirectoryContents($directory, $recursive = false);
+
+ /**
+ * Normalize a directory listing.
+ *
+ * @param array $listing
+ * @param string $prefix
+ *
+ * @return array directory listing
+ */
+ protected function normalizeListing(array $listing, $prefix = '')
+ {
+ $base = $prefix;
+ $result = [];
+ $listing = $this->removeDotDirectories($listing);
+
+ while ($item = array_shift($listing)) {
+ if (preg_match('#^.*:$#', $item)) {
+ $base = preg_replace('~^\./*|:$~', '', $item);
+ continue;
+ }
+
+ $result[] = $this->normalizeObject($item, $base);
+ }
+
+ return $this->sortListing($result);
+ }
+
+ /**
+ * Sort a directory listing.
+ *
+ * @param array $result
+ *
+ * @return array sorted listing
+ */
+ protected function sortListing(array $result)
+ {
+ $compare = function ($one, $two) {
+ return strnatcmp($one['path'], $two['path']);
+ };
+
+ usort($result, $compare);
+
+ return $result;
+ }
+
+ /**
+ * Normalize a file entry.
+ *
+ * @param string $item
+ * @param string $base
+ *
+ * @return array normalized file array
+ *
+ * @throws NotSupportedException
+ */
+ protected function normalizeObject($item, $base)
+ {
+ $systemType = $this->systemType ?: $this->detectSystemType($item);
+
+ if ($systemType === 'unix') {
+ return $this->normalizeUnixObject($item, $base);
+ } elseif ($systemType === 'windows') {
+ return $this->normalizeWindowsObject($item, $base);
+ }
+
+ throw NotSupportedException::forFtpSystemType($systemType);
+ }
+
+ /**
+ * Normalize a Unix file entry.
+ *
+ * @param string $item
+ * @param string $base
+ *
+ * @return array normalized file array
+ */
+ protected function normalizeUnixObject($item, $base)
+ {
+ $item = preg_replace('#\s+#', ' ', trim($item), 7);
+
+ if (count(explode(' ', $item, 9)) !== 9) {
+ throw new RuntimeException("Metadata can't be parsed from item '$item' , not enough parts.");
+ }
+
+ list($permissions, /* $number */, /* $owner */, /* $group */, $size, /* $month */, /* $day */, /* $time*/, $name) = explode(' ', $item, 9);
+ $type = $this->detectType($permissions);
+ $path = $base === '' ? $name : $base . $this->separator . $name;
+
+ if ($type === 'dir') {
+ return compact('type', 'path');
+ }
+
+ $permissions = $this->normalizePermissions($permissions);
+ $visibility = $permissions & 0044 ? AdapterInterface::VISIBILITY_PUBLIC : AdapterInterface::VISIBILITY_PRIVATE;
+ $size = (int) $size;
+
+ return compact('type', 'path', 'visibility', 'size');
+ }
+
+ /**
+ * Normalize a Windows/DOS file entry.
+ *
+ * @param string $item
+ * @param string $base
+ *
+ * @return array normalized file array
+ */
+ protected function normalizeWindowsObject($item, $base)
+ {
+ $item = preg_replace('#\s+#', ' ', trim($item), 3);
+
+ if (count(explode(' ', $item, 4)) !== 4) {
+ throw new RuntimeException("Metadata can't be parsed from item '$item' , not enough parts.");
+ }
+
+ list($date, $time, $size, $name) = explode(' ', $item, 4);
+ $path = $base === '' ? $name : $base . $this->separator . $name;
+
+ // Check for the correct date/time format
+ $format = strlen($date) === 8 ? 'm-d-yH:iA' : 'Y-m-dH:i';
+ $dt = DateTime::createFromFormat($format, $date . $time);
+ $timestamp = $dt ? $dt->getTimestamp() : (int) strtotime("$date $time");
+
+ if ($size === '') {
+ $type = 'dir';
+
+ return compact('type', 'path', 'timestamp');
+ }
+
+ $type = 'file';
+ $visibility = AdapterInterface::VISIBILITY_PUBLIC;
+ $size = (int) $size;
+
+ return compact('type', 'path', 'visibility', 'size', 'timestamp');
+ }
+
+ /**
+ * Get the system type from a listing item.
+ *
+ * @param string $item
+ *
+ * @return string the system type
+ */
+ protected function detectSystemType($item)
+ {
+ return preg_match('/^[0-9]{2,4}-[0-9]{2}-[0-9]{2}/', $item) ? 'windows' : 'unix';
+ }
+
+ /**
+ * Get the file type from the permissions.
+ *
+ * @param string $permissions
+ *
+ * @return string file type
+ */
+ protected function detectType($permissions)
+ {
+ return substr($permissions, 0, 1) === 'd' ? 'dir' : 'file';
+ }
+
+ /**
+ * Normalize a permissions string.
+ *
+ * @param string $permissions
+ *
+ * @return int
+ */
+ protected function normalizePermissions($permissions)
+ {
+ // remove the type identifier
+ $permissions = substr($permissions, 1);
+
+ // map the string rights to the numeric counterparts
+ $map = ['-' => '0', 'r' => '4', 'w' => '2', 'x' => '1'];
+ $permissions = strtr($permissions, $map);
+
+ // split up the permission groups
+ $parts = str_split($permissions, 3);
+
+ // convert the groups
+ $mapper = function ($part) {
+ return array_sum(str_split($part));
+ };
+
+ // converts to decimal number
+ return octdec(implode('', array_map($mapper, $parts)));
+ }
+
+ /**
+ * Filter out dot-directories.
+ *
+ * @param array $list
+ *
+ * @return array
+ */
+ public function removeDotDirectories(array $list)
+ {
+ $filter = function ($line) {
+ return $line !== '' && ! preg_match('#.* \.(\.)?$|^total#', $line);
+ };
+
+ return array_filter($list, $filter);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function has($path)
+ {
+ return $this->getMetadata($path);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getSize($path)
+ {
+ return $this->getMetadata($path);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getVisibility($path)
+ {
+ return $this->getMetadata($path);
+ }
+
+ /**
+ * Ensure a directory exists.
+ *
+ * @param string $dirname
+ */
+ public function ensureDirectory($dirname)
+ {
+ $dirname = (string) $dirname;
+
+ if ($dirname !== '' && ! $this->has($dirname)) {
+ $this->createDir($dirname, new Config());
+ }
+ }
+
+ /**
+ * @return mixed
+ */
+ public function getConnection()
+ {
+ $tries = 0;
+
+ while ( ! $this->isConnected() && $tries < 3) {
+ $tries++;
+ $this->disconnect();
+ $this->connect();
+ }
+
+ return $this->connection;
+ }
+
+ /**
+ * Get the public permission value.
+ *
+ * @return int
+ */
+ public function getPermPublic()
+ {
+ return $this->permPublic;
+ }
+
+ /**
+ * Get the private permission value.
+ *
+ * @return int
+ */
+ public function getPermPrivate()
+ {
+ return $this->permPrivate;
+ }
+
+ /**
+ * Disconnect on destruction.
+ */
+ public function __destruct()
+ {
+ $this->disconnect();
+ }
+
+ /**
+ * Establish a connection.
+ */
+ abstract public function connect();
+
+ /**
+ * Close the connection.
+ */
+ abstract public function disconnect();
+
+ /**
+ * Check if a connection is active.
+ *
+ * @return bool
+ */
+ abstract public function isConnected();
+}
diff --git a/vendor/league/flysystem/src/Adapter/CanOverwriteFiles.php b/vendor/league/flysystem/src/Adapter/CanOverwriteFiles.php
new file mode 100644
index 0000000000..c42719e608
--- /dev/null
+++ b/vendor/league/flysystem/src/Adapter/CanOverwriteFiles.php
@@ -0,0 +1,10 @@
+transferMode = $mode;
+
+ return $this;
+ }
+
+ /**
+ * Set if Ssl is enabled.
+ *
+ * @param bool $ssl
+ *
+ * @return $this
+ */
+ public function setSsl($ssl)
+ {
+ $this->ssl = (bool) $ssl;
+
+ return $this;
+ }
+
+ /**
+ * Set if passive mode should be used.
+ *
+ * @param bool $passive
+ */
+ public function setPassive($passive = true)
+ {
+ $this->passive = $passive;
+ }
+
+ /**
+ * @param bool $ignorePassiveAddress
+ */
+ public function setIgnorePassiveAddress($ignorePassiveAddress)
+ {
+ $this->ignorePassiveAddress = $ignorePassiveAddress;
+ }
+
+ /**
+ * @param bool $recurseManually
+ */
+ public function setRecurseManually($recurseManually)
+ {
+ $this->recurseManually = $recurseManually;
+ }
+
+ /**
+ * @param bool $utf8
+ */
+ public function setUtf8($utf8)
+ {
+ $this->utf8 = (bool) $utf8;
+ }
+
+ /**
+ * Connect to the FTP server.
+ */
+ public function connect()
+ {
+ if ($this->ssl) {
+ $this->connection = ftp_ssl_connect($this->getHost(), $this->getPort(), $this->getTimeout());
+ } else {
+ $this->connection = ftp_connect($this->getHost(), $this->getPort(), $this->getTimeout());
+ }
+
+ if ( ! $this->connection) {
+ throw new RuntimeException('Could not connect to host: ' . $this->getHost() . ', port:' . $this->getPort());
+ }
+
+ $this->login();
+ $this->setUtf8Mode();
+ $this->setConnectionPassiveMode();
+ $this->setConnectionRoot();
+ $this->isPureFtpd = $this->isPureFtpdServer();
+ }
+
+ /**
+ * Set the connection to UTF-8 mode.
+ */
+ protected function setUtf8Mode()
+ {
+ if ($this->utf8) {
+ $response = ftp_raw($this->connection, "OPTS UTF8 ON");
+ if (substr($response[0], 0, 3) !== '200') {
+ throw new RuntimeException(
+ 'Could not set UTF-8 mode for connection: ' . $this->getHost() . '::' . $this->getPort()
+ );
+ }
+ }
+ }
+
+ /**
+ * Set the connections to passive mode.
+ *
+ * @throws RuntimeException
+ */
+ protected function setConnectionPassiveMode()
+ {
+ if (is_bool($this->ignorePassiveAddress) && defined('FTP_USEPASVADDRESS')) {
+ ftp_set_option($this->connection, FTP_USEPASVADDRESS, ! $this->ignorePassiveAddress);
+ }
+
+ if ( ! ftp_pasv($this->connection, $this->passive)) {
+ throw new RuntimeException(
+ 'Could not set passive mode for connection: ' . $this->getHost() . '::' . $this->getPort()
+ );
+ }
+ }
+
+ /**
+ * Set the connection root.
+ */
+ protected function setConnectionRoot()
+ {
+ $root = $this->getRoot();
+ $connection = $this->connection;
+
+ if ($root && ! ftp_chdir($connection, $root)) {
+ throw new RuntimeException('Root is invalid or does not exist: ' . $this->getRoot());
+ }
+
+ // Store absolute path for further reference.
+ // This is needed when creating directories and
+ // initial root was a relative path, else the root
+ // would be relative to the chdir'd path.
+ $this->root = ftp_pwd($connection);
+ }
+
+ /**
+ * Login.
+ *
+ * @throws RuntimeException
+ */
+ protected function login()
+ {
+ set_error_handler(function () {});
+ $isLoggedIn = ftp_login(
+ $this->connection,
+ $this->getUsername(),
+ $this->getPassword()
+ );
+ restore_error_handler();
+
+ if ( ! $isLoggedIn) {
+ $this->disconnect();
+ throw new RuntimeException(
+ 'Could not login with connection: ' . $this->getHost() . '::' . $this->getPort(
+ ) . ', username: ' . $this->getUsername()
+ );
+ }
+ }
+
+ /**
+ * Disconnect from the FTP server.
+ */
+ public function disconnect()
+ {
+ if (is_resource($this->connection)) {
+ ftp_close($this->connection);
+ }
+
+ $this->connection = null;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function write($path, $contents, Config $config)
+ {
+ $stream = fopen('php://temp', 'w+b');
+ fwrite($stream, $contents);
+ rewind($stream);
+ $result = $this->writeStream($path, $stream, $config);
+ fclose($stream);
+
+ if ($result === false) {
+ return false;
+ }
+
+ $result['contents'] = $contents;
+ $result['mimetype'] = Util::guessMimeType($path, $contents);
+
+ return $result;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function writeStream($path, $resource, Config $config)
+ {
+ $this->ensureDirectory(Util::dirname($path));
+
+ if ( ! ftp_fput($this->getConnection(), $path, $resource, $this->transferMode)) {
+ return false;
+ }
+
+ if ($visibility = $config->get('visibility')) {
+ $this->setVisibility($path, $visibility);
+ }
+
+ $type = 'file';
+
+ return compact('type', 'path', 'visibility');
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function update($path, $contents, Config $config)
+ {
+ return $this->write($path, $contents, $config);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function updateStream($path, $resource, Config $config)
+ {
+ return $this->writeStream($path, $resource, $config);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function rename($path, $newpath)
+ {
+ return ftp_rename($this->getConnection(), $path, $newpath);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function delete($path)
+ {
+ return ftp_delete($this->getConnection(), $path);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function deleteDir($dirname)
+ {
+ $connection = $this->getConnection();
+ $contents = array_reverse($this->listDirectoryContents($dirname, false));
+
+ foreach ($contents as $object) {
+ if ($object['type'] === 'file') {
+ if ( ! ftp_delete($connection, $object['path'])) {
+ return false;
+ }
+ } elseif ( ! $this->deleteDir($object['path'])) {
+ return false;
+ }
+ }
+
+ return ftp_rmdir($connection, $dirname);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function createDir($dirname, Config $config)
+ {
+ $connection = $this->getConnection();
+ $directories = explode('/', $dirname);
+
+ foreach ($directories as $directory) {
+ if (false === $this->createActualDirectory($directory, $connection)) {
+ $this->setConnectionRoot();
+
+ return false;
+ }
+
+ ftp_chdir($connection, $directory);
+ }
+
+ $this->setConnectionRoot();
+
+ return ['type' => 'dir', 'path' => $dirname];
+ }
+
+ /**
+ * Create a directory.
+ *
+ * @param string $directory
+ * @param resource $connection
+ *
+ * @return bool
+ */
+ protected function createActualDirectory($directory, $connection)
+ {
+ // List the current directory
+ $listing = ftp_nlist($connection, '.') ?: [];
+
+ foreach ($listing as $key => $item) {
+ if (preg_match('~^\./.*~', $item)) {
+ $listing[$key] = substr($item, 2);
+ }
+ }
+
+ if (in_array($directory, $listing, true)) {
+ return true;
+ }
+
+ return (boolean) ftp_mkdir($connection, $directory);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getMetadata($path)
+ {
+ $connection = $this->getConnection();
+
+ if ($path === '') {
+ return ['type' => 'dir', 'path' => ''];
+ }
+
+ if (@ftp_chdir($connection, $path) === true) {
+ $this->setConnectionRoot();
+
+ return ['type' => 'dir', 'path' => $path];
+ }
+
+ $listing = $this->ftpRawlist('-A', str_replace('*', '\\*', $path));
+
+ if (empty($listing) || in_array('total 0', $listing, true)) {
+ return false;
+ }
+
+ if (preg_match('/.* not found/', $listing[0])) {
+ return false;
+ }
+
+ if (preg_match('/^total [0-9]*$/', $listing[0])) {
+ array_shift($listing);
+ }
+
+ return $this->normalizeObject($listing[0], '');
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getMimetype($path)
+ {
+ if ( ! $metadata = $this->getMetadata($path)) {
+ return false;
+ }
+
+ $metadata['mimetype'] = MimeType::detectByFilename($path);
+
+ return $metadata;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getTimestamp($path)
+ {
+ $timestamp = ftp_mdtm($this->getConnection(), $path);
+
+ return ($timestamp !== -1) ? ['path' => $path, 'timestamp' => $timestamp] : false;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function read($path)
+ {
+ if ( ! $object = $this->readStream($path)) {
+ return false;
+ }
+
+ $object['contents'] = stream_get_contents($object['stream']);
+ fclose($object['stream']);
+ unset($object['stream']);
+
+ return $object;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function readStream($path)
+ {
+ $stream = fopen('php://temp', 'w+b');
+ $result = ftp_fget($this->getConnection(), $stream, $path, $this->transferMode);
+ rewind($stream);
+
+ if ( ! $result) {
+ fclose($stream);
+
+ return false;
+ }
+
+ return ['type' => 'file', 'path' => $path, 'stream' => $stream];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function setVisibility($path, $visibility)
+ {
+ $mode = $visibility === AdapterInterface::VISIBILITY_PUBLIC ? $this->getPermPublic() : $this->getPermPrivate();
+
+ if ( ! ftp_chmod($this->getConnection(), $mode, $path)) {
+ return false;
+ }
+
+ return compact('path', 'visibility');
+ }
+
+ /**
+ * @inheritdoc
+ *
+ * @param string $directory
+ */
+ protected function listDirectoryContents($directory, $recursive = true)
+ {
+ $directory = str_replace('*', '\\*', $directory);
+
+ if ($recursive && $this->recurseManually) {
+ return $this->listDirectoryContentsRecursive($directory);
+ }
+
+ $options = $recursive ? '-alnR' : '-aln';
+ $listing = $this->ftpRawlist($options, $directory);
+
+ return $listing ? $this->normalizeListing($listing, $directory) : [];
+ }
+
+ /**
+ * @inheritdoc
+ *
+ * @param string $directory
+ */
+ protected function listDirectoryContentsRecursive($directory)
+ {
+ $listing = $this->normalizeListing($this->ftpRawlist('-aln', $directory) ?: [], $directory);
+ $output = [];
+
+ foreach ($listing as $item) {
+ $output[] = $item;
+ if ($item['type'] !== 'dir') continue;
+ $output = array_merge($output, $this->listDirectoryContentsRecursive($item['path']));
+ }
+
+ return $output;
+ }
+
+ /**
+ * Check if the connection is open.
+ *
+ * @return bool
+ * @throws ErrorException
+ */
+ public function isConnected()
+ {
+ try {
+ return is_resource($this->connection) && ftp_rawlist($this->connection, $this->getRoot()) !== false;
+ } catch (ErrorException $e) {
+ if (strpos($e->getMessage(), 'ftp_rawlist') === false) {
+ throw $e;
+ }
+
+ return false;
+ }
+ }
+
+ /**
+ * @return bool
+ */
+ protected function isPureFtpdServer()
+ {
+ $response = ftp_raw($this->connection, 'HELP');
+
+ return stripos(implode(' ', $response), 'Pure-FTPd') !== false;
+ }
+
+ /**
+ * The ftp_rawlist function with optional escaping.
+ *
+ * @param string $options
+ * @param string $path
+ *
+ * @return array
+ */
+ protected function ftpRawlist($options, $path)
+ {
+ $connection = $this->getConnection();
+
+ if ($this->isPureFtpd) {
+ $path = str_replace(' ', '\ ', $path);
+ }
+ return ftp_rawlist($connection, $options . ' ' . $path);
+ }
+}
diff --git a/vendor/league/flysystem/src/Adapter/Ftpd.php b/vendor/league/flysystem/src/Adapter/Ftpd.php
new file mode 100644
index 0000000000..7fcecd09b7
--- /dev/null
+++ b/vendor/league/flysystem/src/Adapter/Ftpd.php
@@ -0,0 +1,40 @@
+ 'dir', 'path' => ''];
+ }
+
+ if ( ! ($object = ftp_raw($this->getConnection(), 'STAT ' . $path)) || count($object) < 3) {
+ return false;
+ }
+
+ if (substr($object[1], 0, 5) === "ftpd:") {
+ return false;
+ }
+
+ return $this->normalizeObject($object[1], '');
+ }
+
+ /**
+ * @inheritdoc
+ */
+ protected function listDirectoryContents($directory, $recursive = true)
+ {
+ $listing = ftp_rawlist($this->getConnection(), $directory, $recursive);
+
+ if ($listing === false || ( ! empty($listing) && substr($listing[0], 0, 5) === "ftpd:")) {
+ return [];
+ }
+
+ return $this->normalizeListing($listing, $directory);
+ }
+}
diff --git a/vendor/league/flysystem/src/Adapter/Local.php b/vendor/league/flysystem/src/Adapter/Local.php
new file mode 100644
index 0000000000..3e3c827627
--- /dev/null
+++ b/vendor/league/flysystem/src/Adapter/Local.php
@@ -0,0 +1,518 @@
+ [
+ 'public' => 0644,
+ 'private' => 0600,
+ ],
+ 'dir' => [
+ 'public' => 0755,
+ 'private' => 0700,
+ ]
+ ];
+
+ /**
+ * @var string
+ */
+ protected $pathSeparator = DIRECTORY_SEPARATOR;
+
+ /**
+ * @var array
+ */
+ protected $permissionMap;
+
+ /**
+ * @var int
+ */
+ protected $writeFlags;
+ /**
+ * @var int
+ */
+ private $linkHandling;
+
+ /**
+ * Constructor.
+ *
+ * @param string $root
+ * @param int $writeFlags
+ * @param int $linkHandling
+ * @param array $permissions
+ *
+ * @throws LogicException
+ */
+ public function __construct($root, $writeFlags = LOCK_EX, $linkHandling = self::DISALLOW_LINKS, array $permissions = [])
+ {
+ $root = is_link($root) ? realpath($root) : $root;
+ $this->permissionMap = array_replace_recursive(static::$permissions, $permissions);
+ $this->ensureDirectory($root);
+
+ if ( ! is_dir($root) || ! is_readable($root)) {
+ throw new LogicException('The root path ' . $root . ' is not readable.');
+ }
+
+ $this->setPathPrefix($root);
+ $this->writeFlags = $writeFlags;
+ $this->linkHandling = $linkHandling;
+ }
+
+ /**
+ * Ensure the root directory exists.
+ *
+ * @param string $root root directory path
+ *
+ * @return void
+ *
+ * @throws Exception in case the root directory can not be created
+ */
+ protected function ensureDirectory($root)
+ {
+ if ( ! is_dir($root)) {
+ $umask = umask(0);
+ @mkdir($root, $this->permissionMap['dir']['public'], true);
+ umask($umask);
+
+ if ( ! is_dir($root)) {
+ throw new Exception(sprintf('Impossible to create the root directory "%s".', $root));
+ }
+ }
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function has($path)
+ {
+ $location = $this->applyPathPrefix($path);
+
+ return file_exists($location);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function write($path, $contents, Config $config)
+ {
+ $location = $this->applyPathPrefix($path);
+ $this->ensureDirectory(dirname($location));
+
+ if (($size = file_put_contents($location, $contents, $this->writeFlags)) === false) {
+ return false;
+ }
+
+ $type = 'file';
+ $result = compact('contents', 'type', 'size', 'path');
+
+ if ($visibility = $config->get('visibility')) {
+ $result['visibility'] = $visibility;
+ $this->setVisibility($path, $visibility);
+ }
+
+ return $result;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function writeStream($path, $resource, Config $config)
+ {
+ $location = $this->applyPathPrefix($path);
+ $this->ensureDirectory(dirname($location));
+ $stream = fopen($location, 'w+b');
+
+ if ( ! $stream) {
+ return false;
+ }
+
+ stream_copy_to_stream($resource, $stream);
+
+ if ( ! fclose($stream)) {
+ return false;
+ }
+
+ $type = 'file';
+
+ $result = compact('type', 'path');
+
+ if ($visibility = $config->get('visibility')) {
+ $this->setVisibility($path, $visibility);
+ $result['visibility'] = $visibility;
+ }
+
+ return $result;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function readStream($path)
+ {
+ $location = $this->applyPathPrefix($path);
+ $stream = fopen($location, 'rb');
+
+ return ['type' => 'file', 'path' => $path, 'stream' => $stream];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function updateStream($path, $resource, Config $config)
+ {
+ return $this->writeStream($path, $resource, $config);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function update($path, $contents, Config $config)
+ {
+ $location = $this->applyPathPrefix($path);
+ $size = file_put_contents($location, $contents, $this->writeFlags);
+
+ if ($size === false) {
+ return false;
+ }
+
+ $type = 'file';
+
+ $result = compact('type', 'path', 'size', 'contents');
+
+ if ($mimetype = Util::guessMimeType($path, $contents)) {
+ $result['mimetype'] = $mimetype;
+ }
+
+ return $result;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function read($path)
+ {
+ $location = $this->applyPathPrefix($path);
+ $contents = file_get_contents($location);
+
+ if ($contents === false) {
+ return false;
+ }
+
+ return ['type' => 'file', 'path' => $path, 'contents' => $contents];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function rename($path, $newpath)
+ {
+ $location = $this->applyPathPrefix($path);
+ $destination = $this->applyPathPrefix($newpath);
+ $parentDirectory = $this->applyPathPrefix(Util::dirname($newpath));
+ $this->ensureDirectory($parentDirectory);
+
+ return rename($location, $destination);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function copy($path, $newpath)
+ {
+ $location = $this->applyPathPrefix($path);
+ $destination = $this->applyPathPrefix($newpath);
+ $this->ensureDirectory(dirname($destination));
+
+ return copy($location, $destination);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function delete($path)
+ {
+ $location = $this->applyPathPrefix($path);
+
+ return unlink($location);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function listContents($directory = '', $recursive = false)
+ {
+ $result = [];
+ $location = $this->applyPathPrefix($directory);
+
+ if ( ! is_dir($location)) {
+ return [];
+ }
+
+ $iterator = $recursive ? $this->getRecursiveDirectoryIterator($location) : $this->getDirectoryIterator($location);
+
+ foreach ($iterator as $file) {
+ $path = $this->getFilePath($file);
+
+ if (preg_match('#(^|/|\\\\)\.{1,2}$#', $path)) {
+ continue;
+ }
+
+ $result[] = $this->normalizeFileInfo($file);
+ }
+
+ return array_filter($result);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getMetadata($path)
+ {
+ $location = $this->applyPathPrefix($path);
+ $info = new SplFileInfo($location);
+
+ return $this->normalizeFileInfo($info);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getSize($path)
+ {
+ return $this->getMetadata($path);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getMimetype($path)
+ {
+ $location = $this->applyPathPrefix($path);
+ $finfo = new Finfo(FILEINFO_MIME_TYPE);
+ $mimetype = $finfo->file($location);
+
+ if (in_array($mimetype, ['application/octet-stream', 'inode/x-empty'])) {
+ $mimetype = Util\MimeType::detectByFilename($location);
+ }
+
+ return ['path' => $path, 'type' => 'file', 'mimetype' => $mimetype];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getTimestamp($path)
+ {
+ return $this->getMetadata($path);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getVisibility($path)
+ {
+ $location = $this->applyPathPrefix($path);
+ clearstatcache(false, $location);
+ $permissions = octdec(substr(sprintf('%o', fileperms($location)), -4));
+ $visibility = $permissions & 0044 ? AdapterInterface::VISIBILITY_PUBLIC : AdapterInterface::VISIBILITY_PRIVATE;
+
+ return compact('path', 'visibility');
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function setVisibility($path, $visibility)
+ {
+ $location = $this->applyPathPrefix($path);
+ $type = is_dir($location) ? 'dir' : 'file';
+ $success = chmod($location, $this->permissionMap[$type][$visibility]);
+
+ if ($success === false) {
+ return false;
+ }
+
+ return compact('path', 'visibility');
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function createDir($dirname, Config $config)
+ {
+ $location = $this->applyPathPrefix($dirname);
+ $umask = umask(0);
+ $visibility = $config->get('visibility', 'public');
+
+ if ( ! is_dir($location) && ! mkdir($location, $this->permissionMap['dir'][$visibility], true)) {
+ $return = false;
+ } else {
+ $return = ['path' => $dirname, 'type' => 'dir'];
+ }
+
+ umask($umask);
+
+ return $return;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function deleteDir($dirname)
+ {
+ $location = $this->applyPathPrefix($dirname);
+
+ if ( ! is_dir($location)) {
+ return false;
+ }
+
+ $contents = $this->getRecursiveDirectoryIterator($location, RecursiveIteratorIterator::CHILD_FIRST);
+
+ /** @var SplFileInfo $file */
+ foreach ($contents as $file) {
+ $this->guardAgainstUnreadableFileInfo($file);
+ $this->deleteFileInfoObject($file);
+ }
+
+ return rmdir($location);
+ }
+
+ /**
+ * @param SplFileInfo $file
+ */
+ protected function deleteFileInfoObject(SplFileInfo $file)
+ {
+ switch ($file->getType()) {
+ case 'dir':
+ rmdir($file->getRealPath());
+ break;
+ case 'link':
+ unlink($file->getPathname());
+ break;
+ default:
+ unlink($file->getRealPath());
+ }
+ }
+
+ /**
+ * Normalize the file info.
+ *
+ * @param SplFileInfo $file
+ *
+ * @return array|void
+ *
+ * @throws NotSupportedException
+ */
+ protected function normalizeFileInfo(SplFileInfo $file)
+ {
+ if ( ! $file->isLink()) {
+ return $this->mapFileInfo($file);
+ }
+
+ if ($this->linkHandling & self::DISALLOW_LINKS) {
+ throw NotSupportedException::forLink($file);
+ }
+ }
+
+ /**
+ * Get the normalized path from a SplFileInfo object.
+ *
+ * @param SplFileInfo $file
+ *
+ * @return string
+ */
+ protected function getFilePath(SplFileInfo $file)
+ {
+ $location = $file->getPathname();
+ $path = $this->removePathPrefix($location);
+
+ return trim(str_replace('\\', '/', $path), '/');
+ }
+
+ /**
+ * @param string $path
+ * @param int $mode
+ *
+ * @return RecursiveIteratorIterator
+ */
+ protected function getRecursiveDirectoryIterator($path, $mode = RecursiveIteratorIterator::SELF_FIRST)
+ {
+ return new RecursiveIteratorIterator(
+ new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS),
+ $mode
+ );
+ }
+
+ /**
+ * @param string $path
+ *
+ * @return DirectoryIterator
+ */
+ protected function getDirectoryIterator($path)
+ {
+ $iterator = new DirectoryIterator($path);
+
+ return $iterator;
+ }
+
+ /**
+ * @param SplFileInfo $file
+ *
+ * @return array
+ */
+ protected function mapFileInfo(SplFileInfo $file)
+ {
+ $normalized = [
+ 'type' => $file->getType(),
+ 'path' => $this->getFilePath($file),
+ ];
+
+ $normalized['timestamp'] = $file->getMTime();
+
+ if ($normalized['type'] === 'file') {
+ $normalized['size'] = $file->getSize();
+ }
+
+ return $normalized;
+ }
+
+ /**
+ * @param SplFileInfo $file
+ *
+ * @throws UnreadableFileException
+ */
+ protected function guardAgainstUnreadableFileInfo(SplFileInfo $file)
+ {
+ if ( ! $file->isReadable()) {
+ throw UnreadableFileException::forFileInfo($file);
+ }
+ }
+}
diff --git a/vendor/league/flysystem/src/Adapter/NullAdapter.php b/vendor/league/flysystem/src/Adapter/NullAdapter.php
new file mode 100644
index 0000000000..2527087f7c
--- /dev/null
+++ b/vendor/league/flysystem/src/Adapter/NullAdapter.php
@@ -0,0 +1,144 @@
+get('visibility')) {
+ $result['visibility'] = $visibility;
+ }
+
+ return $result;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function update($path, $contents, Config $config)
+ {
+ return false;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function read($path)
+ {
+ return false;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function rename($path, $newpath)
+ {
+ return false;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function delete($path)
+ {
+ return false;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function listContents($directory = '', $recursive = false)
+ {
+ return [];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getMetadata($path)
+ {
+ return false;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getSize($path)
+ {
+ return false;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getMimetype($path)
+ {
+ return false;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getTimestamp($path)
+ {
+ return false;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getVisibility($path)
+ {
+ return false;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function setVisibility($path, $visibility)
+ {
+ return compact('visibility');
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function createDir($dirname, Config $config)
+ {
+ return ['path' => $dirname, 'type' => 'dir'];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function deleteDir($dirname)
+ {
+ return false;
+ }
+}
diff --git a/vendor/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php b/vendor/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php
new file mode 100644
index 0000000000..fc0a747acb
--- /dev/null
+++ b/vendor/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php
@@ -0,0 +1,33 @@
+readStream($path);
+
+ if ($response === false || ! is_resource($response['stream'])) {
+ return false;
+ }
+
+ $result = $this->writeStream($newpath, $response['stream'], new Config());
+
+ if ($result !== false && is_resource($response['stream'])) {
+ fclose($response['stream']);
+ }
+
+ return $result !== false;
+ }
+
+ // Required abstract method
+
+ /**
+ * @param string $path
+ * @return resource
+ */
+ abstract public function readStream($path);
+
+ /**
+ * @param string $path
+ * @param resource $resource
+ * @param Config $config
+ * @return resource
+ */
+ abstract public function writeStream($path, $resource, Config $config);
+}
diff --git a/vendor/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php b/vendor/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php
new file mode 100644
index 0000000000..2b31c01d69
--- /dev/null
+++ b/vendor/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php
@@ -0,0 +1,44 @@
+read($path)) {
+ return false;
+ }
+
+ $stream = fopen('php://temp', 'w+b');
+ fwrite($stream, $data['contents']);
+ rewind($stream);
+ $data['stream'] = $stream;
+ unset($data['contents']);
+
+ return $data;
+ }
+
+ /**
+ * Reads a file.
+ *
+ * @param string $path
+ *
+ * @return array|false
+ *
+ * @see League\Flysystem\ReadInterface::read()
+ */
+ abstract public function read($path);
+}
diff --git a/vendor/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php b/vendor/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php
new file mode 100644
index 0000000000..80424960c1
--- /dev/null
+++ b/vendor/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php
@@ -0,0 +1,9 @@
+stream($path, $resource, $config, 'write');
+ }
+
+ /**
+ * Update a file using a stream.
+ *
+ * @param string $path
+ * @param resource $resource
+ * @param Config $config Config object or visibility setting
+ *
+ * @return mixed false of file metadata
+ */
+ public function updateStream($path, $resource, Config $config)
+ {
+ return $this->stream($path, $resource, $config, 'update');
+ }
+
+ // Required abstract methods
+ abstract public function write($pash, $contents, Config $config);
+ abstract public function update($pash, $contents, Config $config);
+}
diff --git a/vendor/league/flysystem/src/Adapter/SynologyFtp.php b/vendor/league/flysystem/src/Adapter/SynologyFtp.php
new file mode 100644
index 0000000000..fe0d344cfe
--- /dev/null
+++ b/vendor/league/flysystem/src/Adapter/SynologyFtp.php
@@ -0,0 +1,8 @@
+settings = $settings;
+ }
+
+ /**
+ * Get a setting.
+ *
+ * @param string $key
+ * @param mixed $default
+ *
+ * @return mixed config setting or default when not found
+ */
+ public function get($key, $default = null)
+ {
+ if ( ! array_key_exists($key, $this->settings)) {
+ return $this->getDefault($key, $default);
+ }
+
+ return $this->settings[$key];
+ }
+
+ /**
+ * Check if an item exists by key.
+ *
+ * @param string $key
+ *
+ * @return bool
+ */
+ public function has($key)
+ {
+ if (array_key_exists($key, $this->settings)) {
+ return true;
+ }
+
+ return $this->fallback instanceof Config
+ ? $this->fallback->has($key)
+ : false;
+ }
+
+ /**
+ * Try to retrieve a default setting from a config fallback.
+ *
+ * @param string $key
+ * @param mixed $default
+ *
+ * @return mixed config setting or default when not found
+ */
+ protected function getDefault($key, $default)
+ {
+ if ( ! $this->fallback) {
+ return $default;
+ }
+
+ return $this->fallback->get($key, $default);
+ }
+
+ /**
+ * Set a setting.
+ *
+ * @param string $key
+ * @param mixed $value
+ *
+ * @return $this
+ */
+ public function set($key, $value)
+ {
+ $this->settings[$key] = $value;
+
+ return $this;
+ }
+
+ /**
+ * Set the fallback.
+ *
+ * @param Config $fallback
+ *
+ * @return $this
+ */
+ public function setFallback(Config $fallback)
+ {
+ $this->fallback = $fallback;
+
+ return $this;
+ }
+}
diff --git a/vendor/league/flysystem/src/ConfigAwareTrait.php b/vendor/league/flysystem/src/ConfigAwareTrait.php
new file mode 100644
index 0000000000..202d605dad
--- /dev/null
+++ b/vendor/league/flysystem/src/ConfigAwareTrait.php
@@ -0,0 +1,49 @@
+config = $config ? Util::ensureConfig($config) : new Config;
+ }
+
+ /**
+ * Get the Config.
+ *
+ * @return Config config object
+ */
+ public function getConfig()
+ {
+ return $this->config;
+ }
+
+ /**
+ * Convert a config array to a Config object with the correct fallback.
+ *
+ * @param array $config
+ *
+ * @return Config
+ */
+ protected function prepareConfig(array $config)
+ {
+ $config = new Config($config);
+ $config->setFallback($this->getConfig());
+
+ return $config;
+ }
+}
diff --git a/vendor/league/flysystem/src/Directory.php b/vendor/league/flysystem/src/Directory.php
new file mode 100644
index 0000000000..d4f90a8804
--- /dev/null
+++ b/vendor/league/flysystem/src/Directory.php
@@ -0,0 +1,31 @@
+filesystem->deleteDir($this->path);
+ }
+
+ /**
+ * List the directory contents.
+ *
+ * @param bool $recursive
+ *
+ * @return array|bool directory contents or false
+ */
+ public function getContents($recursive = false)
+ {
+ return $this->filesystem->listContents($this->path, $recursive);
+ }
+}
diff --git a/vendor/league/flysystem/src/Exception.php b/vendor/league/flysystem/src/Exception.php
new file mode 100644
index 0000000000..d4a9907b4a
--- /dev/null
+++ b/vendor/league/flysystem/src/Exception.php
@@ -0,0 +1,8 @@
+filesystem->has($this->path);
+ }
+
+ /**
+ * Read the file.
+ *
+ * @return string|false file contents
+ */
+ public function read()
+ {
+ return $this->filesystem->read($this->path);
+ }
+
+ /**
+ * Read the file as a stream.
+ *
+ * @return resource|false file stream
+ */
+ public function readStream()
+ {
+ return $this->filesystem->readStream($this->path);
+ }
+
+ /**
+ * Write the new file.
+ *
+ * @param string $content
+ *
+ * @return bool success boolean
+ */
+ public function write($content)
+ {
+ return $this->filesystem->write($this->path, $content);
+ }
+
+ /**
+ * Write the new file using a stream.
+ *
+ * @param resource $resource
+ *
+ * @return bool success boolean
+ */
+ public function writeStream($resource)
+ {
+ return $this->filesystem->writeStream($this->path, $resource);
+ }
+
+ /**
+ * Update the file contents.
+ *
+ * @param string $content
+ *
+ * @return bool success boolean
+ */
+ public function update($content)
+ {
+ return $this->filesystem->update($this->path, $content);
+ }
+
+ /**
+ * Update the file contents with a stream.
+ *
+ * @param resource $resource
+ *
+ * @return bool success boolean
+ */
+ public function updateStream($resource)
+ {
+ return $this->filesystem->updateStream($this->path, $resource);
+ }
+
+ /**
+ * Create the file or update if exists.
+ *
+ * @param string $content
+ *
+ * @return bool success boolean
+ */
+ public function put($content)
+ {
+ return $this->filesystem->put($this->path, $content);
+ }
+
+ /**
+ * Create the file or update if exists using a stream.
+ *
+ * @param resource $resource
+ *
+ * @return bool success boolean
+ */
+ public function putStream($resource)
+ {
+ return $this->filesystem->putStream($this->path, $resource);
+ }
+
+ /**
+ * Rename the file.
+ *
+ * @param string $newpath
+ *
+ * @return bool success boolean
+ */
+ public function rename($newpath)
+ {
+ if ($this->filesystem->rename($this->path, $newpath)) {
+ $this->path = $newpath;
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Copy the file.
+ *
+ * @param string $newpath
+ *
+ * @return File|false new file or false
+ */
+ public function copy($newpath)
+ {
+ if ($this->filesystem->copy($this->path, $newpath)) {
+ return new File($this->filesystem, $newpath);
+ }
+
+ return false;
+ }
+
+ /**
+ * Get the file's timestamp.
+ *
+ * @return string|false The timestamp or false on failure.
+ */
+ public function getTimestamp()
+ {
+ return $this->filesystem->getTimestamp($this->path);
+ }
+
+ /**
+ * Get the file's mimetype.
+ *
+ * @return string|false The file mime-type or false on failure.
+ */
+ public function getMimetype()
+ {
+ return $this->filesystem->getMimetype($this->path);
+ }
+
+ /**
+ * Get the file's visibility.
+ *
+ * @return string|false The visibility (public|private) or false on failure.
+ */
+ public function getVisibility()
+ {
+ return $this->filesystem->getVisibility($this->path);
+ }
+
+ /**
+ * Get the file's metadata.
+ *
+ * @return array|false The file metadata or false on failure.
+ */
+ public function getMetadata()
+ {
+ return $this->filesystem->getMetadata($this->path);
+ }
+
+ /**
+ * Get the file size.
+ *
+ * @return int|false The file size or false on failure.
+ */
+ public function getSize()
+ {
+ return $this->filesystem->getSize($this->path);
+ }
+
+ /**
+ * Delete the file.
+ *
+ * @return bool success boolean
+ */
+ public function delete()
+ {
+ return $this->filesystem->delete($this->path);
+ }
+}
diff --git a/vendor/league/flysystem/src/FileExistsException.php b/vendor/league/flysystem/src/FileExistsException.php
new file mode 100644
index 0000000000..c82e20c169
--- /dev/null
+++ b/vendor/league/flysystem/src/FileExistsException.php
@@ -0,0 +1,37 @@
+path = $path;
+
+ parent::__construct('File already exists at path: ' . $this->getPath(), $code, $previous);
+ }
+
+ /**
+ * Get the path which was found.
+ *
+ * @return string
+ */
+ public function getPath()
+ {
+ return $this->path;
+ }
+}
diff --git a/vendor/league/flysystem/src/FileNotFoundException.php b/vendor/league/flysystem/src/FileNotFoundException.php
new file mode 100644
index 0000000000..989df69bbe
--- /dev/null
+++ b/vendor/league/flysystem/src/FileNotFoundException.php
@@ -0,0 +1,37 @@
+path = $path;
+
+ parent::__construct('File not found at path: ' . $this->getPath(), $code, $previous);
+ }
+
+ /**
+ * Get the path which was not found.
+ *
+ * @return string
+ */
+ public function getPath()
+ {
+ return $this->path;
+ }
+}
diff --git a/vendor/league/flysystem/src/Filesystem.php b/vendor/league/flysystem/src/Filesystem.php
new file mode 100644
index 0000000000..7e9881fb54
--- /dev/null
+++ b/vendor/league/flysystem/src/Filesystem.php
@@ -0,0 +1,407 @@
+adapter = $adapter;
+ $this->setConfig($config);
+ }
+
+ /**
+ * Get the Adapter.
+ *
+ * @return AdapterInterface adapter
+ */
+ public function getAdapter()
+ {
+ return $this->adapter;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function has($path)
+ {
+ $path = Util::normalizePath($path);
+
+ return strlen($path) === 0 ? false : (bool) $this->getAdapter()->has($path);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function write($path, $contents, array $config = [])
+ {
+ $path = Util::normalizePath($path);
+ $this->assertAbsent($path);
+ $config = $this->prepareConfig($config);
+
+ return (bool) $this->getAdapter()->write($path, $contents, $config);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function writeStream($path, $resource, array $config = [])
+ {
+ if ( ! is_resource($resource)) {
+ throw new InvalidArgumentException(__METHOD__ . ' expects argument #2 to be a valid resource.');
+ }
+
+ $path = Util::normalizePath($path);
+ $this->assertAbsent($path);
+ $config = $this->prepareConfig($config);
+
+ Util::rewindStream($resource);
+
+ return (bool) $this->getAdapter()->writeStream($path, $resource, $config);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function put($path, $contents, array $config = [])
+ {
+ $path = Util::normalizePath($path);
+ $config = $this->prepareConfig($config);
+
+ if ( ! $this->getAdapter() instanceof CanOverwriteFiles && $this->has($path)) {
+ return (bool) $this->getAdapter()->update($path, $contents, $config);
+ }
+
+ return (bool) $this->getAdapter()->write($path, $contents, $config);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function putStream($path, $resource, array $config = [])
+ {
+ if ( ! is_resource($resource)) {
+ throw new InvalidArgumentException(__METHOD__ . ' expects argument #2 to be a valid resource.');
+ }
+
+ $path = Util::normalizePath($path);
+ $config = $this->prepareConfig($config);
+ Util::rewindStream($resource);
+
+ if ( ! $this->getAdapter() instanceof CanOverwriteFiles &&$this->has($path)) {
+ return (bool) $this->getAdapter()->updateStream($path, $resource, $config);
+ }
+
+ return (bool) $this->getAdapter()->writeStream($path, $resource, $config);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function readAndDelete($path)
+ {
+ $path = Util::normalizePath($path);
+ $this->assertPresent($path);
+ $contents = $this->read($path);
+
+ if ($contents === false) {
+ return false;
+ }
+
+ $this->delete($path);
+
+ return $contents;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function update($path, $contents, array $config = [])
+ {
+ $path = Util::normalizePath($path);
+ $config = $this->prepareConfig($config);
+
+ $this->assertPresent($path);
+
+ return (bool) $this->getAdapter()->update($path, $contents, $config);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function updateStream($path, $resource, array $config = [])
+ {
+ if ( ! is_resource($resource)) {
+ throw new InvalidArgumentException(__METHOD__ . ' expects argument #2 to be a valid resource.');
+ }
+
+ $path = Util::normalizePath($path);
+ $config = $this->prepareConfig($config);
+ $this->assertPresent($path);
+ Util::rewindStream($resource);
+
+ return (bool) $this->getAdapter()->updateStream($path, $resource, $config);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function read($path)
+ {
+ $path = Util::normalizePath($path);
+ $this->assertPresent($path);
+
+ if ( ! ($object = $this->getAdapter()->read($path))) {
+ return false;
+ }
+
+ return $object['contents'];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function readStream($path)
+ {
+ $path = Util::normalizePath($path);
+ $this->assertPresent($path);
+
+ if ( ! $object = $this->getAdapter()->readStream($path)) {
+ return false;
+ }
+
+ return $object['stream'];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function rename($path, $newpath)
+ {
+ $path = Util::normalizePath($path);
+ $newpath = Util::normalizePath($newpath);
+ $this->assertPresent($path);
+ $this->assertAbsent($newpath);
+
+ return (bool) $this->getAdapter()->rename($path, $newpath);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function copy($path, $newpath)
+ {
+ $path = Util::normalizePath($path);
+ $newpath = Util::normalizePath($newpath);
+ $this->assertPresent($path);
+ $this->assertAbsent($newpath);
+
+ return $this->getAdapter()->copy($path, $newpath);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function delete($path)
+ {
+ $path = Util::normalizePath($path);
+ $this->assertPresent($path);
+
+ return $this->getAdapter()->delete($path);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function deleteDir($dirname)
+ {
+ $dirname = Util::normalizePath($dirname);
+
+ if ($dirname === '') {
+ throw new RootViolationException('Root directories can not be deleted.');
+ }
+
+ return (bool) $this->getAdapter()->deleteDir($dirname);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function createDir($dirname, array $config = [])
+ {
+ $dirname = Util::normalizePath($dirname);
+ $config = $this->prepareConfig($config);
+
+ return (bool) $this->getAdapter()->createDir($dirname, $config);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function listContents($directory = '', $recursive = false)
+ {
+ $directory = Util::normalizePath($directory);
+ $contents = $this->getAdapter()->listContents($directory, $recursive);
+
+ return (new ContentListingFormatter($directory, $recursive))->formatListing($contents);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getMimetype($path)
+ {
+ $path = Util::normalizePath($path);
+ $this->assertPresent($path);
+
+ if (( ! $object = $this->getAdapter()->getMimetype($path)) || ! array_key_exists('mimetype', $object)) {
+ return false;
+ }
+
+ return $object['mimetype'];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getTimestamp($path)
+ {
+ $path = Util::normalizePath($path);
+ $this->assertPresent($path);
+
+ if (( ! $object = $this->getAdapter()->getTimestamp($path)) || ! array_key_exists('timestamp', $object)) {
+ return false;
+ }
+
+ return $object['timestamp'];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getVisibility($path)
+ {
+ $path = Util::normalizePath($path);
+ $this->assertPresent($path);
+
+ if (( ! $object = $this->getAdapter()->getVisibility($path)) || ! array_key_exists('visibility', $object)) {
+ return false;
+ }
+
+ return $object['visibility'];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getSize($path)
+ {
+ $path = Util::normalizePath($path);
+ $this->assertPresent($path);
+
+ if (( ! $object = $this->getAdapter()->getSize($path)) || ! array_key_exists('size', $object)) {
+ return false;
+ }
+
+ return (int) $object['size'];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function setVisibility($path, $visibility)
+ {
+ $path = Util::normalizePath($path);
+ $this->assertPresent($path);
+
+ return (bool) $this->getAdapter()->setVisibility($path, $visibility);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getMetadata($path)
+ {
+ $path = Util::normalizePath($path);
+ $this->assertPresent($path);
+
+ return $this->getAdapter()->getMetadata($path);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function get($path, Handler $handler = null)
+ {
+ $path = Util::normalizePath($path);
+
+ if ( ! $handler) {
+ $metadata = $this->getMetadata($path);
+ $handler = $metadata['type'] === 'file' ? new File($this, $path) : new Directory($this, $path);
+ }
+
+ $handler->setPath($path);
+ $handler->setFilesystem($this);
+
+ return $handler;
+ }
+
+ /**
+ * Assert a file is present.
+ *
+ * @param string $path path to file
+ *
+ * @throws FileNotFoundException
+ *
+ * @return void
+ */
+ public function assertPresent($path)
+ {
+ if ($this->config->get('disable_asserts', false) === false && ! $this->has($path)) {
+ throw new FileNotFoundException($path);
+ }
+ }
+
+ /**
+ * Assert a file is absent.
+ *
+ * @param string $path path to file
+ *
+ * @throws FileExistsException
+ *
+ * @return void
+ */
+ public function assertAbsent($path)
+ {
+ if ($this->config->get('disable_asserts', false) === false && $this->has($path)) {
+ throw new FileExistsException($path);
+ }
+ }
+}
diff --git a/vendor/league/flysystem/src/FilesystemInterface.php b/vendor/league/flysystem/src/FilesystemInterface.php
new file mode 100644
index 0000000000..09b811b1d2
--- /dev/null
+++ b/vendor/league/flysystem/src/FilesystemInterface.php
@@ -0,0 +1,284 @@
+path = $path;
+ $this->filesystem = $filesystem;
+ }
+
+ /**
+ * Check whether the entree is a directory.
+ *
+ * @return bool
+ */
+ public function isDir()
+ {
+ return $this->getType() === 'dir';
+ }
+
+ /**
+ * Check whether the entree is a file.
+ *
+ * @return bool
+ */
+ public function isFile()
+ {
+ return $this->getType() === 'file';
+ }
+
+ /**
+ * Retrieve the entree type (file|dir).
+ *
+ * @return string file or dir
+ */
+ public function getType()
+ {
+ $metadata = $this->filesystem->getMetadata($this->path);
+
+ return $metadata['type'];
+ }
+
+ /**
+ * Set the Filesystem object.
+ *
+ * @param FilesystemInterface $filesystem
+ *
+ * @return $this
+ */
+ public function setFilesystem(FilesystemInterface $filesystem)
+ {
+ $this->filesystem = $filesystem;
+
+ return $this;
+ }
+
+ /**
+ * Retrieve the Filesystem object.
+ *
+ * @return FilesystemInterface
+ */
+ public function getFilesystem()
+ {
+ return $this->filesystem;
+ }
+
+ /**
+ * Set the entree path.
+ *
+ * @param string $path
+ *
+ * @return $this
+ */
+ public function setPath($path)
+ {
+ $this->path = $path;
+
+ return $this;
+ }
+
+ /**
+ * Retrieve the entree path.
+ *
+ * @return string path
+ */
+ public function getPath()
+ {
+ return $this->path;
+ }
+
+ /**
+ * Plugins pass-through.
+ *
+ * @param string $method
+ * @param array $arguments
+ *
+ * @return mixed
+ */
+ public function __call($method, array $arguments)
+ {
+ array_unshift($arguments, $this->path);
+ $callback = [$this->filesystem, $method];
+
+ try {
+ return call_user_func_array($callback, $arguments);
+ } catch (BadMethodCallException $e) {
+ throw new BadMethodCallException(
+ 'Call to undefined method '
+ . get_called_class()
+ . '::' . $method
+ );
+ }
+ }
+}
diff --git a/vendor/league/flysystem/src/MountManager.php b/vendor/league/flysystem/src/MountManager.php
new file mode 100644
index 0000000000..6dea200103
--- /dev/null
+++ b/vendor/league/flysystem/src/MountManager.php
@@ -0,0 +1,320 @@
+ Filesystem,]
+ *
+ * @throws InvalidArgumentException
+ */
+ public function __construct(array $filesystems = [])
+ {
+ $this->mountFilesystems($filesystems);
+ }
+
+ /**
+ * Mount filesystems.
+ *
+ * @param FilesystemInterface[] $filesystems [:prefix => Filesystem,]
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return $this
+ */
+ public function mountFilesystems(array $filesystems)
+ {
+ foreach ($filesystems as $prefix => $filesystem) {
+ $this->mountFilesystem($prefix, $filesystem);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Mount filesystems.
+ *
+ * @param string $prefix
+ * @param FilesystemInterface $filesystem
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return $this
+ */
+ public function mountFilesystem($prefix, FilesystemInterface $filesystem)
+ {
+ if ( ! is_string($prefix)) {
+ throw new InvalidArgumentException(__METHOD__ . ' expects argument #1 to be a string.');
+ }
+
+ $this->filesystems[$prefix] = $filesystem;
+
+ return $this;
+ }
+
+ /**
+ * Get the filesystem with the corresponding prefix.
+ *
+ * @param string $prefix
+ *
+ * @throws FilesystemNotFoundException
+ *
+ * @return FilesystemInterface
+ */
+ public function getFilesystem($prefix)
+ {
+ if ( ! isset($this->filesystems[$prefix])) {
+ throw new FilesystemNotFoundException('No filesystem mounted with prefix ' . $prefix);
+ }
+
+ return $this->filesystems[$prefix];
+ }
+
+ /**
+ * Retrieve the prefix from an arguments array.
+ *
+ * @param array $arguments
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return array [:prefix, :arguments]
+ */
+ public function filterPrefix(array $arguments)
+ {
+ if (empty($arguments)) {
+ throw new InvalidArgumentException('At least one argument needed');
+ }
+
+ $path = array_shift($arguments);
+
+ if ( ! is_string($path)) {
+ throw new InvalidArgumentException('First argument should be a string');
+ }
+
+ list($prefix, $path) = $this->getPrefixAndPath($path);
+ array_unshift($arguments, $path);
+
+ return [$prefix, $arguments];
+ }
+
+ /**
+ * @param string $directory
+ * @param bool $recursive
+ *
+ * @throws InvalidArgumentException
+ * @throws FilesystemNotFoundException
+ *
+ * @return array
+ */
+ public function listContents($directory = '', $recursive = false)
+ {
+ list($prefix, $directory) = $this->getPrefixAndPath($directory);
+ $filesystem = $this->getFilesystem($prefix);
+ $result = $filesystem->listContents($directory, $recursive);
+
+ foreach ($result as &$file) {
+ $file['filesystem'] = $prefix;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Call forwarder.
+ *
+ * @param string $method
+ * @param array $arguments
+ *
+ * @throws InvalidArgumentException
+ * @throws FilesystemNotFoundException
+ *
+ * @return mixed
+ */
+ public function __call($method, $arguments)
+ {
+ list($prefix, $arguments) = $this->filterPrefix($arguments);
+
+ return $this->invokePluginOnFilesystem($method, $arguments, $prefix);
+ }
+
+ /**
+ * @param string $from
+ * @param string $to
+ * @param array $config
+ *
+ * @throws InvalidArgumentException
+ * @throws FilesystemNotFoundException
+ *
+ * @return bool
+ */
+ public function copy($from, $to, array $config = [])
+ {
+ list($prefixFrom, $from) = $this->getPrefixAndPath($from);
+
+ $buffer = $this->getFilesystem($prefixFrom)->readStream($from);
+
+ if ($buffer === false) {
+ return false;
+ }
+
+ list($prefixTo, $to) = $this->getPrefixAndPath($to);
+
+ $result = $this->getFilesystem($prefixTo)->writeStream($to, $buffer, $config);
+
+ if (is_resource($buffer)) {
+ fclose($buffer);
+ }
+
+ return $result;
+ }
+
+ /**
+ * List with plugin adapter.
+ *
+ * @param array $keys
+ * @param string $directory
+ * @param bool $recursive
+ *
+ * @throws InvalidArgumentException
+ * @throws FilesystemNotFoundException
+ *
+ * @return array
+ */
+ public function listWith(array $keys = [], $directory = '', $recursive = false)
+ {
+ list($prefix, $directory) = $this->getPrefixAndPath($directory);
+ $arguments = [$keys, $directory, $recursive];
+
+ return $this->invokePluginOnFilesystem('listWith', $arguments, $prefix);
+ }
+
+ /**
+ * Move a file.
+ *
+ * @param string $from
+ * @param string $to
+ * @param array $config
+ *
+ * @throws InvalidArgumentException
+ * @throws FilesystemNotFoundException
+ *
+ * @return bool
+ */
+ public function move($from, $to, array $config = [])
+ {
+ list($prefixFrom, $pathFrom) = $this->getPrefixAndPath($from);
+ list($prefixTo, $pathTo) = $this->getPrefixAndPath($to);
+
+ if ($prefixFrom === $prefixTo) {
+ $filesystem = $this->getFilesystem($prefixFrom);
+ $renamed = $filesystem->rename($pathFrom, $pathTo);
+
+ if ($renamed && isset($config['visibility'])) {
+ return $filesystem->setVisibility($pathTo, $config['visibility']);
+ }
+
+ return $renamed;
+ }
+
+ $copied = $this->copy($from, $to, $config);
+
+ if ($copied) {
+ return $this->delete($from);
+ }
+
+ return false;
+ }
+
+ /**
+ * Invoke a plugin on a filesystem mounted on a given prefix.
+ *
+ * @param string $method
+ * @param array $arguments
+ * @param string $prefix
+ *
+ * @throws FilesystemNotFoundException
+ *
+ * @return mixed
+ */
+ public function invokePluginOnFilesystem($method, $arguments, $prefix)
+ {
+ $filesystem = $this->getFilesystem($prefix);
+
+ try {
+ return $this->invokePlugin($method, $arguments, $filesystem);
+ } catch (PluginNotFoundException $e) {
+ // Let it pass, it's ok, don't panic.
+ }
+
+ $callback = [$filesystem, $method];
+
+ return call_user_func_array($callback, $arguments);
+ }
+
+ /**
+ * @param string $path
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return string[] [:prefix, :path]
+ */
+ protected function getPrefixAndPath($path)
+ {
+ if (strpos($path, '://') < 1) {
+ throw new InvalidArgumentException('No prefix detected in path: ' . $path);
+ }
+
+ return explode('://', $path, 2);
+ }
+}
diff --git a/vendor/league/flysystem/src/NotSupportedException.php b/vendor/league/flysystem/src/NotSupportedException.php
new file mode 100644
index 0000000000..08f47f7495
--- /dev/null
+++ b/vendor/league/flysystem/src/NotSupportedException.php
@@ -0,0 +1,37 @@
+getPathname());
+ }
+
+ /**
+ * Create a new exception for a link.
+ *
+ * @param string $systemType
+ *
+ * @return static
+ */
+ public static function forFtpSystemType($systemType)
+ {
+ $message = "The FTP system type '$systemType' is currently not supported.";
+
+ return new static($message);
+ }
+}
diff --git a/vendor/league/flysystem/src/Plugin/AbstractPlugin.php b/vendor/league/flysystem/src/Plugin/AbstractPlugin.php
new file mode 100644
index 0000000000..0d56789769
--- /dev/null
+++ b/vendor/league/flysystem/src/Plugin/AbstractPlugin.php
@@ -0,0 +1,24 @@
+filesystem = $filesystem;
+ }
+}
diff --git a/vendor/league/flysystem/src/Plugin/EmptyDir.php b/vendor/league/flysystem/src/Plugin/EmptyDir.php
new file mode 100644
index 0000000000..b5ae7f582d
--- /dev/null
+++ b/vendor/league/flysystem/src/Plugin/EmptyDir.php
@@ -0,0 +1,34 @@
+filesystem->listContents($dirname, false);
+
+ foreach ($listing as $item) {
+ if ($item['type'] === 'dir') {
+ $this->filesystem->deleteDir($item['path']);
+ } else {
+ $this->filesystem->delete($item['path']);
+ }
+ }
+ }
+}
diff --git a/vendor/league/flysystem/src/Plugin/ForcedCopy.php b/vendor/league/flysystem/src/Plugin/ForcedCopy.php
new file mode 100644
index 0000000000..a41e9f3aeb
--- /dev/null
+++ b/vendor/league/flysystem/src/Plugin/ForcedCopy.php
@@ -0,0 +1,44 @@
+filesystem->delete($newpath);
+ } catch (FileNotFoundException $e) {
+ // The destination path does not exist. That's ok.
+ $deleted = true;
+ }
+
+ if ($deleted) {
+ return $this->filesystem->copy($path, $newpath);
+ }
+
+ return false;
+ }
+}
diff --git a/vendor/league/flysystem/src/Plugin/ForcedRename.php b/vendor/league/flysystem/src/Plugin/ForcedRename.php
new file mode 100644
index 0000000000..3f51cd6076
--- /dev/null
+++ b/vendor/league/flysystem/src/Plugin/ForcedRename.php
@@ -0,0 +1,44 @@
+filesystem->delete($newpath);
+ } catch (FileNotFoundException $e) {
+ // The destination path does not exist. That's ok.
+ $deleted = true;
+ }
+
+ if ($deleted) {
+ return $this->filesystem->rename($path, $newpath);
+ }
+
+ return false;
+ }
+}
diff --git a/vendor/league/flysystem/src/Plugin/GetWithMetadata.php b/vendor/league/flysystem/src/Plugin/GetWithMetadata.php
new file mode 100644
index 0000000000..6fe4f05628
--- /dev/null
+++ b/vendor/league/flysystem/src/Plugin/GetWithMetadata.php
@@ -0,0 +1,51 @@
+filesystem->getMetadata($path);
+
+ if ( ! $object) {
+ return false;
+ }
+
+ $keys = array_diff($metadata, array_keys($object));
+
+ foreach ($keys as $key) {
+ if ( ! method_exists($this->filesystem, $method = 'get' . ucfirst($key))) {
+ throw new InvalidArgumentException('Could not fetch metadata: ' . $key);
+ }
+
+ $object[$key] = $this->filesystem->{$method}($path);
+ }
+
+ return $object;
+ }
+}
diff --git a/vendor/league/flysystem/src/Plugin/ListFiles.php b/vendor/league/flysystem/src/Plugin/ListFiles.php
new file mode 100644
index 0000000000..9669fe7e7b
--- /dev/null
+++ b/vendor/league/flysystem/src/Plugin/ListFiles.php
@@ -0,0 +1,35 @@
+filesystem->listContents($directory, $recursive);
+
+ $filter = function ($object) {
+ return $object['type'] === 'file';
+ };
+
+ return array_values(array_filter($contents, $filter));
+ }
+}
diff --git a/vendor/league/flysystem/src/Plugin/ListPaths.php b/vendor/league/flysystem/src/Plugin/ListPaths.php
new file mode 100644
index 0000000000..514bdf0b3a
--- /dev/null
+++ b/vendor/league/flysystem/src/Plugin/ListPaths.php
@@ -0,0 +1,36 @@
+filesystem->listContents($directory, $recursive);
+
+ foreach ($contents as $object) {
+ $result[] = $object['path'];
+ }
+
+ return $result;
+ }
+}
diff --git a/vendor/league/flysystem/src/Plugin/ListWith.php b/vendor/league/flysystem/src/Plugin/ListWith.php
new file mode 100644
index 0000000000..d90464e528
--- /dev/null
+++ b/vendor/league/flysystem/src/Plugin/ListWith.php
@@ -0,0 +1,60 @@
+filesystem->listContents($directory, $recursive);
+
+ foreach ($contents as $index => $object) {
+ if ($object['type'] === 'file') {
+ $missingKeys = array_diff($keys, array_keys($object));
+ $contents[$index] = array_reduce($missingKeys, [$this, 'getMetadataByName'], $object);
+ }
+ }
+
+ return $contents;
+ }
+
+ /**
+ * Get a meta-data value by key name.
+ *
+ * @param array $object
+ * @param string $key
+ *
+ * @return array
+ */
+ protected function getMetadataByName(array $object, $key)
+ {
+ $method = 'get' . ucfirst($key);
+
+ if ( ! method_exists($this->filesystem, $method)) {
+ throw new \InvalidArgumentException('Could not get meta-data for key: ' . $key);
+ }
+
+ $object[$key] = $this->filesystem->{$method}($object['path']);
+
+ return $object;
+ }
+}
diff --git a/vendor/league/flysystem/src/Plugin/PluggableTrait.php b/vendor/league/flysystem/src/Plugin/PluggableTrait.php
new file mode 100644
index 0000000000..922edfe52b
--- /dev/null
+++ b/vendor/league/flysystem/src/Plugin/PluggableTrait.php
@@ -0,0 +1,97 @@
+plugins[$plugin->getMethod()] = $plugin;
+
+ return $this;
+ }
+
+ /**
+ * Find a specific plugin.
+ *
+ * @param string $method
+ *
+ * @throws PluginNotFoundException
+ *
+ * @return PluginInterface
+ */
+ protected function findPlugin($method)
+ {
+ if ( ! isset($this->plugins[$method])) {
+ throw new PluginNotFoundException('Plugin not found for method: ' . $method);
+ }
+
+ return $this->plugins[$method];
+ }
+
+ /**
+ * Invoke a plugin by method name.
+ *
+ * @param string $method
+ * @param array $arguments
+ * @param FilesystemInterface $filesystem
+ *
+ * @throws PluginNotFoundException
+ *
+ * @return mixed
+ */
+ protected function invokePlugin($method, array $arguments, FilesystemInterface $filesystem)
+ {
+ $plugin = $this->findPlugin($method);
+ $plugin->setFilesystem($filesystem);
+ $callback = [$plugin, 'handle'];
+
+ return call_user_func_array($callback, $arguments);
+ }
+
+ /**
+ * Plugins pass-through.
+ *
+ * @param string $method
+ * @param array $arguments
+ *
+ * @throws BadMethodCallException
+ *
+ * @return mixed
+ */
+ public function __call($method, array $arguments)
+ {
+ try {
+ return $this->invokePlugin($method, $arguments, $this);
+ } catch (PluginNotFoundException $e) {
+ throw new BadMethodCallException(
+ 'Call to undefined method '
+ . get_class($this)
+ . '::' . $method
+ );
+ }
+ }
+}
diff --git a/vendor/league/flysystem/src/Plugin/PluginNotFoundException.php b/vendor/league/flysystem/src/Plugin/PluginNotFoundException.php
new file mode 100644
index 0000000000..fd1d7e7e30
--- /dev/null
+++ b/vendor/league/flysystem/src/Plugin/PluginNotFoundException.php
@@ -0,0 +1,10 @@
+hash = spl_object_hash($this);
+ static::$safeStorage[$this->hash] = [];
+ }
+
+ public function storeSafely($key, $value)
+ {
+ static::$safeStorage[$this->hash][$key] = $value;
+ }
+
+ public function retrieveSafely($key)
+ {
+ if (array_key_exists($key, static::$safeStorage[$this->hash])) {
+ return static::$safeStorage[$this->hash][$key];
+ }
+ }
+
+ public function __destruct()
+ {
+ unset(static::$safeStorage[$this->hash]);
+ }
+}
diff --git a/vendor/league/flysystem/src/UnreadableFileException.php b/vendor/league/flysystem/src/UnreadableFileException.php
new file mode 100644
index 0000000000..e66803383f
--- /dev/null
+++ b/vendor/league/flysystem/src/UnreadableFileException.php
@@ -0,0 +1,18 @@
+getRealPath()
+ )
+ );
+ }
+}
diff --git a/vendor/league/flysystem/src/Util.php b/vendor/league/flysystem/src/Util.php
new file mode 100644
index 0000000000..46dad86f15
--- /dev/null
+++ b/vendor/league/flysystem/src/Util.php
@@ -0,0 +1,348 @@
+ ''];
+ }
+
+ /**
+ * Normalize a dirname return value.
+ *
+ * @param string $dirname
+ *
+ * @return string normalized dirname
+ */
+ public static function normalizeDirname($dirname)
+ {
+ return $dirname === '.' ? '' : $dirname;
+ }
+
+ /**
+ * Get a normalized dirname from a path.
+ *
+ * @param string $path
+ *
+ * @return string dirname
+ */
+ public static function dirname($path)
+ {
+ return static::normalizeDirname(dirname($path));
+ }
+
+ /**
+ * Map result arrays.
+ *
+ * @param array $object
+ * @param array $map
+ *
+ * @return array mapped result
+ */
+ public static function map(array $object, array $map)
+ {
+ $result = [];
+
+ foreach ($map as $from => $to) {
+ if ( ! isset($object[$from])) {
+ continue;
+ }
+
+ $result[$to] = $object[$from];
+ }
+
+ return $result;
+ }
+
+ /**
+ * Normalize path.
+ *
+ * @param string $path
+ *
+ * @throws LogicException
+ *
+ * @return string
+ */
+ public static function normalizePath($path)
+ {
+ return static::normalizeRelativePath($path);
+ }
+
+ /**
+ * Normalize relative directories in a path.
+ *
+ * @param string $path
+ *
+ * @throws LogicException
+ *
+ * @return string
+ */
+ public static function normalizeRelativePath($path)
+ {
+ $path = str_replace('\\', '/', $path);
+ $path = static::removeFunkyWhiteSpace($path);
+
+ $parts = [];
+
+ foreach (explode('/', $path) as $part) {
+ switch ($part) {
+ case '':
+ case '.':
+ break;
+
+ case '..':
+ if (empty($parts)) {
+ throw new LogicException(
+ 'Path is outside of the defined root, path: [' . $path . ']'
+ );
+ }
+ array_pop($parts);
+ break;
+
+ default:
+ $parts[] = $part;
+ break;
+ }
+ }
+
+ return implode('/', $parts);
+ }
+
+ /**
+ * Removes unprintable characters and invalid unicode characters.
+ *
+ * @param string $path
+ *
+ * @return string $path
+ */
+ protected static function removeFunkyWhiteSpace($path) {
+ // We do this check in a loop, since removing invalid unicode characters
+ // can lead to new characters being created.
+ while (preg_match('#\p{C}+|^\./#u', $path)) {
+ $path = preg_replace('#\p{C}+|^\./#u', '', $path);
+ }
+
+ return $path;
+ }
+
+ /**
+ * Normalize prefix.
+ *
+ * @param string $prefix
+ * @param string $separator
+ *
+ * @return string normalized path
+ */
+ public static function normalizePrefix($prefix, $separator)
+ {
+ return rtrim($prefix, $separator) . $separator;
+ }
+
+ /**
+ * Get content size.
+ *
+ * @param string $contents
+ *
+ * @return int content size
+ */
+ public static function contentSize($contents)
+ {
+ return defined('MB_OVERLOAD_STRING') ? mb_strlen($contents, '8bit') : strlen($contents);
+ }
+
+ /**
+ * Guess MIME Type based on the path of the file and it's content.
+ *
+ * @param string $path
+ * @param string|resource $content
+ *
+ * @return string|null MIME Type or NULL if no extension detected
+ */
+ public static function guessMimeType($path, $content)
+ {
+ $mimeType = MimeType::detectByContent($content);
+
+ if ( ! (empty($mimeType) || in_array($mimeType, ['application/x-empty', 'text/plain', 'text/x-asm']))) {
+ return $mimeType;
+ }
+
+ return MimeType::detectByFilename($path);
+ }
+
+ /**
+ * Emulate directories.
+ *
+ * @param array $listing
+ *
+ * @return array listing with emulated directories
+ */
+ public static function emulateDirectories(array $listing)
+ {
+ $directories = [];
+ $listedDirectories = [];
+
+ foreach ($listing as $object) {
+ list($directories, $listedDirectories) = static::emulateObjectDirectories($object, $directories, $listedDirectories);
+ }
+
+ $directories = array_diff(array_unique($directories), array_unique($listedDirectories));
+
+ foreach ($directories as $directory) {
+ $listing[] = static::pathinfo($directory) + ['type' => 'dir'];
+ }
+
+ return $listing;
+ }
+
+ /**
+ * Ensure a Config instance.
+ *
+ * @param null|array|Config $config
+ *
+ * @return Config config instance
+ *
+ * @throw LogicException
+ */
+ public static function ensureConfig($config)
+ {
+ if ($config === null) {
+ return new Config();
+ }
+
+ if ($config instanceof Config) {
+ return $config;
+ }
+
+ if (is_array($config)) {
+ return new Config($config);
+ }
+
+ throw new LogicException('A config should either be an array or a Flysystem\Config object.');
+ }
+
+ /**
+ * Rewind a stream.
+ *
+ * @param resource $resource
+ */
+ public static function rewindStream($resource)
+ {
+ if (ftell($resource) !== 0 && static::isSeekableStream($resource)) {
+ rewind($resource);
+ }
+ }
+
+ public static function isSeekableStream($resource)
+ {
+ $metadata = stream_get_meta_data($resource);
+
+ return $metadata['seekable'];
+ }
+
+ /**
+ * Get the size of a stream.
+ *
+ * @param resource $resource
+ *
+ * @return int stream size
+ */
+ public static function getStreamSize($resource)
+ {
+ $stat = fstat($resource);
+
+ return $stat['size'];
+ }
+
+ /**
+ * Emulate the directories of a single object.
+ *
+ * @param array $object
+ * @param array $directories
+ * @param array $listedDirectories
+ *
+ * @return array
+ */
+ protected static function emulateObjectDirectories(array $object, array $directories, array $listedDirectories)
+ {
+ if ($object['type'] === 'dir') {
+ $listedDirectories[] = $object['path'];
+ }
+
+ if (empty($object['dirname'])) {
+ return [$directories, $listedDirectories];
+ }
+
+ $parent = $object['dirname'];
+
+ while ( ! empty($parent) && ! in_array($parent, $directories)) {
+ $directories[] = $parent;
+ $parent = static::dirname($parent);
+ }
+
+ if (isset($object['type']) && $object['type'] === 'dir') {
+ $listedDirectories[] = $object['path'];
+
+ return [$directories, $listedDirectories];
+ }
+
+ return [$directories, $listedDirectories];
+ }
+
+ /**
+ * Returns the trailing name component of the path.
+ *
+ * @param string $path
+ *
+ * @return string
+ */
+ private static function basename($path)
+ {
+ $separators = DIRECTORY_SEPARATOR === '/' ? '/' : '\/';
+
+ $path = rtrim($path, $separators);
+
+ $basename = preg_replace('#.*?([^' . preg_quote($separators, '#') . ']+$)#', '$1', $path);
+
+ if (DIRECTORY_SEPARATOR === '/') {
+ return $basename;
+ }
+ // @codeCoverageIgnoreStart
+ // Extra Windows path munging. This is tested via AppVeyor, but code
+ // coverage is not reported.
+
+ // Handle relative paths with drive letters. c:file.txt.
+ while (preg_match('#^[a-zA-Z]{1}:[^\\\/]#', $basename)) {
+ $basename = substr($basename, 2);
+ }
+
+ // Remove colon for standalone drive letter names.
+ if (preg_match('#^[a-zA-Z]{1}:$#', $basename)) {
+ $basename = rtrim($basename, ':');
+ }
+
+ return $basename;
+ // @codeCoverageIgnoreEnd
+ }
+}
diff --git a/vendor/league/flysystem/src/Util/ContentListingFormatter.php b/vendor/league/flysystem/src/Util/ContentListingFormatter.php
new file mode 100644
index 0000000000..5a8c95a8d9
--- /dev/null
+++ b/vendor/league/flysystem/src/Util/ContentListingFormatter.php
@@ -0,0 +1,116 @@
+directory = $directory;
+ $this->recursive = $recursive;
+ }
+
+ /**
+ * Format contents listing.
+ *
+ * @param array $listing
+ *
+ * @return array
+ */
+ public function formatListing(array $listing)
+ {
+ $listing = array_values(
+ array_map(
+ [$this, 'addPathInfo'],
+ array_filter($listing, [$this, 'isEntryOutOfScope'])
+ )
+ );
+
+ return $this->sortListing($listing);
+ }
+
+ private function addPathInfo(array $entry)
+ {
+ return $entry + Util::pathinfo($entry['path']);
+ }
+
+ /**
+ * Determine if the entry is out of scope.
+ *
+ * @param array $entry
+ *
+ * @return bool
+ */
+ private function isEntryOutOfScope(array $entry)
+ {
+ if (empty($entry['path']) && $entry['path'] !== '0') {
+ return false;
+ }
+
+ if ($this->recursive) {
+ return $this->residesInDirectory($entry);
+ }
+
+ return $this->isDirectChild($entry);
+ }
+
+ /**
+ * Check if the entry resides within the parent directory.
+ *
+ * @param array $entry
+ *
+ * @return bool
+ */
+ private function residesInDirectory(array $entry)
+ {
+ if ($this->directory === '') {
+ return true;
+ }
+
+ return strpos($entry['path'], $this->directory . '/') === 0;
+ }
+
+ /**
+ * Check if the entry is a direct child of the directory.
+ *
+ * @param array $entry
+ *
+ * @return bool
+ */
+ private function isDirectChild(array $entry)
+ {
+ return Util::dirname($entry['path']) === $this->directory;
+ }
+
+ /**
+ * @param array $listing
+ *
+ * @return array
+ */
+ private function sortListing(array $listing)
+ {
+ usort($listing, function ($a, $b) {
+ return strcasecmp($a['path'], $b['path']);
+ });
+
+ return $listing;
+ }
+}
diff --git a/vendor/league/flysystem/src/Util/MimeType.php b/vendor/league/flysystem/src/Util/MimeType.php
new file mode 100644
index 0000000000..69e35e729a
--- /dev/null
+++ b/vendor/league/flysystem/src/Util/MimeType.php
@@ -0,0 +1,232 @@
+buffer($content) ?: null;
+ // @codeCoverageIgnoreStart
+ } catch( ErrorException $e ) {
+ // This is caused by an array to string conversion error.
+ }
+ } // @codeCoverageIgnoreEnd
+
+ /**
+ * Detects MIME Type based on file extension.
+ *
+ * @param string $extension
+ *
+ * @return string|null MIME Type or NULL if no extension detected
+ */
+ public static function detectByFileExtension($extension)
+ {
+ static $extensionToMimeTypeMap;
+
+ if (! $extensionToMimeTypeMap) {
+ $extensionToMimeTypeMap = static::getExtensionToMimeTypeMap();
+ }
+
+ if (isset($extensionToMimeTypeMap[$extension])) {
+ return $extensionToMimeTypeMap[$extension];
+ }
+
+ return 'text/plain';
+ }
+
+ /**
+ * @param string $filename
+ *
+ * @return string|null MIME Type or NULL if no extension detected
+ */
+ public static function detectByFilename($filename)
+ {
+ $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
+
+ return empty($extension) ? 'text/plain' : static::detectByFileExtension($extension);
+ }
+
+ /**
+ * @return array Map of file extension to MIME Type
+ */
+ public static function getExtensionToMimeTypeMap()
+ {
+ return [
+ 'hqx' => 'application/mac-binhex40',
+ 'cpt' => 'application/mac-compactpro',
+ 'csv' => 'text/x-comma-separated-values',
+ 'bin' => 'application/octet-stream',
+ 'dms' => 'application/octet-stream',
+ 'lha' => 'application/octet-stream',
+ 'lzh' => 'application/octet-stream',
+ 'exe' => 'application/octet-stream',
+ 'class' => 'application/octet-stream',
+ 'psd' => 'application/x-photoshop',
+ 'so' => 'application/octet-stream',
+ 'sea' => 'application/octet-stream',
+ 'dll' => 'application/octet-stream',
+ 'oda' => 'application/oda',
+ 'pdf' => 'application/pdf',
+ 'ai' => 'application/pdf',
+ 'eps' => 'application/postscript',
+ 'ps' => 'application/postscript',
+ 'smi' => 'application/smil',
+ 'smil' => 'application/smil',
+ 'mif' => 'application/vnd.mif',
+ 'xls' => 'application/vnd.ms-excel',
+ 'ppt' => 'application/powerpoint',
+ 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+ 'wbxml' => 'application/wbxml',
+ 'wmlc' => 'application/wmlc',
+ 'dcr' => 'application/x-director',
+ 'dir' => 'application/x-director',
+ 'dxr' => 'application/x-director',
+ 'dvi' => 'application/x-dvi',
+ 'gtar' => 'application/x-gtar',
+ 'gz' => 'application/x-gzip',
+ 'gzip' => 'application/x-gzip',
+ 'php' => 'application/x-httpd-php',
+ 'php4' => 'application/x-httpd-php',
+ 'php3' => 'application/x-httpd-php',
+ 'phtml' => 'application/x-httpd-php',
+ 'phps' => 'application/x-httpd-php-source',
+ 'js' => 'application/javascript',
+ 'swf' => 'application/x-shockwave-flash',
+ 'sit' => 'application/x-stuffit',
+ 'tar' => 'application/x-tar',
+ 'tgz' => 'application/x-tar',
+ 'z' => 'application/x-compress',
+ 'xhtml' => 'application/xhtml+xml',
+ 'xht' => 'application/xhtml+xml',
+ 'zip' => 'application/x-zip',
+ 'rar' => 'application/x-rar',
+ 'mid' => 'audio/midi',
+ 'midi' => 'audio/midi',
+ 'mpga' => 'audio/mpeg',
+ 'mp2' => 'audio/mpeg',
+ 'mp3' => 'audio/mpeg',
+ 'aif' => 'audio/x-aiff',
+ 'aiff' => 'audio/x-aiff',
+ 'aifc' => 'audio/x-aiff',
+ 'ram' => 'audio/x-pn-realaudio',
+ 'rm' => 'audio/x-pn-realaudio',
+ 'rpm' => 'audio/x-pn-realaudio-plugin',
+ 'ra' => 'audio/x-realaudio',
+ 'rv' => 'video/vnd.rn-realvideo',
+ 'wav' => 'audio/x-wav',
+ 'jpg' => 'image/jpeg',
+ 'jpeg' => 'image/jpeg',
+ 'jpe' => 'image/jpeg',
+ 'png' => 'image/png',
+ 'gif' => 'image/gif',
+ 'bmp' => 'image/bmp',
+ 'tiff' => 'image/tiff',
+ 'tif' => 'image/tiff',
+ 'svg' => 'image/svg+xml',
+ 'css' => 'text/css',
+ 'html' => 'text/html',
+ 'htm' => 'text/html',
+ 'shtml' => 'text/html',
+ 'txt' => 'text/plain',
+ 'text' => 'text/plain',
+ 'log' => 'text/plain',
+ 'rtx' => 'text/richtext',
+ 'rtf' => 'text/rtf',
+ 'xml' => 'application/xml',
+ 'xsl' => 'application/xml',
+ 'dmn' => 'application/octet-stream',
+ 'bpmn' => 'application/octet-stream',
+ 'mpeg' => 'video/mpeg',
+ 'mpg' => 'video/mpeg',
+ 'mpe' => 'video/mpeg',
+ 'qt' => 'video/quicktime',
+ 'mov' => 'video/quicktime',
+ 'avi' => 'video/x-msvideo',
+ 'movie' => 'video/x-sgi-movie',
+ 'doc' => 'application/msword',
+ 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+ 'docm' => 'application/vnd.ms-word.template.macroEnabled.12',
+ 'dot' => 'application/msword',
+ 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+ 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+ 'word' => 'application/msword',
+ 'xl' => 'application/excel',
+ 'eml' => 'message/rfc822',
+ 'json' => 'application/json',
+ 'pem' => 'application/x-x509-user-cert',
+ 'p10' => 'application/x-pkcs10',
+ 'p12' => 'application/x-pkcs12',
+ 'p7a' => 'application/x-pkcs7-signature',
+ 'p7c' => 'application/pkcs7-mime',
+ 'p7m' => 'application/pkcs7-mime',
+ 'p7r' => 'application/x-pkcs7-certreqresp',
+ 'p7s' => 'application/pkcs7-signature',
+ 'crt' => 'application/x-x509-ca-cert',
+ 'crl' => 'application/pkix-crl',
+ 'der' => 'application/x-x509-ca-cert',
+ 'kdb' => 'application/octet-stream',
+ 'pgp' => 'application/pgp',
+ 'gpg' => 'application/gpg-keys',
+ 'sst' => 'application/octet-stream',
+ 'csr' => 'application/octet-stream',
+ 'rsa' => 'application/x-pkcs7',
+ 'cer' => 'application/pkix-cert',
+ '3g2' => 'video/3gpp2',
+ '3gp' => 'video/3gp',
+ 'mp4' => 'video/mp4',
+ 'm4a' => 'audio/x-m4a',
+ 'f4v' => 'video/mp4',
+ 'webm' => 'video/webm',
+ 'aac' => 'audio/x-acc',
+ 'm4u' => 'application/vnd.mpegurl',
+ 'm3u' => 'text/plain',
+ 'xspf' => 'application/xspf+xml',
+ 'vlc' => 'application/videolan',
+ 'wmv' => 'video/x-ms-wmv',
+ 'au' => 'audio/x-au',
+ 'ac3' => 'audio/ac3',
+ 'flac' => 'audio/x-flac',
+ 'ogg' => 'audio/ogg',
+ 'kmz' => 'application/vnd.google-earth.kmz',
+ 'kml' => 'application/vnd.google-earth.kml+xml',
+ 'ics' => 'text/calendar',
+ 'zsh' => 'text/x-scriptzsh',
+ '7zip' => 'application/x-7z-compressed',
+ 'cdr' => 'application/cdr',
+ 'wma' => 'audio/x-ms-wma',
+ 'jar' => 'application/java-archive',
+ 'tex' => 'application/x-tex',
+ 'latex' => 'application/x-latex',
+ 'odt' => 'application/vnd.oasis.opendocument.text',
+ 'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
+ 'odp' => 'application/vnd.oasis.opendocument.presentation',
+ 'odg' => 'application/vnd.oasis.opendocument.graphics',
+ 'odc' => 'application/vnd.oasis.opendocument.chart',
+ 'odf' => 'application/vnd.oasis.opendocument.formula',
+ 'odi' => 'application/vnd.oasis.opendocument.image',
+ 'odm' => 'application/vnd.oasis.opendocument.text-master',
+ 'odb' => 'application/vnd.oasis.opendocument.database',
+ 'ott' => 'application/vnd.oasis.opendocument.text-template',
+ ];
+ }
+}
diff --git a/vendor/league/flysystem/src/Util/StreamHasher.php b/vendor/league/flysystem/src/Util/StreamHasher.php
new file mode 100644
index 0000000000..938ec5db71
--- /dev/null
+++ b/vendor/league/flysystem/src/Util/StreamHasher.php
@@ -0,0 +1,36 @@
+algo = $algo;
+ }
+
+ /**
+ * @param resource $resource
+ *
+ * @return string
+ */
+ public function hash($resource)
+ {
+ rewind($resource);
+ $context = hash_init($this->algo);
+ hash_update_stream($context, $resource);
+ fclose($resource);
+
+ return hash_final($context);
+ }
+}
diff --git a/vendor/league/oauth1-client/.scrutinizer.yml b/vendor/league/oauth1-client/.scrutinizer.yml
new file mode 100644
index 0000000000..1d352e5bfe
--- /dev/null
+++ b/vendor/league/oauth1-client/.scrutinizer.yml
@@ -0,0 +1,35 @@
+filter:
+ excluded_paths: [tests/*]
+checks:
+ php:
+ code_rating: true
+ remove_extra_empty_lines: true
+ remove_php_closing_tag: true
+ remove_trailing_whitespace: true
+ fix_use_statements:
+ remove_unused: true
+ preserve_multiple: false
+ preserve_blanklines: true
+ order_alphabetically: true
+ fix_php_opening_tag: true
+ fix_linefeed: true
+ fix_line_ending: true
+ fix_identation_4spaces: true
+ fix_doc_comments: true
+tools:
+ external_code_coverage:
+ timeout: 600
+ runs: 4
+ php_analyzer: true
+ php_code_coverage: false
+ php_code_sniffer:
+ config:
+ standard: PSR2
+ filter:
+ paths: ['src']
+ php_loc:
+ enabled: true
+ excluded_dirs: [vendor, tests]
+ php_cpd:
+ enabled: true
+ excluded_dirs: [vendor, tests]
diff --git a/vendor/league/oauth1-client/.travis.yml b/vendor/league/oauth1-client/.travis.yml
new file mode 100644
index 0000000000..0644d45ba7
--- /dev/null
+++ b/vendor/league/oauth1-client/.travis.yml
@@ -0,0 +1,22 @@
+language: php
+
+php:
+ - 5.3
+ - 5.4
+ - 5.5
+ - 5.6
+ - 7.0
+ - hhvm
+
+before_script:
+ - travis_retry composer self-update
+ - travis_retry composer install --no-interaction --prefer-source --dev
+ - travis_retry phpenv rehash
+
+script:
+ - ./vendor/bin/phpcs --standard=psr2 src/
+ - ./vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover
+
+after_script:
+ - if [ "$TRAVIS_PHP_VERSION" != "hhvm" ] && [ "$TRAVIS_PHP_VERSION" != "7.0" ]; then wget https://scrutinizer-ci.com/ocular.phar; fi
+ - if [ "$TRAVIS_PHP_VERSION" != "hhvm" ] && [ "$TRAVIS_PHP_VERSION" != "7.0" ]; then php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi
diff --git a/vendor/league/oauth1-client/CONDUCT.md b/vendor/league/oauth1-client/CONDUCT.md
new file mode 100644
index 0000000000..6ff94ca3a4
--- /dev/null
+++ b/vendor/league/oauth1-client/CONDUCT.md
@@ -0,0 +1,22 @@
+# Contributor Code of Conduct
+
+As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
+
+We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, or nationality.
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery
+* Personal attacks
+* Trolling or insulting/derogatory comments
+* Public or private harassment
+* Publishing other's private information, such as physical or electronic addresses, without explicit permission
+* Other unethical or unprofessional conduct.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. By adopting this Code of Conduct, project maintainers commit themselves to fairly and consistently applying these principles to every aspect of managing this project. Project maintainers who do not follow or enforce the Code of Conduct may be permanently removed from the project team.
+
+This code of conduct applies both within project spaces and in public spaces when an individual is representing the project or its community in a direct capacity. Personal views, beliefs and values of individuals do not necessarily reflect those of the organisation or affiliated individuals and organisations.
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
+
+This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0, available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/)
diff --git a/vendor/league/oauth1-client/CONTRIBUTING.md b/vendor/league/oauth1-client/CONTRIBUTING.md
new file mode 100644
index 0000000000..576bb1f35e
--- /dev/null
+++ b/vendor/league/oauth1-client/CONTRIBUTING.md
@@ -0,0 +1,32 @@
+# Contributing
+
+Contributions are **welcome** and will be fully **credited**.
+
+We accept contributions via Pull Requests on [Github](https://github.com/thephpleague/oauth1-client).
+
+
+## Pull Requests
+
+- **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** - The easiest way to apply the conventions is to install [PHP Code Sniffer](http://pear.php.net/package/PHP_CodeSniffer).
+
+- **Add tests!** - Your patch won't be accepted if it doesn't have tests.
+
+- **Document any change in behaviour** - Make sure the README and any other relevant documentation are kept up-to-date.
+
+- **Consider our release cycle** - We try to follow semver. Randomly breaking public APIs is not an option.
+
+- **Create topic branches** - Don't ask us to pull from your master branch.
+
+- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests.
+
+- **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please squash them before submitting.
+
+
+## Running Tests
+
+``` bash
+$ phpunit
+```
+
+
+**Happy coding**!
diff --git a/vendor/league/oauth1-client/LICENSE b/vendor/league/oauth1-client/LICENSE
new file mode 100644
index 0000000000..922a514183
--- /dev/null
+++ b/vendor/league/oauth1-client/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2013 Ben Corlett
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/league/oauth1-client/README.md b/vendor/league/oauth1-client/README.md
new file mode 100644
index 0000000000..550718d89b
--- /dev/null
+++ b/vendor/league/oauth1-client/README.md
@@ -0,0 +1,260 @@
+# OAuth 1.0 Client
+
+[![Latest Stable Version](https://img.shields.io/github/release/thephpleague/oauth1-client.svg?style=flat-square)](https://github.com/thephpleague/oauth1-client/releases)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE.md)
+[![Build Status](https://img.shields.io/travis/thephpleague/oauth1-client/master.svg?style=flat-square&1)](https://travis-ci.org/thephpleague/oauth1-client)
+[![Coverage Status](https://img.shields.io/scrutinizer/coverage/g/thephpleague/oauth1-client.svg?style=flat-square)](https://scrutinizer-ci.com/g/thephpleague/oauth1-client/code-structure)
+[![Quality Score](https://img.shields.io/scrutinizer/g/thephpleague/oauth1-client.svg?style=flat-square)](https://scrutinizer-ci.com/g/thephpleague/oauth1-client)
+[![Total Downloads](https://img.shields.io/packagist/dt/league/oauth1-client.svg?style=flat-square)](https://packagist.org/packages/thephpleague/oauth1-client)
+
+OAuth 1 Client is an OAuth [RFC 5849 standards-compliant](http://tools.ietf.org/html/rfc5849) library for authenticating against OAuth 1 servers.
+
+It has built in support for:
+
+- Bitbucket
+- Trello
+- Tumblr
+- Twitter
+- Xing
+
+Adding support for other providers is trivial. The library requires PHP 5.3+ and is PSR-2 compatible.
+
+### Third-Party Providers
+
+If you would like to support other providers, please make them available as a Composer package, then link to them
+below.
+
+These providers allow integration with other providers not supported by `oauth1-client`. They may require an older version
+so please help them out with a pull request if you notice this.
+
+- [Intuit](https://packagist.org/packages/wheniwork/oauth1-intuit)
+- [500px](https://packagist.org/packages/mechant/oauth1-500px)
+- [Etsy](https://packagist.org/packages/y0lk/oauth1-etsy)
+- [Xero](https://packagist.org/packages/Invoiced/oauth1-xero)
+
+#### Terminology (as per the RFC 5849 specification):
+
+ client
+ An HTTP client (per [RFC2616]) capable of making OAuth-
+ authenticated requests (Section 3).
+
+ server
+ An HTTP server (per [RFC2616]) capable of accepting OAuth-
+ authenticated requests (Section 3).
+
+ protected resource
+ An access-restricted resource that can be obtained from the
+ server using an OAuth-authenticated request (Section 3).
+
+ resource owner
+ An entity capable of accessing and controlling protected
+ resources by using credentials to authenticate with the server.
+
+ credentials
+ Credentials are a pair of a unique identifier and a matching
+ shared secret. OAuth defines three classes of credentials:
+ client, temporary, and token, used to identify and authenticate
+ the client making the request, the authorization request, and
+ the access grant, respectively.
+
+ token
+ A unique identifier issued by the server and used by the client
+ to associate authenticated requests with the resource owner
+ whose authorization is requested or has been obtained by the
+ client. Tokens have a matching shared-secret that is used by
+ the client to establish its ownership of the token, and its
+ authority to represent the resource owner.
+
+ The original community specification used a somewhat different
+ terminology that maps to this specifications as follows (original
+ community terms provided on left):
+
+ Consumer: client
+
+ Service Provider: server
+
+ User: resource owner
+
+ Consumer Key and Secret: client credentials
+
+ Request Token and Secret: temporary credentials
+
+ Access Token and Secret: token credentials
+
+
+## Install
+
+Via Composer
+
+```shell
+$ composer require league/oauth1-client
+```
+
+
+## Usage
+
+### Bitbucket
+
+```php
+$server = new League\OAuth1\Client\Server\Bitbucket(array(
+ 'identifier' => 'your-identifier',
+ 'secret' => 'your-secret',
+ 'callback_uri' => "http://your-callback-uri/",
+));
+```
+
+### Trello
+
+```php
+$server = new League\OAuth1\Client\Server\Trello(array(
+ 'identifier' => 'your-identifier',
+ 'secret' => 'your-secret',
+ 'callback_uri' => 'http://your-callback-uri/',
+ 'name' => 'your-application-name', // optional, defaults to null
+ 'expiration' => 'your-application-expiration', // optional ('never', '1day', '2days'), defaults to '1day'
+ 'scope' => 'your-application-scope' // optional ('read', 'read,write'), defaults to 'read'
+));
+```
+
+### Tumblr
+
+```php
+$server = new League\OAuth1\Client\Server\Tumblr(array(
+ 'identifier' => 'your-identifier',
+ 'secret' => 'your-secret',
+ 'callback_uri' => "http://your-callback-uri/",
+));
+```
+
+### Twitter
+
+```php
+$server = new League\OAuth1\Client\Server\Twitter(array(
+ 'identifier' => 'your-identifier',
+ 'secret' => 'your-secret',
+ 'callback_uri' => "http://your-callback-uri/",
+));
+```
+
+### Xing
+
+```php
+$server = new League\OAuth1\Client\Server\Xing(array(
+ 'identifier' => 'your-consumer-key',
+ 'secret' => 'your-consumer-secret',
+ 'callback_uri' => "http://your-callback-uri/",
+));
+```
+
+### Showing a Login Button
+
+To begin, it's advisable that you include a login button on your website. Most servers (Twitter, Tumblr etc) have resources available for making buttons that are familiar to users. Some servers actually require you use their buttons as part of their terms.
+
+```html
+Login With Twitter
+```
+
+### Retrieving Temporary Credentials
+
+The first step to authenticating with OAuth 1 is to retrieve temporary credentials. These have been referred to as **request tokens** in earlier versions of OAuth 1.
+
+To do this, we'll retrieve and store temporary credentials in the session, and redirect the user to the server:
+
+```php
+// Retrieve temporary credentials
+$temporaryCredentials = $server->getTemporaryCredentials();
+
+// Store credentials in the session, we'll need them later
+$_SESSION['temporary_credentials'] = serialize($temporaryCredentials);
+session_write_close();
+
+// Second part of OAuth 1.0 authentication is to redirect the
+// resource owner to the login screen on the server.
+$server->authorize($temporaryCredentials);
+```
+
+The user will be redirected to the familiar login screen on the server, where they will login to their account and authorise your app to access their data.
+
+### Retrieving Token Credentials
+
+Once the user has authenticated (or denied) your application, they will be redirected to the `callback_uri` which you specified when creating the server.
+
+> Note, some servers (such as Twitter) require that the callback URI you specify when authenticating matches what you registered with their app. This is to stop a potential third party impersonating you. This is actually part of the protocol however some servers choose to ignore this.
+>
+> Because of this, we actually require you specify a callback URI for all servers, regardless of whether the server requires it or not. This is good practice.
+
+You'll need to handle when the user is redirected back. This will involve retrieving token credentials, which you may then use to make calls to the server on behalf of the user. These have been referred to as **access tokens** in earlier versions of OAuth 1.
+
+```php
+if (isset($_GET['oauth_token']) && isset($_GET['oauth_verifier'])) {
+ // Retrieve the temporary credentials we saved before
+ $temporaryCredentials = unserialize($_SESSION['temporary_credentials']);
+
+ // We will now retrieve token credentials from the server
+ $tokenCredentials = $server->getTokenCredentials($temporaryCredentials, $_GET['oauth_token'], $_GET['oauth_verifier']);
+}
+```
+
+Now, you may choose to do what you need with the token credentials. You may store them in a database, in the session, or use them as one-off and then forget about them.
+
+All credentials, (`client credentials`, `temporary credentials` and `token credentials`) all implement `League\OAuth1\Client\Credentials\CredentialsInterface` and have two sets of setters and getters exposed:
+
+```php
+var_dump($tokenCredentials->getIdentifier());
+var_dump($tokenCredentials->getSecret());
+```
+
+In earlier versions of OAuth 1, the token credentials identifier and token credentials secret were referred to as **access token** and **access token secret**. Don't be scared by the new terminology here - they are the same. This package is using the exact terminology in the RFC 5849 OAuth 1 standard.
+
+> Twitter will send back an error message in the `denied` query string parameter, allowing you to provide feedback. Some servers do not send back an error message, but rather do not provide the successful `oauth_token` and `oauth_verifier` parameters.
+
+### Accessing User Information
+
+Now you have token credentials stored somewhere, you may use them to make calls against the server, as an authenticated user.
+
+While this package is not intended to be a wrapper for every server's API, it does include basic methods that you may use to retrieve limited information. An example of where this may be useful is if you are using social logins, you only need limited information to confirm who the user is.
+
+The four exposed methods are:
+
+```php
+// User is an instance of League\OAuth1\Client\Server\User
+$user = $server->getUserDetails($tokenCredentials);
+
+// UID is a string / integer unique representation of the user
+$uid = $server->getUserUid($tokenCredentials);
+
+// Email is either a string or null (as some providers do not supply this data)
+$email = $server->getUserEmail($tokenCredentials);
+
+// Screen name is also known as a username (Twitter handle etc)
+$screenName = $server->getUserScreenName($tokenCredentials);
+```
+
+> `League\OAuth1\Client\Server\User` exposes a number of default public properties and also stores any additional data in an extra array - `$user->extra`. You may also iterate over a user's properties as if it was an array, `foreach ($user as $key => $value)`.
+
+## Examples
+
+Examples may be found under the [resources/examples](https://github.com/thephpleague/oauth1-client/tree/master/resources/examples) directory, which take the usage instructions here and go into a bit more depth. They are working examples that would only you substitute in your client credentials to have working.
+
+## Testing
+
+``` bash
+$ phpunit
+```
+
+
+## Contributing
+
+Please see [CONTRIBUTING](https://github.com/thephpleague/oauth1-client/blob/master/CONTRIBUTING.md) for details.
+
+
+## Credits
+
+- [Ben Corlett](https://github.com/bencorlett)
+- [Steven Maguire](https://github.com/stevenmaguire)
+- [All Contributors](https://github.com/thephpleague/oauth1-client/contributors)
+
+
+## License
+
+The MIT License (MIT). Please see [License File](https://github.com/thephpleague/oauth1-client/blob/master/LICENSE) for more information.
diff --git a/vendor/league/oauth1-client/composer.json b/vendor/league/oauth1-client/composer.json
new file mode 100644
index 0000000000..c4e1fae195
--- /dev/null
+++ b/vendor/league/oauth1-client/composer.json
@@ -0,0 +1,46 @@
+{
+ "name": "league/oauth1-client",
+ "description": "OAuth 1.0 Client Library",
+ "license": "MIT",
+ "require": {
+ "php": ">=5.5.0",
+ "guzzlehttp/guzzle": "^6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.0",
+ "mockery/mockery": "^0.9",
+ "squizlabs/php_codesniffer": "^2.0"
+ },
+ "keywords": [
+ "oauth",
+ "oauth1",
+ "authorization",
+ "authentication",
+ "idp",
+ "identity",
+ "sso",
+ "single sign on",
+ "bitbucket",
+ "trello",
+ "tumblr",
+ "twitter"
+ ],
+ "authors": [
+ {
+ "name": "Ben Corlett",
+ "email": "bencorlett@me.com",
+ "homepage": "http://www.webcomm.com.au",
+ "role": "Developer"
+ }
+ ],
+ "autoload": {
+ "psr-4": {
+ "League\\OAuth1\\": "src/"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ }
+}
diff --git a/vendor/league/oauth1-client/phpunit.xml b/vendor/league/oauth1-client/phpunit.xml
new file mode 100644
index 0000000000..d423c1d6e7
--- /dev/null
+++ b/vendor/league/oauth1-client/phpunit.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+ tests
+
+
+
+
+ ./src/
+
+
+
diff --git a/vendor/league/oauth1-client/resources/examples/tumblr.php b/vendor/league/oauth1-client/resources/examples/tumblr.php
new file mode 100644
index 0000000000..236914a7df
--- /dev/null
+++ b/vendor/league/oauth1-client/resources/examples/tumblr.php
@@ -0,0 +1,87 @@
+ 'your-identifier',
+ 'secret' => 'your-secret',
+ 'callback_uri' => "http://your-callback-uri/",
+));
+
+// Start session
+session_start();
+
+// Step 4
+if (isset($_GET['user'])) {
+
+ // Check somebody hasn't manually entered this URL in,
+ // by checking that we have the token credentials in
+ // the session.
+ if ( ! isset($_SESSION['token_credentials'])) {
+ echo 'No token credentials.';
+ exit(1);
+ }
+
+ // Retrieve our token credentials. From here, it's play time!
+ $tokenCredentials = unserialize($_SESSION['token_credentials']);
+
+ // // Below is an example of retrieving the identifier & secret
+ // // (formally known as access token key & secret in earlier
+ // // OAuth 1.0 specs).
+ // $identifier = $tokenCredentials->getIdentifier();
+ // $secret = $tokenCredentials->getSecret();
+
+ // Some OAuth clients try to act as an API wrapper for
+ // the server and it's API. We don't. This is what you
+ // get - the ability to access basic information. If
+ // you want to get fancy, you should be grabbing a
+ // package for interacting with the APIs, by using
+ // the identifier & secret that this package was
+ // designed to retrieve for you. But, for fun,
+ // here's basic user information.
+ $user = $server->getUserDetails($tokenCredentials);
+ var_dump($user);
+
+// Step 3
+} elseif (isset($_GET['oauth_token']) && isset($_GET['oauth_verifier'])) {
+
+ // Retrieve the temporary credentials from step 2
+ $temporaryCredentials = unserialize($_SESSION['temporary_credentials']);
+
+ // Third and final part to OAuth 1.0 authentication is to retrieve token
+ // credentials (formally known as access tokens in earlier OAuth 1.0
+ // specs).
+ $tokenCredentials = $server->getTokenCredentials($temporaryCredentials, $_GET['oauth_token'], $_GET['oauth_verifier']);
+
+ // Now, we'll store the token credentials and discard the temporary
+ // ones - they're irrelevant at this stage.
+ unset($_SESSION['temporary_credentials']);
+ $_SESSION['token_credentials'] = serialize($tokenCredentials);
+ session_write_close();
+
+ // Redirect to the user page
+ header("Location: http://{$_SERVER['HTTP_HOST']}/?user=user");
+ exit;
+
+// Step 2
+} elseif (isset($_GET['go'])) {
+
+ // First part of OAuth 1.0 authentication is retrieving temporary credentials.
+ // These identify you as a client to the server.
+ $temporaryCredentials = $server->getTemporaryCredentials();
+
+ // Store the credentials in the session.
+ $_SESSION['temporary_credentials'] = serialize($temporaryCredentials);
+ session_write_close();
+
+ // Second part of OAuth 1.0 authentication is to redirect the
+ // resource owner to the login screen on the server.
+ $server->authorize($temporaryCredentials);
+
+// Step 1
+} else {
+
+ // Display link to start process
+ echo 'Login';
+}
diff --git a/vendor/league/oauth1-client/resources/examples/twitter.php b/vendor/league/oauth1-client/resources/examples/twitter.php
new file mode 100644
index 0000000000..676def2b44
--- /dev/null
+++ b/vendor/league/oauth1-client/resources/examples/twitter.php
@@ -0,0 +1,91 @@
+ 'your-identifier',
+ 'secret' => 'your-secret',
+ 'callback_uri' => "http://your-callback-uri/",
+));
+
+// Start session
+session_start();
+
+// Step 4
+if (isset($_GET['user'])) {
+
+ // Check somebody hasn't manually entered this URL in,
+ // by checking that we have the token credentials in
+ // the session.
+ if ( ! isset($_SESSION['token_credentials'])) {
+ echo 'No token credentials.';
+ exit(1);
+ }
+
+ // Retrieve our token credentials. From here, it's play time!
+ $tokenCredentials = unserialize($_SESSION['token_credentials']);
+
+ // // Below is an example of retrieving the identifier & secret
+ // // (formally known as access token key & secret in earlier
+ // // OAuth 1.0 specs).
+ // $identifier = $tokenCredentials->getIdentifier();
+ // $secret = $tokenCredentials->getSecret();
+
+ // Some OAuth clients try to act as an API wrapper for
+ // the server and it's API. We don't. This is what you
+ // get - the ability to access basic information. If
+ // you want to get fancy, you should be grabbing a
+ // package for interacting with the APIs, by using
+ // the identifier & secret that this package was
+ // designed to retrieve for you. But, for fun,
+ // here's basic user information.
+ $user = $server->getUserDetails($tokenCredentials);
+ var_dump($user);
+
+// Step 3
+} elseif (isset($_GET['oauth_token']) && isset($_GET['oauth_verifier'])) {
+
+ // Retrieve the temporary credentials from step 2
+ $temporaryCredentials = unserialize($_SESSION['temporary_credentials']);
+
+ // Third and final part to OAuth 1.0 authentication is to retrieve token
+ // credentials (formally known as access tokens in earlier OAuth 1.0
+ // specs).
+ $tokenCredentials = $server->getTokenCredentials($temporaryCredentials, $_GET['oauth_token'], $_GET['oauth_verifier']);
+
+ // Now, we'll store the token credentials and discard the temporary
+ // ones - they're irrelevant at this stage.
+ unset($_SESSION['temporary_credentials']);
+ $_SESSION['token_credentials'] = serialize($tokenCredentials);
+ session_write_close();
+
+ // Redirect to the user page
+ header("Location: http://{$_SERVER['HTTP_HOST']}/?user=user");
+ exit;
+
+// Step 2.5 - denied request to authorize client
+} elseif (isset($_GET['denied'])) {
+ echo 'Hey! You denied the client access to your Twitter account! If you did this by mistake, you should try again.';
+
+// Step 2
+} elseif (isset($_GET['go'])) {
+
+ // First part of OAuth 1.0 authentication is retrieving temporary credentials.
+ // These identify you as a client to the server.
+ $temporaryCredentials = $server->getTemporaryCredentials();
+
+ // Store the credentials in the session.
+ $_SESSION['temporary_credentials'] = serialize($temporaryCredentials);
+ session_write_close();
+
+ // Second part of OAuth 1.0 authentication is to redirect the
+ // resource owner to the login screen on the server.
+ $server->authorize($temporaryCredentials);
+
+// Step 1
+} else {
+
+ // Display link to start process
+ echo 'Login';
+}
diff --git a/vendor/league/oauth1-client/resources/examples/xing.php b/vendor/league/oauth1-client/resources/examples/xing.php
new file mode 100644
index 0000000000..2ac0bd435f
--- /dev/null
+++ b/vendor/league/oauth1-client/resources/examples/xing.php
@@ -0,0 +1,91 @@
+ 'your-identifier',
+ 'secret' => 'your-secret',
+ 'callback_uri' => "http://your-callback-uri/",
+));
+
+// Start session
+session_start();
+
+// Step 4
+if (isset($_GET['user'])) {
+
+ // Check somebody hasn't manually entered this URL in,
+ // by checking that we have the token credentials in
+ // the session.
+ if ( ! isset($_SESSION['token_credentials'])) {
+ echo 'No token credentials.';
+ exit(1);
+ }
+
+ // Retrieve our token credentials. From here, it's play time!
+ $tokenCredentials = unserialize($_SESSION['token_credentials']);
+
+ // // Below is an example of retrieving the identifier & secret
+ // // (formally known as access token key & secret in earlier
+ // // OAuth 1.0 specs).
+ // $identifier = $tokenCredentials->getIdentifier();
+ // $secret = $tokenCredentials->getSecret();
+
+ // Some OAuth clients try to act as an API wrapper for
+ // the server and it's API. We don't. This is what you
+ // get - the ability to access basic information. If
+ // you want to get fancy, you should be grabbing a
+ // package for interacting with the APIs, by using
+ // the identifier & secret that this package was
+ // designed to retrieve for you. But, for fun,
+ // here's basic user information.
+ $user = $server->getUserDetails($tokenCredentials);
+ var_dump($user);
+
+// Step 3
+} elseif (isset($_GET['oauth_token']) && isset($_GET['oauth_verifier'])) {
+
+ // Retrieve the temporary credentials from step 2
+ $temporaryCredentials = unserialize($_SESSION['temporary_credentials']);
+
+ // Third and final part to OAuth 1.0 authentication is to retrieve token
+ // credentials (formally known as access tokens in earlier OAuth 1.0
+ // specs).
+ $tokenCredentials = $server->getTokenCredentials($temporaryCredentials, $_GET['oauth_token'], $_GET['oauth_verifier']);
+
+ // Now, we'll store the token credentials and discard the temporary
+ // ones - they're irrelevant at this stage.
+ unset($_SESSION['temporary_credentials']);
+ $_SESSION['token_credentials'] = serialize($tokenCredentials);
+ session_write_close();
+
+ // Redirect to the user page
+ header("Location: http://{$_SERVER['HTTP_HOST']}/?user=user");
+ exit;
+
+// Step 2.5 - denied request to authorize client
+} elseif (isset($_GET['denied'])) {
+ echo 'Hey! You denied the client access to your Xing account! If you did this by mistake, you should try again.';
+
+// Step 2
+} elseif (isset($_GET['go'])) {
+
+ // First part of OAuth 1.0 authentication is retrieving temporary credentials.
+ // These identify you as a client to the server.
+ $temporaryCredentials = $server->getTemporaryCredentials();
+
+ // Store the credentials in the session.
+ $_SESSION['temporary_credentials'] = serialize($temporaryCredentials);
+ session_write_close();
+
+ // Second part of OAuth 1.0 authentication is to redirect the
+ // resource owner to the login screen on the server.
+ $server->authorize($temporaryCredentials);
+
+// Step 1
+} else {
+
+ // Display link to start process
+ echo 'Login';
+}
diff --git a/vendor/league/oauth1-client/rfc5849.txt b/vendor/league/oauth1-client/rfc5849.txt
new file mode 100644
index 0000000000..636814d8d2
--- /dev/null
+++ b/vendor/league/oauth1-client/rfc5849.txt
@@ -0,0 +1,2131 @@
+
+
+
+
+
+
+Internet Engineering Task Force (IETF) E. Hammer-Lahav, Ed.
+Request for Comments: 5849 April 2010
+Category: Informational
+ISSN: 2070-1721
+
+
+ The OAuth 1.0 Protocol
+
+Abstract
+
+ OAuth provides a method for clients to access server resources on
+ behalf of a resource owner (such as a different client or an end-
+ user). It also provides a process for end-users to authorize third-
+ party access to their server resources without sharing their
+ credentials (typically, a username and password pair), using user-
+ agent redirections.
+
+Status of This Memo
+
+ This document is not an Internet Standards Track specification; it is
+ published for informational purposes.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Not all documents
+ approved by the IESG are a candidate for any level of Internet
+ Standard; see Section 2 of RFC 5741.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ http://www.rfc-editor.org/info/rfc5849.
+
+Copyright Notice
+
+ Copyright (c) 2010 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+
+Hammer-Lahav Informational [Page 1]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+Table of Contents
+
+ 1. Introduction ....................................................3
+ 1.1. Terminology ................................................4
+ 1.2. Example ....................................................5
+ 1.3. Notational Conventions .....................................7
+ 2. Redirection-Based Authorization .................................8
+ 2.1. Temporary Credentials ......................................9
+ 2.2. Resource Owner Authorization ..............................10
+ 2.3. Token Credentials .........................................12
+ 3. Authenticated Requests .........................................14
+ 3.1. Making Requests ...........................................14
+ 3.2. Verifying Requests ........................................16
+ 3.3. Nonce and Timestamp .......................................17
+ 3.4. Signature .................................................18
+ 3.4.1. Signature Base String ..............................18
+ 3.4.2. HMAC-SHA1 ..........................................25
+ 3.4.3. RSA-SHA1 ...........................................25
+ 3.4.4. PLAINTEXT ..........................................26
+ 3.5. Parameter Transmission ....................................26
+ 3.5.1. Authorization Header ...............................27
+ 3.5.2. Form-Encoded Body ..................................28
+ 3.5.3. Request URI Query ..................................28
+ 3.6. Percent Encoding ..........................................29
+ 4. Security Considerations ........................................29
+ 4.1. RSA-SHA1 Signature Method .................................29
+ 4.2. Confidentiality of Requests ...............................30
+ 4.3. Spoofing by Counterfeit Servers ...........................30
+ 4.4. Proxying and Caching of Authenticated Content .............30
+ 4.5. Plaintext Storage of Credentials ..........................30
+ 4.6. Secrecy of the Client Credentials .........................31
+ 4.7. Phishing Attacks ..........................................31
+ 4.8. Scoping of Access Requests ................................31
+ 4.9. Entropy of Secrets ........................................32
+ 4.10. Denial-of-Service / Resource-Exhaustion Attacks ..........32
+ 4.11. SHA-1 Cryptographic Attacks ..............................33
+ 4.12. Signature Base String Limitations ........................33
+ 4.13. Cross-Site Request Forgery (CSRF) ........................33
+ 4.14. User Interface Redress ...................................34
+ 4.15. Automatic Processing of Repeat Authorizations ............34
+ 5. Acknowledgments ................................................35
+ Appendix A. Differences from the Community Edition ...............36
+ 6. References .....................................................37
+ 6.1. Normative References ......................................37
+ 6.2. Informative References ....................................38
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 2]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+1. Introduction
+
+ The OAuth protocol was originally created by a small community of web
+ developers from a variety of websites and other Internet services who
+ wanted to solve the common problem of enabling delegated access to
+ protected resources. The resulting OAuth protocol was stabilized at
+ version 1.0 in October 2007, and revised in June 2009 (Revision A) as
+ published at .
+
+ This specification provides an informational documentation of OAuth
+ Core 1.0 Revision A, addresses several errata reported since that
+ time, and makes numerous editorial clarifications. While this
+ specification is not an item of the IETF's OAuth Working Group, which
+ at the time of writing is working on an OAuth version that can be
+ appropriate for publication on the standards track, it has been
+ transferred to the IETF for change control by authors of the original
+ work.
+
+ In the traditional client-server authentication model, the client
+ uses its credentials to access its resources hosted by the server.
+ With the increasing use of distributed web services and cloud
+ computing, third-party applications require access to these server-
+ hosted resources.
+
+ OAuth introduces a third role to the traditional client-server
+ authentication model: the resource owner. In the OAuth model, the
+ client (which is not the resource owner, but is acting on its behalf)
+ requests access to resources controlled by the resource owner, but
+ hosted by the server. In addition, OAuth allows the server to verify
+ not only the resource owner authorization, but also the identity of
+ the client making the request.
+
+ OAuth provides a method for clients to access server resources on
+ behalf of a resource owner (such as a different client or an end-
+ user). It also provides a process for end-users to authorize third-
+ party access to their server resources without sharing their
+ credentials (typically, a username and password pair), using user-
+ agent redirections.
+
+ For example, a web user (resource owner) can grant a printing service
+ (client) access to her private photos stored at a photo sharing
+ service (server), without sharing her username and password with the
+ printing service. Instead, she authenticates directly with the photo
+ sharing service which issues the printing service delegation-specific
+ credentials.
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 3]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ In order for the client to access resources, it first has to obtain
+ permission from the resource owner. This permission is expressed in
+ the form of a token and matching shared-secret. The purpose of the
+ token is to make it unnecessary for the resource owner to share its
+ credentials with the client. Unlike the resource owner credentials,
+ tokens can be issued with a restricted scope and limited lifetime,
+ and revoked independently.
+
+ This specification consists of two parts. The first part defines a
+ redirection-based user-agent process for end-users to authorize
+ client access to their resources, by authenticating directly with the
+ server and provisioning tokens to the client for use with the
+ authentication method. The second part defines a method for making
+ authenticated HTTP [RFC2616] requests using two sets of credentials,
+ one identifying the client making the request, and a second
+ identifying the resource owner on whose behalf the request is being
+ made.
+
+ The use of OAuth with any transport protocol other than [RFC2616] is
+ undefined.
+
+1.1. Terminology
+
+ client
+ An HTTP client (per [RFC2616]) capable of making OAuth-
+ authenticated requests (Section 3).
+
+ server
+ An HTTP server (per [RFC2616]) capable of accepting OAuth-
+ authenticated requests (Section 3).
+
+ protected resource
+ An access-restricted resource that can be obtained from the
+ server using an OAuth-authenticated request (Section 3).
+
+ resource owner
+ An entity capable of accessing and controlling protected
+ resources by using credentials to authenticate with the server.
+
+ credentials
+ Credentials are a pair of a unique identifier and a matching
+ shared secret. OAuth defines three classes of credentials:
+ client, temporary, and token, used to identify and authenticate
+ the client making the request, the authorization request, and
+ the access grant, respectively.
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 4]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ token
+ A unique identifier issued by the server and used by the client
+ to associate authenticated requests with the resource owner
+ whose authorization is requested or has been obtained by the
+ client. Tokens have a matching shared-secret that is used by
+ the client to establish its ownership of the token, and its
+ authority to represent the resource owner.
+
+ The original community specification used a somewhat different
+ terminology that maps to this specifications as follows (original
+ community terms provided on left):
+
+ Consumer: client
+
+ Service Provider: server
+
+ User: resource owner
+
+ Consumer Key and Secret: client credentials
+
+ Request Token and Secret: temporary credentials
+
+ Access Token and Secret: token credentials
+
+1.2. Example
+
+ Jane (resource owner) has recently uploaded some private vacation
+ photos (protected resources) to her photo sharing site
+ 'photos.example.net' (server). She would like to use the
+ 'printer.example.com' website (client) to print one of these photos.
+ Typically, Jane signs into 'photos.example.net' using her username
+ and password.
+
+ However, Jane does not wish to share her username and password with
+ the 'printer.example.com' website, which needs to access the photo in
+ order to print it. In order to provide its users with better
+ service, 'printer.example.com' has signed up for a set of
+ 'photos.example.net' client credentials ahead of time:
+
+ Client Identifier
+ dpf43f3p2l4k3l03
+
+ Client Shared-Secret:
+ kd94hf93k423kf44
+
+ The 'printer.example.com' website has also configured its application
+ to use the protocol endpoints listed in the 'photos.example.net' API
+ documentation, which use the "HMAC-SHA1" signature method:
+
+
+
+Hammer-Lahav Informational [Page 5]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ Temporary Credential Request
+ https://photos.example.net/initiate
+
+ Resource Owner Authorization URI:
+ https://photos.example.net/authorize
+
+ Token Request URI:
+ https://photos.example.net/token
+
+ Before 'printer.example.com' can ask Jane to grant it access to the
+ photos, it must first establish a set of temporary credentials with
+ 'photos.example.net' to identify the delegation request. To do so,
+ the client sends the following HTTPS [RFC2818] request to the server:
+
+ POST /initiate HTTP/1.1
+ Host: photos.example.net
+ Authorization: OAuth realm="Photos",
+ oauth_consumer_key="dpf43f3p2l4k3l03",
+ oauth_signature_method="HMAC-SHA1",
+ oauth_timestamp="137131200",
+ oauth_nonce="wIjqoS",
+ oauth_callback="http%3A%2F%2Fprinter.example.com%2Fready",
+ oauth_signature="74KNZJeDHnMBp0EMJ9ZHt%2FXKycU%3D"
+
+ The server validates the request and replies with a set of temporary
+ credentials in the body of the HTTP response (line breaks are for
+ display purposes only):
+
+ HTTP/1.1 200 OK
+ Content-Type: application/x-www-form-urlencoded
+
+ oauth_token=hh5s93j4hdidpola&oauth_token_secret=hdhd0244k9j7ao03&
+ oauth_callback_confirmed=true
+
+ The client redirects Jane's user-agent to the server's Resource Owner
+ Authorization endpoint to obtain Jane's approval for accessing her
+ private photos:
+
+ https://photos.example.net/authorize?oauth_token=hh5s93j4hdidpola
+
+ The server requests Jane to sign in using her username and password
+ and if successful, asks her to approve granting 'printer.example.com'
+ access to her private photos. Jane approves the request and her
+ user-agent is redirected to the callback URI provided by the client
+ in the previous request (line breaks are for display purposes only):
+
+ http://printer.example.com/ready?
+ oauth_token=hh5s93j4hdidpola&oauth_verifier=hfdp7dh39dks9884
+
+
+
+Hammer-Lahav Informational [Page 6]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ The callback request informs the client that Jane completed the
+ authorization process. The client then requests a set of token
+ credentials using its temporary credentials (over a secure Transport
+ Layer Security (TLS) channel):
+
+ POST /token HTTP/1.1
+ Host: photos.example.net
+ Authorization: OAuth realm="Photos",
+ oauth_consumer_key="dpf43f3p2l4k3l03",
+ oauth_token="hh5s93j4hdidpola",
+ oauth_signature_method="HMAC-SHA1",
+ oauth_timestamp="137131201",
+ oauth_nonce="walatlh",
+ oauth_verifier="hfdp7dh39dks9884",
+ oauth_signature="gKgrFCywp7rO0OXSjdot%2FIHF7IU%3D"
+
+ The server validates the request and replies with a set of token
+ credentials in the body of the HTTP response:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/x-www-form-urlencoded
+
+ oauth_token=nnch734d00sl2jdk&oauth_token_secret=pfkkdhi9sl3r4s00
+
+ With a set of token credentials, the client is now ready to request
+ the private photo:
+
+ GET /photos?file=vacation.jpg&size=original HTTP/1.1
+ Host: photos.example.net
+ Authorization: OAuth realm="Photos",
+ oauth_consumer_key="dpf43f3p2l4k3l03",
+ oauth_token="nnch734d00sl2jdk",
+ oauth_signature_method="HMAC-SHA1",
+ oauth_timestamp="137131202",
+ oauth_nonce="chapoH",
+ oauth_signature="MdpQcU8iPSUjWoN%2FUDMsK2sui9I%3D"
+
+ The 'photos.example.net' server validates the request and responds
+ with the requested photo. 'printer.example.com' is able to continue
+ accessing Jane's private photos using the same set of token
+ credentials for the duration of Jane's authorization, or until Jane
+ revokes access.
+
+1.3. Notational Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+
+
+Hammer-Lahav Informational [Page 7]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+2. Redirection-Based Authorization
+
+ OAuth uses tokens to represent the authorization granted to the
+ client by the resource owner. Typically, token credentials are
+ issued by the server at the resource owner's request, after
+ authenticating the resource owner's identity (usually using a
+ username and password).
+
+ There are many ways in which a server can facilitate the provisioning
+ of token credentials. This section defines one such way, using HTTP
+ redirections and the resource owner's user-agent. This redirection-
+ based authorization method includes three steps:
+
+ 1. The client obtains a set of temporary credentials from the server
+ (in the form of an identifier and shared-secret). The temporary
+ credentials are used to identify the access request throughout
+ the authorization process.
+
+ 2. The resource owner authorizes the server to grant the client's
+ access request (identified by the temporary credentials).
+
+ 3. The client uses the temporary credentials to request a set of
+ token credentials from the server, which will enable it to access
+ the resource owner's protected resources.
+
+ The server MUST revoke the temporary credentials after being used
+ once to obtain the token credentials. It is RECOMMENDED that the
+ temporary credentials have a limited lifetime. Servers SHOULD enable
+ resource owners to revoke token credentials after they have been
+ issued to clients.
+
+ In order for the client to perform these steps, the server needs to
+ advertise the URIs of the following three endpoints:
+
+ Temporary Credential Request
+ The endpoint used by the client to obtain a set of temporary
+ credentials as described in Section 2.1.
+
+ Resource Owner Authorization
+ The endpoint to which the resource owner is redirected to grant
+ authorization as described in Section 2.2.
+
+ Token Request
+ The endpoint used by the client to request a set of token
+ credentials using the set of temporary credentials as described
+ in Section 2.3.
+
+
+
+
+
+Hammer-Lahav Informational [Page 8]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ The three URIs advertised by the server MAY include a query component
+ as defined by [RFC3986], Section 3, but if present, the query MUST
+ NOT contain any parameters beginning with the "oauth_" prefix, to
+ avoid conflicts with the protocol parameters added to the URIs when
+ used.
+
+ The methods in which the server advertises and documents its three
+ endpoints are beyond the scope of this specification. Clients should
+ avoid making assumptions about the size of tokens and other server-
+ generated values, which are left undefined by this specification. In
+ addition, protocol parameters MAY include values that require
+ encoding when transmitted. Clients and servers should not make
+ assumptions about the possible range of their values.
+
+2.1. Temporary Credentials
+
+ The client obtains a set of temporary credentials from the server by
+ making an authenticated (Section 3) HTTP "POST" request to the
+ Temporary Credential Request endpoint (unless the server advertises
+ another HTTP request method for the client to use). The client
+ constructs a request URI by adding the following REQUIRED parameter
+ to the request (in addition to the other protocol parameters, using
+ the same parameter transmission method):
+
+ oauth_callback: An absolute URI back to which the server will
+ redirect the resource owner when the Resource Owner
+ Authorization step (Section 2.2) is completed. If
+ the client is unable to receive callbacks or a
+ callback URI has been established via other means,
+ the parameter value MUST be set to "oob" (case
+ sensitive), to indicate an out-of-band
+ configuration.
+
+ Servers MAY specify additional parameters.
+
+ When making the request, the client authenticates using only the
+ client credentials. The client MAY omit the empty "oauth_token"
+ protocol parameter from the request and MUST use the empty string as
+ the token secret value.
+
+ Since the request results in the transmission of plain text
+ credentials in the HTTP response, the server MUST require the use of
+ a transport-layer mechanisms such as TLS or Secure Socket Layer (SSL)
+ (or a secure channel with equivalent protections).
+
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 9]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ For example, the client makes the following HTTPS request:
+
+ POST /request_temp_credentials HTTP/1.1
+ Host: server.example.com
+ Authorization: OAuth realm="Example",
+ oauth_consumer_key="jd83jd92dhsh93js",
+ oauth_signature_method="PLAINTEXT",
+ oauth_callback="http%3A%2F%2Fclient.example.net%2Fcb%3Fx%3D1",
+ oauth_signature="ja893SD9%26"
+
+ The server MUST verify (Section 3.2) the request and if valid,
+ respond back to the client with a set of temporary credentials (in
+ the form of an identifier and shared-secret). The temporary
+ credentials are included in the HTTP response body using the
+ "application/x-www-form-urlencoded" content type as defined by
+ [W3C.REC-html40-19980424] with a 200 status code (OK).
+
+ The response contains the following REQUIRED parameters:
+
+ oauth_token
+ The temporary credentials identifier.
+
+ oauth_token_secret
+ The temporary credentials shared-secret.
+
+ oauth_callback_confirmed
+ MUST be present and set to "true". The parameter is used to
+ differentiate from previous versions of the protocol.
+
+ Note that even though the parameter names include the term 'token',
+ these credentials are not token credentials, but are used in the next
+ two steps in a similar manner to token credentials.
+
+ For example (line breaks are for display purposes only):
+
+ HTTP/1.1 200 OK
+ Content-Type: application/x-www-form-urlencoded
+
+ oauth_token=hdk48Djdsa&oauth_token_secret=xyz4992k83j47x0b&
+ oauth_callback_confirmed=true
+
+2.2. Resource Owner Authorization
+
+ Before the client requests a set of token credentials from the
+ server, it MUST send the user to the server to authorize the request.
+ The client constructs a request URI by adding the following REQUIRED
+ query parameter to the Resource Owner Authorization endpoint URI:
+
+
+
+
+Hammer-Lahav Informational [Page 10]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ oauth_token
+ The temporary credentials identifier obtained in Section 2.1 in
+ the "oauth_token" parameter. Servers MAY declare this
+ parameter as OPTIONAL, in which case they MUST provide a way
+ for the resource owner to indicate the identifier through other
+ means.
+
+ Servers MAY specify additional parameters.
+
+ The client directs the resource owner to the constructed URI using an
+ HTTP redirection response, or by other means available to it via the
+ resource owner's user-agent. The request MUST use the HTTP "GET"
+ method.
+
+ For example, the client redirects the resource owner's user-agent to
+ make the following HTTPS request:
+
+ GET /authorize_access?oauth_token=hdk48Djdsa HTTP/1.1
+ Host: server.example.com
+
+ The way in which the server handles the authorization request,
+ including whether it uses a secure channel such as TLS/SSL is beyond
+ the scope of this specification. However, the server MUST first
+ verify the identity of the resource owner.
+
+ When asking the resource owner to authorize the requested access, the
+ server SHOULD present to the resource owner information about the
+ client requesting access based on the association of the temporary
+ credentials with the client identity. When displaying any such
+ information, the server SHOULD indicate if the information has been
+ verified.
+
+ After receiving an authorization decision from the resource owner,
+ the server redirects the resource owner to the callback URI if one
+ was provided in the "oauth_callback" parameter or by other means.
+
+ To make sure that the resource owner granting access is the same
+ resource owner returning back to the client to complete the process,
+ the server MUST generate a verification code: an unguessable value
+ passed to the client via the resource owner and REQUIRED to complete
+ the process. The server constructs the request URI by adding the
+ following REQUIRED parameters to the callback URI query component:
+
+ oauth_token
+ The temporary credentials identifier received from the client.
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 11]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ oauth_verifier
+ The verification code.
+
+ If the callback URI already includes a query component, the server
+ MUST append the OAuth parameters to the end of the existing query.
+
+ For example, the server redirects the resource owner's user-agent to
+ make the following HTTP request:
+
+ GET /cb?x=1&oauth_token=hdk48Djdsa&oauth_verifier=473f82d3 HTTP/1.1
+ Host: client.example.net
+
+ If the client did not provide a callback URI, the server SHOULD
+ display the value of the verification code, and instruct the resource
+ owner to manually inform the client that authorization is completed.
+ If the server knows a client to be running on a limited device, it
+ SHOULD ensure that the verifier value is suitable for manual entry.
+
+2.3. Token Credentials
+
+ The client obtains a set of token credentials from the server by
+ making an authenticated (Section 3) HTTP "POST" request to the Token
+ Request endpoint (unless the server advertises another HTTP request
+ method for the client to use). The client constructs a request URI
+ by adding the following REQUIRED parameter to the request (in
+ addition to the other protocol parameters, using the same parameter
+ transmission method):
+
+ oauth_verifier
+ The verification code received from the server in the previous
+ step.
+
+ When making the request, the client authenticates using the client
+ credentials as well as the temporary credentials. The temporary
+ credentials are used as a substitute for token credentials in the
+ authenticated request and transmitted using the "oauth_token"
+ parameter.
+
+ Since the request results in the transmission of plain text
+ credentials in the HTTP response, the server MUST require the use of
+ a transport-layer mechanism such as TLS or SSL (or a secure channel
+ with equivalent protections).
+
+
+
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 12]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ For example, the client makes the following HTTPS request:
+
+ POST /request_token HTTP/1.1
+ Host: server.example.com
+ Authorization: OAuth realm="Example",
+ oauth_consumer_key="jd83jd92dhsh93js",
+ oauth_token="hdk48Djdsa",
+ oauth_signature_method="PLAINTEXT",
+ oauth_verifier="473f82d3",
+ oauth_signature="ja893SD9%26xyz4992k83j47x0b"
+
+ The server MUST verify (Section 3.2) the validity of the request,
+ ensure that the resource owner has authorized the provisioning of
+ token credentials to the client, and ensure that the temporary
+ credentials have not expired or been used before. The server MUST
+ also verify the verification code received from the client. If the
+ request is valid and authorized, the token credentials are included
+ in the HTTP response body using the
+ "application/x-www-form-urlencoded" content type as defined by
+ [W3C.REC-html40-19980424] with a 200 status code (OK).
+
+ The response contains the following REQUIRED parameters:
+
+ oauth_token
+ The token identifier.
+
+ oauth_token_secret
+ The token shared-secret.
+
+ For example:
+
+ HTTP/1.1 200 OK
+ Content-Type: application/x-www-form-urlencoded
+
+ oauth_token=j49ddk933skd9dks&oauth_token_secret=ll399dj47dskfjdk
+
+ The server must retain the scope, duration, and other attributes
+ approved by the resource owner, and enforce these restrictions when
+ receiving a client request made with the token credentials issued.
+
+ Once the client receives and stores the token credentials, it can
+ proceed to access protected resources on behalf of the resource owner
+ by making authenticated requests (Section 3) using the client
+ credentials together with the token credentials received.
+
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 13]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+3. Authenticated Requests
+
+ The HTTP authentication methods defined by [RFC2617] enable clients
+ to make authenticated HTTP requests. Clients using these methods
+ gain access to protected resources by using their credentials
+ (typically, a username and password pair), which allow the server to
+ verify their authenticity. Using these methods for delegation
+ requires the client to assume the role of the resource owner.
+
+ OAuth provides a method designed to include two sets of credentials
+ with each request, one to identify the client, and another to
+ identify the resource owner. Before a client can make authenticated
+ requests on behalf of the resource owner, it must obtain a token
+ authorized by the resource owner. Section 2 provides one such method
+ through which the client can obtain a token authorized by the
+ resource owner.
+
+ The client credentials take the form of a unique identifier and an
+ associated shared-secret or RSA key pair. Prior to making
+ authenticated requests, the client establishes a set of credentials
+ with the server. The process and requirements for provisioning these
+ are outside the scope of this specification. Implementers are urged
+ to consider the security ramifications of using client credentials,
+ some of which are described in Section 4.6.
+
+ Making authenticated requests requires prior knowledge of the
+ server's configuration. OAuth includes multiple methods for
+ transmitting protocol parameters with requests (Section 3.5), as well
+ as multiple methods for the client to prove its rightful ownership of
+ the credentials used (Section 3.4). The way in which clients
+ discover the required configuration is outside the scope of this
+ specification.
+
+3.1. Making Requests
+
+ An authenticated request includes several protocol parameters. Each
+ parameter name begins with the "oauth_" prefix, and the parameter
+ names and values are case sensitive. Clients make authenticated
+ requests by calculating the values of a set of protocol parameters
+ and adding them to the HTTP request as follows:
+
+ 1. The client assigns value to each of these REQUIRED (unless
+ specified otherwise) protocol parameters:
+
+
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 14]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ oauth_consumer_key
+ The identifier portion of the client credentials (equivalent to
+ a username). The parameter name reflects a deprecated term
+ (Consumer Key) used in previous revisions of the specification,
+ and has been retained to maintain backward compatibility.
+
+ oauth_token
+ The token value used to associate the request with the resource
+ owner. If the request is not associated with a resource owner
+ (no token available), clients MAY omit the parameter.
+
+ oauth_signature_method
+ The name of the signature method used by the client to sign the
+ request, as defined in Section 3.4.
+
+ oauth_timestamp
+ The timestamp value as defined in Section 3.3. The parameter
+ MAY be omitted when using the "PLAINTEXT" signature method.
+
+ oauth_nonce
+ The nonce value as defined in Section 3.3. The parameter MAY
+ be omitted when using the "PLAINTEXT" signature method.
+
+ oauth_version
+ OPTIONAL. If present, MUST be set to "1.0". Provides the
+ version of the authentication process as defined in this
+ specification.
+
+ 2. The protocol parameters are added to the request using one of the
+ transmission methods listed in Section 3.5. Each parameter MUST
+ NOT appear more than once per request.
+
+ 3. The client calculates and assigns the value of the
+ "oauth_signature" parameter as described in Section 3.4 and adds
+ the parameter to the request using the same method as in the
+ previous step.
+
+ 4. The client sends the authenticated HTTP request to the server.
+
+ For example, to make the following HTTP request authenticated (the
+ "c2&a3=2+q" string in the following examples is used to illustrate
+ the impact of a form-encoded entity-body):
+
+ POST /request?b5=%3D%253D&a3=a&c%40=&a2=r%20b HTTP/1.1
+ Host: example.com
+ Content-Type: application/x-www-form-urlencoded
+
+ c2&a3=2+q
+
+
+
+Hammer-Lahav Informational [Page 15]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ The client assigns values to the following protocol parameters using
+ its client credentials, token credentials, the current timestamp, a
+ uniquely generated nonce, and indicates that it will use the
+ "HMAC-SHA1" signature method:
+
+ oauth_consumer_key: 9djdj82h48djs9d2
+ oauth_token: kkk9d7dh3k39sjv7
+ oauth_signature_method: HMAC-SHA1
+ oauth_timestamp: 137131201
+ oauth_nonce: 7d8f3e4a
+
+ The client adds the protocol parameters to the request using the
+ OAuth HTTP "Authorization" header field:
+
+ Authorization: OAuth realm="Example",
+ oauth_consumer_key="9djdj82h48djs9d2",
+ oauth_token="kkk9d7dh3k39sjv7",
+ oauth_signature_method="HMAC-SHA1",
+ oauth_timestamp="137131201",
+ oauth_nonce="7d8f3e4a"
+
+ Then, it calculates the value of the "oauth_signature" parameter
+ (using client secret "j49sk3j29djd" and token secret "dh893hdasih9"),
+ adds it to the request, and sends the HTTP request to the server:
+
+ POST /request?b5=%3D%253D&a3=a&c%40=&a2=r%20b HTTP/1.1
+ Host: example.com
+ Content-Type: application/x-www-form-urlencoded
+ Authorization: OAuth realm="Example",
+ oauth_consumer_key="9djdj82h48djs9d2",
+ oauth_token="kkk9d7dh3k39sjv7",
+ oauth_signature_method="HMAC-SHA1",
+ oauth_timestamp="137131201",
+ oauth_nonce="7d8f3e4a",
+ oauth_signature="bYT5CMsGcbgUdFHObYMEfcx6bsw%3D"
+
+ c2&a3=2+q
+
+3.2. Verifying Requests
+
+ Servers receiving an authenticated request MUST validate it by:
+
+ o Recalculating the request signature independently as described in
+ Section 3.4 and comparing it to the value received from the client
+ via the "oauth_signature" parameter.
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 16]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ o If using the "HMAC-SHA1" or "RSA-SHA1" signature methods, ensuring
+ that the combination of nonce/timestamp/token (if present)
+ received from the client has not been used before in a previous
+ request (the server MAY reject requests with stale timestamps as
+ described in Section 3.3).
+
+ o If a token is present, verifying the scope and status of the
+ client authorization as represented by the token (the server MAY
+ choose to restrict token usage to the client to which it was
+ issued).
+
+ o If the "oauth_version" parameter is present, ensuring its value is
+ "1.0".
+
+ If the request fails verification, the server SHOULD respond with the
+ appropriate HTTP response status code. The server MAY include
+ further details about why the request was rejected in the response
+ body.
+
+ The server SHOULD return a 400 (Bad Request) status code when
+ receiving a request with unsupported parameters, an unsupported
+ signature method, missing parameters, or duplicated protocol
+ parameters. The server SHOULD return a 401 (Unauthorized) status
+ code when receiving a request with invalid client credentials, an
+ invalid or expired token, an invalid signature, or an invalid or used
+ nonce.
+
+3.3. Nonce and Timestamp
+
+ The timestamp value MUST be a positive integer. Unless otherwise
+ specified by the server's documentation, the timestamp is expressed
+ in the number of seconds since January 1, 1970 00:00:00 GMT.
+
+ A nonce is a random string, uniquely generated by the client to allow
+ the server to verify that a request has never been made before and
+ helps prevent replay attacks when requests are made over a non-secure
+ channel. The nonce value MUST be unique across all requests with the
+ same timestamp, client credentials, and token combinations.
+
+ To avoid the need to retain an infinite number of nonce values for
+ future checks, servers MAY choose to restrict the time period after
+ which a request with an old timestamp is rejected. Note that this
+ restriction implies a level of synchronization between the client's
+ and server's clocks. Servers applying such a restriction MAY provide
+ a way for the client to sync with the server's clock; alternatively,
+ both systems could synchronize with a trusted time service. Details
+ of clock synchronization strategies are beyond the scope of this
+ specification.
+
+
+
+Hammer-Lahav Informational [Page 17]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+3.4. Signature
+
+ OAuth-authenticated requests can have two sets of credentials: those
+ passed via the "oauth_consumer_key" parameter and those in the
+ "oauth_token" parameter. In order for the server to verify the
+ authenticity of the request and prevent unauthorized access, the
+ client needs to prove that it is the rightful owner of the
+ credentials. This is accomplished using the shared-secret (or RSA
+ key) part of each set of credentials.
+
+ OAuth provides three methods for the client to prove its rightful
+ ownership of the credentials: "HMAC-SHA1", "RSA-SHA1", and
+ "PLAINTEXT". These methods are generally referred to as signature
+ methods, even though "PLAINTEXT" does not involve a signature. In
+ addition, "RSA-SHA1" utilizes an RSA key instead of the shared-
+ secrets associated with the client credentials.
+
+ OAuth does not mandate a particular signature method, as each
+ implementation can have its own unique requirements. Servers are
+ free to implement and document their own custom methods.
+ Recommending any particular method is beyond the scope of this
+ specification. Implementers should review the Security
+ Considerations section (Section 4) before deciding on which method to
+ support.
+
+ The client declares which signature method is used via the
+ "oauth_signature_method" parameter. It then generates a signature
+ (or a string of an equivalent value) and includes it in the
+ "oauth_signature" parameter. The server verifies the signature as
+ specified for each method.
+
+ The signature process does not change the request or its parameters,
+ with the exception of the "oauth_signature" parameter.
+
+3.4.1. Signature Base String
+
+ The signature base string is a consistent, reproducible concatenation
+ of several of the HTTP request elements into a single string. The
+ string is used as an input to the "HMAC-SHA1" and "RSA-SHA1"
+ signature methods.
+
+ The signature base string includes the following components of the
+ HTTP request:
+
+ o The HTTP request method (e.g., "GET", "POST", etc.).
+
+ o The authority as declared by the HTTP "Host" request header field.
+
+
+
+
+Hammer-Lahav Informational [Page 18]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ o The path and query components of the request resource URI.
+
+ o The protocol parameters excluding the "oauth_signature".
+
+ o Parameters included in the request entity-body if they comply with
+ the strict restrictions defined in Section 3.4.1.3.
+
+ The signature base string does not cover the entire HTTP request.
+ Most notably, it does not include the entity-body in most requests,
+ nor does it include most HTTP entity-headers. It is important to
+ note that the server cannot verify the authenticity of the excluded
+ request components without using additional protections such as SSL/
+ TLS or other methods.
+
+3.4.1.1. String Construction
+
+ The signature base string is constructed by concatenating together,
+ in order, the following HTTP request elements:
+
+ 1. The HTTP request method in uppercase. For example: "HEAD",
+ "GET", "POST", etc. If the request uses a custom HTTP method, it
+ MUST be encoded (Section 3.6).
+
+ 2. An "&" character (ASCII code 38).
+
+ 3. The base string URI from Section 3.4.1.2, after being encoded
+ (Section 3.6).
+
+ 4. An "&" character (ASCII code 38).
+
+ 5. The request parameters as normalized in Section 3.4.1.3.2, after
+ being encoded (Section 3.6).
+
+ For example, the HTTP request:
+
+ POST /request?b5=%3D%253D&a3=a&c%40=&a2=r%20b HTTP/1.1
+ Host: example.com
+ Content-Type: application/x-www-form-urlencoded
+ Authorization: OAuth realm="Example",
+ oauth_consumer_key="9djdj82h48djs9d2",
+ oauth_token="kkk9d7dh3k39sjv7",
+ oauth_signature_method="HMAC-SHA1",
+ oauth_timestamp="137131201",
+ oauth_nonce="7d8f3e4a",
+ oauth_signature="bYT5CMsGcbgUdFHObYMEfcx6bsw%3D"
+
+ c2&a3=2+q
+
+
+
+
+Hammer-Lahav Informational [Page 19]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ is represented by the following signature base string (line breaks
+ are for display purposes only):
+
+ POST&http%3A%2F%2Fexample.com%2Frequest&a2%3Dr%2520b%26a3%3D2%2520q
+ %26a3%3Da%26b5%3D%253D%25253D%26c%2540%3D%26c2%3D%26oauth_consumer_
+ key%3D9djdj82h48djs9d2%26oauth_nonce%3D7d8f3e4a%26oauth_signature_m
+ ethod%3DHMAC-SHA1%26oauth_timestamp%3D137131201%26oauth_token%3Dkkk
+ 9d7dh3k39sjv7
+
+3.4.1.2. Base String URI
+
+ The scheme, authority, and path of the request resource URI [RFC3986]
+ are included by constructing an "http" or "https" URI representing
+ the request resource (without the query or fragment) as follows:
+
+ 1. The scheme and host MUST be in lowercase.
+
+ 2. The host and port values MUST match the content of the HTTP
+ request "Host" header field.
+
+ 3. The port MUST be included if it is not the default port for the
+ scheme, and MUST be excluded if it is the default. Specifically,
+ the port MUST be excluded when making an HTTP request [RFC2616]
+ to port 80 or when making an HTTPS request [RFC2818] to port 443.
+ All other non-default port numbers MUST be included.
+
+ For example, the HTTP request:
+
+ GET /r%20v/X?id=123 HTTP/1.1
+ Host: EXAMPLE.COM:80
+
+ is represented by the base string URI: "http://example.com/r%20v/X".
+
+ In another example, the HTTPS request:
+
+ GET /?q=1 HTTP/1.1
+ Host: www.example.net:8080
+
+ is represented by the base string URI:
+ "https://www.example.net:8080/".
+
+3.4.1.3. Request Parameters
+
+ In order to guarantee a consistent and reproducible representation of
+ the request parameters, the parameters are collected and decoded to
+ their original decoded form. They are then sorted and encoded in a
+ particular manner that is often different from their original
+ encoding scheme, and concatenated into a single string.
+
+
+
+Hammer-Lahav Informational [Page 20]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+3.4.1.3.1. Parameter Sources
+
+ The parameters from the following sources are collected into a single
+ list of name/value pairs:
+
+ o The query component of the HTTP request URI as defined by
+ [RFC3986], Section 3.4. The query component is parsed into a list
+ of name/value pairs by treating it as an
+ "application/x-www-form-urlencoded" string, separating the names
+ and values and decoding them as defined by
+ [W3C.REC-html40-19980424], Section 17.13.4.
+
+ o The OAuth HTTP "Authorization" header field (Section 3.5.1) if
+ present. The header's content is parsed into a list of name/value
+ pairs excluding the "realm" parameter if present. The parameter
+ values are decoded as defined by Section 3.5.1.
+
+ o The HTTP request entity-body, but only if all of the following
+ conditions are met:
+
+ * The entity-body is single-part.
+
+ * The entity-body follows the encoding requirements of the
+ "application/x-www-form-urlencoded" content-type as defined by
+ [W3C.REC-html40-19980424].
+
+ * The HTTP request entity-header includes the "Content-Type"
+ header field set to "application/x-www-form-urlencoded".
+
+ The entity-body is parsed into a list of decoded name/value pairs
+ as described in [W3C.REC-html40-19980424], Section 17.13.4.
+
+ The "oauth_signature" parameter MUST be excluded from the signature
+ base string if present. Parameters not explicitly included in the
+ request MUST be excluded from the signature base string (e.g., the
+ "oauth_version" parameter when omitted).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 21]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ For example, the HTTP request:
+
+ POST /request?b5=%3D%253D&a3=a&c%40=&a2=r%20b HTTP/1.1
+ Host: example.com
+ Content-Type: application/x-www-form-urlencoded
+ Authorization: OAuth realm="Example",
+ oauth_consumer_key="9djdj82h48djs9d2",
+ oauth_token="kkk9d7dh3k39sjv7",
+ oauth_signature_method="HMAC-SHA1",
+ oauth_timestamp="137131201",
+ oauth_nonce="7d8f3e4a",
+ oauth_signature="djosJKDKJSD8743243%2Fjdk33klY%3D"
+
+ c2&a3=2+q
+
+ contains the following (fully decoded) parameters used in the
+ signature base sting:
+
+ +------------------------+------------------+
+ | Name | Value |
+ +------------------------+------------------+
+ | b5 | =%3D |
+ | a3 | a |
+ | c@ | |
+ | a2 | r b |
+ | oauth_consumer_key | 9djdj82h48djs9d2 |
+ | oauth_token | kkk9d7dh3k39sjv7 |
+ | oauth_signature_method | HMAC-SHA1 |
+ | oauth_timestamp | 137131201 |
+ | oauth_nonce | 7d8f3e4a |
+ | c2 | |
+ | a3 | 2 q |
+ +------------------------+------------------+
+
+ Note that the value of "b5" is "=%3D" and not "==". Both "c@" and
+ "c2" have empty values. While the encoding rules specified in this
+ specification for the purpose of constructing the signature base
+ string exclude the use of a "+" character (ASCII code 43) to
+ represent an encoded space character (ASCII code 32), this practice
+ is widely used in "application/x-www-form-urlencoded" encoded values,
+ and MUST be properly decoded, as demonstrated by one of the "a3"
+ parameter instances (the "a3" parameter is used twice in this
+ request).
+
+
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 22]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+3.4.1.3.2. Parameters Normalization
+
+ The parameters collected in Section 3.4.1.3 are normalized into a
+ single string as follows:
+
+ 1. First, the name and value of each parameter are encoded
+ (Section 3.6).
+
+ 2. The parameters are sorted by name, using ascending byte value
+ ordering. If two or more parameters share the same name, they
+ are sorted by their value.
+
+ 3. The name of each parameter is concatenated to its corresponding
+ value using an "=" character (ASCII code 61) as a separator, even
+ if the value is empty.
+
+ 4. The sorted name/value pairs are concatenated together into a
+ single string by using an "&" character (ASCII code 38) as
+ separator.
+
+ For example, the list of parameters from the previous section would
+ be normalized as follows:
+
+ Encoded:
+
+ +------------------------+------------------+
+ | Name | Value |
+ +------------------------+------------------+
+ | b5 | %3D%253D |
+ | a3 | a |
+ | c%40 | |
+ | a2 | r%20b |
+ | oauth_consumer_key | 9djdj82h48djs9d2 |
+ | oauth_token | kkk9d7dh3k39sjv7 |
+ | oauth_signature_method | HMAC-SHA1 |
+ | oauth_timestamp | 137131201 |
+ | oauth_nonce | 7d8f3e4a |
+ | c2 | |
+ | a3 | 2%20q |
+ +------------------------+------------------+
+
+
+
+
+
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 23]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ Sorted:
+
+ +------------------------+------------------+
+ | Name | Value |
+ +------------------------+------------------+
+ | a2 | r%20b |
+ | a3 | 2%20q |
+ | a3 | a |
+ | b5 | %3D%253D |
+ | c%40 | |
+ | c2 | |
+ | oauth_consumer_key | 9djdj82h48djs9d2 |
+ | oauth_nonce | 7d8f3e4a |
+ | oauth_signature_method | HMAC-SHA1 |
+ | oauth_timestamp | 137131201 |
+ | oauth_token | kkk9d7dh3k39sjv7 |
+ +------------------------+------------------+
+
+ Concatenated Pairs:
+
+ +-------------------------------------+
+ | Name=Value |
+ +-------------------------------------+
+ | a2=r%20b |
+ | a3=2%20q |
+ | a3=a |
+ | b5=%3D%253D |
+ | c%40= |
+ | c2= |
+ | oauth_consumer_key=9djdj82h48djs9d2 |
+ | oauth_nonce=7d8f3e4a |
+ | oauth_signature_method=HMAC-SHA1 |
+ | oauth_timestamp=137131201 |
+ | oauth_token=kkk9d7dh3k39sjv7 |
+ +-------------------------------------+
+
+ and concatenated together into a single string (line breaks are for
+ display purposes only):
+
+ a2=r%20b&a3=2%20q&a3=a&b5=%3D%253D&c%40=&c2=&oauth_consumer_key=9dj
+ dj82h48djs9d2&oauth_nonce=7d8f3e4a&oauth_signature_method=HMAC-SHA1
+ &oauth_timestamp=137131201&oauth_token=kkk9d7dh3k39sjv7
+
+
+
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 24]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+3.4.2. HMAC-SHA1
+
+ The "HMAC-SHA1" signature method uses the HMAC-SHA1 signature
+ algorithm as defined in [RFC2104]:
+
+ digest = HMAC-SHA1 (key, text)
+
+ The HMAC-SHA1 function variables are used in following way:
+
+ text is set to the value of the signature base string from
+ Section 3.4.1.1.
+
+ key is set to the concatenated values of:
+
+ 1. The client shared-secret, after being encoded
+ (Section 3.6).
+
+ 2. An "&" character (ASCII code 38), which MUST be included
+ even when either secret is empty.
+
+ 3. The token shared-secret, after being encoded
+ (Section 3.6).
+
+ digest is used to set the value of the "oauth_signature" protocol
+ parameter, after the result octet string is base64-encoded
+ per [RFC2045], Section 6.8.
+
+3.4.3. RSA-SHA1
+
+ The "RSA-SHA1" signature method uses the RSASSA-PKCS1-v1_5 signature
+ algorithm as defined in [RFC3447], Section 8.2 (also known as
+ PKCS#1), using SHA-1 as the hash function for EMSA-PKCS1-v1_5. To
+ use this method, the client MUST have established client credentials
+ with the server that included its RSA public key (in a manner that is
+ beyond the scope of this specification).
+
+ The signature base string is signed using the client's RSA private
+ key per [RFC3447], Section 8.2.1:
+
+ S = RSASSA-PKCS1-V1_5-SIGN (K, M)
+
+ Where:
+
+ K is set to the client's RSA private key,
+
+ M is set to the value of the signature base string from
+ Section 3.4.1.1, and
+
+
+
+
+Hammer-Lahav Informational [Page 25]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ S is the result signature used to set the value of the
+ "oauth_signature" protocol parameter, after the result octet
+ string is base64-encoded per [RFC2045] section 6.8.
+
+ The server verifies the signature per [RFC3447] section 8.2.2:
+
+ RSASSA-PKCS1-V1_5-VERIFY ((n, e), M, S)
+
+ Where:
+
+ (n, e) is set to the client's RSA public key,
+
+ M is set to the value of the signature base string from
+ Section 3.4.1.1, and
+
+ S is set to the octet string value of the "oauth_signature"
+ protocol parameter received from the client.
+
+3.4.4. PLAINTEXT
+
+ The "PLAINTEXT" method does not employ a signature algorithm. It
+ MUST be used with a transport-layer mechanism such as TLS or SSL (or
+ sent over a secure channel with equivalent protections). It does not
+ utilize the signature base string or the "oauth_timestamp" and
+ "oauth_nonce" parameters.
+
+ The "oauth_signature" protocol parameter is set to the concatenated
+ value of:
+
+ 1. The client shared-secret, after being encoded (Section 3.6).
+
+ 2. An "&" character (ASCII code 38), which MUST be included even
+ when either secret is empty.
+
+ 3. The token shared-secret, after being encoded (Section 3.6).
+
+3.5. Parameter Transmission
+
+ When making an OAuth-authenticated request, protocol parameters as
+ well as any other parameter using the "oauth_" prefix SHALL be
+ included in the request using one and only one of the following
+ locations, listed in order of decreasing preference:
+
+ 1. The HTTP "Authorization" header field as described in
+ Section 3.5.1.
+
+ 2. The HTTP request entity-body as described in Section 3.5.2.
+
+
+
+
+Hammer-Lahav Informational [Page 26]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ 3. The HTTP request URI query as described in Section 3.5.3.
+
+ In addition to these three methods, future extensions MAY define
+ other methods for including protocol parameters in the request.
+
+3.5.1. Authorization Header
+
+ Protocol parameters can be transmitted using the HTTP "Authorization"
+ header field as defined by [RFC2617] with the auth-scheme name set to
+ "OAuth" (case insensitive).
+
+ For example:
+
+ Authorization: OAuth realm="Example",
+ oauth_consumer_key="0685bd9184jfhq22",
+ oauth_token="ad180jjd733klru7",
+ oauth_signature_method="HMAC-SHA1",
+ oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+ oauth_timestamp="137131200",
+ oauth_nonce="4572616e48616d6d65724c61686176",
+ oauth_version="1.0"
+
+ Protocol parameters SHALL be included in the "Authorization" header
+ field as follows:
+
+ 1. Parameter names and values are encoded per Parameter Encoding
+ (Section 3.6).
+
+ 2. Each parameter's name is immediately followed by an "=" character
+ (ASCII code 61), a """ character (ASCII code 34), the parameter
+ value (MAY be empty), and another """ character (ASCII code 34).
+
+ 3. Parameters are separated by a "," character (ASCII code 44) and
+ OPTIONAL linear whitespace per [RFC2617].
+
+ 4. The OPTIONAL "realm" parameter MAY be added and interpreted per
+ [RFC2617] section 1.2.
+
+ Servers MAY indicate their support for the "OAuth" auth-scheme by
+ returning the HTTP "WWW-Authenticate" response header field upon
+ client requests for protected resources. As per [RFC2617], such a
+ response MAY include additional HTTP "WWW-Authenticate" header
+ fields:
+
+ For example:
+
+ WWW-Authenticate: OAuth realm="http://server.example.com/"
+
+
+
+
+Hammer-Lahav Informational [Page 27]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+ The realm parameter defines a protection realm per [RFC2617], Section
+ 1.2.
+
+3.5.2. Form-Encoded Body
+
+ Protocol parameters can be transmitted in the HTTP request entity-
+ body, but only if the following REQUIRED conditions are met:
+
+ o The entity-body is single-part.
+
+ o The entity-body follows the encoding requirements of the
+ "application/x-www-form-urlencoded" content-type as defined by
+ [W3C.REC-html40-19980424].
+
+ o The HTTP request entity-header includes the "Content-Type" header
+ field set to "application/x-www-form-urlencoded".
+
+ For example (line breaks are for display purposes only):
+
+ oauth_consumer_key=0685bd9184jfhq22&oauth_token=ad180jjd733klr
+ u7&oauth_signature_method=HMAC-SHA1&oauth_signature=wOJIO9A2W5
+ mFwDgiDvZbTSMK%2FPY%3D&oauth_timestamp=137131200&oauth_nonce=4
+ 572616e48616d6d65724c61686176&oauth_version=1.0
+
+ The entity-body MAY include other request-specific parameters, in
+ which case, the protocol parameters SHOULD be appended following the
+ request-specific parameters, properly separated by an "&" character
+ (ASCII code 38).
+
+3.5.3. Request URI Query
+
+ Protocol parameters can be transmitted by being added to the HTTP
+ request URI as a query parameter as defined by [RFC3986], Section 3.
+
+ For example (line breaks are for display purposes only):
+
+ GET /example/path?oauth_consumer_key=0685bd9184jfhq22&
+ oauth_token=ad180jjd733klru7&oauth_signature_method=HM
+ AC-SHA1&oauth_signature=wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%
+ 3D&oauth_timestamp=137131200&oauth_nonce=4572616e48616
+ d6d65724c61686176&oauth_version=1.0 HTTP/1.1
+
+ The request URI MAY include other request-specific query parameters,
+ in which case, the protocol parameters SHOULD be appended following
+ the request-specific parameters, properly separated by an "&"
+ character (ASCII code 38).
+
+
+
+
+
+Hammer-Lahav Informational [Page 28]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+3.6. Percent Encoding
+
+ Existing percent-encoding methods do not guarantee a consistent
+ construction of the signature base string. The following percent-
+ encoding method is not defined to replace the existing encoding
+ methods defined by [RFC3986] and [W3C.REC-html40-19980424]. It is
+ used only in the construction of the signature base string and the
+ "Authorization" header field.
+
+ This specification defines the following method for percent-encoding
+ strings:
+
+ 1. Text values are first encoded as UTF-8 octets per [RFC3629] if
+ they are not already. This does not include binary values that
+ are not intended for human consumption.
+
+ 2. The values are then escaped using the [RFC3986] percent-encoding
+ (%XX) mechanism as follows:
+
+ * Characters in the unreserved character set as defined by
+ [RFC3986], Section 2.3 (ALPHA, DIGIT, "-", ".", "_", "~") MUST
+ NOT be encoded.
+
+ * All other characters MUST be encoded.
+
+ * The two hexadecimal characters used to represent encoded
+ characters MUST be uppercase.
+
+ This method is different from the encoding scheme used by the
+ "application/x-www-form-urlencoded" content-type (for example, it
+ encodes space characters as "%20" and not using the "+" character).
+ It MAY be different from the percent-encoding functions provided by
+ web-development frameworks (e.g., encode different characters, use
+ lowercase hexadecimal characters).
+
+4. Security Considerations
+
+ As stated in [RFC2617], the greatest sources of risks are usually
+ found not in the core protocol itself but in policies and procedures
+ surrounding its use. Implementers are strongly encouraged to assess
+ how this protocol addresses their security requirements.
+
+4.1. RSA-SHA1 Signature Method
+
+ Authenticated requests made with "RSA-SHA1" signatures do not use the
+ token shared-secret, or any provisioned client shared-secret. This
+ means the request relies completely on the secrecy of the private key
+ used by the client to sign requests.
+
+
+
+Hammer-Lahav Informational [Page 29]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+4.2. Confidentiality of Requests
+
+ While this protocol provides a mechanism for verifying the integrity
+ of requests, it provides no guarantee of request confidentiality.
+ Unless further precautions are taken, eavesdroppers will have full
+ access to request content. Servers should carefully consider the
+ kinds of data likely to be sent as part of such requests, and should
+ employ transport-layer security mechanisms to protect sensitive
+ resources.
+
+4.3. Spoofing by Counterfeit Servers
+
+ This protocol makes no attempt to verify the authenticity of the
+ server. A hostile party could take advantage of this by intercepting
+ the client's requests and returning misleading or otherwise incorrect
+ responses. Service providers should consider such attacks when
+ developing services using this protocol, and should require
+ transport-layer security for any requests where the authenticity of
+ the server or of request responses is an issue.
+
+4.4. Proxying and Caching of Authenticated Content
+
+ The HTTP Authorization scheme (Section 3.5.1) is optional. However,
+ [RFC2616] relies on the "Authorization" and "WWW-Authenticate" header
+ fields to distinguish authenticated content so that it can be
+ protected. Proxies and caches, in particular, may fail to adequately
+ protect requests not using these header fields.
+
+ For example, private authenticated content may be stored in (and thus
+ retrievable from) publicly accessible caches. Servers not using the
+ HTTP "Authorization" header field should take care to use other
+ mechanisms, such as the "Cache-Control" header field, to ensure that
+ authenticated content is protected.
+
+4.5. Plaintext Storage of Credentials
+
+ The client shared-secret and token shared-secret function the same
+ way passwords do in traditional authentication systems. In order to
+ compute the signatures used in methods other than "RSA-SHA1", the
+ server must have access to these secrets in plaintext form. This is
+ in contrast, for example, to modern operating systems, which store
+ only a one-way hash of user credentials.
+
+ If an attacker were to gain access to these secrets -- or worse, to
+ the server's database of all such secrets -- he or she would be able
+ to perform any action on behalf of any resource owner. Accordingly,
+ it is critical that servers protect these secrets from unauthorized
+ access.
+
+
+
+Hammer-Lahav Informational [Page 30]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+4.6. Secrecy of the Client Credentials
+
+ In many cases, the client application will be under the control of
+ potentially untrusted parties. For example, if the client is a
+ desktop application with freely available source code or an
+ executable binary, an attacker may be able to download a copy for
+ analysis. In such cases, attackers will be able to recover the
+ client credentials.
+
+ Accordingly, servers should not use the client credentials alone to
+ verify the identity of the client. Where possible, other factors
+ such as IP address should be used as well.
+
+4.7. Phishing Attacks
+
+ Wide deployment of this and similar protocols may cause resource
+ owners to become inured to the practice of being redirected to
+ websites where they are asked to enter their passwords. If resource
+ owners are not careful to verify the authenticity of these websites
+ before entering their credentials, it will be possible for attackers
+ to exploit this practice to steal resource owners' passwords.
+
+ Servers should attempt to educate resource owners about the risks
+ phishing attacks pose, and should provide mechanisms that make it
+ easy for resource owners to confirm the authenticity of their sites.
+ Client developers should consider the security implications of how
+ they interact with a user-agent (e.g., separate window, embedded),
+ and the ability of the end-user to verify the authenticity of the
+ server website.
+
+4.8. Scoping of Access Requests
+
+ By itself, this protocol does not provide any method for scoping the
+ access rights granted to a client. However, most applications do
+ require greater granularity of access rights. For example, servers
+ may wish to make it possible to grant access to some protected
+ resources but not others, or to grant only limited access (such as
+ read-only access) to those protected resources.
+
+ When implementing this protocol, servers should consider the types of
+ access resource owners may wish to grant clients, and should provide
+ mechanisms to do so. Servers should also take care to ensure that
+ resource owners understand the access they are granting, as well as
+ any risks that may be involved.
+
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 31]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+4.9. Entropy of Secrets
+
+ Unless a transport-layer security protocol is used, eavesdroppers
+ will have full access to authenticated requests and signatures, and
+ will thus be able to mount offline brute-force attacks to recover the
+ credentials used. Servers should be careful to assign shared-secrets
+ that are long enough, and random enough, to resist such attacks for
+ at least the length of time that the shared-secrets are valid.
+
+ For example, if shared-secrets are valid for two weeks, servers
+ should ensure that it is not possible to mount a brute force attack
+ that recovers the shared-secret in less than two weeks. Of course,
+ servers are urged to err on the side of caution, and use the longest
+ secrets reasonable.
+
+ It is equally important that the pseudo-random number generator
+ (PRNG) used to generate these secrets be of sufficiently high
+ quality. Many PRNG implementations generate number sequences that
+ may appear to be random, but that nevertheless exhibit patterns or
+ other weaknesses that make cryptanalysis or brute force attacks
+ easier. Implementers should be careful to use cryptographically
+ secure PRNGs to avoid these problems.
+
+4.10. Denial-of-Service / Resource-Exhaustion Attacks
+
+ This specification includes a number of features that may make
+ resource exhaustion attacks against servers possible. For example,
+ this protocol requires servers to track used nonces. If an attacker
+ is able to use many nonces quickly, the resources required to track
+ them may exhaust available capacity. And again, this protocol can
+ require servers to perform potentially expensive computations in
+ order to verify the signature on incoming requests. An attacker may
+ exploit this to perform a denial-of-service attack by sending a large
+ number of invalid requests to the server.
+
+ Resource Exhaustion attacks are by no means specific to this
+ specification. However, implementers should be careful to consider
+ the additional avenues of attack that this protocol exposes, and
+ design their implementations accordingly. For example, entropy
+ starvation typically results in either a complete denial of service
+ while the system waits for new entropy or else in weak (easily
+ guessable) secrets. When implementing this protocol, servers should
+ consider which of these presents a more serious risk for their
+ application and design accordingly.
+
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 32]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+4.11. SHA-1 Cryptographic Attacks
+
+ SHA-1, the hash algorithm used in "HMAC-SHA1" and "RSA-SHA1"
+ signature methods, has been shown to have a number of cryptographic
+ weaknesses that significantly reduce its resistance to collision
+ attacks. While these weaknesses do not seem to affect the use of
+ SHA-1 with the Hash-based Message Authentication Code (HMAC) and
+ should not affect the "HMAC-SHA1" signature method, it may affect the
+ use of the "RSA-SHA1" signature method. NIST has announced that it
+ will phase out use of SHA-1 in digital signatures by 2010
+ [NIST_SHA-1Comments].
+
+ Practically speaking, these weaknesses are difficult to exploit, and
+ by themselves do not pose a significant risk to users of this
+ protocol. They may, however, make more efficient attacks possible,
+ and servers should take this into account when considering whether
+ SHA-1 provides an adequate level of security for their applications.
+
+4.12. Signature Base String Limitations
+
+ The signature base string has been designed to support the signature
+ methods defined in this specification. Those designing additional
+ signature methods, should evaluated the compatibility of the
+ signature base string with their security requirements.
+
+ Since the signature base string does not cover the entire HTTP
+ request, such as most request entity-body, most entity-headers, and
+ the order in which parameters are sent, servers should employ
+ additional mechanisms to protect such elements.
+
+4.13. Cross-Site Request Forgery (CSRF)
+
+ Cross-Site Request Forgery (CSRF) is a web-based attack whereby HTTP
+ requests are transmitted from a user that the website trusts or has
+ authenticated. CSRF attacks on authorization approvals can allow an
+ attacker to obtain authorization to protected resources without the
+ consent of the User. Servers SHOULD strongly consider best practices
+ in CSRF prevention at all the protocol authorization endpoints.
+
+ CSRF attacks on OAuth callback URIs hosted by clients are also
+ possible. Clients should prevent CSRF attacks on OAuth callback URIs
+ by verifying that the resource owner at the client site intended to
+ complete the OAuth negotiation with the server. The methods for
+ preventing such CSRF attacks are beyond the scope of this
+ specification.
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 33]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+4.14. User Interface Redress
+
+ Servers should protect the authorization process against user
+ interface (UI) redress attacks (also known as "clickjacking"). As of
+ the time of this writing, no complete defenses against UI redress are
+ available. Servers can mitigate the risk of UI redress attacks using
+ the following techniques:
+
+ o JavaScript frame busting.
+
+ o JavaScript frame busting, and requiring that browsers have
+ JavaScript enabled on the authorization page.
+
+ o Browser-specific anti-framing techniques.
+
+ o Requiring password reentry before issuing OAuth tokens.
+
+4.15. Automatic Processing of Repeat Authorizations
+
+ Servers may wish to automatically process authorization requests
+ (Section 2.2) from clients that have been previously authorized by
+ the resource owner. When the resource owner is redirected to the
+ server to grant access, the server detects that the resource owner
+ has already granted access to that particular client. Instead of
+ prompting the resource owner for approval, the server automatically
+ redirects the resource owner back to the client.
+
+ If the client credentials are compromised, automatic processing
+ creates additional security risks. An attacker can use the stolen
+ client credentials to redirect the resource owner to the server with
+ an authorization request. The server will then grant access to the
+ resource owner's data without the resource owner's explicit approval,
+ or even awareness of an attack. If no automatic approval is
+ implemented, an attacker must use social engineering to convince the
+ resource owner to approve access.
+
+ Servers can mitigate the risks associated with automatic processing
+ by limiting the scope of token credentials obtained through automated
+ approvals. Tokens credentials obtained through explicit resource
+ owner consent can remain unaffected. Clients can mitigate the risks
+ associated with automatic processing by protecting their client
+ credentials.
+
+
+
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 34]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+5. Acknowledgments
+
+ This specification is directly based on the OAuth Core 1.0 Revision A
+ community specification, which in turn was modeled after existing
+ proprietary protocols and best practices that have been independently
+ implemented by various companies.
+
+ The community specification was edited by Eran Hammer-Lahav and
+ authored by: Mark Atwood, Dirk Balfanz, Darren Bounds, Richard M.
+ Conlan, Blaine Cook, Leah Culver, Breno de Medeiros, Brian Eaton,
+ Kellan Elliott-McCrea, Larry Halff, Eran Hammer-Lahav, Ben Laurie,
+ Chris Messina, John Panzer, Sam Quigley, David Recordon, Eran
+ Sandler, Jonathan Sergent, Todd Sieling, Brian Slesinsky, and Andy
+ Smith.
+
+ The editor would like to thank the following individuals for their
+ invaluable contribution to the publication of this edition of the
+ protocol: Lisa Dusseault, Justin Hart, Avshalom Houri, Chris Messina,
+ Mark Nottingham, Tim Polk, Peter Saint-Andre, Joseph Smarr, and Paul
+ Walker.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 35]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+Appendix A. Differences from the Community Edition
+
+ This specification includes the following changes made to the
+ original community document [OAuthCore1.0_RevisionA] in order to
+ correct mistakes and omissions identified since the document was
+ originally published at .
+
+ o Changed using TLS/SSL when sending or requesting plain text
+ credentials from SHOULD to MUST. This change affects any use of
+ the "PLAINTEXT" signature method, as well as requesting temporary
+ credentials (Section 2.1) and obtaining token credentials
+ (Section 2.3).
+
+ o Adjusted nonce language to indicate it is unique per token/
+ timestamp/client combination.
+
+ o Removed the requirement for timestamps to be equal to or greater
+ than the timestamp used in the previous request.
+
+ o Changed the nonce and timestamp parameters to OPTIONAL when using
+ the "PLAINTEXT" signature method.
+
+ o Extended signature base string coverage that includes
+ "application/x-www-form-urlencoded" entity-body parameters when
+ the HTTP method used is other than "POST" and URI query parameters
+ when the HTTP method used is other than "GET".
+
+ o Incorporated corrections to the instructions in each signature
+ method to encode the signature value before inserting it into the
+ "oauth_signature" parameter, removing errors that would have
+ caused double-encoded values.
+
+ o Allowed omitting the "oauth_token" parameter when empty.
+
+ o Permitted sending requests for temporary credentials with an empty
+ "oauth_token" parameter.
+
+ o Removed the restrictions from defining additional "oauth_"
+ parameters.
+
+
+
+
+
+
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 36]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+6. References
+
+6.1. Normative References
+
+ [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part One: Format of Internet Message
+ Bodies", RFC 2045, November 1996.
+
+ [RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed-
+ Hashing for Message Authentication", RFC 2104,
+ February 1997.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC2617] Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S.,
+ Leach, P., Luotonen, A., and L. Stewart, "HTTP
+ Authentication: Basic and Digest Access Authentication",
+ RFC 2617, June 1999.
+
+ [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000.
+
+ [RFC3447] Jonsson, J. and B. Kaliski, "Public-Key Cryptography
+ Standards (PKCS) #1: RSA Cryptography Specifications
+ Version 2.1", RFC 3447, February 2003.
+
+ [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO
+ 10646", STD 63, RFC 3629, November 2003.
+
+ [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
+ Resource Identifier (URI): Generic Syntax", STD 66,
+ RFC 3986, January 2005.
+
+ [W3C.REC-html40-19980424]
+ Hors, A., Raggett, D., and I. Jacobs, "HTML 4.0
+ Specification", World Wide Web Consortium
+ Recommendation REC-html40-19980424, April 1998,
+ .
+
+
+
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 37]
+
+RFC 5849 OAuth 1.0 April 2010
+
+
+6.2. Informative References
+
+ [NIST_SHA-1Comments]
+ Burr, W., "NIST Comments on Cryptanalytic Attacks on
+ SHA-1",
+ .
+
+ [OAuthCore1.0_RevisionA]
+ OAuth Community, "OAuth Core 1.0 Revision A",
+ .
+
+Author's Address
+
+ Eran Hammer-Lahav (editor)
+
+ EMail: eran@hueniverse.com
+ URI: http://hueniverse.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Hammer-Lahav Informational [Page 38]
+
diff --git a/vendor/league/oauth1-client/src/Client/Credentials/ClientCredentials.php b/vendor/league/oauth1-client/src/Client/Credentials/ClientCredentials.php
new file mode 100644
index 0000000000..3a977d4cc9
--- /dev/null
+++ b/vendor/league/oauth1-client/src/Client/Credentials/ClientCredentials.php
@@ -0,0 +1,29 @@
+callbackUri;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function setCallbackUri($callbackUri)
+ {
+ $this->callbackUri = $callbackUri;
+ }
+}
diff --git a/vendor/league/oauth1-client/src/Client/Credentials/ClientCredentialsInterface.php b/vendor/league/oauth1-client/src/Client/Credentials/ClientCredentialsInterface.php
new file mode 100644
index 0000000000..f50f97b3ec
--- /dev/null
+++ b/vendor/league/oauth1-client/src/Client/Credentials/ClientCredentialsInterface.php
@@ -0,0 +1,20 @@
+identifier;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function setIdentifier($identifier)
+ {
+ $this->identifier = $identifier;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getSecret()
+ {
+ return $this->secret;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function setSecret($secret)
+ {
+ $this->secret = $secret;
+ }
+}
diff --git a/vendor/league/oauth1-client/src/Client/Credentials/CredentialsException.php b/vendor/league/oauth1-client/src/Client/Credentials/CredentialsException.php
new file mode 100644
index 0000000000..b512eaa441
--- /dev/null
+++ b/vendor/league/oauth1-client/src/Client/Credentials/CredentialsException.php
@@ -0,0 +1,9 @@
+uid = $data['user']['username'];
+ $user->nickname = $data['user']['username'];
+ $user->name = $data['user']['display_name'];
+ $user->firstName = $data['user']['first_name'];
+ $user->lastName = $data['user']['last_name'];
+ $user->imageUrl = $data['user']['avatar'];
+
+ $used = array('username', 'display_name', 'avatar');
+
+ foreach ($data as $key => $value) {
+ if (strpos($key, 'url') !== false) {
+ if (!in_array($key, $used)) {
+ $used[] = $key;
+ }
+
+ $user->urls[$key] = $value;
+ }
+ }
+
+ // Save all extra data
+ $user->extra = array_diff_key($data, array_flip($used));
+
+ return $user;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userUid($data, TokenCredentials $tokenCredentials)
+ {
+ return $data['user']['username'];
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userEmail($data, TokenCredentials $tokenCredentials)
+ {
+ return;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userScreenName($data, TokenCredentials $tokenCredentials)
+ {
+ return $data['user']['display_name'];
+ }
+}
diff --git a/vendor/league/oauth1-client/src/Client/Server/Magento.php b/vendor/league/oauth1-client/src/Client/Server/Magento.php
new file mode 100644
index 0000000000..bd9e006dd9
--- /dev/null
+++ b/vendor/league/oauth1-client/src/Client/Server/Magento.php
@@ -0,0 +1,212 @@
+parseConfigurationArray($clientCredentials);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function urlTemporaryCredentials()
+ {
+ return $this->baseUri.'/oauth/initiate';
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function urlAuthorization()
+ {
+ return $this->isAdmin
+ ? $this->adminUrl
+ : $this->baseUri.'/oauth/authorize';
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function urlTokenCredentials()
+ {
+ return $this->baseUri.'/oauth/token';
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function urlUserDetails()
+ {
+ return $this->baseUri.'/api/rest/customers';
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userDetails($data, TokenCredentials $tokenCredentials)
+ {
+ if (!is_array($data) || !count($data)) {
+ throw new \Exception('Not possible to get user info');
+ }
+
+ $id = key($data);
+ $data = current($data);
+
+ $user = new User();
+ $user->uid = $id;
+
+ $mapping = array(
+ 'email' => 'email',
+ 'firstName' => 'firstname',
+ 'lastName' => 'lastname',
+ );
+ foreach ($mapping as $userKey => $dataKey) {
+ if (!isset($data[$dataKey])) {
+ continue;
+ }
+ $user->{$userKey} = $data[$dataKey];
+ }
+
+ $user->extra = array_diff_key($data, array_flip($mapping));
+
+ return $user;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userUid($data, TokenCredentials $tokenCredentials)
+ {
+ return key($data);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userEmail($data, TokenCredentials $tokenCredentials)
+ {
+ $data = current($data);
+ if (!isset($data['email'])) {
+ return;
+ }
+ return $data['email'];
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userScreenName($data, TokenCredentials $tokenCredentials)
+ {
+ return;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getTokenCredentials(TemporaryCredentials $temporaryCredentials, $temporaryIdentifier, $verifier)
+ {
+ $this->verifier = $verifier;
+
+ return parent::getTokenCredentials($temporaryCredentials, $temporaryIdentifier, $verifier);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function additionalProtocolParameters()
+ {
+ return array(
+ 'oauth_verifier' => $this->verifier,
+ );
+ }
+
+ protected function getHttpClientDefaultHeaders()
+ {
+ $defaultHeaders = parent::getHttpClientDefaultHeaders();
+ // Accept header is required, @see Mage_Api2_Model_Renderer::factory
+ $defaultHeaders['Accept'] = 'application/json';
+
+ return $defaultHeaders;
+ }
+
+ /**
+ * Parse configuration array to set attributes.
+ *
+ * @param array $configuration
+ * @throws \Exception
+ */
+ private function parseConfigurationArray(array $configuration = array())
+ {
+ if (!isset($configuration['host'])) {
+ throw new \Exception('Missing Magento Host');
+ }
+ $url = parse_url($configuration['host']);
+ $this->baseUri = sprintf('%s://%s', $url['scheme'], $url['host']);
+
+ if (isset($url['port'])) {
+ $this->baseUri .= ':'.$url['port'];
+ }
+
+ if (isset($url['path'])) {
+ $this->baseUri .= '/'.trim($url['path'], '/');
+ }
+ $this->isAdmin = !empty($configuration['admin']);
+ if (!empty($configuration['adminUrl'])) {
+ $this->adminUrl = $configuration['adminUrl'].'/oauth_authorize';
+ } else {
+ $this->adminUrl = $this->baseUri.'/admin/oauth_authorize';
+ }
+ }
+}
diff --git a/vendor/league/oauth1-client/src/Client/Server/Server.php b/vendor/league/oauth1-client/src/Client/Server/Server.php
new file mode 100644
index 0000000000..417688cba0
--- /dev/null
+++ b/vendor/league/oauth1-client/src/Client/Server/Server.php
@@ -0,0 +1,695 @@
+createClientCredentials($clientCredentials);
+ } elseif (!$clientCredentials instanceof ClientCredentialsInterface) {
+ throw new \InvalidArgumentException('Client credentials must be an array or valid object.');
+ }
+
+ $this->clientCredentials = $clientCredentials;
+ $this->signature = $signature ?: new HmacSha1Signature($clientCredentials);
+ }
+
+ /**
+ * Gets temporary credentials by performing a request to
+ * the server.
+ *
+ * @return TemporaryCredentials
+ */
+ public function getTemporaryCredentials()
+ {
+ $uri = $this->urlTemporaryCredentials();
+
+ $client = $this->createHttpClient();
+
+ $header = $this->temporaryCredentialsProtocolHeader($uri);
+ $authorizationHeader = array('Authorization' => $header);
+ $headers = $this->buildHttpClientHeaders($authorizationHeader);
+
+ try {
+ $response = $client->post($uri, [
+ 'headers' => $headers,
+ ]);
+ } catch (BadResponseException $e) {
+ return $this->handleTemporaryCredentialsBadResponse($e);
+ }
+
+ return $this->createTemporaryCredentials((string) $response->getBody());
+ }
+
+ /**
+ * Get the authorization URL by passing in the temporary credentials
+ * identifier or an object instance.
+ *
+ * @param TemporaryCredentials|string $temporaryIdentifier
+ *
+ * @return string
+ */
+ public function getAuthorizationUrl($temporaryIdentifier)
+ {
+ // Somebody can pass through an instance of temporary
+ // credentials and we'll extract the identifier from there.
+ if ($temporaryIdentifier instanceof TemporaryCredentials) {
+ $temporaryIdentifier = $temporaryIdentifier->getIdentifier();
+ }
+
+ $parameters = array('oauth_token' => $temporaryIdentifier);
+
+ $url = $this->urlAuthorization();
+ $queryString = http_build_query($parameters);
+
+ return $this->buildUrl($url, $queryString);
+ }
+
+ /**
+ * Redirect the client to the authorization URL.
+ *
+ * @param TemporaryCredentials|string $temporaryIdentifier
+ */
+ public function authorize($temporaryIdentifier)
+ {
+ $url = $this->getAuthorizationUrl($temporaryIdentifier);
+
+ header('Location: '.$url);
+
+ return;
+ }
+
+ /**
+ * Retrieves token credentials by passing in the temporary credentials,
+ * the temporary credentials identifier as passed back by the server
+ * and finally the verifier code.
+ *
+ * @param TemporaryCredentials $temporaryCredentials
+ * @param string $temporaryIdentifier
+ * @param string $verifier
+ *
+ * @return TokenCredentials
+ */
+ public function getTokenCredentials(TemporaryCredentials $temporaryCredentials, $temporaryIdentifier, $verifier)
+ {
+ if ($temporaryIdentifier !== $temporaryCredentials->getIdentifier()) {
+ throw new \InvalidArgumentException(
+ 'Temporary identifier passed back by server does not match that of stored temporary credentials.
+ Potential man-in-the-middle.'
+ );
+ }
+
+ $uri = $this->urlTokenCredentials();
+ $bodyParameters = array('oauth_verifier' => $verifier);
+
+ $client = $this->createHttpClient();
+
+ $headers = $this->getHeaders($temporaryCredentials, 'POST', $uri, $bodyParameters);
+
+ try {
+ $response = $client->post($uri, [
+ 'headers' => $headers,
+ 'form_params' => $bodyParameters,
+ ]);
+ } catch (BadResponseException $e) {
+ return $this->handleTokenCredentialsBadResponse($e);
+ }
+
+ return $this->createTokenCredentials((string) $response->getBody());
+ }
+
+ /**
+ * Get user details by providing valid token credentials.
+ *
+ * @param TokenCredentials $tokenCredentials
+ * @param bool $force
+ *
+ * @return \League\OAuth1\Client\Server\User
+ */
+ public function getUserDetails(TokenCredentials $tokenCredentials, $force = false)
+ {
+ $data = $this->fetchUserDetails($tokenCredentials, $force);
+
+ return $this->userDetails($data, $tokenCredentials);
+ }
+
+ /**
+ * Get the user's unique identifier (primary key).
+ *
+ * @param TokenCredentials $tokenCredentials
+ * @param bool $force
+ *
+ * @return string|int
+ */
+ public function getUserUid(TokenCredentials $tokenCredentials, $force = false)
+ {
+ $data = $this->fetchUserDetails($tokenCredentials, $force);
+
+ return $this->userUid($data, $tokenCredentials);
+ }
+
+ /**
+ * Get the user's email, if available.
+ *
+ * @param TokenCredentials $tokenCredentials
+ * @param bool $force
+ *
+ * @return string|null
+ */
+ public function getUserEmail(TokenCredentials $tokenCredentials, $force = false)
+ {
+ $data = $this->fetchUserDetails($tokenCredentials, $force);
+
+ return $this->userEmail($data, $tokenCredentials);
+ }
+
+ /**
+ * Get the user's screen name (username), if available.
+ *
+ * @param TokenCredentials $tokenCredentials
+ * @param bool $force
+ *
+ * @return string
+ */
+ public function getUserScreenName(TokenCredentials $tokenCredentials, $force = false)
+ {
+ $data = $this->fetchUserDetails($tokenCredentials, $force);
+
+ return $this->userScreenName($data, $tokenCredentials);
+ }
+
+ /**
+ * Fetch user details from the remote service.
+ *
+ * @param TokenCredentials $tokenCredentials
+ * @param bool $force
+ *
+ * @return array HTTP client response
+ */
+ protected function fetchUserDetails(TokenCredentials $tokenCredentials, $force = true)
+ {
+ if (!$this->cachedUserDetailsResponse || $force) {
+ $url = $this->urlUserDetails();
+
+ $client = $this->createHttpClient();
+
+ $headers = $this->getHeaders($tokenCredentials, 'GET', $url);
+
+ try {
+ $response = $client->get($url, [
+ 'headers' => $headers,
+ ]);
+ } catch (BadResponseException $e) {
+ $response = $e->getResponse();
+ $body = $response->getBody();
+ $statusCode = $response->getStatusCode();
+
+ throw new \Exception(
+ "Received error [$body] with status code [$statusCode] when retrieving token credentials."
+ );
+ }
+ switch ($this->responseType) {
+ case 'json':
+ $this->cachedUserDetailsResponse = json_decode((string) $response->getBody(), true);
+ break;
+
+ case 'xml':
+ $this->cachedUserDetailsResponse = simplexml_load_string((string) $response->getBody());
+ break;
+
+ case 'string':
+ parse_str((string) $response->getBody(), $this->cachedUserDetailsResponse);
+ break;
+
+ default:
+ throw new \InvalidArgumentException("Invalid response type [{$this->responseType}].");
+ }
+ }
+
+ return $this->cachedUserDetailsResponse;
+ }
+
+ /**
+ * Get the client credentials associated with the server.
+ *
+ * @return ClientCredentialsInterface
+ */
+ public function getClientCredentials()
+ {
+ return $this->clientCredentials;
+ }
+
+ /**
+ * Get the signature associated with the server.
+ *
+ * @return SignatureInterface
+ */
+ public function getSignature()
+ {
+ return $this->signature;
+ }
+
+ /**
+ * Creates a Guzzle HTTP client for the given URL.
+ *
+ * @return GuzzleHttpClient
+ */
+ public function createHttpClient()
+ {
+ return new GuzzleHttpClient();
+ }
+
+ /**
+ * Set the user agent value.
+ *
+ * @param string $userAgent
+ *
+ * @return Server
+ */
+ public function setUserAgent($userAgent = null)
+ {
+ $this->userAgent = $userAgent;
+
+ return $this;
+ }
+
+ /**
+ * Get all headers required to created an authenticated request.
+ *
+ * @param CredentialsInterface $credentials
+ * @param string $method
+ * @param string $url
+ * @param array $bodyParameters
+ *
+ * @return array
+ */
+ public function getHeaders(CredentialsInterface $credentials, $method, $url, array $bodyParameters = array())
+ {
+ $header = $this->protocolHeader(strtoupper($method), $url, $credentials, $bodyParameters);
+ $authorizationHeader = array('Authorization' => $header);
+ $headers = $this->buildHttpClientHeaders($authorizationHeader);
+
+ return $headers;
+ }
+
+ /**
+ * Get Guzzle HTTP client default headers.
+ *
+ * @return array
+ */
+ protected function getHttpClientDefaultHeaders()
+ {
+ $defaultHeaders = array();
+ if (!empty($this->userAgent)) {
+ $defaultHeaders['User-Agent'] = $this->userAgent;
+ }
+
+ return $defaultHeaders;
+ }
+
+ /**
+ * Build Guzzle HTTP client headers.
+ *
+ * @return array
+ */
+ protected function buildHttpClientHeaders($headers = array())
+ {
+ $defaultHeaders = $this->getHttpClientDefaultHeaders();
+
+ return array_merge($headers, $defaultHeaders);
+ }
+
+ /**
+ * Creates a client credentials instance from an array of credentials.
+ *
+ * @param array $clientCredentials
+ *
+ * @return ClientCredentials
+ */
+ protected function createClientCredentials(array $clientCredentials)
+ {
+ $keys = array('identifier', 'secret');
+
+ foreach ($keys as $key) {
+ if (!isset($clientCredentials[$key])) {
+ throw new \InvalidArgumentException("Missing client credentials key [$key] from options.");
+ }
+ }
+
+ $_clientCredentials = new ClientCredentials();
+ $_clientCredentials->setIdentifier($clientCredentials['identifier']);
+ $_clientCredentials->setSecret($clientCredentials['secret']);
+
+ if (isset($clientCredentials['callback_uri'])) {
+ $_clientCredentials->setCallbackUri($clientCredentials['callback_uri']);
+ }
+
+ return $_clientCredentials;
+ }
+
+ /**
+ * Handle a bad response coming back when getting temporary credentials.
+ *
+ * @param BadResponseException $e
+ *
+ * @throws CredentialsException
+ */
+ protected function handleTemporaryCredentialsBadResponse(BadResponseException $e)
+ {
+ $response = $e->getResponse();
+ $body = $response->getBody();
+ $statusCode = $response->getStatusCode();
+
+ throw new CredentialsException(
+ "Received HTTP status code [$statusCode] with message \"$body\" when getting temporary credentials."
+ );
+ }
+
+ /**
+ * Creates temporary credentials from the body response.
+ *
+ * @param string $body
+ *
+ * @return TemporaryCredentials
+ */
+ protected function createTemporaryCredentials($body)
+ {
+ parse_str($body, $data);
+
+ if (!$data || !is_array($data)) {
+ throw new CredentialsException('Unable to parse temporary credentials response.');
+ }
+
+ if (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] != 'true') {
+ throw new CredentialsException('Error in retrieving temporary credentials.');
+ }
+
+ $temporaryCredentials = new TemporaryCredentials();
+ $temporaryCredentials->setIdentifier($data['oauth_token']);
+ $temporaryCredentials->setSecret($data['oauth_token_secret']);
+
+ return $temporaryCredentials;
+ }
+
+ /**
+ * Handle a bad response coming back when getting token credentials.
+ *
+ * @param BadResponseException $e
+ *
+ * @throws CredentialsException
+ */
+ protected function handleTokenCredentialsBadResponse(BadResponseException $e)
+ {
+ $response = $e->getResponse();
+ $body = $response->getBody();
+ $statusCode = $response->getStatusCode();
+
+ throw new CredentialsException(
+ "Received HTTP status code [$statusCode] with message \"$body\" when getting token credentials."
+ );
+ }
+
+ /**
+ * Creates token credentials from the body response.
+ *
+ * @param string $body
+ *
+ * @return TokenCredentials
+ */
+ protected function createTokenCredentials($body)
+ {
+ parse_str($body, $data);
+
+ if (!$data || !is_array($data)) {
+ throw new CredentialsException('Unable to parse token credentials response.');
+ }
+
+ if (isset($data['error'])) {
+ throw new CredentialsException("Error [{$data['error']}] in retrieving token credentials.");
+ }
+
+ $tokenCredentials = new TokenCredentials();
+ $tokenCredentials->setIdentifier($data['oauth_token']);
+ $tokenCredentials->setSecret($data['oauth_token_secret']);
+
+ return $tokenCredentials;
+ }
+
+ /**
+ * Get the base protocol parameters for an OAuth request.
+ * Each request builds on these parameters.
+ *
+ * @return array
+ *
+ * @see OAuth 1.0 RFC 5849 Section 3.1
+ */
+ protected function baseProtocolParameters()
+ {
+ $dateTime = new \DateTime();
+
+ return array(
+ 'oauth_consumer_key' => $this->clientCredentials->getIdentifier(),
+ 'oauth_nonce' => $this->nonce(),
+ 'oauth_signature_method' => $this->signature->method(),
+ 'oauth_timestamp' => $dateTime->format('U'),
+ 'oauth_version' => '1.0',
+ );
+ }
+
+ /**
+ * Any additional required protocol parameters for an
+ * OAuth request.
+ *
+ * @return array
+ */
+ protected function additionalProtocolParameters()
+ {
+ return array();
+ }
+
+ /**
+ * Generate the OAuth protocol header for a temporary credentials
+ * request, based on the URI.
+ *
+ * @param string $uri
+ *
+ * @return string
+ */
+ protected function temporaryCredentialsProtocolHeader($uri)
+ {
+ $parameters = array_merge($this->baseProtocolParameters(), array(
+ 'oauth_callback' => $this->clientCredentials->getCallbackUri(),
+ ));
+
+ $parameters['oauth_signature'] = $this->signature->sign($uri, $parameters, 'POST');
+
+ return $this->normalizeProtocolParameters($parameters);
+ }
+
+ /**
+ * Generate the OAuth protocol header for requests other than temporary
+ * credentials, based on the URI, method, given credentials & body query
+ * string.
+ *
+ * @param string $method
+ * @param string $uri
+ * @param CredentialsInterface $credentials
+ * @param array $bodyParameters
+ *
+ * @return string
+ */
+ protected function protocolHeader($method, $uri, CredentialsInterface $credentials, array $bodyParameters = array())
+ {
+ $parameters = array_merge(
+ $this->baseProtocolParameters(),
+ $this->additionalProtocolParameters(),
+ array(
+ 'oauth_token' => $credentials->getIdentifier(),
+ )
+ );
+
+ $this->signature->setCredentials($credentials);
+
+ $parameters['oauth_signature'] = $this->signature->sign(
+ $uri,
+ array_merge($parameters, $bodyParameters),
+ $method
+ );
+
+ return $this->normalizeProtocolParameters($parameters);
+ }
+
+ /**
+ * Takes an array of protocol parameters and normalizes them
+ * to be used as a HTTP header.
+ *
+ * @param array $parameters
+ *
+ * @return string
+ */
+ protected function normalizeProtocolParameters(array $parameters)
+ {
+ array_walk($parameters, function (&$value, $key) {
+ $value = rawurlencode($key).'="'.rawurlencode($value).'"';
+ });
+
+ return 'OAuth '.implode(', ', $parameters);
+ }
+
+ /**
+ * Generate a random string.
+ *
+ * @param int $length
+ *
+ * @return string
+ *
+ * @see OAuth 1.0 RFC 5849 Section 3.3
+ */
+ protected function nonce($length = 32)
+ {
+ $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+
+ return substr(str_shuffle(str_repeat($pool, 5)), 0, $length);
+ }
+
+ /**
+ * Build a url by combining hostname and query string after checking for
+ * exisiting '?' character in host.
+ *
+ * @param string $host
+ * @param string $queryString
+ *
+ * @return string
+ */
+ protected function buildUrl($host, $queryString)
+ {
+ return $host.(strpos($host, '?') !== false ? '&' : '?').$queryString;
+ }
+
+ /**
+ * Get the URL for retrieving temporary credentials.
+ *
+ * @return string
+ */
+ abstract public function urlTemporaryCredentials();
+
+ /**
+ * Get the URL for redirecting the resource owner to authorize the client.
+ *
+ * @return string
+ */
+ abstract public function urlAuthorization();
+
+ /**
+ * Get the URL retrieving token credentials.
+ *
+ * @return string
+ */
+ abstract public function urlTokenCredentials();
+
+ /**
+ * Get the URL for retrieving user details.
+ *
+ * @return string
+ */
+ abstract public function urlUserDetails();
+
+ /**
+ * Take the decoded data from the user details URL and convert
+ * it to a User object.
+ *
+ * @param mixed $data
+ * @param TokenCredentials $tokenCredentials
+ *
+ * @return User
+ */
+ abstract public function userDetails($data, TokenCredentials $tokenCredentials);
+
+ /**
+ * Take the decoded data from the user details URL and extract
+ * the user's UID.
+ *
+ * @param mixed $data
+ * @param TokenCredentials $tokenCredentials
+ *
+ * @return string|int
+ */
+ abstract public function userUid($data, TokenCredentials $tokenCredentials);
+
+ /**
+ * Take the decoded data from the user details URL and extract
+ * the user's email.
+ *
+ * @param mixed $data
+ * @param TokenCredentials $tokenCredentials
+ *
+ * @return string
+ */
+ abstract public function userEmail($data, TokenCredentials $tokenCredentials);
+
+ /**
+ * Take the decoded data from the user details URL and extract
+ * the user's screen name.
+ *
+ * @param mixed $data
+ * @param TokenCredentials $tokenCredentials
+ *
+ * @return string
+ */
+ abstract public function userScreenName($data, TokenCredentials $tokenCredentials);
+}
diff --git a/vendor/league/oauth1-client/src/Client/Server/Trello.php b/vendor/league/oauth1-client/src/Client/Server/Trello.php
new file mode 100644
index 0000000000..7f9e944d6d
--- /dev/null
+++ b/vendor/league/oauth1-client/src/Client/Server/Trello.php
@@ -0,0 +1,252 @@
+parseConfiguration($clientCredentials);
+ }
+ }
+
+ /**
+ * Set the access token.
+ *
+ * @param string $accessToken
+ *
+ * @return Trello
+ */
+ public function setAccessToken($accessToken)
+ {
+ $this->accessToken = $accessToken;
+
+ return $this;
+ }
+
+ /**
+ * Set the application expiration.
+ *
+ * @param string $applicationExpiration
+ *
+ * @return Trello
+ */
+ public function setApplicationExpiration($applicationExpiration)
+ {
+ $this->applicationExpiration = $applicationExpiration;
+
+ return $this;
+ }
+
+ /**
+ * Get application expiration.
+ *
+ * @return string
+ */
+ public function getApplicationExpiration()
+ {
+ return $this->applicationExpiration ?: '1day';
+ }
+
+ /**
+ * Set the application name.
+ *
+ * @param string $applicationName
+ *
+ * @return Trello
+ */
+ public function setApplicationName($applicationName)
+ {
+ $this->applicationName = $applicationName;
+
+ return $this;
+ }
+
+ /**
+ * Get application name.
+ *
+ * @return string|null
+ */
+ public function getApplicationName()
+ {
+ return $this->applicationName ?: null;
+ }
+
+ /**
+ * Set the application scope.
+ *
+ * @param string $applicationScope
+ *
+ * @return Trello
+ */
+ public function setApplicationScope($applicationScope)
+ {
+ $this->applicationScope = $applicationScope;
+
+ return $this;
+ }
+
+ /**
+ * Get application scope.
+ *
+ * @return string
+ */
+ public function getApplicationScope()
+ {
+ return $this->applicationScope ?: 'read';
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function urlTemporaryCredentials()
+ {
+ return 'https://trello.com/1/OAuthGetRequestToken';
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function urlAuthorization()
+ {
+ return 'https://trello.com/1/OAuthAuthorizeToken?'.
+ $this->buildAuthorizationQueryParameters();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function urlTokenCredentials()
+ {
+ return 'https://trello.com/1/OAuthGetAccessToken';
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function urlUserDetails()
+ {
+ return 'https://trello.com/1/members/me?key='.$this->applicationKey.'&token='.$this->accessToken;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userDetails($data, TokenCredentials $tokenCredentials)
+ {
+ $user = new User();
+
+ $user->nickname = $data['username'];
+ $user->name = $data['fullName'];
+ $user->imageUrl = null;
+
+ $user->extra = (array) $data;
+
+ return $user;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userUid($data, TokenCredentials $tokenCredentials)
+ {
+ return $data['id'];
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userEmail($data, TokenCredentials $tokenCredentials)
+ {
+ return;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userScreenName($data, TokenCredentials $tokenCredentials)
+ {
+ return $data['username'];
+ }
+
+ /**
+ * Build authorization query parameters.
+ *
+ * @return string
+ */
+ private function buildAuthorizationQueryParameters()
+ {
+ $params = array(
+ 'response_type' => 'fragment',
+ 'scope' => $this->getApplicationScope(),
+ 'expiration' => $this->getApplicationExpiration(),
+ 'name' => $this->getApplicationName(),
+ );
+
+ return http_build_query($params);
+ }
+
+ /**
+ * Parse configuration array to set attributes.
+ *
+ * @param array $configuration
+ */
+ private function parseConfiguration(array $configuration = array())
+ {
+ $configToPropertyMap = array(
+ 'identifier' => 'applicationKey',
+ 'expiration' => 'applicationExpiration',
+ 'name' => 'applicationName',
+ 'scope' => 'applicationScope',
+ );
+
+ foreach ($configToPropertyMap as $config => $property) {
+ if (isset($configuration[$config])) {
+ $this->$property = $configuration[$config];
+ }
+ }
+ }
+}
diff --git a/vendor/league/oauth1-client/src/Client/Server/Tumblr.php b/vendor/league/oauth1-client/src/Client/Server/Tumblr.php
new file mode 100644
index 0000000000..51ffb040ca
--- /dev/null
+++ b/vendor/league/oauth1-client/src/Client/Server/Tumblr.php
@@ -0,0 +1,99 @@
+nickname = $data['name'];
+
+ // Save all extra data
+ $used = array('name');
+ $user->extra = array_diff_key($data, array_flip($used));
+
+ return $user;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userUid($data, TokenCredentials $tokenCredentials)
+ {
+ if (!isset($data['response']['user']) || !is_array($data['response']['user'])) {
+ return;
+ }
+
+ $data = $data['response']['user'];
+
+ return $data['name'];
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userEmail($data, TokenCredentials $tokenCredentials)
+ {
+ return;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userScreenName($data, TokenCredentials $tokenCredentials)
+ {
+ if (!isset($data['response']['user']) || !is_array($data['response']['user'])) {
+ return;
+ }
+
+ $data = $data['response']['user'];
+
+ return $data['name'];
+ }
+}
diff --git a/vendor/league/oauth1-client/src/Client/Server/Twitter.php b/vendor/league/oauth1-client/src/Client/Server/Twitter.php
new file mode 100644
index 0000000000..cca204329f
--- /dev/null
+++ b/vendor/league/oauth1-client/src/Client/Server/Twitter.php
@@ -0,0 +1,100 @@
+uid = $data['id_str'];
+ $user->nickname = $data['screen_name'];
+ $user->name = $data['name'];
+ $user->location = $data['location'];
+ $user->description = $data['description'];
+ $user->imageUrl = $data['profile_image_url'];
+ $user->email = null;
+ if (isset($data['email'])) {
+ $user->email = $data['email'];
+ }
+
+ $used = array('id', 'screen_name', 'name', 'location', 'description', 'profile_image_url', 'email');
+
+ foreach ($data as $key => $value) {
+ if (strpos($key, 'url') !== false) {
+ if (!in_array($key, $used)) {
+ $used[] = $key;
+ }
+
+ $user->urls[$key] = $value;
+ }
+ }
+
+ // Save all extra data
+ $user->extra = array_diff_key($data, array_flip($used));
+
+ return $user;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userUid($data, TokenCredentials $tokenCredentials)
+ {
+ return $data['id'];
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userEmail($data, TokenCredentials $tokenCredentials)
+ {
+ return;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userScreenName($data, TokenCredentials $tokenCredentials)
+ {
+ return $data['name'];
+ }
+}
diff --git a/vendor/league/oauth1-client/src/Client/Server/User.php b/vendor/league/oauth1-client/src/Client/Server/User.php
new file mode 100644
index 0000000000..95c2567e29
--- /dev/null
+++ b/vendor/league/oauth1-client/src/Client/Server/User.php
@@ -0,0 +1,118 @@
+{$key})) {
+ $this->{$key} = $value;
+ }
+ }
+
+ /**
+ * Get a property from the user.
+ *
+ * @param string $key
+ *
+ * @return mixed
+ */
+ public function __get($key)
+ {
+ if (isset($this->{$key})) {
+ return $this->{$key};
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getIterator()
+ {
+ return new \ArrayIterator($this);
+ }
+}
diff --git a/vendor/league/oauth1-client/src/Client/Server/Uservoice.php b/vendor/league/oauth1-client/src/Client/Server/Uservoice.php
new file mode 100644
index 0000000000..686f7b6551
--- /dev/null
+++ b/vendor/league/oauth1-client/src/Client/Server/Uservoice.php
@@ -0,0 +1,130 @@
+parseConfigurationArray($clientCredentials);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function urlTemporaryCredentials()
+ {
+ return $this->base.'/oauth/request_token';
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function urlAuthorization()
+ {
+ return $this->base.'/oauth/authorize';
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function urlTokenCredentials()
+ {
+ return $this->base.'/oauth/access_token';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function urlUserDetails()
+ {
+ return $this->base.'/api/v1/users/current.json';
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userDetails($data, TokenCredentials $tokenCredentials)
+ {
+ $user = new User();
+
+ $user->uid = $data['user']['id'];
+ $user->name = $data['user']['name'];
+ $user->imageUrl = $data['user']['avatar_url'];
+ $user->email = $data['user']['email'];
+
+ if ($data['user']['name']) {
+ $parts = explode(' ', $data['user']['name']);
+
+ if (count($parts) > 0) {
+ $user->firstName = $parts[0];
+ }
+
+ if (count($parts) > 1) {
+ $user->lastName = $parts[1];
+ }
+ }
+
+ $user->urls[] = $data['user']['url'];
+
+ return $user;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function userUid($data, TokenCredentials $tokenCredentials)
+ {
+ return $data['user']['id'];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function userEmail($data, TokenCredentials $tokenCredentials)
+ {
+ return $data['user']['email'];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function userScreenName($data, TokenCredentials $tokenCredentials)
+ {
+ return $data['user']['name'];
+ }
+
+ /**
+ * Parse configuration array to set attributes.
+ *
+ * @param array $configuration
+ *
+ * @throws InvalidArgumentException
+ */
+ private function parseConfigurationArray(array $configuration = array())
+ {
+ if (isset($configuration['host'])) {
+ throw new InvalidArgumentException('Missing host');
+ }
+
+ $this->base = trim($configuration['host'], '/');
+ }
+}
diff --git a/vendor/league/oauth1-client/src/Client/Server/Xing.php b/vendor/league/oauth1-client/src/Client/Server/Xing.php
new file mode 100644
index 0000000000..8f78157e76
--- /dev/null
+++ b/vendor/league/oauth1-client/src/Client/Server/Xing.php
@@ -0,0 +1,92 @@
+uid = $data['id'];
+ $user->nickname = $data['display_name'];
+ $user->name = $data['display_name'];
+ $user->firstName = $data['first_name'];
+ $user->lastName = $data['last_name'];
+ $user->location = $data['private_address']['country'];
+
+ if ($user->location == '') {
+ $user->location = $data['business_address']['country'];
+ }
+ $user->description = $data['employment_status'];
+ $user->imageUrl = $data['photo_urls']['maxi_thumb'];
+ $user->email = $data['active_email'];
+
+ $user->urls['permalink'] = $data['permalink'];
+
+ return $user;
+ }
+ /**
+ * {@inheritDoc}
+ */
+ public function userUid($data, TokenCredentials $tokenCredentials)
+ {
+ $data = $data['users'][0];
+ return $data['id'];
+ }
+ /**
+ * {@inheritDoc}
+ */
+ public function userEmail($data, TokenCredentials $tokenCredentials)
+ {
+ $data = $data['users'][0];
+ return $data['active_email'];
+ }
+ /**
+ * {@inheritDoc}
+ */
+ public function userScreenName($data, TokenCredentials $tokenCredentials)
+ {
+ $data = $data['users'][0];
+ return $data['display_name'];
+ }
+}
diff --git a/vendor/league/oauth1-client/src/Client/Signature/HmacSha1Signature.php b/vendor/league/oauth1-client/src/Client/Signature/HmacSha1Signature.php
new file mode 100644
index 0000000000..70fdfc62df
--- /dev/null
+++ b/vendor/league/oauth1-client/src/Client/Signature/HmacSha1Signature.php
@@ -0,0 +1,125 @@
+createUrl($uri);
+
+ $baseString = $this->baseString($url, $method, $parameters);
+
+ return base64_encode($this->hash($baseString));
+ }
+
+ /**
+ * Create a Guzzle url for the given URI.
+ *
+ * @param string $uri
+ *
+ * @return Url
+ */
+ protected function createUrl($uri)
+ {
+ return Psr7\uri_for($uri);
+ }
+
+ /**
+ * Generate a base string for a HMAC-SHA1 signature
+ * based on the given a url, method, and any parameters.
+ *
+ * @param Url $url
+ * @param string $method
+ * @param array $parameters
+ *
+ * @return string
+ */
+ protected function baseString(Uri $url, $method = 'POST', array $parameters = array())
+ {
+ $baseString = rawurlencode($method).'&';
+
+ $schemeHostPath = Uri::fromParts(array(
+ 'scheme' => $url->getScheme(),
+ 'host' => $url->getHost(),
+ 'path' => $url->getPath(),
+ ));
+
+ $baseString .= rawurlencode($schemeHostPath).'&';
+
+ $data = array();
+ parse_str($url->getQuery(), $query);
+ $data = array_merge($query, $parameters);
+
+ // normalize data key/values
+ array_walk_recursive($data, function (&$key, &$value) {
+ $key = rawurlencode(rawurldecode($key));
+ $value = rawurlencode(rawurldecode($value));
+ });
+ ksort($data);
+
+ $baseString .= $this->queryStringFromData($data);
+
+ return $baseString;
+ }
+
+ /**
+ * Creates an array of rawurlencoded strings out of each array key/value pair
+ * Handles multi-demensional arrays recursively.
+ *
+ * @param array $data Array of parameters to convert.
+ * @param array $queryParams Array to extend. False by default.
+ * @param string $prevKey Optional Array key to append
+ *
+ * @return string rawurlencoded string version of data
+ */
+ protected function queryStringFromData($data, $queryParams = false, $prevKey = '')
+ {
+ if ($initial = (false === $queryParams)) {
+ $queryParams = array();
+ }
+
+ foreach ($data as $key => $value) {
+ if ($prevKey) {
+ $key = $prevKey.'['.$key.']'; // Handle multi-dimensional array
+ }
+ if (is_array($value)) {
+ $queryParams = $this->queryStringFromData($value, $queryParams, $key);
+ } else {
+ $queryParams[] = rawurlencode($key.'='.$value); // join with equals sign
+ }
+ }
+
+ if ($initial) {
+ return implode('%26', $queryParams); // join with ampersand
+ }
+
+ return $queryParams;
+ }
+
+ /**
+ * Hashes a string with the signature's key.
+ *
+ * @param string $string
+ *
+ * @return string
+ */
+ protected function hash($string)
+ {
+ return hash_hmac('sha1', $string, $this->key(), true);
+ }
+}
diff --git a/vendor/league/oauth1-client/src/Client/Signature/PlainTextSignature.php b/vendor/league/oauth1-client/src/Client/Signature/PlainTextSignature.php
new file mode 100644
index 0000000000..d3ddf9465d
--- /dev/null
+++ b/vendor/league/oauth1-client/src/Client/Signature/PlainTextSignature.php
@@ -0,0 +1,22 @@
+key();
+ }
+}
diff --git a/vendor/league/oauth1-client/src/Client/Signature/Signature.php b/vendor/league/oauth1-client/src/Client/Signature/Signature.php
new file mode 100644
index 0000000000..e9aa68bf14
--- /dev/null
+++ b/vendor/league/oauth1-client/src/Client/Signature/Signature.php
@@ -0,0 +1,55 @@
+clientCredentials = $clientCredentials;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function setCredentials(CredentialsInterface $credentials)
+ {
+ $this->credentials = $credentials;
+ }
+
+ /**
+ * Generate a signing key.
+ *
+ * @return string
+ */
+ protected function key()
+ {
+ $key = rawurlencode($this->clientCredentials->getSecret()).'&';
+
+ if ($this->credentials !== null) {
+ $key .= rawurlencode($this->credentials->getSecret());
+ }
+
+ return $key;
+ }
+}
diff --git a/vendor/league/oauth1-client/src/Client/Signature/SignatureInterface.php b/vendor/league/oauth1-client/src/Client/Signature/SignatureInterface.php
new file mode 100644
index 0000000000..69210583cf
--- /dev/null
+++ b/vendor/league/oauth1-client/src/Client/Signature/SignatureInterface.php
@@ -0,0 +1,44 @@
+assertNull($credentials->getIdentifier());
+ $credentials->setIdentifier('foo');
+ $this->assertEquals('foo', $credentials->getIdentifier());
+ $this->assertNull($credentials->getSecret());
+ $credentials->setSecret('foo');
+ $this->assertEquals('foo', $credentials->getSecret());
+ }
+}
\ No newline at end of file
diff --git a/vendor/league/oauth1-client/tests/HmacSha1SignatureTest.php b/vendor/league/oauth1-client/tests/HmacSha1SignatureTest.php
new file mode 100644
index 0000000000..6e70f902b4
--- /dev/null
+++ b/vendor/league/oauth1-client/tests/HmacSha1SignatureTest.php
@@ -0,0 +1,164 @@
+getMockClientCredentials());
+
+ $uri = 'http://www.example.com/?qux=corge';
+ $parameters = array('foo' => 'bar', 'baz' => null);
+
+ $this->assertEquals('A3Y7C1SUHXR1EBYIUlT3d6QT1cQ=', $signature->sign($uri, $parameters));
+ }
+
+ public function testQueryStringFromArray()
+ {
+ $array = array('a' => 'b');
+ $res = $this->invokeQueryStringFromData($array);
+
+ $this->assertSame(
+ 'a%3Db',
+ $res
+ );
+ }
+
+ public function testQueryStringFromIndexedArray()
+ {
+ $array = array('a', 'b');
+ $res = $this->invokeQueryStringFromData($array);
+
+ $this->assertSame(
+ '0%3Da%261%3Db',
+ $res
+ );
+ }
+
+ public function testQueryStringFromMultiDimensionalArray()
+ {
+ $array = array(
+ 'a' => array(
+ 'b' => array(
+ 'c' => 'd',
+ ),
+ 'e' => array(
+ 'f' => 'g',
+ ),
+ ),
+ 'h' => 'i',
+ 'empty' => '',
+ 'null' => null,
+ 'false' => false,
+ );
+
+ // Convert to query string.
+ $res = $this->invokeQueryStringFromData($array);
+
+ $this->assertSame(
+ 'a%5Bb%5D%5Bc%5D%3Dd%26a%5Be%5D%5Bf%5D%3Dg%26h%3Di%26empty%3D%26null%3D%26false%3D',
+ $res
+ );
+
+ // Reverse engineer the string.
+ $res = urldecode($res);
+
+ $this->assertSame(
+ 'a[b][c]=d&a[e][f]=g&h=i&empty=&null=&false=',
+ $res
+ );
+
+ // Finally, parse the string back to an array.
+ parse_str($res, $original_array);
+
+ // And ensure it matches the orignal array (approximately).
+ $this->assertSame(
+ array(
+ 'a' => array(
+ 'b' => array(
+ 'c' => 'd',
+ ),
+ 'e' => array(
+ 'f' => 'g',
+ ),
+ ),
+ 'h' => 'i',
+ 'empty' => '',
+ 'null' => '', // null value gets lost in string translation
+ 'false' => '', // false value gets lost in string translation
+ ),
+ $original_array
+ );
+ }
+
+ public function testSigningRequestWithMultiDimensionalParams()
+ {
+ $signature = new HmacSha1Signature($this->getMockClientCredentials());
+
+ $uri = 'http://www.example.com/';
+ $parameters = array(
+ 'a' => array(
+ 'b' => array(
+ 'c' => 'd',
+ ),
+ 'e' => array(
+ 'f' => 'g',
+ ),
+ ),
+ 'h' => 'i',
+ 'empty' => '',
+ 'null' => null,
+ 'false' => false,
+ );
+
+ $this->assertEquals('ZUxiJKugeEplaZm9e4hshN0I70U=', $signature->sign($uri, $parameters));
+ }
+
+ protected function invokeQueryStringFromData(array $args)
+ {
+ $signature = new HmacSha1Signature(m::mock('League\OAuth1\Client\Credentials\ClientCredentialsInterface'));
+ $refl = new \ReflectionObject($signature);
+ $method = $refl->getMethod('queryStringFromData');
+ $method->setAccessible(true);
+ return $method->invokeArgs($signature, array($args));
+ }
+
+ protected function getMockClientCredentials()
+ {
+ $clientCredentials = m::mock('League\OAuth1\Client\Credentials\ClientCredentialsInterface');
+ $clientCredentials->shouldReceive('getSecret')->andReturn('clientsecret');
+ return $clientCredentials;
+ }
+}
diff --git a/vendor/league/oauth1-client/tests/PlainTextSignatureTest.php b/vendor/league/oauth1-client/tests/PlainTextSignatureTest.php
new file mode 100644
index 0000000000..3c34e00e9a
--- /dev/null
+++ b/vendor/league/oauth1-client/tests/PlainTextSignatureTest.php
@@ -0,0 +1,60 @@
+getMockClientCredentials());
+ $this->assertEquals('clientsecret&', $signature->sign($uri = 'http://www.example.com/'));
+
+ $signature->setCredentials($this->getMockCredentials());
+ $this->assertEquals('clientsecret&tokensecret', $signature->sign($uri));
+ $this->assertEquals('PLAINTEXT', $signature->method());
+ }
+
+ protected function getMockClientCredentials()
+ {
+ $clientCredentials = m::mock('League\OAuth1\Client\Credentials\ClientCredentialsInterface');
+ $clientCredentials->shouldReceive('getSecret')->andReturn('clientsecret');
+ return $clientCredentials;
+ }
+
+ protected function getMockCredentials()
+ {
+ $credentials = m::mock('League\OAuth1\Client\Credentials\CredentialsInterface');
+ $credentials->shouldReceive('getSecret')->andReturn('tokensecret');
+ return $credentials;
+ }
+}
diff --git a/vendor/league/oauth1-client/tests/ServerTest.php b/vendor/league/oauth1-client/tests/ServerTest.php
new file mode 100644
index 0000000000..75b93d172a
--- /dev/null
+++ b/vendor/league/oauth1-client/tests/ServerTest.php
@@ -0,0 +1,285 @@
+getMockClientCredentials());
+
+ $credentials = $server->getClientCredentials();
+ $this->assertInstanceOf('League\OAuth1\Client\Credentials\ClientCredentialsInterface', $credentials);
+ $this->assertEquals('myidentifier', $credentials->getIdentifier());
+ $this->assertEquals('mysecret', $credentials->getSecret());
+ $this->assertEquals('http://app.dev/', $credentials->getCallbackUri());
+ }
+
+ public function testCreatingWithObject()
+ {
+ $credentials = new ClientCredentials;
+ $credentials->setIdentifier('myidentifier');
+ $credentials->setSecret('mysecret');
+ $credentials->setCallbackUri('http://app.dev/');
+
+ $server = new ServerStub($credentials);
+
+ $this->assertEquals($credentials, $server->getClientCredentials());
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ **/
+ public function testCreatingWithInvalidInput()
+ {
+ $server = new ServerStub(uniqid());
+ }
+
+ public function testGettingTemporaryCredentials()
+ {
+ $server = m::mock('League\OAuth1\Client\Tests\ServerStub[createHttpClient]', array($this->getMockClientCredentials()));
+
+ $server->shouldReceive('createHttpClient')->andReturn($client = m::mock('stdClass'));
+
+ $me = $this;
+ $client->shouldReceive('post')->with('http://www.example.com/temporary', m::on(function($options) use ($me) {
+ $headers = $options['headers'];
+
+ $me->assertTrue(isset($headers['Authorization']));
+
+ // OAuth protocol specifies a strict number of
+ // headers should be sent, in the correct order.
+ // We'll validate that here.
+ $pattern = '/OAuth oauth_consumer_key=".*?", oauth_nonce="[a-zA-Z0-9]+", oauth_signature_method="HMAC-SHA1", oauth_timestamp="\d{10}", oauth_version="1.0", oauth_callback="'.preg_quote('http%3A%2F%2Fapp.dev%2F', '/').'", oauth_signature=".*?"/';
+
+ $matches = preg_match($pattern, $headers['Authorization']);
+ $me->assertEquals(1, $matches, 'Asserting that the authorization header contains the correct expression.');
+
+ return true;
+ }))->once()->andReturn($response = m::mock('stdClass'));
+ $response->shouldReceive('getBody')->andReturn('oauth_token=temporarycredentialsidentifier&oauth_token_secret=temporarycredentialssecret&oauth_callback_confirmed=true');
+
+ $credentials = $server->getTemporaryCredentials();
+ $this->assertInstanceOf('League\OAuth1\Client\Credentials\TemporaryCredentials', $credentials);
+ $this->assertEquals('temporarycredentialsidentifier', $credentials->getIdentifier());
+ $this->assertEquals('temporarycredentialssecret', $credentials->getSecret());
+ }
+
+ public function testGettingAuthorizationUrl()
+ {
+ $server = new ServerStub($this->getMockClientCredentials());
+
+ $expected = 'http://www.example.com/authorize?oauth_token=foo';
+
+ $this->assertEquals($expected, $server->getAuthorizationUrl('foo'));
+
+ $credentials = m::mock('League\OAuth1\Client\Credentials\TemporaryCredentials');
+ $credentials->shouldReceive('getIdentifier')->andReturn('foo');
+ $this->assertEquals($expected, $server->getAuthorizationUrl($credentials));
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ public function testGettingTokenCredentialsFailsWithManInTheMiddle()
+ {
+ $server = new ServerStub($this->getMockClientCredentials());
+
+ $credentials = m::mock('League\OAuth1\Client\Credentials\TemporaryCredentials');
+ $credentials->shouldReceive('getIdentifier')->andReturn('foo');
+
+ $server->getTokenCredentials($credentials, 'bar', 'verifier');
+ }
+
+ public function testGettingTokenCredentials()
+ {
+ $server = m::mock('League\OAuth1\Client\Tests\ServerStub[createHttpClient]', array($this->getMockClientCredentials()));
+
+ $temporaryCredentials = m::mock('League\OAuth1\Client\Credentials\TemporaryCredentials');
+ $temporaryCredentials->shouldReceive('getIdentifier')->andReturn('temporarycredentialsidentifier');
+ $temporaryCredentials->shouldReceive('getSecret')->andReturn('temporarycredentialssecret');
+
+ $server->shouldReceive('createHttpClient')->andReturn($client = m::mock('stdClass'));
+
+ $me = $this;
+ $client->shouldReceive('post')->with('http://www.example.com/token', m::on(function($options) use ($me) {
+ $headers = $options['headers'];
+ $body = $options['form_params'];
+
+ $me->assertTrue(isset($headers['Authorization']));
+ $me->assertFalse(isset($headers['User-Agent']));
+
+ // OAuth protocol specifies a strict number of
+ // headers should be sent, in the correct order.
+ // We'll validate that here.
+ $pattern = '/OAuth oauth_consumer_key=".*?", oauth_nonce="[a-zA-Z0-9]+", oauth_signature_method="HMAC-SHA1", oauth_timestamp="\d{10}", oauth_version="1.0", oauth_token="temporarycredentialsidentifier", oauth_signature=".*?"/';
+
+ $matches = preg_match($pattern, $headers['Authorization']);
+ $me->assertEquals(1, $matches, 'Asserting that the authorization header contains the correct expression.');
+
+ $me->assertSame($body, array('oauth_verifier' => 'myverifiercode'));
+
+ return true;
+ }))->once()->andReturn($response = m::mock('stdClass'));
+ $response->shouldReceive('getBody')->andReturn('oauth_token=tokencredentialsidentifier&oauth_token_secret=tokencredentialssecret');
+
+ $credentials = $server->getTokenCredentials($temporaryCredentials, 'temporarycredentialsidentifier', 'myverifiercode');
+ $this->assertInstanceOf('League\OAuth1\Client\Credentials\TokenCredentials', $credentials);
+ $this->assertEquals('tokencredentialsidentifier', $credentials->getIdentifier());
+ $this->assertEquals('tokencredentialssecret', $credentials->getSecret());
+ }
+
+ public function testGettingTokenCredentialsWithUserAgent()
+ {
+ $userAgent = 'FooBar';
+ $server = m::mock('League\OAuth1\Client\Tests\ServerStub[createHttpClient]', array($this->getMockClientCredentials()));
+
+ $temporaryCredentials = m::mock('League\OAuth1\Client\Credentials\TemporaryCredentials');
+ $temporaryCredentials->shouldReceive('getIdentifier')->andReturn('temporarycredentialsidentifier');
+ $temporaryCredentials->shouldReceive('getSecret')->andReturn('temporarycredentialssecret');
+
+ $server->shouldReceive('createHttpClient')->andReturn($client = m::mock('stdClass'));
+
+ $me = $this;
+ $client->shouldReceive('post')->with('http://www.example.com/token', m::on(function($options) use ($me, $userAgent) {
+ $headers = $options['headers'];
+ $body = $options['form_params'];
+
+ $me->assertTrue(isset($headers['Authorization']));
+ $me->assertTrue(isset($headers['User-Agent']));
+ $me->assertEquals($userAgent, $headers['User-Agent']);
+
+ // OAuth protocol specifies a strict number of
+ // headers should be sent, in the correct order.
+ // We'll validate that here.
+ $pattern = '/OAuth oauth_consumer_key=".*?", oauth_nonce="[a-zA-Z0-9]+", oauth_signature_method="HMAC-SHA1", oauth_timestamp="\d{10}", oauth_version="1.0", oauth_token="temporarycredentialsidentifier", oauth_signature=".*?"/';
+
+ $matches = preg_match($pattern, $headers['Authorization']);
+ $me->assertEquals(1, $matches, 'Asserting that the authorization header contains the correct expression.');
+
+ $me->assertSame($body, array('oauth_verifier' => 'myverifiercode'));
+
+ return true;
+ }))->once()->andReturn($response = m::mock('stdClass'));
+ $response->shouldReceive('getBody')->andReturn('oauth_token=tokencredentialsidentifier&oauth_token_secret=tokencredentialssecret');
+
+ $credentials = $server->setUserAgent($userAgent)->getTokenCredentials($temporaryCredentials, 'temporarycredentialsidentifier', 'myverifiercode');
+ $this->assertInstanceOf('League\OAuth1\Client\Credentials\TokenCredentials', $credentials);
+ $this->assertEquals('tokencredentialsidentifier', $credentials->getIdentifier());
+ $this->assertEquals('tokencredentialssecret', $credentials->getSecret());
+
+ }
+
+ public function testGettingUserDetails()
+ {
+ $server = m::mock('League\OAuth1\Client\Tests\ServerStub[createHttpClient,protocolHeader]', array($this->getMockClientCredentials()));
+
+ $temporaryCredentials = m::mock('League\OAuth1\Client\Credentials\TokenCredentials');
+ $temporaryCredentials->shouldReceive('getIdentifier')->andReturn('tokencredentialsidentifier');
+ $temporaryCredentials->shouldReceive('getSecret')->andReturn('tokencredentialssecret');
+
+ $server->shouldReceive('createHttpClient')->andReturn($client = m::mock('stdClass'));
+
+ $me = $this;
+ $client->shouldReceive('get')->with('http://www.example.com/user', m::on(function($options) use ($me) {
+ $headers = $options['headers'];
+
+ $me->assertTrue(isset($headers['Authorization']));
+
+ // OAuth protocol specifies a strict number of
+ // headers should be sent, in the correct order.
+ // We'll validate that here.
+ $pattern = '/OAuth oauth_consumer_key=".*?", oauth_nonce="[a-zA-Z0-9]+", oauth_signature_method="HMAC-SHA1", oauth_timestamp="\d{10}", oauth_version="1.0", oauth_token="tokencredentialsidentifier", oauth_signature=".*?"/';
+
+ $matches = preg_match($pattern, $headers['Authorization']);
+ $me->assertEquals(1, $matches, 'Asserting that the authorization header contains the correct expression.');
+
+ return true;
+ }))->once()->andReturn($response = m::mock('stdClass'));
+ $response->shouldReceive('getBody')->once()->andReturn(json_encode(array('foo' => 'bar', 'id' => 123, 'contact_email' => 'baz@qux.com', 'username' => 'fred')));
+
+ $user = $server->getUserDetails($temporaryCredentials);
+ $this->assertInstanceOf('League\OAuth1\Client\Server\User', $user);
+ $this->assertEquals('bar', $user->firstName);
+ $this->assertEquals(123, $server->getUserUid($temporaryCredentials));
+ $this->assertEquals('baz@qux.com', $server->getUserEmail($temporaryCredentials));
+ $this->assertEquals('fred', $server->getUserScreenName($temporaryCredentials));
+ }
+
+ public function testGettingHeaders()
+ {
+ $server = new ServerStub($this->getMockClientCredentials());
+
+ $tokenCredentials = m::mock('League\OAuth1\Client\Credentials\TokenCredentials');
+ $tokenCredentials->shouldReceive('getIdentifier')->andReturn('mock_identifier');
+ $tokenCredentials->shouldReceive('getSecret')->andReturn('mock_secret');
+
+ // OAuth protocol specifies a strict number of
+ // headers should be sent, in the correct order.
+ // We'll validate that here.
+ $pattern = '/OAuth oauth_consumer_key=".*?", oauth_nonce="[a-zA-Z0-9]+", oauth_signature_method="HMAC-SHA1", oauth_timestamp="\d{10}", oauth_version="1.0", oauth_token="mock_identifier", oauth_signature=".*?"/';
+
+ // With a GET request
+ $headers = $server->getHeaders($tokenCredentials, 'GET', 'http://example.com/');
+ $this->assertTrue(isset($headers['Authorization']));
+
+ $matches = preg_match($pattern, $headers['Authorization']);
+ $this->assertEquals(1, $matches, 'Asserting that the authorization header contains the correct expression.');
+
+ // With a POST request
+ $headers = $server->getHeaders($tokenCredentials, 'POST', 'http://example.com/', array('body' => 'params'));
+ $this->assertTrue(isset($headers['Authorization']));
+
+ $matches = preg_match($pattern, $headers['Authorization']);
+ $this->assertEquals(1, $matches, 'Asserting that the authorization header contains the correct expression.');
+ }
+
+ protected function getMockClientCredentials()
+ {
+ return array(
+ 'identifier' => 'myidentifier',
+ 'secret' => 'mysecret',
+ 'callback_uri' => 'http://app.dev/',
+ );
+ }
+}
diff --git a/vendor/league/oauth1-client/tests/TrelloServerTest.php b/vendor/league/oauth1-client/tests/TrelloServerTest.php
new file mode 100644
index 0000000000..1e3105a6d9
--- /dev/null
+++ b/vendor/league/oauth1-client/tests/TrelloServerTest.php
@@ -0,0 +1,349 @@
+getMockClientCredentials());
+
+ $credentials = $server->getClientCredentials();
+ $this->assertInstanceOf('League\OAuth1\Client\Credentials\ClientCredentialsInterface', $credentials);
+ $this->assertEquals($this->getApplicationKey(), $credentials->getIdentifier());
+ $this->assertEquals('mysecret', $credentials->getSecret());
+ $this->assertEquals('http://app.dev/', $credentials->getCallbackUri());
+ }
+
+ public function testCreatingWithObject()
+ {
+ $credentials = new ClientCredentials;
+ $credentials->setIdentifier('myidentifier');
+ $credentials->setSecret('mysecret');
+ $credentials->setCallbackUri('http://app.dev/');
+
+ $server = new Trello($credentials);
+
+ $this->assertEquals($credentials, $server->getClientCredentials());
+ }
+
+ public function testGettingTemporaryCredentials()
+ {
+ $server = m::mock('League\OAuth1\Client\Server\Trello[createHttpClient]', array($this->getMockClientCredentials()));
+
+ $server->shouldReceive('createHttpClient')->andReturn($client = m::mock('stdClass'));
+
+ $me = $this;
+ $client->shouldReceive('post')->with('https://trello.com/1/OAuthGetRequestToken', m::on(function($options) use ($me) {
+ $headers = $options['headers'];
+
+ $me->assertTrue(isset($headers['Authorization']));
+
+ // OAuth protocol specifies a strict number of
+ // headers should be sent, in the correct order.
+ // We'll validate that here.
+ $pattern = '/OAuth oauth_consumer_key=".*?", oauth_nonce="[a-zA-Z0-9]+", oauth_signature_method="HMAC-SHA1", oauth_timestamp="\d{10}", oauth_version="1.0", oauth_callback="'.preg_quote('http%3A%2F%2Fapp.dev%2F', '/').'", oauth_signature=".*?"/';
+
+ $matches = preg_match($pattern, $headers['Authorization']);
+ $me->assertEquals(1, $matches, 'Asserting that the authorization header contains the correct expression.');
+
+ return true;
+ }))->once()->andReturn($response = m::mock('stdClass'));
+ $response->shouldReceive('getBody')->andReturn('oauth_token=temporarycredentialsidentifier&oauth_token_secret=temporarycredentialssecret&oauth_callback_confirmed=true');
+
+ $credentials = $server->getTemporaryCredentials();
+ $this->assertInstanceOf('League\OAuth1\Client\Credentials\TemporaryCredentials', $credentials);
+ $this->assertEquals('temporarycredentialsidentifier', $credentials->getIdentifier());
+ $this->assertEquals('temporarycredentialssecret', $credentials->getSecret());
+ }
+
+ public function testGettingDefaultAuthorizationUrl()
+ {
+ $server = new Trello($this->getMockClientCredentials());
+
+ $expected = 'https://trello.com/1/OAuthAuthorizeToken?response_type=fragment&scope=read&expiration=1day&oauth_token=foo';
+
+ $this->assertEquals($expected, $server->getAuthorizationUrl('foo'));
+
+ $credentials = m::mock('League\OAuth1\Client\Credentials\TemporaryCredentials');
+ $credentials->shouldReceive('getIdentifier')->andReturn('foo');
+ $this->assertEquals($expected, $server->getAuthorizationUrl($credentials));
+ }
+
+ public function testGettingAuthorizationUrlWithExpirationAfterConstructingWithExpiration()
+ {
+ $credentials = $this->getMockClientCredentials();
+ $expiration = $this->getApplicationExpiration(2);
+ $credentials['expiration'] = $expiration;
+ $server = new Trello($credentials);
+
+ $expected = 'https://trello.com/1/OAuthAuthorizeToken?response_type=fragment&scope=read&expiration='.urlencode($expiration).'&oauth_token=foo';
+
+ $this->assertEquals($expected, $server->getAuthorizationUrl('foo'));
+
+ $credentials = m::mock('League\OAuth1\Client\Credentials\TemporaryCredentials');
+ $credentials->shouldReceive('getIdentifier')->andReturn('foo');
+ $this->assertEquals($expected, $server->getAuthorizationUrl($credentials));
+ }
+
+ public function testGettingAuthorizationUrlWithExpirationAfterSettingExpiration()
+ {
+ $expiration = $this->getApplicationExpiration(2);
+ $server = new Trello($this->getMockClientCredentials());
+ $server->setApplicationExpiration($expiration);
+
+ $expected = 'https://trello.com/1/OAuthAuthorizeToken?response_type=fragment&scope=read&expiration='.urlencode($expiration).'&oauth_token=foo';
+
+ $this->assertEquals($expected, $server->getAuthorizationUrl('foo'));
+
+ $credentials = m::mock('League\OAuth1\Client\Credentials\TemporaryCredentials');
+ $credentials->shouldReceive('getIdentifier')->andReturn('foo');
+ $this->assertEquals($expected, $server->getAuthorizationUrl($credentials));
+ }
+
+ public function testGettingAuthorizationUrlWithNameAfterConstructingWithName()
+ {
+ $credentials = $this->getMockClientCredentials();
+ $name = $this->getApplicationName();
+ $credentials['name'] = $name;
+ $server = new Trello($credentials);
+
+ $expected = 'https://trello.com/1/OAuthAuthorizeToken?response_type=fragment&scope=read&expiration=1day&name='.urlencode($name).'&oauth_token=foo';
+
+ $this->assertEquals($expected, $server->getAuthorizationUrl('foo'));
+
+ $credentials = m::mock('League\OAuth1\Client\Credentials\TemporaryCredentials');
+ $credentials->shouldReceive('getIdentifier')->andReturn('foo');
+ $this->assertEquals($expected, $server->getAuthorizationUrl($credentials));
+ }
+
+ public function testGettingAuthorizationUrlWithNameAfterSettingName()
+ {
+ $name = $this->getApplicationName();
+ $server = new Trello($this->getMockClientCredentials());
+ $server->setApplicationName($name);
+
+ $expected = 'https://trello.com/1/OAuthAuthorizeToken?response_type=fragment&scope=read&expiration=1day&name='.urlencode($name).'&oauth_token=foo';
+
+ $this->assertEquals($expected, $server->getAuthorizationUrl('foo'));
+
+ $credentials = m::mock('League\OAuth1\Client\Credentials\TemporaryCredentials');
+ $credentials->shouldReceive('getIdentifier')->andReturn('foo');
+ $this->assertEquals($expected, $server->getAuthorizationUrl($credentials));
+ }
+
+ public function testGettingAuthorizationUrlWithScopeAfterConstructingWithScope()
+ {
+ $credentials = $this->getMockClientCredentials();
+ $scope = $this->getApplicationScope(false);
+ $credentials['scope'] = $scope;
+ $server = new Trello($credentials);
+
+ $expected = 'https://trello.com/1/OAuthAuthorizeToken?response_type=fragment&scope='.urlencode($scope).'&expiration=1day&oauth_token=foo';
+
+ $this->assertEquals($expected, $server->getAuthorizationUrl('foo'));
+
+ $credentials = m::mock('League\OAuth1\Client\Credentials\TemporaryCredentials');
+ $credentials->shouldReceive('getIdentifier')->andReturn('foo');
+ $this->assertEquals($expected, $server->getAuthorizationUrl($credentials));
+ }
+
+ public function testGettingAuthorizationUrlWithScopeAfterSettingScope()
+ {
+ $scope = $this->getApplicationScope(false);
+ $server = new Trello($this->getMockClientCredentials());
+ $server->setApplicationScope($scope);
+
+ $expected = 'https://trello.com/1/OAuthAuthorizeToken?response_type=fragment&scope='.urlencode($scope).'&expiration=1day&oauth_token=foo';
+
+ $this->assertEquals($expected, $server->getAuthorizationUrl('foo'));
+
+ $credentials = m::mock('League\OAuth1\Client\Credentials\TemporaryCredentials');
+ $credentials->shouldReceive('getIdentifier')->andReturn('foo');
+ $this->assertEquals($expected, $server->getAuthorizationUrl($credentials));
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ public function testGettingTokenCredentialsFailsWithManInTheMiddle()
+ {
+ $server = new Trello($this->getMockClientCredentials());
+
+ $credentials = m::mock('League\OAuth1\Client\Credentials\TemporaryCredentials');
+ $credentials->shouldReceive('getIdentifier')->andReturn('foo');
+
+ $server->getTokenCredentials($credentials, 'bar', 'verifier');
+ }
+
+ public function testGettingTokenCredentials()
+ {
+ $server = m::mock('League\OAuth1\Client\Server\Trello[createHttpClient]', array($this->getMockClientCredentials()));
+
+ $temporaryCredentials = m::mock('League\OAuth1\Client\Credentials\TemporaryCredentials');
+ $temporaryCredentials->shouldReceive('getIdentifier')->andReturn('temporarycredentialsidentifier');
+ $temporaryCredentials->shouldReceive('getSecret')->andReturn('temporarycredentialssecret');
+
+ $server->shouldReceive('createHttpClient')->andReturn($client = m::mock('stdClass'));
+
+ $me = $this;
+ $client->shouldReceive('post')->with('https://trello.com/1/OAuthGetAccessToken', m::on(function($options) use ($me) {
+ $headers = $options['headers'];
+ $body = $options['form_params'];
+
+ $me->assertTrue(isset($headers['Authorization']));
+
+ // OAuth protocol specifies a strict number of
+ // headers should be sent, in the correct order.
+ // We'll validate that here.
+ $pattern = '/OAuth oauth_consumer_key=".*?", oauth_nonce="[a-zA-Z0-9]+", oauth_signature_method="HMAC-SHA1", oauth_timestamp="\d{10}", oauth_version="1.0", oauth_token="temporarycredentialsidentifier", oauth_signature=".*?"/';
+
+ $matches = preg_match($pattern, $headers['Authorization']);
+ $me->assertEquals(1, $matches, 'Asserting that the authorization header contains the correct expression.');
+
+ $me->assertSame($body, array('oauth_verifier' => 'myverifiercode'));
+
+ return true;
+ }))->once()->andReturn($response = m::mock('stdClass'));
+ $response->shouldReceive('getBody')->andReturn('oauth_token=tokencredentialsidentifier&oauth_token_secret=tokencredentialssecret');
+
+ $credentials = $server->getTokenCredentials($temporaryCredentials, 'temporarycredentialsidentifier', 'myverifiercode');
+ $this->assertInstanceOf('League\OAuth1\Client\Credentials\TokenCredentials', $credentials);
+ $this->assertEquals('tokencredentialsidentifier', $credentials->getIdentifier());
+ $this->assertEquals('tokencredentialssecret', $credentials->getSecret());
+ }
+
+ public function testGettingUserDetails()
+ {
+ $server = m::mock('League\OAuth1\Client\Server\Trello[createHttpClient,protocolHeader]', array($this->getMockClientCredentials()));
+
+ $temporaryCredentials = m::mock('League\OAuth1\Client\Credentials\TokenCredentials');
+ $temporaryCredentials->shouldReceive('getIdentifier')->andReturn('tokencredentialsidentifier');
+ $temporaryCredentials->shouldReceive('getSecret')->andReturn('tokencredentialssecret');
+
+ $server->shouldReceive('createHttpClient')->andReturn($client = m::mock('stdClass'));
+
+ $me = $this;
+ $client->shouldReceive('get')->with('https://trello.com/1/members/me?key='.$this->getApplicationKey().'&token='.$this->getAccessToken(), m::on(function($options) use ($me) {
+ $headers = $options['headers'];
+
+ $me->assertTrue(isset($headers['Authorization']));
+
+ // OAuth protocol specifies a strict number of
+ // headers should be sent, in the correct order.
+ // We'll validate that here.
+ $pattern = '/OAuth oauth_consumer_key=".*?", oauth_nonce="[a-zA-Z0-9]+", oauth_signature_method="HMAC-SHA1", oauth_timestamp="\d{10}", oauth_version="1.0", oauth_token="tokencredentialsidentifier", oauth_signature=".*?"/';
+
+ $matches = preg_match($pattern, $headers['Authorization']);
+ $me->assertEquals(1, $matches, 'Asserting that the authorization header contains the correct expression.');
+
+ return true;
+ }))->once()->andReturn($response = m::mock('stdClass'));
+ $response->shouldReceive('getBody')->once()->andReturn($this->getUserPayload());
+
+ $user = $server
+ ->setAccessToken($this->getAccessToken())
+ ->getUserDetails($temporaryCredentials);
+ $this->assertInstanceOf('League\OAuth1\Client\Server\User', $user);
+ $this->assertEquals('Matilda Wormwood', $user->name);
+ $this->assertEquals('545df696e29c0dddaed31967', $server->getUserUid($temporaryCredentials));
+ $this->assertEquals(null, $server->getUserEmail($temporaryCredentials));
+ $this->assertEquals('matildawormwood12', $server->getUserScreenName($temporaryCredentials));
+ }
+
+ protected function getMockClientCredentials()
+ {
+ return array(
+ 'identifier' => $this->getApplicationKey(),
+ 'secret' => 'mysecret',
+ 'callback_uri' => 'http://app.dev/',
+ );
+ }
+
+ protected function getAccessToken()
+ {
+ return 'lmnopqrstuvwxyz';
+ }
+
+ protected function getApplicationKey()
+ {
+ return 'abcdefghijk';
+ }
+
+ protected function getApplicationExpiration($days = 0)
+ {
+ return is_numeric($days) && $days > 0 ? $days.'day'.($days == 1 ? '' : 's') : 'never';
+ }
+
+ protected function getApplicationName()
+ {
+ return 'fizz buzz';
+ }
+
+ protected function getApplicationScope($readonly = true)
+ {
+ return $readonly ? 'read' : 'read,write';
+ }
+
+ private function getUserPayload()
+ {
+ return '{
+ "id": "545df696e29c0dddaed31967",
+ "avatarHash": null,
+ "bio": "I have magical powers",
+ "bioData": null,
+ "confirmed": true,
+ "fullName": "Matilda Wormwood",
+ "idPremOrgsAdmin": [],
+ "initials": "MW",
+ "memberType": "normal",
+ "products": [],
+ "status": "idle",
+ "url": "https://trello.com/matildawormwood12",
+ "username": "matildawormwood12",
+ "avatarSource": "none",
+ "email": null,
+ "gravatarHash": "39aaaada0224f26f0bb8f1965326dcb7",
+ "idBoards": [
+ "545df696e29c0dddaed31968",
+ "545e01d6c7b2dd962b5b46cb"
+ ],
+ "idOrganizations": [
+ "54adfd79f9aea14f84009a85",
+ "54adfde13b0e706947bc4789"
+ ],
+ "loginTypes": null,
+ "oneTimeMessagesDismissed": [],
+ "prefs": {
+ "sendSummaries": true,
+ "minutesBetweenSummaries": 1,
+ "minutesBeforeDeadlineToNotify": 1440,
+ "colorBlind": false,
+ "timezoneInfo": {
+ "timezoneNext": "CDT",
+ "dateNext": "2015-03-08T08:00:00.000Z",
+ "offsetNext": 300,
+ "timezoneCurrent": "CST",
+ "offsetCurrent": 360
+ }
+ },
+ "trophies": [],
+ "uploadedAvatarHash": null,
+ "premiumFeatures": [],
+ "idBoardsPinned": null
+ }';
+ }
+}
diff --git a/vendor/league/oauth1-client/tests/XingServerTest.php b/vendor/league/oauth1-client/tests/XingServerTest.php
new file mode 100644
index 0000000000..d3dd0f0040
--- /dev/null
+++ b/vendor/league/oauth1-client/tests/XingServerTest.php
@@ -0,0 +1,255 @@
+getMockClientCredentials());
+
+ $credentials = $server->getClientCredentials();
+ $this->assertInstanceOf('League\OAuth1\Client\Credentials\ClientCredentialsInterface', $credentials);
+ $this->assertEquals($this->getApplicationKey(), $credentials->getIdentifier());
+ $this->assertEquals('mysecret', $credentials->getSecret());
+ $this->assertEquals('http://app.dev/', $credentials->getCallbackUri());
+ }
+
+ public function testCreatingWithObject()
+ {
+ $credentials = new ClientCredentials;
+ $credentials->setIdentifier('myidentifier');
+ $credentials->setSecret('mysecret');
+ $credentials->setCallbackUri('http://app.dev/');
+
+ $server = new Xing($credentials);
+
+ $this->assertEquals($credentials, $server->getClientCredentials());
+ }
+
+ public function testGettingTemporaryCredentials()
+ {
+ $server = m::mock('League\OAuth1\Client\Server\Xing[createHttpClient]', array($this->getMockClientCredentials()));
+
+ $server->shouldReceive('createHttpClient')->andReturn($client = m::mock('stdClass'));
+
+ $me = $this;
+ $client->shouldReceive('post')->with('https://api.xing.com/v1/request_token', m::on(function ($options) use ($me) {
+ $headers = $options['headers'];
+ $me->assertTrue(isset($headers['Authorization']));
+
+ // OAuth protocol specifies a strict number of
+ // headers should be sent, in the correct order.
+ // We'll validate that here.
+ $pattern = '/OAuth oauth_consumer_key=".*?", oauth_nonce="[a-zA-Z0-9]+", oauth_signature_method="HMAC-SHA1", oauth_timestamp="\d{10}", oauth_version="1.0", oauth_callback="'.preg_quote('http%3A%2F%2Fapp.dev%2F', '/').'", oauth_signature=".*?"/';
+
+ $matches = preg_match($pattern, $headers['Authorization']);
+ $me->assertEquals(1, $matches, 'Asserting that the authorization header contains the correct expression.');
+
+ return true;
+ }))->once()->andReturn($response = m::mock('stdClass'));
+ $response->shouldReceive('getBody')->andReturn('oauth_token=temporarycredentialsidentifier&oauth_token_secret=temporarycredentialssecret&oauth_callback_confirmed=true');
+
+ $credentials = $server->getTemporaryCredentials();
+ $this->assertInstanceOf('League\OAuth1\Client\Credentials\TemporaryCredentials', $credentials);
+ $this->assertEquals('temporarycredentialsidentifier', $credentials->getIdentifier());
+ $this->assertEquals('temporarycredentialssecret', $credentials->getSecret());
+ }
+
+ public function testGettingDefaultAuthorizationUrl()
+ {
+ $server = new Xing($this->getMockClientCredentials());
+
+ $expected = 'https://api.xing.com/v1/authorize?oauth_token=foo';
+
+ $this->assertEquals($expected, $server->getAuthorizationUrl('foo'));
+
+ $credentials = m::mock('League\OAuth1\Client\Credentials\TemporaryCredentials');
+ $credentials->shouldReceive('getIdentifier')->andReturn('foo');
+ $this->assertEquals($expected, $server->getAuthorizationUrl($credentials));
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ public function testGettingTokenCredentialsFailsWithManInTheMiddle()
+ {
+ $server = new Xing($this->getMockClientCredentials());
+
+ $credentials = m::mock('League\OAuth1\Client\Credentials\TemporaryCredentials');
+ $credentials->shouldReceive('getIdentifier')->andReturn('foo');
+
+ $server->getTokenCredentials($credentials, 'bar', 'verifier');
+ }
+
+ public function testGettingTokenCredentials()
+ {
+ $server = m::mock('League\OAuth1\Client\Server\Xing[createHttpClient]', array($this->getMockClientCredentials()));
+
+ $temporaryCredentials = m::mock('League\OAuth1\Client\Credentials\TemporaryCredentials');
+ $temporaryCredentials->shouldReceive('getIdentifier')->andReturn('temporarycredentialsidentifier');
+ $temporaryCredentials->shouldReceive('getSecret')->andReturn('temporarycredentialssecret');
+
+ $server->shouldReceive('createHttpClient')->andReturn($client = m::mock('stdClass'));
+
+ $me = $this;
+ $client->shouldReceive('post')->with('https://api.xing.com/v1/access_token', m::on(function ($options) use ($me) {
+ $headers = $options['headers'];
+ $body = $options['form_params'];
+
+ $me->assertTrue(isset($headers['Authorization']));
+
+ // OAuth protocol specifies a strict number of
+ // headers should be sent, in the correct order.
+ // We'll validate that here.
+ $pattern = '/OAuth oauth_consumer_key=".*?", oauth_nonce="[a-zA-Z0-9]+", oauth_signature_method="HMAC-SHA1", oauth_timestamp="\d{10}", oauth_version="1.0", oauth_token="temporarycredentialsidentifier", oauth_signature=".*?"/';
+
+ $matches = preg_match($pattern, $headers['Authorization']);
+ $me->assertEquals(1, $matches, 'Asserting that the authorization header contains the correct expression.');
+
+ $me->assertSame($body, array('oauth_verifier' => 'myverifiercode'));
+
+ return true;
+ }))->once()->andReturn($response = m::mock('stdClass'));
+ $response->shouldReceive('getBody')->andReturn('oauth_token=tokencredentialsidentifier&oauth_token_secret=tokencredentialssecret');
+
+ $credentials = $server->getTokenCredentials($temporaryCredentials, 'temporarycredentialsidentifier', 'myverifiercode');
+ $this->assertInstanceOf('League\OAuth1\Client\Credentials\TokenCredentials', $credentials);
+ $this->assertEquals('tokencredentialsidentifier', $credentials->getIdentifier());
+ $this->assertEquals('tokencredentialssecret', $credentials->getSecret());
+ }
+
+ public function testGettingUserDetails()
+ {
+ $server = m::mock('League\OAuth1\Client\Server\Xing[createHttpClient,protocolHeader]', array($this->getMockClientCredentials()));
+
+ $temporaryCredentials = m::mock('League\OAuth1\Client\Credentials\TokenCredentials');
+ $temporaryCredentials->shouldReceive('getIdentifier')->andReturn('tokencredentialsidentifier');
+ $temporaryCredentials->shouldReceive('getSecret')->andReturn('tokencredentialssecret');
+
+ $server->shouldReceive('createHttpClient')->andReturn($client = m::mock('stdClass'));
+
+ $me = $this;
+ $client->shouldReceive('get')->with('https://api.xing.com/v1/users/me', m::on(function ($options) use ($me) {
+ $headers = $options['headers'];
+
+ $me->assertTrue(isset($headers['Authorization']));
+
+ // OAuth protocol specifies a strict number of
+ // headers should be sent, in the correct order.
+ // We'll validate that here.
+ $pattern = '/OAuth oauth_consumer_key=".*?", oauth_nonce="[a-zA-Z0-9]+", oauth_signature_method="HMAC-SHA1", oauth_timestamp="\d{10}", oauth_version="1.0", oauth_token="tokencredentialsidentifier", oauth_signature=".*?"/';
+
+ $matches = preg_match($pattern, $headers['Authorization']);
+ $me->assertEquals(1, $matches, 'Asserting that the authorization header contains the correct expression.');
+
+ return true;
+ }))->once()->andReturn($response = m::mock('stdClass'));
+ $response->shouldReceive('getBody')->once()->andReturn($this->getUserPayload());
+
+ $user = $server->getUserDetails($temporaryCredentials);
+ $this->assertInstanceOf('League\OAuth1\Client\Server\User', $user);
+ $this->assertEquals('Roman Gelembjuk', $user->name);
+ $this->assertEquals('17144430_0f9409', $server->getUserUid($temporaryCredentials));
+ $this->assertEquals('XXXXXXXXXX@gmail.com', $server->getUserEmail($temporaryCredentials));
+ $this->assertEquals('Roman Gelembjuk', $server->getUserScreenName($temporaryCredentials));
+ }
+
+ protected function getMockClientCredentials()
+ {
+ return array(
+ 'identifier' => $this->getApplicationKey(),
+ 'secret' => 'mysecret',
+ 'callback_uri' => 'http://app.dev/',
+ );
+ }
+
+ protected function getApplicationKey()
+ {
+ return 'abcdefghijk';
+ }
+
+ protected function getApplicationExpiration($days = 0)
+ {
+ return is_numeric($days) && $days > 0 ? $days.'day'.($days == 1 ? '' : 's') : 'never';
+ }
+
+ protected function getApplicationName()
+ {
+ return 'fizz buzz';
+ }
+
+ private function getUserPayload()
+ {
+ return '{
+ "users":[
+ {
+ "id":"17144430_0f9409",
+ "active_email":"XXXXXXXXXX@gmail.com",
+ "time_zone":
+ {
+ "utc_offset":3.0,
+ "name":"Europe/Kiev"
+ },
+ "display_name":"Roman Gelembjuk",
+ "first_name":"Roman",
+ "last_name":"Gelembjuk",
+ "gender":"m",
+ "page_name":"Roman_Gelembjuk",
+ "birth_date":
+ {"year":null,"month":null,"day":null},
+ "wants":null,
+ "haves":null,
+ "interests":null,
+ "web_profiles":{},
+ "badges":[],
+ "photo_urls":
+ {
+ "large":"https://x1.xingassets.com/assets/frontend_minified/img/users/nobody_m.140x185.jpg",
+ "maxi_thumb":"https://x1.xingassets.com/assets/frontend_minified/img/users/nobody_m.70x93.jpg",
+ "medium_thumb":"https://x1.xingassets.com/assets/frontend_minified/img/users/nobody_m.57x75.jpg"
+ },
+ "permalink":"https://www.xing.com/profile/Roman_Gelembjuk",
+ "languages":{"en":null},
+ "employment_status":"EMPLOYEE",
+ "organisation_member":null,
+ "instant_messaging_accounts":{},
+ "educational_background":
+ {"degree":null,"primary_school":null,"schools":[],"qualifications":[]},
+ "private_address":{
+ "street":null,
+ "zip_code":null,
+ "city":null,
+ "province":null,
+ "country":null,
+ "email":"XXXXXXXX@gmail.com",
+ "fax":null,
+ "phone":null,
+ "mobile_phone":null}
+ ,"business_address":
+ {
+ "street":null,
+ "zip_code":null,
+ "city":"Ivano-Frankivsk",
+ "province":null,
+ "country":"UA",
+ "email":null,
+ "fax":null,"phone":null,"mobile_phone":null
+ },
+ "premium_services":[]
+ }]}';
+ }
+}
diff --git a/vendor/league/oauth1-client/tests/stubs/ServerStub.php b/vendor/league/oauth1-client/tests/stubs/ServerStub.php
new file mode 100644
index 0000000000..b211bab92a
--- /dev/null
+++ b/vendor/league/oauth1-client/tests/stubs/ServerStub.php
@@ -0,0 +1,76 @@
+firstName = $data['foo'];
+ return $user;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userUid($data, TokenCredentials $tokenCredentials)
+ {
+ return isset($data['id']) ? $data['id'] : null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userEmail($data, TokenCredentials $tokenCredentials)
+ {
+ return isset($data['contact_email']) ? $data['contact_email'] : null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function userScreenName($data, TokenCredentials $tokenCredentials)
+ {
+ return isset($data['username']) ? $data['username'] : null;
+ }
+}
diff --git a/vendor/league/oauth2-client/CHANGELOG.md b/vendor/league/oauth2-client/CHANGELOG.md
new file mode 100644
index 0000000000..73a24dd886
--- /dev/null
+++ b/vendor/league/oauth2-client/CHANGELOG.md
@@ -0,0 +1,301 @@
+# OAuth 2.0 Client Changelog
+
+## 2.3.0
+
+_Released: 2018-01-13_
+
+* Add `ProviderRedirectTrait` tool for 3rd-party provider libraries to use when
+ handling provider redirections
+* Fix TypeError thrown because `getResourceOwner()` receives a non-JSON Response
+* Gracefully handle non-standard errors received from providers
+* Update README to reflect official support of PHP 7.2
+
+## 2.2.1
+
+_Released: 2017-04-25_
+
+* Fix potential type error when HTTP 500 errors are encountered
+* Allow broader range of `random_compat` versions
+
+## 2.2.0
+
+_Released: 2017-02-01_
+
+* Allow base URLs to contain query parameters
+* Protect against `+` being improperly encoded in URL parameters
+* Remove misleading `state` option from authorization parameters
+* Stop generating more random bytes than necessary
+
+## 2.1.0
+
+_Released: 2017-01-24_
+
+* Allow `expires_in` with a value of `0`
+
+## 2.0.0
+
+_Released: 2017-01-12_
+
+* Rename `getResponse()` to `getParsedResponse()`
+* Add `getResponse()` method that returns the unparsed PSR-7 `Response` instance
+* Removed `RandomFactory`, switched to native random functions
+
+## 1.4.1
+
+_Released: 2016-04-29_
+
+* Add `QueryBuilderTrait` to standardize query string generation.
+
+## 1.4.0
+
+_Released: 2016-04-19_
+
+* Add `AccessToken::getValues()` to access additional vendor data provided with tokens.
+
+## 1.3.0
+
+_Released: 2016-02-13_
+
+* Enable dynamic parameters being passed into the authorization URL.
+* Minor documentation updates.
+
+## 1.2.0
+
+_Released: 2016-01-23_
+
+* Add `resource_owner_id` to the JSON-serialized representation of the access token.
+* Minor documentation updates and improved test coverage.
+
+## 1.1.0
+
+_Released: 2015-11-13_
+
+* Add `ArrayAccessorTrait`, update `AbstractProvider` to utilize.
+* Use `expires` to serialize access tokens.
+* Documentation updates.
+
+## 1.0.2
+
+_Released: 2015-09-22_
+
+* Allow access tokens to be created from storage (see #431).
+* Minor fixes and documentation updates.
+
+## 1.0.1
+
+_Released: 2015-08-26_
+
+* Allow required parameters checked using the `RequiredParameterTrait` to be set as `false`, `null`, `"0"`, etc.
+
+## 1.0.0
+
+_Released: 2015-08-19_
+
+* We are running code-quality builds through Scrutinizer, and we are running unit test builds on the new Travis CI container-based infrastructure.
+* Cleaned up code, as recommended by Scrutinizer.
+* Documentation updates.
+
+## 1.0.0-beta2
+
+_Released: 2015-08-12_
+
+* BREAK: Add toArray() to ResourceOwnerInterface.
+* Always attempt to parse responses as JSON and fallback on failure.
+* Add dot notation support to access token resource owner ID.
+* Use the Bearer authorization header for the generic provider.
+* Documentation updates.
+
+## 1.0.0-beta1
+
+_Released: 2015-07-16_
+
+* API for 1.0 is now frozen!
+* BREAK: Convert all uses of "User" to "ResourceOwner" to more closely match the OAuth 2.0 specification.
+* BREAK: Rename `StandardProvider` to `GenericProvider`.
+* BREAK: Move access token creation to the `AbstractProvider`. It was previously handled in the `AbstractGrant`.
+* FIX: Add `Content-Type` header with value of `application/x-www-form-urlencoded` to the request header when retrieving access tokens. This adheres to the OAuth 2.0 specification and fixes issues where certain OAuth servers expect this header.
+* Enhanced `json_encode()` serialization of AccessToken; when using `json_encode()` on an AccessToken, it will return a JSON object with these properties: `access_token`, `refresh_token`, and `expires_in`.
+
+## 1.0.0-alpha2
+
+_Released: 2015-07-04_
+
+* BREAK: Renamed `AbstractProvider::ACCESS_TOKEN_METHOD_GET` to `AbstractProvider::METHOD_GET`.
+* BREAK: Renamed `AbstractProvider::ACCESS_TOKEN_METHOD_POST` to `AbstractProvider::METHOD_POST`.
+* BREAK: Renamed `AbstractProvider::prepareUserDetails()` to `AbstractProvider::createUser()`.
+* BREAK: Renamed `AbstractProvider::getUserDetails()` to `AbstractProvider::getUser()`.
+* BREAK: Removed `$token` parameter from `AbstractProvider::getDefaultHeaders()`.
+* BREAK: Modify `AbstractProvider::getBaseAccessTokenUrl()` to accept a required array of parameters, allowing providers the ability to vary the access token URL, based on the parameters.
+* Removed newline characters from MAC Authorization header.
+* Documentation updates, notably:
+ - Moved list of providers to `README.PROVIDERS.md`.
+ - Moved provider creation notes to `README.PROVIDER-GUIDE.md`.
+
+## 1.0.0-alpha1
+
+_Released: 2015-06-25_
+
+This release contains numerous BC breaks from the 0.x series. Please note these breaks and refer to the [upgrade guide](GUIDE-UPGRADING.md).
+
+* BREAK: Requires PHP 5.5.0 and greater.
+* BREAK: All providers have been moved to separate repositories, one for each provider.
+* BREAK: All `public` properties have been set as `protected` or `private` and getters/setters have been introduced for access to these properties.
+* BREAK: The `Provider\ProviderInterface` has been removed. Please extend from and override `Provider\AbstractProvider`.
+* BREAK: The `Entity\User` has been removed. Providers should implement the `Provider\UserInterface` and provide user functionality instead of expecting it in this base library.
+* BREAK: The `Grant\GrantInterface` has been removed. Providers needing to provide a new grant type should extend from and override `Grant\AbstractGrant`.
+* A generic `Provider\StandardProvider` has been introduced, which may be used as a client to integrate with most OAuth 2.0 compatible servers.
+* A `Grant\GrantFactory` has been introduced as a means to register and retrieve singleton grants from a registry.
+* Introduced traits for bearer and MAC authorization (`Tool\BearerAuthorizationTrait` and `Tool\MacAuthorizationTrait`), which providers may use to enable these header authorization types.
+
+## 0.12.1
+
+_Released: 2015-06-20_
+
+* FIX: Scope separators for LinkedIn and Instagram are now correctly a single space
+
+## 0.12.0
+
+_Released: 2015-06-15_
+
+* BREAK: LinkedIn Provider: Default scopes removed from LinkedIn Provider. See "[Managing LinkedIn Scopes](https://github.com/thephpleague/oauth2-client/blob/9cea9864c2e89bce1b922d1e37ba5378b3b0b264/README.md#managing-linkedin-scopes)" in the README for information on how to set scopes. See [#327](https://github.com/thephpleague/oauth2-client/pull/327) and [#307](https://github.com/thephpleague/oauth2-client/pull/307) for details on this change.
+* FIX: LinkedIn Provider: A scenario existed in which `publicProfileUrl` was not set, generating a PHP notice; this has been fixed.
+* FIX: Instagram Provider: Fixed scope separator.
+* Documentation updates and corrections.
+
+
+## 0.11.0
+
+_Released: 2015-04-25_
+
+* Identity Provider: Better handling of error responses
+* Documentation updates
+
+
+## 0.10.1
+
+_Released: 2015-04-02_
+
+* FIX: Invalid JSON triggering fatal error
+* FIX: Sending headers along with auth `getAccessToken()` requests
+* Now running Travis CI tests on PHP 7
+* Documentation updates
+
+
+## 0.10.0
+
+_Released: 2015-03-10_
+
+* Providers: Added `getHeaders()` to ProviderInterface and updated AbstractProvider to provide the method
+* Providers: Updated all bundled providers to support new `$authorizationHeader` property
+* Identity Provider: Update IDPException to account for empty strings
+* Identity Provider: Added `getResponseBody()` method to IDPException
+* Documentation updates, minor bug fixes, and coding standards fixes
+
+
+## 0.9.0
+
+_Released: 2015-02-24_
+
+* Add `AbstractProvider::prepareAccessTokenResult()` to provide additional token response preparation to providers
+* Remove custom provider code from AccessToken
+* Add links to README for Dropbox and Square providers
+
+
+## 0.8.1
+
+_Released: 2015-02-12_
+
+* Allow `approval_prompt` to be set by providers. This fixes an issue where some providers have problems if the `approval_prompt` is present in the query string.
+
+
+## 0.8.0
+
+_Released: 2015-02-10_
+
+* Facebook Provider: Upgrade to Graph API v2.2
+* Google Provider: Add `access_type` parameter for Google authorization URL
+* Get a more reliable response body on errors
+
+
+## 0.7.2
+
+_Released: 2015-02-03_
+
+* GitHub Provider: Fix regression
+* Documentation updates
+
+
+## 0.7.1
+
+_Released: 2015-01-06_
+
+* Google Provider: fixed issue where Google API was not returning the user ID
+
+
+## 0.7.0
+
+_Released: 2014-12-29_
+
+* Improvements to Provider\AbstractProvider (addition of `userUid()`, `userEmail()`, and `userScreenName()`)
+* GitHub Provider: Support for GitHub Enterprise
+* GitHub Provider: Methods to allow fetching user email addresses
+* Google Provider: Updated scopes and endpoints to remove deprecated values
+* Documentation updates, minor bug fixes, and coding standards fixes
+
+
+## 0.6.0
+
+_Released: 2014-12-03_
+
+* Added ability to specify a redirect handler for providers through use of a callback (see [Provider\AbstractProvider::setRedirectHandler()](https://github.com/thephpleague/oauth2-client/blob/55de45401eaa21f53c0b2414091da6f3b0f3fcb7/src/Provider/AbstractProvider.php#L314-L317))
+* Updated authorize and token URLs for the Microsoft provider; the old URLs had been phased out and were no longer working (see #146)
+* Increased test coverage
+* Documentation updates, minor bug fixes, and coding standards fixes
+
+
+## 0.5.0
+
+_Released: 2014-11-28_
+
+* Added `ClientCredentials` and `Password` grants
+* Added support for providers to set their own `uid` parameter key name
+* Added support for Google's `hd` (hosted domain) parameter
+* Added support for providing a custom `state` parameter to the authorization URL
+* LinkedIn `pictureUrl` is now an optional response element
+* Added Battle.net provider package link to README
+* Added Meetup provider package link to README
+* Added `.gitattributes` file
+* Increased test coverage
+* A number of documentation fixes, minor bug fixes, and coding standards fixes
+
+
+## 0.4.0
+
+_Released: 2014-10-28_
+
+* Added `ProviderInterface` and removed `IdentityProvider`.
+* Expose generated state to allow for CSRF validation.
+* Renamed `League\OAuth2\Client\Provider\User` to `League\OAuth2\Client\Entity\User`.
+* Entity: User: added `gender` and `locale` properties
+* Updating logic for populating the token expiration time.
+
+
+## 0.3.0
+
+_Released: 2014-04-26_
+
+* This release made some huge leaps forward, including 100% unit-coverage and a bunch of new features.
+
+
+## 0.2.0
+
+_Released: 2013-05-28_
+
+* No release notes available.
+
+
+## 0.1.0
+
+_Released: 2013-05-25_
+
+* Initial release.
diff --git a/vendor/league/oauth2-client/CONTRIBUTING.md b/vendor/league/oauth2-client/CONTRIBUTING.md
new file mode 100644
index 0000000000..056e870057
--- /dev/null
+++ b/vendor/league/oauth2-client/CONTRIBUTING.md
@@ -0,0 +1,39 @@
+# Contributing
+
+Contributions are **welcome** and will be fully **credited**.
+
+We accept contributions via Pull Requests on [Github](https://github.com/thephpleague/oauth2-client).
+
+
+## Pull Requests
+
+- **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** - The easiest way to apply the conventions is to install [PHP Code Sniffer](http://pear.php.net/package/PHP_CodeSniffer).
+
+- **Add tests!** - Your patch won't be accepted if it doesn't have tests.
+
+- **Document any change in behaviour** - Make sure the README and any other relevant documentation are kept up-to-date.
+
+- **Consider our release cycle** - We try to follow SemVer. Randomly breaking public APIs is not an option.
+
+- **Create topic branches** - Don't ask us to pull from your master branch.
+
+- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests.
+
+- **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please squash them before submitting.
+
+- **Ensure tests pass!** - Please run the tests (see below) before submitting your pull request, and make sure they pass. We won't accept a patch until all tests pass.
+
+- **Ensure no coding standards violations** - Please run PHP Code Sniffer using the PSR-2 standard (see below) before submitting your pull request. A violation will cause the build to fail, so please make sure there are no violations. We can't accept a patch if the build fails.
+
+
+## Testing
+
+The following tests must pass for a build to be considered successful. If contributing, please ensure these pass before submitting a pull request.
+
+``` bash
+$ ./vendor/bin/parallel-lint src test
+$ ./vendor/bin/phpunit --coverage-text
+$ ./vendor/bin/phpcs src --standard=psr2 -sp
+```
+
+**Happy coding**!
diff --git a/vendor/league/oauth2-client/CREDITS.md b/vendor/league/oauth2-client/CREDITS.md
new file mode 100644
index 0000000000..628f49e6e5
--- /dev/null
+++ b/vendor/league/oauth2-client/CREDITS.md
@@ -0,0 +1,20 @@
+# OAuth 2.0 Client
+
+## Authors
+
+Also see .
+
+### Current Maintainer
+
+- [Ben Ramsey](https://github.com/ramsey)
+
+### Contributors
+
+- [Alex Bilbie](https://github.com/alexbilbie)
+- [Ben Corlett](https://github.com/bencorlett)
+- [Ben Ramsey](https://github.com/ramsey)
+- [James Mills](https://github.com/jamesmills)
+- [Phil Sturgeon](https://github.com/philsturgeon)
+- [Rudi Theunissen](https://github.com/rtheunissen)
+- [Tom Anderson](https://github.com/TomHAnderson)
+- [Woody Gilk](https://github.com/shadowhand)
diff --git a/vendor/league/oauth2-client/LICENSE b/vendor/league/oauth2-client/LICENSE
new file mode 100644
index 0000000000..262729740a
--- /dev/null
+++ b/vendor/league/oauth2-client/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2013-2018 Alex Bilbie
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/league/oauth2-client/README.PROVIDER-GUIDE.md b/vendor/league/oauth2-client/README.PROVIDER-GUIDE.md
new file mode 100644
index 0000000000..4999d7da14
--- /dev/null
+++ b/vendor/league/oauth2-client/README.PROVIDER-GUIDE.md
@@ -0,0 +1,96 @@
+# OAuth 2.0 Client
+
+## Provider Guide
+
+New providers may be created by copying the layout of an existing package. See
+the [list of providers](docs/providers/thirdparty.md) for good examples.
+
+When choosing a name for your package, please don’t use the `league` vendor
+prefix, as this implies that it is officially supported. You should use your own
+username as the vendor prefix, and prepend `oauth2-` to the package name to make
+it clear that your package works with OAuth2 Client. For example, if your GitHub
+username was "santa," and you were implementing the "giftpay" OAuth2 library, a
+good name for your composer package would be `santa/oauth2-giftpay`.
+
+### Implementing your own provider
+
+If you are working with an oauth2 service not supported out-of-the-box or by an
+existing package, it is quite simple to implement your own. Simply extend
+[`League\OAuth2\Client\Provider\AbstractProvider`](src/Provider/AbstractProvider.php)
+and implement the required abstract methods:
+
+```php
+abstract public function getBaseAuthorizationUrl();
+abstract public function getBaseAccessTokenUrl(array $params);
+abstract public function getResourceOwnerDetailsUrl(AccessToken $token);
+abstract protected function getDefaultScopes();
+abstract protected function checkResponse(ResponseInterface $response, $data);
+abstract protected function createResourceOwner(array $response, AccessToken $token);
+```
+
+Each of these abstract methods contain a docblock defining their expectations
+and typical behavior. Once you have extended this class, you can simply follow
+the [usage example in the README](README.md#usage) using your new `Provider`.
+
+If you wish to use the `Provider` to make authenticated requests to the
+service, you will also need to define how you provide the token to the
+service. If this is done via headers, you should override this method:
+
+```php
+protected function getAuthorizationHeaders($token = null);
+```
+
+This package comes with a trait for implementing `Bearer` authorization.
+To use this, you just need to include the trait in your `Provider` class:
+
+```php
+ 'demoapp', // The client ID assigned to you by the provider
+ 'clientSecret' => 'demopass', // The client password assigned to you by the provider
+ 'redirectUri' => 'http://example.com/your-redirect-url/',
+ 'urlAuthorize' => 'http://brentertainment.com/oauth2/lockdin/authorize',
+ 'urlAccessToken' => 'http://brentertainment.com/oauth2/lockdin/token',
+ 'urlResourceOwnerDetails' => 'http://brentertainment.com/oauth2/lockdin/resource'
+]);
+
+// If we don't have an authorization code then get one
+if (!isset($_GET['code'])) {
+
+ // Fetch the authorization URL from the provider; this returns the
+ // urlAuthorize option and generates and applies any necessary parameters
+ // (e.g. state).
+ $authorizationUrl = $provider->getAuthorizationUrl();
+
+ // Get the state generated for you and store it to the session.
+ $_SESSION['oauth2state'] = $provider->getState();
+
+ // Redirect the user to the authorization URL.
+ header('Location: ' . $authorizationUrl);
+ exit;
+
+// Check given state against previously stored one to mitigate CSRF attack
+} elseif (empty($_GET['state']) || (isset($_SESSION['oauth2state']) && $_GET['state'] !== $_SESSION['oauth2state'])) {
+
+ if (isset($_SESSION['oauth2state'])) {
+ unset($_SESSION['oauth2state']);
+ }
+
+ exit('Invalid state');
+
+} else {
+
+ try {
+
+ // Try to get an access token using the authorization code grant.
+ $accessToken = $provider->getAccessToken('authorization_code', [
+ 'code' => $_GET['code']
+ ]);
+
+ // We have an access token, which we may use in authenticated
+ // requests against the service provider's API.
+ echo 'Access Token: ' . $accessToken->getToken() . " ";
+ echo 'Refresh Token: ' . $accessToken->getRefreshToken() . " ";
+ echo 'Expired in: ' . $accessToken->getExpires() . " ";
+ echo 'Already expired? ' . ($accessToken->hasExpired() ? 'expired' : 'not expired') . " ";
+
+ // Using the access token, we may look up details about the
+ // resource owner.
+ $resourceOwner = $provider->getResourceOwner($accessToken);
+
+ var_export($resourceOwner->toArray());
+
+ // The provider provides a way to get an authenticated API request for
+ // the service, using the access token; it returns an object conforming
+ // to Psr\Http\Message\RequestInterface.
+ $request = $provider->getAuthenticatedRequest(
+ 'GET',
+ 'http://brentertainment.com/oauth2/lockdin/resource',
+ $accessToken
+ );
+
+ } catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) {
+
+ // Failed to get the access token or user details.
+ exit($e->getMessage());
+
+ }
+
+}
+```
+
+### Refreshing a Token
+
+Once your application is authorized, you can refresh an expired token using a refresh token rather than going through the entire process of obtaining a brand new token. To do so, simply reuse this refresh token from your data store to request a refresh.
+
+_This example uses [Brent Shaffer's](https://github.com/bshaffer) demo OAuth 2.0 application named **Lock'd In**. See authorization code example above, for more details._
+
+```php
+$provider = new \League\OAuth2\Client\Provider\GenericProvider([
+ 'clientId' => 'demoapp', // The client ID assigned to you by the provider
+ 'clientSecret' => 'demopass', // The client password assigned to you by the provider
+ 'redirectUri' => 'http://example.com/your-redirect-url/',
+ 'urlAuthorize' => 'http://brentertainment.com/oauth2/lockdin/authorize',
+ 'urlAccessToken' => 'http://brentertainment.com/oauth2/lockdin/token',
+ 'urlResourceOwnerDetails' => 'http://brentertainment.com/oauth2/lockdin/resource'
+]);
+
+$existingAccessToken = getAccessTokenFromYourDataStore();
+
+if ($existingAccessToken->hasExpired()) {
+ $newAccessToken = $provider->getAccessToken('refresh_token', [
+ 'refresh_token' => $existingAccessToken->getRefreshToken()
+ ]);
+
+ // Purge old access token and store new access token to your data store.
+}
+```
+
+### Resource Owner Password Credentials Grant
+
+Some service providers allow you to skip the authorization code step to exchange a user's credentials (username and password) for an access token. This is referred to as the "resource owner password credentials" grant type.
+
+According to [section 1.3.3](http://tools.ietf.org/html/rfc6749#section-1.3.3) of the OAuth 2.0 standard (emphasis added):
+
+> The credentials **should only be used when there is a high degree of trust**
+> between the resource owner and the client (e.g., the client is part of the
+> device operating system or a highly privileged application), and when other
+> authorization grant types are not available (such as an authorization code).
+
+**We do not advise using this grant type if the service provider supports the authorization code grant type (see above), as this reinforces the [password anti-pattern](https://agentile.com/the-password-anti-pattern) by allowing users to think it's okay to trust third-party applications with their usernames and passwords.**
+
+That said, there are use-cases where the resource owner password credentials grant is acceptable and useful. Here's an example using it with [Brent Shaffer's](https://github.com/bshaffer) demo OAuth 2.0 application named **Lock'd In**. See authorization code example above, for more details about the Lock'd In demo application.
+
+``` php
+$provider = new \League\OAuth2\Client\Provider\GenericProvider([
+ 'clientId' => 'demoapp', // The client ID assigned to you by the provider
+ 'clientSecret' => 'demopass', // The client password assigned to you by the provider
+ 'redirectUri' => 'http://example.com/your-redirect-url/',
+ 'urlAuthorize' => 'http://brentertainment.com/oauth2/lockdin/authorize',
+ 'urlAccessToken' => 'http://brentertainment.com/oauth2/lockdin/token',
+ 'urlResourceOwnerDetails' => 'http://brentertainment.com/oauth2/lockdin/resource'
+]);
+
+try {
+
+ // Try to get an access token using the resource owner password credentials grant.
+ $accessToken = $provider->getAccessToken('password', [
+ 'username' => 'demouser',
+ 'password' => 'testpass'
+ ]);
+
+} catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) {
+
+ // Failed to get the access token
+ exit($e->getMessage());
+
+}
+```
+
+### Client Credentials Grant
+
+When your application is acting on its own behalf to access resources it controls/owns in a service provider, it may use the client credentials grant type. This is best used when the credentials for your application are stored privately and never exposed (e.g. through the web browser, etc.) to end-users. This grant type functions similarly to the resource owner password credentials grant type, but it does not request a user's username or password. It uses only the client ID and secret issued to your client by the service provider.
+
+Unlike earlier examples, the following does not work against a functioning demo service provider. It is provided for the sake of example only.
+
+``` php
+// Note: the GenericProvider requires the `urlAuthorize` option, even though
+// it's not used in the OAuth 2.0 client credentials grant type.
+
+$provider = new \League\OAuth2\Client\Provider\GenericProvider([
+ 'clientId' => 'XXXXXX', // The client ID assigned to you by the provider
+ 'clientSecret' => 'XXXXXX', // The client password assigned to you by the provider
+ 'redirectUri' => 'http://my.example.com/your-redirect-url/',
+ 'urlAuthorize' => 'http://service.example.com/authorize',
+ 'urlAccessToken' => 'http://service.example.com/token',
+ 'urlResourceOwnerDetails' => 'http://service.example.com/resource'
+]);
+
+try {
+
+ // Try to get an access token using the client credentials grant.
+ $accessToken = $provider->getAccessToken('client_credentials');
+
+} catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) {
+
+ // Failed to get the access token
+ exit($e->getMessage());
+
+}
+```
+
+### Using a proxy
+
+It is possible to use a proxy to debug HTTP calls made to a provider. All you need to do is set the `proxy` and `verify` options when creating your Provider instance. Make sure you enable SSL proxying in your proxy.
+
+``` php
+$provider = new \League\OAuth2\Client\Provider\GenericProvider([
+ 'clientId' => 'XXXXXX', // The client ID assigned to you by the provider
+ 'clientSecret' => 'XXXXXX', // The client password assigned to you by the provider
+ 'redirectUri' => 'http://my.example.com/your-redirect-url/',
+ 'urlAuthorize' => 'http://service.example.com/authorize',
+ 'urlAccessToken' => 'http://service.example.com/token',
+ 'urlResourceOwnerDetails' => 'http://service.example.com/resource',
+ 'proxy' => '192.168.0.1:8888',
+ 'verify' => false
+]);
+```
+
+## Install
+
+Via Composer
+
+``` bash
+$ composer require league/oauth2-client
+```
+
+## Contributing
+
+Please see [CONTRIBUTING](https://github.com/thephpleague/oauth2-client/blob/master/CONTRIBUTING.md) for details.
+
+## License
+
+The MIT License (MIT). Please see [License File](https://github.com/thephpleague/oauth2-client/blob/master/LICENSE) for more information.
+
+
+[PSR-1]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md
+[PSR-2]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
+[PSR-4]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md
+[PSR-7]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-7-http-message.md
diff --git a/vendor/league/oauth2-client/composer.json b/vendor/league/oauth2-client/composer.json
new file mode 100644
index 0000000000..66c10045cd
--- /dev/null
+++ b/vendor/league/oauth2-client/composer.json
@@ -0,0 +1,59 @@
+{
+ "name": "league/oauth2-client",
+ "description": "OAuth 2.0 Client Library",
+ "license": "MIT",
+ "config": {
+ "sort-packages": true
+ },
+ "require": {
+ "php": "^5.6|^7.0",
+ "guzzlehttp/guzzle": "^6.0",
+ "paragonie/random_compat": "^1|^2"
+ },
+ "require-dev": {
+ "eloquent/liberator": "^2.0",
+ "eloquent/phony-phpunit": "^1.0|^3.0",
+ "jakub-onderka/php-parallel-lint": "^0.9.2",
+ "phpunit/phpunit": "^5.7|^6.0",
+ "squizlabs/php_codesniffer": "^2.3|^3.0"
+ },
+ "keywords": [
+ "oauth",
+ "oauth2",
+ "authorization",
+ "authentication",
+ "idp",
+ "identity",
+ "sso",
+ "single sign on"
+ ],
+ "authors": [
+ {
+ "name": "Alex Bilbie",
+ "email": "hello@alexbilbie.com",
+ "homepage": "http://www.alexbilbie.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Woody Gilk",
+ "homepage": "https://github.com/shadowhand",
+ "role": "Contributor"
+ }
+
+ ],
+ "autoload": {
+ "psr-4": {
+ "League\\OAuth2\\Client\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "League\\OAuth2\\Client\\Test\\": "test/src/"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.0.x-dev"
+ }
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Grant/AbstractGrant.php b/vendor/league/oauth2-client/src/Grant/AbstractGrant.php
new file mode 100644
index 0000000000..2c0244ba3d
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Grant/AbstractGrant.php
@@ -0,0 +1,80 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Grant;
+
+use League\OAuth2\Client\Tool\RequiredParameterTrait;
+
+/**
+ * Represents a type of authorization grant.
+ *
+ * An authorization grant is a credential representing the resource
+ * owner's authorization (to access its protected resources) used by the
+ * client to obtain an access token. OAuth 2.0 defines four
+ * grant types -- authorization code, implicit, resource owner password
+ * credentials, and client credentials -- as well as an extensibility
+ * mechanism for defining additional types.
+ *
+ * @link http://tools.ietf.org/html/rfc6749#section-1.3 Authorization Grant (RFC 6749, §1.3)
+ */
+abstract class AbstractGrant
+{
+ use RequiredParameterTrait;
+
+ /**
+ * Returns the name of this grant, eg. 'grant_name', which is used as the
+ * grant type when encoding URL query parameters.
+ *
+ * @return string
+ */
+ abstract protected function getName();
+
+ /**
+ * Returns a list of all required request parameters.
+ *
+ * @return array
+ */
+ abstract protected function getRequiredRequestParameters();
+
+ /**
+ * Returns this grant's name as its string representation. This allows for
+ * string interpolation when building URL query parameters.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->getName();
+ }
+
+ /**
+ * Prepares an access token request's parameters by checking that all
+ * required parameters are set, then merging with any given defaults.
+ *
+ * @param array $defaults
+ * @param array $options
+ * @return array
+ */
+ public function prepareRequestParameters(array $defaults, array $options)
+ {
+ $defaults['grant_type'] = $this->getName();
+
+ $required = $this->getRequiredRequestParameters();
+ $provided = array_merge($defaults, $options);
+
+ $this->checkRequiredParameters($required, $provided);
+
+ return $provided;
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Grant/AuthorizationCode.php b/vendor/league/oauth2-client/src/Grant/AuthorizationCode.php
new file mode 100644
index 0000000000..c49460c02d
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Grant/AuthorizationCode.php
@@ -0,0 +1,41 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Grant;
+
+/**
+ * Represents an authorization code grant.
+ *
+ * @link http://tools.ietf.org/html/rfc6749#section-1.3.1 Authorization Code (RFC 6749, §1.3.1)
+ */
+class AuthorizationCode extends AbstractGrant
+{
+ /**
+ * @inheritdoc
+ */
+ protected function getName()
+ {
+ return 'authorization_code';
+ }
+
+ /**
+ * @inheritdoc
+ */
+ protected function getRequiredRequestParameters()
+ {
+ return [
+ 'code',
+ ];
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Grant/ClientCredentials.php b/vendor/league/oauth2-client/src/Grant/ClientCredentials.php
new file mode 100644
index 0000000000..dc78c4fdab
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Grant/ClientCredentials.php
@@ -0,0 +1,39 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Grant;
+
+/**
+ * Represents a client credentials grant.
+ *
+ * @link http://tools.ietf.org/html/rfc6749#section-1.3.4 Client Credentials (RFC 6749, §1.3.4)
+ */
+class ClientCredentials extends AbstractGrant
+{
+ /**
+ * @inheritdoc
+ */
+ protected function getName()
+ {
+ return 'client_credentials';
+ }
+
+ /**
+ * @inheritdoc
+ */
+ protected function getRequiredRequestParameters()
+ {
+ return [];
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Grant/Exception/InvalidGrantException.php b/vendor/league/oauth2-client/src/Grant/Exception/InvalidGrantException.php
new file mode 100644
index 0000000000..c3c4e677b4
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Grant/Exception/InvalidGrantException.php
@@ -0,0 +1,26 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Grant\Exception;
+
+use InvalidArgumentException;
+
+/**
+ * Exception thrown if the grant does not extend from AbstractGrant.
+ *
+ * @see League\OAuth2\Client\Grant\AbstractGrant
+ */
+class InvalidGrantException extends InvalidArgumentException
+{
+}
diff --git a/vendor/league/oauth2-client/src/Grant/GrantFactory.php b/vendor/league/oauth2-client/src/Grant/GrantFactory.php
new file mode 100644
index 0000000000..71990e83db
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Grant/GrantFactory.php
@@ -0,0 +1,104 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Grant;
+
+use League\OAuth2\Client\Grant\Exception\InvalidGrantException;
+
+/**
+ * Represents a factory used when retrieving an authorization grant type.
+ */
+class GrantFactory
+{
+ /**
+ * @var array
+ */
+ protected $registry = [];
+
+ /**
+ * Defines a grant singleton in the registry.
+ *
+ * @param string $name
+ * @param AbstractGrant $grant
+ * @return self
+ */
+ public function setGrant($name, AbstractGrant $grant)
+ {
+ $this->registry[$name] = $grant;
+
+ return $this;
+ }
+
+ /**
+ * Returns a grant singleton by name.
+ *
+ * If the grant has not be registered, a default grant will be loaded.
+ *
+ * @param string $name
+ * @return AbstractGrant
+ */
+ public function getGrant($name)
+ {
+ if (empty($this->registry[$name])) {
+ $this->registerDefaultGrant($name);
+ }
+
+ return $this->registry[$name];
+ }
+
+ /**
+ * Registers a default grant singleton by name.
+ *
+ * @param string $name
+ * @return self
+ */
+ protected function registerDefaultGrant($name)
+ {
+ // PascalCase the grant. E.g: 'authorization_code' becomes 'AuthorizationCode'
+ $class = str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $name)));
+ $class = 'League\\OAuth2\\Client\\Grant\\' . $class;
+
+ $this->checkGrant($class);
+
+ return $this->setGrant($name, new $class);
+ }
+
+ /**
+ * Determines if a variable is a valid grant.
+ *
+ * @param mixed $class
+ * @return boolean
+ */
+ public function isGrant($class)
+ {
+ return is_subclass_of($class, AbstractGrant::class);
+ }
+
+ /**
+ * Checks if a variable is a valid grant.
+ *
+ * @throws InvalidGrantException
+ * @param mixed $class
+ * @return void
+ */
+ public function checkGrant($class)
+ {
+ if (!$this->isGrant($class)) {
+ throw new InvalidGrantException(sprintf(
+ 'Grant "%s" must extend AbstractGrant',
+ is_object($class) ? get_class($class) : $class
+ ));
+ }
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Grant/Password.php b/vendor/league/oauth2-client/src/Grant/Password.php
new file mode 100644
index 0000000000..6543b2ebd1
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Grant/Password.php
@@ -0,0 +1,42 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Grant;
+
+/**
+ * Represents a resource owner password credentials grant.
+ *
+ * @link http://tools.ietf.org/html/rfc6749#section-1.3.3 Resource Owner Password Credentials (RFC 6749, §1.3.3)
+ */
+class Password extends AbstractGrant
+{
+ /**
+ * @inheritdoc
+ */
+ protected function getName()
+ {
+ return 'password';
+ }
+
+ /**
+ * @inheritdoc
+ */
+ protected function getRequiredRequestParameters()
+ {
+ return [
+ 'username',
+ 'password',
+ ];
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Grant/RefreshToken.php b/vendor/league/oauth2-client/src/Grant/RefreshToken.php
new file mode 100644
index 0000000000..8192182301
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Grant/RefreshToken.php
@@ -0,0 +1,41 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Grant;
+
+/**
+ * Represents a refresh token grant.
+ *
+ * @link http://tools.ietf.org/html/rfc6749#section-6 Refreshing an Access Token (RFC 6749, §6)
+ */
+class RefreshToken extends AbstractGrant
+{
+ /**
+ * @inheritdoc
+ */
+ protected function getName()
+ {
+ return 'refresh_token';
+ }
+
+ /**
+ * @inheritdoc
+ */
+ protected function getRequiredRequestParameters()
+ {
+ return [
+ 'refresh_token',
+ ];
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Provider/AbstractProvider.php b/vendor/league/oauth2-client/src/Provider/AbstractProvider.php
new file mode 100644
index 0000000000..0e2e94b0d2
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Provider/AbstractProvider.php
@@ -0,0 +1,828 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Provider;
+
+use GuzzleHttp\Client as HttpClient;
+use GuzzleHttp\ClientInterface as HttpClientInterface;
+use GuzzleHttp\Exception\BadResponseException;
+use League\OAuth2\Client\Grant\AbstractGrant;
+use League\OAuth2\Client\Grant\GrantFactory;
+use League\OAuth2\Client\Provider\Exception\IdentityProviderException;
+use League\OAuth2\Client\Token\AccessToken;
+use League\OAuth2\Client\Tool\ArrayAccessorTrait;
+use League\OAuth2\Client\Tool\QueryBuilderTrait;
+use League\OAuth2\Client\Tool\RequestFactory;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+use UnexpectedValueException;
+
+/**
+ * Represents a service provider (authorization server).
+ *
+ * @link http://tools.ietf.org/html/rfc6749#section-1.1 Roles (RFC 6749, §1.1)
+ */
+abstract class AbstractProvider
+{
+ use ArrayAccessorTrait;
+ use QueryBuilderTrait;
+
+ /**
+ * @var string Key used in a token response to identify the resource owner.
+ */
+ const ACCESS_TOKEN_RESOURCE_OWNER_ID = null;
+
+ /**
+ * @var string HTTP method used to fetch access tokens.
+ */
+ const METHOD_GET = 'GET';
+
+ /**
+ * @var string HTTP method used to fetch access tokens.
+ */
+ const METHOD_POST = 'POST';
+
+ /**
+ * @var string
+ */
+ protected $clientId;
+
+ /**
+ * @var string
+ */
+ protected $clientSecret;
+
+ /**
+ * @var string
+ */
+ protected $redirectUri;
+
+ /**
+ * @var string
+ */
+ protected $state;
+
+ /**
+ * @var GrantFactory
+ */
+ protected $grantFactory;
+
+ /**
+ * @var RequestFactory
+ */
+ protected $requestFactory;
+
+ /**
+ * @var HttpClientInterface
+ */
+ protected $httpClient;
+
+ /**
+ * Constructs an OAuth 2.0 service provider.
+ *
+ * @param array $options An array of options to set on this provider.
+ * Options include `clientId`, `clientSecret`, `redirectUri`, and `state`.
+ * Individual providers may introduce more options, as needed.
+ * @param array $collaborators An array of collaborators that may be used to
+ * override this provider's default behavior. Collaborators include
+ * `grantFactory`, `requestFactory`, and `httpClient`.
+ * Individual providers may introduce more collaborators, as needed.
+ */
+ public function __construct(array $options = [], array $collaborators = [])
+ {
+ foreach ($options as $option => $value) {
+ if (property_exists($this, $option)) {
+ $this->{$option} = $value;
+ }
+ }
+
+ if (empty($collaborators['grantFactory'])) {
+ $collaborators['grantFactory'] = new GrantFactory();
+ }
+ $this->setGrantFactory($collaborators['grantFactory']);
+
+ if (empty($collaborators['requestFactory'])) {
+ $collaborators['requestFactory'] = new RequestFactory();
+ }
+ $this->setRequestFactory($collaborators['requestFactory']);
+
+ if (empty($collaborators['httpClient'])) {
+ $client_options = $this->getAllowedClientOptions($options);
+
+ $collaborators['httpClient'] = new HttpClient(
+ array_intersect_key($options, array_flip($client_options))
+ );
+ }
+ $this->setHttpClient($collaborators['httpClient']);
+ }
+
+ /**
+ * Returns the list of options that can be passed to the HttpClient
+ *
+ * @param array $options An array of options to set on this provider.
+ * Options include `clientId`, `clientSecret`, `redirectUri`, and `state`.
+ * Individual providers may introduce more options, as needed.
+ * @return array The options to pass to the HttpClient constructor
+ */
+ protected function getAllowedClientOptions(array $options)
+ {
+ $client_options = ['timeout', 'proxy'];
+
+ // Only allow turning off ssl verification if it's for a proxy
+ if (!empty($options['proxy'])) {
+ $client_options[] = 'verify';
+ }
+
+ return $client_options;
+ }
+
+ /**
+ * Sets the grant factory instance.
+ *
+ * @param GrantFactory $factory
+ * @return self
+ */
+ public function setGrantFactory(GrantFactory $factory)
+ {
+ $this->grantFactory = $factory;
+
+ return $this;
+ }
+
+ /**
+ * Returns the current grant factory instance.
+ *
+ * @return GrantFactory
+ */
+ public function getGrantFactory()
+ {
+ return $this->grantFactory;
+ }
+
+ /**
+ * Sets the request factory instance.
+ *
+ * @param RequestFactory $factory
+ * @return self
+ */
+ public function setRequestFactory(RequestFactory $factory)
+ {
+ $this->requestFactory = $factory;
+
+ return $this;
+ }
+
+ /**
+ * Returns the request factory instance.
+ *
+ * @return RequestFactory
+ */
+ public function getRequestFactory()
+ {
+ return $this->requestFactory;
+ }
+
+ /**
+ * Sets the HTTP client instance.
+ *
+ * @param HttpClientInterface $client
+ * @return self
+ */
+ public function setHttpClient(HttpClientInterface $client)
+ {
+ $this->httpClient = $client;
+
+ return $this;
+ }
+
+ /**
+ * Returns the HTTP client instance.
+ *
+ * @return HttpClientInterface
+ */
+ public function getHttpClient()
+ {
+ return $this->httpClient;
+ }
+
+ /**
+ * Returns the current value of the state parameter.
+ *
+ * This can be accessed by the redirect handler during authorization.
+ *
+ * @return string
+ */
+ public function getState()
+ {
+ return $this->state;
+ }
+
+ /**
+ * Returns the base URL for authorizing a client.
+ *
+ * Eg. https://oauth.service.com/authorize
+ *
+ * @return string
+ */
+ abstract public function getBaseAuthorizationUrl();
+
+ /**
+ * Returns the base URL for requesting an access token.
+ *
+ * Eg. https://oauth.service.com/token
+ *
+ * @param array $params
+ * @return string
+ */
+ abstract public function getBaseAccessTokenUrl(array $params);
+
+ /**
+ * Returns the URL for requesting the resource owner's details.
+ *
+ * @param AccessToken $token
+ * @return string
+ */
+ abstract public function getResourceOwnerDetailsUrl(AccessToken $token);
+
+ /**
+ * Returns a new random string to use as the state parameter in an
+ * authorization flow.
+ *
+ * @param int $length Length of the random string to be generated.
+ * @return string
+ */
+ protected function getRandomState($length = 32)
+ {
+ // Converting bytes to hex will always double length. Hence, we can reduce
+ // the amount of bytes by half to produce the correct length.
+ return bin2hex(random_bytes($length / 2));
+ }
+
+ /**
+ * Returns the default scopes used by this provider.
+ *
+ * This should only be the scopes that are required to request the details
+ * of the resource owner, rather than all the available scopes.
+ *
+ * @return array
+ */
+ abstract protected function getDefaultScopes();
+
+ /**
+ * Returns the string that should be used to separate scopes when building
+ * the URL for requesting an access token.
+ *
+ * @return string Scope separator, defaults to ','
+ */
+ protected function getScopeSeparator()
+ {
+ return ',';
+ }
+
+ /**
+ * Returns authorization parameters based on provided options.
+ *
+ * @param array $options
+ * @return array Authorization parameters
+ */
+ protected function getAuthorizationParameters(array $options)
+ {
+ if (empty($options['state'])) {
+ $options['state'] = $this->getRandomState();
+ }
+
+ if (empty($options['scope'])) {
+ $options['scope'] = $this->getDefaultScopes();
+ }
+
+ $options += [
+ 'response_type' => 'code',
+ 'approval_prompt' => 'auto'
+ ];
+
+ if (is_array($options['scope'])) {
+ $separator = $this->getScopeSeparator();
+ $options['scope'] = implode($separator, $options['scope']);
+ }
+
+ // Store the state as it may need to be accessed later on.
+ $this->state = $options['state'];
+
+ // Business code layer might set a different redirect_uri parameter
+ // depending on the context, leave it as-is
+ if (!isset($options['redirect_uri'])) {
+ $options['redirect_uri'] = $this->redirectUri;
+ }
+
+ $options['client_id'] = $this->clientId;
+
+ return $options;
+ }
+
+ /**
+ * Builds the authorization URL's query string.
+ *
+ * @param array $params Query parameters
+ * @return string Query string
+ */
+ protected function getAuthorizationQuery(array $params)
+ {
+ return $this->buildQueryString($params);
+ }
+
+ /**
+ * Builds the authorization URL.
+ *
+ * @param array $options
+ * @return string Authorization URL
+ */
+ public function getAuthorizationUrl(array $options = [])
+ {
+ $base = $this->getBaseAuthorizationUrl();
+ $params = $this->getAuthorizationParameters($options);
+ $query = $this->getAuthorizationQuery($params);
+
+ return $this->appendQuery($base, $query);
+ }
+
+ /**
+ * Redirects the client for authorization.
+ *
+ * @param array $options
+ * @param callable|null $redirectHandler
+ * @return mixed
+ */
+ public function authorize(
+ array $options = [],
+ callable $redirectHandler = null
+ ) {
+ $url = $this->getAuthorizationUrl($options);
+ if ($redirectHandler) {
+ return $redirectHandler($url, $this);
+ }
+
+ // @codeCoverageIgnoreStart
+ header('Location: ' . $url);
+ exit;
+ // @codeCoverageIgnoreEnd
+ }
+
+ /**
+ * Appends a query string to a URL.
+ *
+ * @param string $url The URL to append the query to
+ * @param string $query The HTTP query string
+ * @return string The resulting URL
+ */
+ protected function appendQuery($url, $query)
+ {
+ $query = trim($query, '?&');
+
+ if ($query) {
+ $glue = strstr($url, '?') === false ? '?' : '&';
+ return $url . $glue . $query;
+ }
+
+ return $url;
+ }
+
+ /**
+ * Returns the method to use when requesting an access token.
+ *
+ * @return string HTTP method
+ */
+ protected function getAccessTokenMethod()
+ {
+ return self::METHOD_POST;
+ }
+
+ /**
+ * Returns the key used in the access token response to identify the resource owner.
+ *
+ * @return string|null Resource owner identifier key
+ */
+ protected function getAccessTokenResourceOwnerId()
+ {
+ return static::ACCESS_TOKEN_RESOURCE_OWNER_ID;
+ }
+
+ /**
+ * Builds the access token URL's query string.
+ *
+ * @param array $params Query parameters
+ * @return string Query string
+ */
+ protected function getAccessTokenQuery(array $params)
+ {
+ return $this->buildQueryString($params);
+ }
+
+ /**
+ * Checks that a provided grant is valid, or attempts to produce one if the
+ * provided grant is a string.
+ *
+ * @param AbstractGrant|string $grant
+ * @return AbstractGrant
+ */
+ protected function verifyGrant($grant)
+ {
+ if (is_string($grant)) {
+ return $this->grantFactory->getGrant($grant);
+ }
+
+ $this->grantFactory->checkGrant($grant);
+ return $grant;
+ }
+
+ /**
+ * Returns the full URL to use when requesting an access token.
+ *
+ * @param array $params Query parameters
+ * @return string
+ */
+ protected function getAccessTokenUrl(array $params)
+ {
+ $url = $this->getBaseAccessTokenUrl($params);
+
+ if ($this->getAccessTokenMethod() === self::METHOD_GET) {
+ $query = $this->getAccessTokenQuery($params);
+ return $this->appendQuery($url, $query);
+ }
+
+ return $url;
+ }
+
+ /**
+ * Returns the request body for requesting an access token.
+ *
+ * @param array $params
+ * @return string
+ */
+ protected function getAccessTokenBody(array $params)
+ {
+ return $this->buildQueryString($params);
+ }
+
+ /**
+ * Builds request options used for requesting an access token.
+ *
+ * @param array $params
+ * @return array
+ */
+ protected function getAccessTokenOptions(array $params)
+ {
+ $options = ['headers' => ['content-type' => 'application/x-www-form-urlencoded']];
+
+ if ($this->getAccessTokenMethod() === self::METHOD_POST) {
+ $options['body'] = $this->getAccessTokenBody($params);
+ }
+
+ return $options;
+ }
+
+ /**
+ * Returns a prepared request for requesting an access token.
+ *
+ * @param array $params Query string parameters
+ * @return RequestInterface
+ */
+ protected function getAccessTokenRequest(array $params)
+ {
+ $method = $this->getAccessTokenMethod();
+ $url = $this->getAccessTokenUrl($params);
+ $options = $this->getAccessTokenOptions($params);
+
+ return $this->getRequest($method, $url, $options);
+ }
+
+ /**
+ * Requests an access token using a specified grant and option set.
+ *
+ * @param mixed $grant
+ * @param array $options
+ * @return AccessToken
+ */
+ public function getAccessToken($grant, array $options = [])
+ {
+ $grant = $this->verifyGrant($grant);
+
+ $params = [
+ 'client_id' => $this->clientId,
+ 'client_secret' => $this->clientSecret,
+ 'redirect_uri' => $this->redirectUri,
+ ];
+
+ $params = $grant->prepareRequestParameters($params, $options);
+ $request = $this->getAccessTokenRequest($params);
+ $response = $this->getParsedResponse($request);
+ $prepared = $this->prepareAccessTokenResponse($response);
+ $token = $this->createAccessToken($prepared, $grant);
+
+ return $token;
+ }
+
+ /**
+ * Returns a PSR-7 request instance that is not authenticated.
+ *
+ * @param string $method
+ * @param string $url
+ * @param array $options
+ * @return RequestInterface
+ */
+ public function getRequest($method, $url, array $options = [])
+ {
+ return $this->createRequest($method, $url, null, $options);
+ }
+
+ /**
+ * Returns an authenticated PSR-7 request instance.
+ *
+ * @param string $method
+ * @param string $url
+ * @param AccessToken|string $token
+ * @param array $options Any of "headers", "body", and "protocolVersion".
+ * @return RequestInterface
+ */
+ public function getAuthenticatedRequest($method, $url, $token, array $options = [])
+ {
+ return $this->createRequest($method, $url, $token, $options);
+ }
+
+ /**
+ * Creates a PSR-7 request instance.
+ *
+ * @param string $method
+ * @param string $url
+ * @param AccessToken|string|null $token
+ * @param array $options
+ * @return RequestInterface
+ */
+ protected function createRequest($method, $url, $token, array $options)
+ {
+ $defaults = [
+ 'headers' => $this->getHeaders($token),
+ ];
+
+ $options = array_merge_recursive($defaults, $options);
+ $factory = $this->getRequestFactory();
+
+ return $factory->getRequestWithOptions($method, $url, $options);
+ }
+
+ /**
+ * Sends a request instance and returns a response instance.
+ *
+ * WARNING: This method does not attempt to catch exceptions caused by HTTP
+ * errors! It is recommended to wrap this method in a try/catch block.
+ *
+ * @param RequestInterface $request
+ * @return ResponseInterface
+ */
+ public function getResponse(RequestInterface $request)
+ {
+ return $this->getHttpClient()->send($request);
+ }
+
+ /**
+ * Sends a request and returns the parsed response.
+ *
+ * @param RequestInterface $request
+ * @return mixed
+ */
+ public function getParsedResponse(RequestInterface $request)
+ {
+ try {
+ $response = $this->getResponse($request);
+ } catch (BadResponseException $e) {
+ $response = $e->getResponse();
+ }
+
+ $parsed = $this->parseResponse($response);
+
+ $this->checkResponse($response, $parsed);
+
+ return $parsed;
+ }
+
+ /**
+ * Attempts to parse a JSON response.
+ *
+ * @param string $content JSON content from response body
+ * @return array Parsed JSON data
+ * @throws UnexpectedValueException if the content could not be parsed
+ */
+ protected function parseJson($content)
+ {
+ $content = json_decode($content, true);
+
+ if (json_last_error() !== JSON_ERROR_NONE) {
+ throw new UnexpectedValueException(sprintf(
+ "Failed to parse JSON response: %s",
+ json_last_error_msg()
+ ));
+ }
+
+ return $content;
+ }
+
+ /**
+ * Returns the content type header of a response.
+ *
+ * @param ResponseInterface $response
+ * @return string Semi-colon separated join of content-type headers.
+ */
+ protected function getContentType(ResponseInterface $response)
+ {
+ return join(';', (array) $response->getHeader('content-type'));
+ }
+
+ /**
+ * Parses the response according to its content-type header.
+ *
+ * @throws UnexpectedValueException
+ * @param ResponseInterface $response
+ * @return array
+ */
+ protected function parseResponse(ResponseInterface $response)
+ {
+ $content = (string) $response->getBody();
+ $type = $this->getContentType($response);
+
+ if (strpos($type, 'urlencoded') !== false) {
+ parse_str($content, $parsed);
+ return $parsed;
+ }
+
+ // Attempt to parse the string as JSON regardless of content type,
+ // since some providers use non-standard content types. Only throw an
+ // exception if the JSON could not be parsed when it was expected to.
+ try {
+ return $this->parseJson($content);
+ } catch (UnexpectedValueException $e) {
+ if (strpos($type, 'json') !== false) {
+ throw $e;
+ }
+
+ if ($response->getStatusCode() == 500) {
+ throw new UnexpectedValueException(
+ 'An OAuth server error was encountered that did not contain a JSON body',
+ 0,
+ $e
+ );
+ }
+
+ return $content;
+ }
+ }
+
+ /**
+ * Checks a provider response for errors.
+ *
+ * @throws IdentityProviderException
+ * @param ResponseInterface $response
+ * @param array|string $data Parsed response data
+ * @return void
+ */
+ abstract protected function checkResponse(ResponseInterface $response, $data);
+
+ /**
+ * Prepares an parsed access token response for a grant.
+ *
+ * Custom mapping of expiration, etc should be done here. Always call the
+ * parent method when overloading this method.
+ *
+ * @param mixed $result
+ * @return array
+ */
+ protected function prepareAccessTokenResponse(array $result)
+ {
+ if ($this->getAccessTokenResourceOwnerId() !== null) {
+ $result['resource_owner_id'] = $this->getValueByKey(
+ $result,
+ $this->getAccessTokenResourceOwnerId()
+ );
+ }
+ return $result;
+ }
+
+ /**
+ * Creates an access token from a response.
+ *
+ * The grant that was used to fetch the response can be used to provide
+ * additional context.
+ *
+ * @param array $response
+ * @param AbstractGrant $grant
+ * @return AccessToken
+ */
+ protected function createAccessToken(array $response, AbstractGrant $grant)
+ {
+ return new AccessToken($response);
+ }
+
+ /**
+ * Generates a resource owner object from a successful resource owner
+ * details request.
+ *
+ * @param array $response
+ * @param AccessToken $token
+ * @return ResourceOwnerInterface
+ */
+ abstract protected function createResourceOwner(array $response, AccessToken $token);
+
+ /**
+ * Requests and returns the resource owner of given access token.
+ *
+ * @param AccessToken $token
+ * @return ResourceOwnerInterface
+ */
+ public function getResourceOwner(AccessToken $token)
+ {
+ $response = $this->fetchResourceOwnerDetails($token);
+
+ return $this->createResourceOwner($response, $token);
+ }
+
+ /**
+ * Requests resource owner details.
+ *
+ * @param AccessToken $token
+ * @return mixed
+ */
+ protected function fetchResourceOwnerDetails(AccessToken $token)
+ {
+ $url = $this->getResourceOwnerDetailsUrl($token);
+
+ $request = $this->getAuthenticatedRequest(self::METHOD_GET, $url, $token);
+
+ $response = $this->getParsedResponse($request);
+
+ if (false === is_array($response)) {
+ throw new UnexpectedValueException(
+ 'Invalid response received from Authorization Server. Expected JSON.'
+ );
+ }
+
+ return $response;
+ }
+
+ /**
+ * Returns the default headers used by this provider.
+ *
+ * Typically this is used to set 'Accept' or 'Content-Type' headers.
+ *
+ * @return array
+ */
+ protected function getDefaultHeaders()
+ {
+ return [];
+ }
+
+ /**
+ * Returns the authorization headers used by this provider.
+ *
+ * Typically this is "Bearer" or "MAC". For more information see:
+ * http://tools.ietf.org/html/rfc6749#section-7.1
+ *
+ * No default is provided, providers must overload this method to activate
+ * authorization headers.
+ *
+ * @param mixed|null $token Either a string or an access token instance
+ * @return array
+ */
+ protected function getAuthorizationHeaders($token = null)
+ {
+ return [];
+ }
+
+ /**
+ * Returns all headers used by this provider for a request.
+ *
+ * The request will be authenticated if an access token is provided.
+ *
+ * @param mixed|null $token object or string
+ * @return array
+ */
+ public function getHeaders($token = null)
+ {
+ if ($token) {
+ return array_merge(
+ $this->getDefaultHeaders(),
+ $this->getAuthorizationHeaders($token)
+ );
+ }
+
+ return $this->getDefaultHeaders();
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Provider/Exception/IdentityProviderException.php b/vendor/league/oauth2-client/src/Provider/Exception/IdentityProviderException.php
new file mode 100644
index 0000000000..52b7e0353c
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Provider/Exception/IdentityProviderException.php
@@ -0,0 +1,48 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Provider\Exception;
+
+/**
+ * Exception thrown if the provider response contains errors.
+ */
+class IdentityProviderException extends \Exception
+{
+ /**
+ * @var mixed
+ */
+ protected $response;
+
+ /**
+ * @param string $message
+ * @param int $code
+ * @param array|string $response The response body
+ */
+ public function __construct($message, $code, $response)
+ {
+ $this->response = $response;
+
+ parent::__construct($message, $code);
+ }
+
+ /**
+ * Returns the exception's response body.
+ *
+ * @return array|string
+ */
+ public function getResponseBody()
+ {
+ return $this->response;
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Provider/GenericProvider.php b/vendor/league/oauth2-client/src/Provider/GenericProvider.php
new file mode 100644
index 0000000000..74393ffda5
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Provider/GenericProvider.php
@@ -0,0 +1,233 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Provider;
+
+use InvalidArgumentException;
+use League\OAuth2\Client\Provider\Exception\IdentityProviderException;
+use League\OAuth2\Client\Token\AccessToken;
+use League\OAuth2\Client\Tool\BearerAuthorizationTrait;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * Represents a generic service provider that may be used to interact with any
+ * OAuth 2.0 service provider, using Bearer token authentication.
+ */
+class GenericProvider extends AbstractProvider
+{
+ use BearerAuthorizationTrait;
+
+ /**
+ * @var string
+ */
+ private $urlAuthorize;
+
+ /**
+ * @var string
+ */
+ private $urlAccessToken;
+
+ /**
+ * @var string
+ */
+ private $urlResourceOwnerDetails;
+
+ /**
+ * @var string
+ */
+ private $accessTokenMethod;
+
+ /**
+ * @var string
+ */
+ private $accessTokenResourceOwnerId;
+
+ /**
+ * @var array|null
+ */
+ private $scopes = null;
+
+ /**
+ * @var string
+ */
+ private $scopeSeparator;
+
+ /**
+ * @var string
+ */
+ private $responseError = 'error';
+
+ /**
+ * @var string
+ */
+ private $responseCode;
+
+ /**
+ * @var string
+ */
+ private $responseResourceOwnerId = 'id';
+
+ /**
+ * @param array $options
+ * @param array $collaborators
+ */
+ public function __construct(array $options = [], array $collaborators = [])
+ {
+ $this->assertRequiredOptions($options);
+
+ $possible = $this->getConfigurableOptions();
+ $configured = array_intersect_key($options, array_flip($possible));
+
+ foreach ($configured as $key => $value) {
+ $this->$key = $value;
+ }
+
+ // Remove all options that are only used locally
+ $options = array_diff_key($options, $configured);
+
+ parent::__construct($options, $collaborators);
+ }
+
+ /**
+ * Returns all options that can be configured.
+ *
+ * @return array
+ */
+ protected function getConfigurableOptions()
+ {
+ return array_merge($this->getRequiredOptions(), [
+ 'accessTokenMethod',
+ 'accessTokenResourceOwnerId',
+ 'scopeSeparator',
+ 'responseError',
+ 'responseCode',
+ 'responseResourceOwnerId',
+ 'scopes',
+ ]);
+ }
+
+ /**
+ * Returns all options that are required.
+ *
+ * @return array
+ */
+ protected function getRequiredOptions()
+ {
+ return [
+ 'urlAuthorize',
+ 'urlAccessToken',
+ 'urlResourceOwnerDetails',
+ ];
+ }
+
+ /**
+ * Verifies that all required options have been passed.
+ *
+ * @param array $options
+ * @return void
+ * @throws InvalidArgumentException
+ */
+ private function assertRequiredOptions(array $options)
+ {
+ $missing = array_diff_key(array_flip($this->getRequiredOptions()), $options);
+
+ if (!empty($missing)) {
+ throw new InvalidArgumentException(
+ 'Required options not defined: ' . implode(', ', array_keys($missing))
+ );
+ }
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getBaseAuthorizationUrl()
+ {
+ return $this->urlAuthorize;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getBaseAccessTokenUrl(array $params)
+ {
+ return $this->urlAccessToken;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getResourceOwnerDetailsUrl(AccessToken $token)
+ {
+ return $this->urlResourceOwnerDetails;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getDefaultScopes()
+ {
+ return $this->scopes;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ protected function getAccessTokenMethod()
+ {
+ return $this->accessTokenMethod ?: parent::getAccessTokenMethod();
+ }
+
+ /**
+ * @inheritdoc
+ */
+ protected function getAccessTokenResourceOwnerId()
+ {
+ return $this->accessTokenResourceOwnerId ?: parent::getAccessTokenResourceOwnerId();
+ }
+
+ /**
+ * @inheritdoc
+ */
+ protected function getScopeSeparator()
+ {
+ return $this->scopeSeparator ?: parent::getScopeSeparator();
+ }
+
+ /**
+ * @inheritdoc
+ */
+ protected function checkResponse(ResponseInterface $response, $data)
+ {
+ if (!empty($data[$this->responseError])) {
+ $error = $data[$this->responseError];
+ if (!is_string($error)) {
+ $error = var_export($error, true);
+ }
+ $code = $this->responseCode && !empty($data[$this->responseCode])? $data[$this->responseCode] : 0;
+ if (!is_int($code)) {
+ $code = intval($code);
+ }
+ throw new IdentityProviderException($error, $code, $data);
+ }
+ }
+
+ /**
+ * @inheritdoc
+ */
+ protected function createResourceOwner(array $response, AccessToken $token)
+ {
+ return new GenericResourceOwner($response, $this->responseResourceOwnerId);
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Provider/GenericResourceOwner.php b/vendor/league/oauth2-client/src/Provider/GenericResourceOwner.php
new file mode 100644
index 0000000000..f876614851
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Provider/GenericResourceOwner.php
@@ -0,0 +1,61 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Provider;
+
+/**
+ * Represents a generic resource owner for use with the GenericProvider.
+ */
+class GenericResourceOwner implements ResourceOwnerInterface
+{
+ /**
+ * @var array
+ */
+ protected $response;
+
+ /**
+ * @var string
+ */
+ protected $resourceOwnerId;
+
+ /**
+ * @param array $response
+ * @param string $resourceOwnerId
+ */
+ public function __construct(array $response, $resourceOwnerId)
+ {
+ $this->response = $response;
+ $this->resourceOwnerId = $resourceOwnerId;
+ }
+
+ /**
+ * Returns the identifier of the authorized resource owner.
+ *
+ * @return mixed
+ */
+ public function getId()
+ {
+ return $this->response[$this->resourceOwnerId];
+ }
+
+ /**
+ * Returns the raw resource owner response.
+ *
+ * @return array
+ */
+ public function toArray()
+ {
+ return $this->response;
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Provider/ResourceOwnerInterface.php b/vendor/league/oauth2-client/src/Provider/ResourceOwnerInterface.php
new file mode 100644
index 0000000000..828442425f
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Provider/ResourceOwnerInterface.php
@@ -0,0 +1,36 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Provider;
+
+/**
+ * Classes implementing `ResourceOwnerInterface` may be used to represent
+ * the resource owner authenticated with a service provider.
+ */
+interface ResourceOwnerInterface
+{
+ /**
+ * Returns the identifier of the authorized resource owner.
+ *
+ * @return mixed
+ */
+ public function getId();
+
+ /**
+ * Return all of the owner details available as an array.
+ *
+ * @return array
+ */
+ public function toArray();
+}
diff --git a/vendor/league/oauth2-client/src/Token/AccessToken.php b/vendor/league/oauth2-client/src/Token/AccessToken.php
new file mode 100644
index 0000000000..89d693c6f5
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Token/AccessToken.php
@@ -0,0 +1,228 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Token;
+
+use InvalidArgumentException;
+use JsonSerializable;
+use RuntimeException;
+
+/**
+ * Represents an access token.
+ *
+ * @link http://tools.ietf.org/html/rfc6749#section-1.4 Access Token (RFC 6749, §1.4)
+ */
+class AccessToken implements JsonSerializable
+{
+ /**
+ * @var string
+ */
+ protected $accessToken;
+
+ /**
+ * @var int
+ */
+ protected $expires;
+
+ /**
+ * @var string
+ */
+ protected $refreshToken;
+
+ /**
+ * @var string
+ */
+ protected $resourceOwnerId;
+
+ /**
+ * @var array
+ */
+ protected $values = [];
+
+ /**
+ * Constructs an access token.
+ *
+ * @param array $options An array of options returned by the service provider
+ * in the access token request. The `access_token` option is required.
+ * @throws InvalidArgumentException if `access_token` is not provided in `$options`.
+ */
+ public function __construct(array $options = [])
+ {
+ if (empty($options['access_token'])) {
+ throw new InvalidArgumentException('Required option not passed: "access_token"');
+ }
+
+ $this->accessToken = $options['access_token'];
+
+ if (!empty($options['resource_owner_id'])) {
+ $this->resourceOwnerId = $options['resource_owner_id'];
+ }
+
+ if (!empty($options['refresh_token'])) {
+ $this->refreshToken = $options['refresh_token'];
+ }
+
+ // We need to know when the token expires. Show preference to
+ // 'expires_in' since it is defined in RFC6749 Section 5.1.
+ // Defer to 'expires' if it is provided instead.
+ if (isset($options['expires_in'])) {
+ if (!is_numeric($options['expires_in'])) {
+ throw new \InvalidArgumentException('expires_in value must be an integer');
+ }
+
+ $this->expires = $options['expires_in'] != 0 ? time() + $options['expires_in'] : 0;
+ } elseif (!empty($options['expires'])) {
+ // Some providers supply the seconds until expiration rather than
+ // the exact timestamp. Take a best guess at which we received.
+ $expires = $options['expires'];
+
+ if (!$this->isExpirationTimestamp($expires)) {
+ $expires += time();
+ }
+
+ $this->expires = $expires;
+ }
+
+ // Capture any additional values that might exist in the token but are
+ // not part of the standard response. Vendors will sometimes pass
+ // additional user data this way.
+ $this->values = array_diff_key($options, array_flip([
+ 'access_token',
+ 'resource_owner_id',
+ 'refresh_token',
+ 'expires_in',
+ 'expires',
+ ]));
+ }
+
+ /**
+ * Check if a value is an expiration timestamp or second value.
+ *
+ * @param integer $value
+ * @return bool
+ */
+ protected function isExpirationTimestamp($value)
+ {
+ // If the given value is larger than the original OAuth 2 draft date,
+ // assume that it is meant to be a (possible expired) timestamp.
+ $oauth2InceptionDate = 1349067600; // 2012-10-01
+ return ($value > $oauth2InceptionDate);
+ }
+
+ /**
+ * Returns the access token string of this instance.
+ *
+ * @return string
+ */
+ public function getToken()
+ {
+ return $this->accessToken;
+ }
+
+ /**
+ * Returns the refresh token, if defined.
+ *
+ * @return string|null
+ */
+ public function getRefreshToken()
+ {
+ return $this->refreshToken;
+ }
+
+ /**
+ * Returns the expiration timestamp, if defined.
+ *
+ * @return integer|null
+ */
+ public function getExpires()
+ {
+ return $this->expires;
+ }
+
+ /**
+ * Returns the resource owner identifier, if defined.
+ *
+ * @return string|null
+ */
+ public function getResourceOwnerId()
+ {
+ return $this->resourceOwnerId;
+ }
+
+ /**
+ * Checks if this token has expired.
+ *
+ * @return boolean true if the token has expired, false otherwise.
+ * @throws RuntimeException if 'expires' is not set on the token.
+ */
+ public function hasExpired()
+ {
+ $expires = $this->getExpires();
+
+ if (empty($expires)) {
+ throw new RuntimeException('"expires" is not set on the token');
+ }
+
+ return $expires < time();
+ }
+
+ /**
+ * Returns additional vendor values stored in the token.
+ *
+ * @return array
+ */
+ public function getValues()
+ {
+ return $this->values;
+ }
+
+ /**
+ * Returns the token key.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return (string) $this->getToken();
+ }
+
+ /**
+ * Returns an array of parameters to serialize when this is serialized with
+ * json_encode().
+ *
+ * @return array
+ */
+ public function jsonSerialize()
+ {
+ $parameters = $this->values;
+
+ if ($this->accessToken) {
+ $parameters['access_token'] = $this->accessToken;
+ }
+
+ if ($this->refreshToken) {
+ $parameters['refresh_token'] = $this->refreshToken;
+ }
+
+ if ($this->expires) {
+ $parameters['expires'] = $this->expires;
+ }
+
+ if ($this->resourceOwnerId) {
+ $parameters['resource_owner_id'] = $this->resourceOwnerId;
+ }
+
+ return $parameters;
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Tool/ArrayAccessorTrait.php b/vendor/league/oauth2-client/src/Tool/ArrayAccessorTrait.php
new file mode 100644
index 0000000000..a18198cf30
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Tool/ArrayAccessorTrait.php
@@ -0,0 +1,52 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Tool;
+
+/**
+ * Provides generic array navigation tools.
+ */
+trait ArrayAccessorTrait
+{
+ /**
+ * Returns a value by key using dot notation.
+ *
+ * @param array $data
+ * @param string $key
+ * @param mixed|null $default
+ * @return mixed
+ */
+ private function getValueByKey(array $data, $key, $default = null)
+ {
+ if (!is_string($key) || empty($key) || !count($data)) {
+ return $default;
+ }
+
+ if (strpos($key, '.') !== false) {
+ $keys = explode('.', $key);
+
+ foreach ($keys as $innerKey) {
+ if (!is_array($data) || !array_key_exists($innerKey, $data)) {
+ return $default;
+ }
+
+ $data = $data[$innerKey];
+ }
+
+ return $data;
+ }
+
+ return array_key_exists($key, $data) ? $data[$key] : $default;
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php b/vendor/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php
new file mode 100644
index 0000000000..967cca868c
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php
@@ -0,0 +1,34 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Tool;
+
+/**
+ * Enables `Bearer` header authorization for providers.
+ *
+ * @link http://tools.ietf.org/html/rfc6750 Bearer Token Usage (RFC 6750)
+ */
+trait BearerAuthorizationTrait
+{
+ /**
+ * Returns authorization headers for the 'bearer' grant.
+ *
+ * @param mixed|null $token Either a string or an access token instance
+ * @return array
+ */
+ protected function getAuthorizationHeaders($token = null)
+ {
+ return ['Authorization' => 'Bearer ' . $token];
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Tool/MacAuthorizationTrait.php b/vendor/league/oauth2-client/src/Tool/MacAuthorizationTrait.php
new file mode 100644
index 0000000000..d36c00ad61
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Tool/MacAuthorizationTrait.php
@@ -0,0 +1,78 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Tool;
+
+use League\OAuth2\Client\Token\AccessToken;
+
+/**
+ * Enables `MAC` header authorization for providers.
+ *
+ * @link http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-05 Message Authentication Code (MAC) Tokens
+ */
+trait MacAuthorizationTrait
+{
+ /**
+ * Returns the id of this token for MAC generation.
+ *
+ * @param AccessToken $token
+ * @return string
+ */
+ abstract protected function getTokenId(AccessToken $token);
+
+ /**
+ * Returns the MAC signature for the current request.
+ *
+ * @param string $id
+ * @param integer $ts
+ * @param string $nonce
+ * @return string
+ */
+ abstract protected function getMacSignature($id, $ts, $nonce);
+
+ /**
+ * Returns a new random string to use as the state parameter in an
+ * authorization flow.
+ *
+ * @param int $length Length of the random string to be generated.
+ * @return string
+ */
+ abstract protected function getRandomState($length);
+
+ /**
+ * Returns the authorization headers for the 'mac' grant.
+ *
+ * @param AccessToken $token
+ * @return array
+ * @codeCoverageIgnore
+ *
+ * @todo This is currently untested and provided only as an example. If you
+ * complete the implementation, please create a pull request for
+ * https://github.com/thephpleague/oauth2-client
+ */
+ protected function getAuthorizationHeaders($token)
+ {
+ $ts = time();
+ $id = $this->getTokenId($token);
+ $nonce = $this->getRandomState(16);
+ $mac = $this->getMacSignature($id, $ts, $nonce);
+
+ $parts = [];
+ foreach (compact('id', 'ts', 'nonce', 'mac') as $key => $value) {
+ $parts[] = sprintf('%s="%s"', $key, $value);
+ }
+
+ return ['Authorization' => 'MAC ' . implode(', ', $parts)];
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Tool/ProviderRedirectTrait.php b/vendor/league/oauth2-client/src/Tool/ProviderRedirectTrait.php
new file mode 100644
index 0000000000..f81b511f9e
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Tool/ProviderRedirectTrait.php
@@ -0,0 +1,122 @@
+redirectLimit) {
+ $attempts++;
+ $response = $this->getHttpClient()->send($request, [
+ 'allow_redirects' => false
+ ]);
+
+ if ($this->isRedirect($response)) {
+ $redirectUrl = new Uri($response->getHeader('Location')[0]);
+ $request = $request->withUri($redirectUrl);
+ } else {
+ break;
+ }
+ }
+
+ return $response;
+ }
+
+ /**
+ * Returns the HTTP client instance.
+ *
+ * @return GuzzleHttp\ClientInterface
+ */
+ abstract public function getHttpClient();
+
+ /**
+ * Retrieves current redirect limit.
+ *
+ * @return integer
+ */
+ public function getRedirectLimit()
+ {
+ return $this->redirectLimit;
+ }
+
+ /**
+ * Determines if a given response is a redirect.
+ *
+ * @param ResponseInterface $response
+ *
+ * @return boolean
+ */
+ protected function isRedirect(ResponseInterface $response)
+ {
+ $statusCode = $response->getStatusCode();
+
+ return $statusCode > 300 && $statusCode < 400 && $response->hasHeader('Location');
+ }
+
+ /**
+ * Sends a request instance and returns a response instance.
+ *
+ * WARNING: This method does not attempt to catch exceptions caused by HTTP
+ * errors! It is recommended to wrap this method in a try/catch block.
+ *
+ * @param RequestInterface $request
+ * @return ResponseInterface
+ */
+ public function getResponse(RequestInterface $request)
+ {
+ try {
+ $response = $this->followRequestRedirects($request);
+ } catch (BadResponseException $e) {
+ $response = $e->getResponse();
+ }
+
+ return $response;
+ }
+
+ /**
+ * Updates the redirect limit.
+ *
+ * @param integer $limit
+ * @return League\OAuth2\Client\Provider\AbstractProvider
+ * @throws InvalidArgumentException
+ */
+ public function setRedirectLimit($limit)
+ {
+ if (!is_int($limit)) {
+ throw new InvalidArgumentException('redirectLimit must be an integer.');
+ }
+
+ if ($limit < 1) {
+ throw new InvalidArgumentException('redirectLimit must be greater than or equal to one.');
+ }
+
+ $this->redirectLimit = $limit;
+
+ return $this;
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Tool/QueryBuilderTrait.php b/vendor/league/oauth2-client/src/Tool/QueryBuilderTrait.php
new file mode 100644
index 0000000000..ebccdffc6e
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Tool/QueryBuilderTrait.php
@@ -0,0 +1,33 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Tool;
+
+/**
+ * Provides a standard way to generate query strings.
+ */
+trait QueryBuilderTrait
+{
+ /**
+ * Build a query string from an array.
+ *
+ * @param array $params
+ *
+ * @return string
+ */
+ protected function buildQueryString(array $params)
+ {
+ return http_build_query($params, null, '&', \PHP_QUERY_RFC3986);
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Tool/RequestFactory.php b/vendor/league/oauth2-client/src/Tool/RequestFactory.php
new file mode 100644
index 0000000000..1af434297f
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Tool/RequestFactory.php
@@ -0,0 +1,87 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Tool;
+
+use GuzzleHttp\Psr7\Request;
+
+/**
+ * Used to produce PSR-7 Request instances.
+ *
+ * @link https://github.com/guzzle/guzzle/pull/1101
+ */
+class RequestFactory
+{
+ /**
+ * Creates a PSR-7 Request instance.
+ *
+ * @param null|string $method HTTP method for the request.
+ * @param null|string $uri URI for the request.
+ * @param array $headers Headers for the message.
+ * @param string|resource|StreamInterface $body Message body.
+ * @param string $version HTTP protocol version.
+ *
+ * @return Request
+ */
+ public function getRequest(
+ $method,
+ $uri,
+ array $headers = [],
+ $body = null,
+ $version = '1.1'
+ ) {
+ return new Request($method, $uri, $headers, $body, $version);
+ }
+
+ /**
+ * Parses simplified options.
+ *
+ * @param array $options Simplified options.
+ *
+ * @return array Extended options for use with getRequest.
+ */
+ protected function parseOptions(array $options)
+ {
+ // Should match default values for getRequest
+ $defaults = [
+ 'headers' => [],
+ 'body' => null,
+ 'version' => '1.1',
+ ];
+
+ return array_merge($defaults, $options);
+ }
+
+ /**
+ * Creates a request using a simplified array of options.
+ *
+ * @param null|string $method
+ * @param null|string $uri
+ * @param array $options
+ *
+ * @return Request
+ */
+ public function getRequestWithOptions($method, $uri, array $options = [])
+ {
+ $options = $this->parseOptions($options);
+
+ return $this->getRequest(
+ $method,
+ $uri,
+ $options['headers'],
+ $options['body'],
+ $options['version']
+ );
+ }
+}
diff --git a/vendor/league/oauth2-client/src/Tool/RequiredParameterTrait.php b/vendor/league/oauth2-client/src/Tool/RequiredParameterTrait.php
new file mode 100644
index 0000000000..47da977177
--- /dev/null
+++ b/vendor/league/oauth2-client/src/Tool/RequiredParameterTrait.php
@@ -0,0 +1,56 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link http://thephpleague.com/oauth2-client/ Documentation
+ * @link https://packagist.org/packages/league/oauth2-client Packagist
+ * @link https://github.com/thephpleague/oauth2-client GitHub
+ */
+
+namespace League\OAuth2\Client\Tool;
+
+use BadMethodCallException;
+
+/**
+ * Provides functionality to check for required parameters.
+ */
+trait RequiredParameterTrait
+{
+ /**
+ * Checks for a required parameter in a hash.
+ *
+ * @throws BadMethodCallException
+ * @param string $name
+ * @param array $params
+ * @return void
+ */
+ private function checkRequiredParameter($name, array $params)
+ {
+ if (!isset($params[$name])) {
+ throw new BadMethodCallException(sprintf(
+ 'Required parameter not passed: "%s"',
+ $name
+ ));
+ }
+ }
+
+ /**
+ * Checks for multiple required parameters in a hash.
+ *
+ * @throws InvalidArgumentException
+ * @param array $names
+ * @param array $params
+ * @return void
+ */
+ private function checkRequiredParameters(array $names, array $params)
+ {
+ foreach ($names as $name) {
+ $this->checkRequiredParameter($name, $params);
+ }
+ }
+}
diff --git a/vendor/league/oauth2-facebook/LICENSE b/vendor/league/oauth2-facebook/LICENSE
new file mode 100755
index 0000000000..dd7005d9e5
--- /dev/null
+++ b/vendor/league/oauth2-facebook/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Sammy Kaye Powers
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/league/oauth2-facebook/composer.json b/vendor/league/oauth2-facebook/composer.json
new file mode 100755
index 0000000000..a977eecfec
--- /dev/null
+++ b/vendor/league/oauth2-facebook/composer.json
@@ -0,0 +1,39 @@
+{
+ "name": "league/oauth2-facebook",
+ "description": "Facebook OAuth 2.0 Client Provider for The PHP League OAuth2-Client",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Sammy Kaye Powers",
+ "email": "me@sammyk.me",
+ "homepage": "http://www.sammyk.me"
+ }
+ ],
+ "keywords": [
+ "oauth",
+ "oauth2",
+ "client",
+ "authorization",
+ "authentication",
+ "facebook"
+ ],
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "league/oauth2-client": "^2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0",
+ "mockery/mockery": "~0.9",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\OAuth2\\Client\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "League\\OAuth2\\Client\\Test\\": "tests/src/"
+ }
+ }
+}
diff --git a/vendor/league/oauth2-facebook/src/Grant/FbExchangeToken.php b/vendor/league/oauth2-facebook/src/Grant/FbExchangeToken.php
new file mode 100644
index 0000000000..aa06490882
--- /dev/null
+++ b/vendor/league/oauth2-facebook/src/Grant/FbExchangeToken.php
@@ -0,0 +1,23 @@
+graphApiVersion = $options['graphApiVersion'];
+
+ if (!empty($options['enableBetaTier']) && $options['enableBetaTier'] === true) {
+ $this->enableBetaMode = true;
+ }
+ }
+
+ public function getBaseAuthorizationUrl()
+ {
+ return $this->getBaseFacebookUrl().$this->graphApiVersion.'/dialog/oauth';
+ }
+
+ public function getBaseAccessTokenUrl(array $params)
+ {
+ return $this->getBaseGraphUrl().$this->graphApiVersion.'/oauth/access_token';
+ }
+
+ public function getDefaultScopes()
+ {
+ return ['public_profile', 'email'];
+ }
+
+ public function getResourceOwnerDetailsUrl(AccessToken $token)
+ {
+ $fields = [
+ 'id', 'name', 'first_name', 'last_name',
+ 'email', 'hometown', 'picture.type(large){url,is_silhouette}',
+ 'cover{source}', 'gender', 'locale', 'link', 'timezone', 'age_range'
+ ];
+
+ // backwards compatibility less than 2.8
+ if (version_compare(substr($this->graphApiVersion, 1), '2.8') < 0) {
+ $fields[] = 'bio';
+ }
+
+ $appSecretProof = AppSecretProof::create($this->clientSecret, $token->getToken());
+
+ return $this->getBaseGraphUrl().$this->graphApiVersion.'/me?fields='.implode(',', $fields)
+ .'&access_token='.$token.'&appsecret_proof='.$appSecretProof;
+ }
+
+ public function getAccessToken($grant = 'authorization_code', array $params = [])
+ {
+ if (isset($params['refresh_token'])) {
+ throw new FacebookProviderException('Facebook does not support token refreshing.');
+ }
+
+ return parent::getAccessToken($grant, $params);
+ }
+
+ /**
+ * Exchanges a short-lived access token with a long-lived access-token.
+ *
+ * @param string $accessToken
+ *
+ * @return \League\OAuth2\Client\Token\AccessToken
+ *
+ * @throws FacebookProviderException
+ */
+ public function getLongLivedAccessToken($accessToken)
+ {
+ $params = [
+ 'fb_exchange_token' => (string) $accessToken,
+ ];
+
+ return $this->getAccessToken('fb_exchange_token', $params);
+ }
+
+ protected function createResourceOwner(array $response, AccessToken $token)
+ {
+ return new FacebookUser($response);
+ }
+
+ protected function checkResponse(ResponseInterface $response, $data)
+ {
+ if (!empty($data['error'])) {
+ $message = $data['error']['type'].': '.$data['error']['message'];
+ throw new IdentityProviderException($message, $data['error']['code'], $data);
+ }
+ }
+
+ /**
+ * @inheritdoc
+ */
+ protected function getContentType(ResponseInterface $response)
+ {
+ $type = parent::getContentType($response);
+
+ // Fix for Facebook's pseudo-JSONP support
+ if (strpos($type, 'javascript') !== false) {
+ return 'application/json';
+ }
+
+ // Fix for Facebook's pseudo-urlencoded support
+ if (strpos($type, 'plain') !== false) {
+ return 'application/x-www-form-urlencoded';
+ }
+
+ return $type;
+ }
+
+ /**
+ * Get the base Facebook URL.
+ *
+ * @return string
+ */
+ private function getBaseFacebookUrl()
+ {
+ return $this->enableBetaMode ? static::BASE_FACEBOOK_URL_BETA : static::BASE_FACEBOOK_URL;
+ }
+
+ /**
+ * Get the base Graph API URL.
+ *
+ * @return string
+ */
+ private function getBaseGraphUrl()
+ {
+ return $this->enableBetaMode ? static::BASE_GRAPH_URL_BETA : static::BASE_GRAPH_URL;
+ }
+}
diff --git a/vendor/league/oauth2-facebook/src/Provider/FacebookUser.php b/vendor/league/oauth2-facebook/src/Provider/FacebookUser.php
new file mode 100755
index 0000000000..57a4b47ee1
--- /dev/null
+++ b/vendor/league/oauth2-facebook/src/Provider/FacebookUser.php
@@ -0,0 +1,221 @@
+data = $response;
+
+ if (!empty($response['picture']['data']['url'])) {
+ $this->data['picture_url'] = $response['picture']['data']['url'];
+ }
+
+ if (isset($response['picture']['data']['is_silhouette'])) {
+ $this->data['is_silhouette'] = $response['picture']['data']['is_silhouette'];
+ }
+
+ if (!empty($response['cover']['source'])) {
+ $this->data['cover_photo_url'] = $response['cover']['source'];
+ }
+ }
+
+ /**
+ * Returns the ID for the user as a string if present.
+ *
+ * @return string|null
+ */
+ public function getId()
+ {
+ return $this->getField('id');
+ }
+
+ /**
+ * Returns the name for the user as a string if present.
+ *
+ * @return string|null
+ */
+ public function getName()
+ {
+ return $this->getField('name');
+ }
+
+ /**
+ * Returns the first name for the user as a string if present.
+ *
+ * @return string|null
+ */
+ public function getFirstName()
+ {
+ return $this->getField('first_name');
+ }
+
+ /**
+ * Returns the last name for the user as a string if present.
+ *
+ * @return string|null
+ */
+ public function getLastName()
+ {
+ return $this->getField('last_name');
+ }
+
+ /**
+ * Returns the email for the user as a string if present.
+ *
+ * @return string|null
+ */
+ public function getEmail()
+ {
+ return $this->getField('email');
+ }
+
+ /**
+ * Returns the current location of the user as an array.
+ *
+ * @return array|null
+ */
+ public function getHometown()
+ {
+ return $this->getField('hometown');
+ }
+
+ /**
+ * Returns the "about me" bio for the user as a string if present.
+ *
+ * @return string|null
+ * @deprecated The bio field was removed in Graph v2.8
+ */
+ public function getBio()
+ {
+ return $this->getField('bio');
+ }
+
+ /**
+ * Returns if user has not defined a specific avatar
+ *
+ * @return boolean
+ */
+
+ public function isDefaultPicture()
+ {
+ return $this->getField('is_silhouette');
+ }
+
+ /**
+ * Returns the profile picture of the user as a string if present.
+ *
+ * @return string|null
+ */
+ public function getPictureUrl()
+ {
+ return $this->getField('picture_url');
+ }
+
+ /**
+ * Returns the cover photo URL of the user as a string if present.
+ *
+ * @return string|null
+ */
+ public function getCoverPhotoUrl()
+ {
+ return $this->getField('cover_photo_url');
+ }
+
+ /**
+ * Returns the gender for the user as a string if present.
+ *
+ * @return string|null
+ */
+ public function getGender()
+ {
+ return $this->getField('gender');
+ }
+
+ /**
+ * Returns the locale of the user as a string if available.
+ *
+ * @return string|null
+ */
+ public function getLocale()
+ {
+ return $this->getField('locale');
+ }
+
+ /**
+ * Returns the Facebook URL for the user as a string if available.
+ *
+ * @return string|null
+ */
+ public function getLink()
+ {
+ return $this->getField('link');
+ }
+
+ /**
+ * Returns the current timezone offset from UTC (from -24 to 24)
+ *
+ * @return float|null
+ */
+ public function getTimezone()
+ {
+ return $this->getField('timezone');
+ }
+
+ /**
+ * Returns the lower bound of the user's age range
+ *
+ * @return integer|null
+ */
+ public function getMinAge()
+ {
+ if (isset($this->data['age_range']['min'])) {
+ return $this->data['age_range']['min'];
+ }
+ return null;
+ }
+
+ /**
+ * Returns the upper bound of the user's age range
+ *
+ * @return integer|null
+ */
+ public function getMaxAge()
+ {
+ if (isset($this->data['age_range']['max'])) {
+ return $this->data['age_range']['max'];
+ }
+ return null;
+ }
+
+ /**
+ * Returns all the data obtained about the user.
+ *
+ * @return array
+ */
+ public function toArray()
+ {
+ return $this->data;
+ }
+
+ /**
+ * Returns a field from the Graph node data.
+ *
+ * @param string $key
+ *
+ * @return mixed|null
+ */
+ private function getField($key)
+ {
+ return isset($this->data[$key]) ? $this->data[$key] : null;
+ }
+}
diff --git a/vendor/league/oauth2-github/.scrutinizer.yml b/vendor/league/oauth2-github/.scrutinizer.yml
new file mode 100644
index 0000000000..d5851073e2
--- /dev/null
+++ b/vendor/league/oauth2-github/.scrutinizer.yml
@@ -0,0 +1,35 @@
+filter:
+ excluded_paths: [test/*]
+checks:
+ php:
+ code_rating: true
+ remove_extra_empty_lines: true
+ remove_php_closing_tag: true
+ remove_trailing_whitespace: true
+ fix_use_statements:
+ remove_unused: true
+ preserve_multiple: false
+ preserve_blanklines: true
+ order_alphabetically: true
+ fix_php_opening_tag: true
+ fix_linefeed: true
+ fix_line_ending: true
+ fix_identation_4spaces: true
+ fix_doc_comments: true
+tools:
+ external_code_coverage:
+ timeout: 600
+ runs: 3
+ php_analyzer: true
+ php_code_coverage: false
+ php_code_sniffer:
+ config:
+ standard: PSR2
+ filter:
+ paths: ['src']
+ php_loc:
+ enabled: true
+ excluded_dirs: [vendor, test]
+ php_cpd:
+ enabled: true
+ excluded_dirs: [vendor, test]
diff --git a/vendor/league/oauth2-github/.travis.yml b/vendor/league/oauth2-github/.travis.yml
new file mode 100644
index 0000000000..d99d282141
--- /dev/null
+++ b/vendor/league/oauth2-github/.travis.yml
@@ -0,0 +1,27 @@
+language: php
+
+sudo: false
+
+php:
+ - 5.6
+ - 7.0
+ - 7.1
+ - hhvm
+
+matrix:
+ include:
+ - php: 5.6
+ env: 'COMPOSER_FLAGS="--prefer-stable --prefer-lowest"'
+
+before_script:
+ - travis_retry composer self-update
+ - travis_retry composer install --no-interaction --prefer-source --dev
+ - travis_retry phpenv rehash
+
+script:
+ - ./vendor/bin/phpcs --standard=psr2 src/
+ - ./vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover
+
+after_script:
+ - wget https://scrutinizer-ci.com/ocular.phar
+ - php ocular.phar code-coverage:upload --format=php-clover coverage.clover
diff --git a/vendor/league/oauth2-github/CHANGELOG.md b/vendor/league/oauth2-github/CHANGELOG.md
new file mode 100644
index 0000000000..68ae784fda
--- /dev/null
+++ b/vendor/league/oauth2-github/CHANGELOG.md
@@ -0,0 +1,92 @@
+# Changelog
+All Notable changes to `oauth2-github` will be documented in this file
+
+## 2.0.0 - 2017-01-25
+
+### Added
+- PHP 7.1 Support
+
+### Deprecated
+- Nothing
+
+### Fixed
+- Nothing
+
+### Removed
+- PHP 5.5 Support
+
+### Security
+- Nothing
+
+## 1.0.0 - 2017-01-25
+
+Bump for base package parity
+
+## 0.2.2 - 2016-11-21
+
+### Added
+- Update base package version from 1.0 to 1.4
+- Update GithubResourceOwner to utilize ArrayAccessorTrait from base package
+
+### Deprecated
+- Nothing
+
+### Fixed
+- Nothing
+
+### Removed
+- Nothing
+
+### Security
+- Nothing
+
+## 0.2.1 - 2016-04-13
+
+### Added
+- Support OAuth exceptions from Github with non-standard status codes (https://developer.github.com/v3/oauth/#common-errors-for-the-access-token-request)
+
+### Deprecated
+- Nothing
+
+### Fixed
+- Nothing
+
+### Removed
+- Nothing
+
+### Security
+- Nothing
+
+## 0.2.0 - 2015-08-20
+
+### Added
+- Upgrade to support version 1.0 release of core client
+
+### Deprecated
+- Nothing
+
+### Fixed
+- Nothing
+
+### Removed
+- Nothing
+
+### Security
+- Nothing
+
+## 0.1.0 - 2015-04-13
+
+### Added
+- Initial release!
+
+### Deprecated
+- Nothing
+
+### Fixed
+- Nothing
+
+### Removed
+- Nothing
+
+### Security
+- Nothing
diff --git a/vendor/league/oauth2-github/CONTRIBUTING.md b/vendor/league/oauth2-github/CONTRIBUTING.md
new file mode 100644
index 0000000000..06745a0081
--- /dev/null
+++ b/vendor/league/oauth2-github/CONTRIBUTING.md
@@ -0,0 +1,42 @@
+# Contributing
+
+Contributions are **welcome** and will be fully **credited**.
+
+We accept contributions via Pull Requests on [Github](https://github.com/thephpleague/oauth2-github).
+
+
+## Pull Requests
+
+- **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** - The easiest way to apply the conventions is to install [PHP Code Sniffer](http://pear.php.net/package/PHP_CodeSniffer).
+
+- **Add tests!** - Your patch won't be accepted if it doesn't have tests.
+
+- **Document any change in behaviour** - Make sure the README and any other relevant documentation are kept up-to-date.
+
+- **Consider our release cycle** - We try to follow SemVer. Randomly breaking public APIs is not an option.
+
+- **Create topic branches** - Don't ask us to pull from your master branch.
+
+- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests.
+
+- **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please squash them before submitting.
+
+- **Ensure tests pass!** - Please run the tests (see below) before submitting your pull request, and make sure they pass. We won't accept a patch until all tests pass.
+
+- **Ensure no coding standards violations** - Please run PHP Code Sniffer using the PSR-2 standard (see below) before submitting your pull request. A violation will cause the build to fail, so please make sure there are no violations. We can't accept a patch if the build fails.
+
+
+## Running Tests
+
+``` bash
+$ ./vendor/bin/phpunit
+```
+
+
+## Running PHP Code Sniffer
+
+``` bash
+$ ./vendor/bin/phpcs src --standard=psr2 -sp
+```
+
+**Happy coding**!
diff --git a/vendor/league/oauth2-github/LICENSE b/vendor/league/oauth2-github/LICENSE
new file mode 100644
index 0000000000..51455e2dd8
--- /dev/null
+++ b/vendor/league/oauth2-github/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Steven Maguire
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/league/oauth2-github/README.md b/vendor/league/oauth2-github/README.md
new file mode 100644
index 0000000000..2fc3a59739
--- /dev/null
+++ b/vendor/league/oauth2-github/README.md
@@ -0,0 +1,129 @@
+# Github Provider for OAuth 2.0 Client
+[![Latest Version](https://img.shields.io/github/release/thephpleague/oauth2-github.svg?style=flat-square)](https://github.com/thephpleague/oauth2-github/releases)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE.md)
+[![Build Status](https://img.shields.io/travis/thephpleague/oauth2-github/master.svg?style=flat-square)](https://travis-ci.org/thephpleague/oauth2-github)
+[![Coverage Status](https://img.shields.io/scrutinizer/coverage/g/thephpleague/oauth2-github.svg?style=flat-square)](https://scrutinizer-ci.com/g/thephpleague/oauth2-github/code-structure)
+[![Quality Score](https://img.shields.io/scrutinizer/g/thephpleague/oauth2-github.svg?style=flat-square)](https://scrutinizer-ci.com/g/thephpleague/oauth2-github)
+[![Total Downloads](https://img.shields.io/packagist/dt/league/oauth2-github.svg?style=flat-square)](https://packagist.org/packages/league/oauth2-github)
+
+This package provides Github OAuth 2.0 support for the PHP League's [OAuth 2.0 Client](https://github.com/thephpleague/oauth2-client).
+
+## Installation
+
+To install, use composer:
+
+```
+composer require league/oauth2-github
+```
+
+## Usage
+
+Usage is the same as The League's OAuth client, using `\League\OAuth2\Client\Provider\Github` as the provider.
+
+### Authorization Code Flow
+
+```php
+$provider = new League\OAuth2\Client\Provider\Github([
+ 'clientId' => '{github-client-id}',
+ 'clientSecret' => '{github-client-secret}',
+ 'redirectUri' => 'https://example.com/callback-url',
+]);
+
+if (!isset($_GET['code'])) {
+
+ // If we don't have an authorization code then get one
+ $authUrl = $provider->getAuthorizationUrl();
+ $_SESSION['oauth2state'] = $provider->getState();
+ header('Location: '.$authUrl);
+ exit;
+
+// Check given state against previously stored one to mitigate CSRF attack
+} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
+
+ unset($_SESSION['oauth2state']);
+ exit('Invalid state');
+
+} else {
+
+ // Try to get an access token (using the authorization code grant)
+ $token = $provider->getAccessToken('authorization_code', [
+ 'code' => $_GET['code']
+ ]);
+
+ // Optional: Now you have a token you can look up a users profile data
+ try {
+
+ // We got an access token, let's now get the user's details
+ $user = $provider->getResourceOwner($token);
+
+ // Use these details to create a new profile
+ printf('Hello %s!', $user->getNickname());
+
+ } catch (Exception $e) {
+
+ // Failed to get user details
+ exit('Oh dear...');
+ }
+
+ // Use this to interact with an API on the users behalf
+ echo $token->getToken();
+}
+```
+
+### Managing Scopes
+
+When creating your Github authorization URL, you can specify the state and scopes your application may authorize.
+
+```php
+$options = [
+ 'state' => 'OPTIONAL_CUSTOM_CONFIGURED_STATE',
+ 'scope' => ['user','user:email','repo'] // array or string
+];
+
+$authorizationUrl = $provider->getAuthorizationUrl($options);
+```
+If neither are defined, the provider will utilize internal defaults.
+
+At the time of authoring this documentation, the [following scopes are available](https://developer.github.com/v3/oauth/#scopes).
+
+- user
+- user:email
+- user:follow
+- public_repo
+- repo
+- repo_deployment
+- repo:status
+- delete_repo
+- notifications
+- gist
+- read:repo_hook
+- write:repo_hook
+- admin:repo_hook
+- admin:org_hook
+- read:org
+- write:org
+- admin:org
+- read:public_key
+- write:public_key
+- admin:public_key
+
+## Testing
+
+``` bash
+$ ./vendor/bin/phpunit
+```
+
+## Contributing
+
+Please see [CONTRIBUTING](https://github.com/thephpleague/oauth2-github/blob/master/CONTRIBUTING.md) for details.
+
+
+## Credits
+
+- [Steven Maguire](https://github.com/stevenmaguire)
+- [All Contributors](https://github.com/thephpleague/oauth2-github/contributors)
+
+
+## License
+
+The MIT License (MIT). Please see [License File](https://github.com/thephpleague/oauth2-github/blob/master/LICENSE) for more information.
diff --git a/vendor/league/oauth2-github/composer.json b/vendor/league/oauth2-github/composer.json
new file mode 100644
index 0000000000..f88f66ba0b
--- /dev/null
+++ b/vendor/league/oauth2-github/composer.json
@@ -0,0 +1,43 @@
+{
+ "name": "league/oauth2-github",
+ "description": "Github OAuth 2.0 Client Provider for The PHP League OAuth2-Client",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Steven Maguire",
+ "email": "stevenmaguire@gmail.com",
+ "homepage": "https://github.com/stevenmaguire"
+ }
+ ],
+ "keywords": [
+ "oauth",
+ "oauth2",
+ "client",
+ "authorization",
+ "authorisation",
+ "github"
+ ],
+ "require": {
+ "league/oauth2-client": "^2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0",
+ "mockery/mockery": "~0.9",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\OAuth2\\Client\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "League\\OAuth2\\Client\\Test\\": "test/src/"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ }
+}
diff --git a/vendor/league/oauth2-github/phpunit.xml b/vendor/league/oauth2-github/phpunit.xml
new file mode 100644
index 0000000000..1819eb04aa
--- /dev/null
+++ b/vendor/league/oauth2-github/phpunit.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+ ./test/
+
+
+
+
+ ./
+
+ ./vendor
+ ./test
+
+
+
+
diff --git a/vendor/league/oauth2-github/src/Provider/Exception/GithubIdentityProviderException.php b/vendor/league/oauth2-github/src/Provider/Exception/GithubIdentityProviderException.php
new file mode 100644
index 0000000000..bb30ace169
--- /dev/null
+++ b/vendor/league/oauth2-github/src/Provider/Exception/GithubIdentityProviderException.php
@@ -0,0 +1,53 @@
+getReasonPhrase()
+ );
+ }
+
+ /**
+ * Creates oauth exception from response.
+ *
+ * @param ResponseInterface $response
+ * @param string $data Parsed response data
+ *
+ * @return IdentityProviderException
+ */
+ public static function oauthException(ResponseInterface $response, $data)
+ {
+ return static::fromResponse(
+ $response,
+ isset($data['error']) ? $data['error'] : $response->getReasonPhrase()
+ );
+ }
+
+ /**
+ * Creates identity exception from response.
+ *
+ * @param ResponseInterface $response
+ * @param string $message
+ *
+ * @return IdentityProviderException
+ */
+ protected static function fromResponse(ResponseInterface $response, $message = null)
+ {
+ return new static($message, $response->getStatusCode(), (string) $response->getBody());
+ }
+}
diff --git a/vendor/league/oauth2-github/src/Provider/Github.php b/vendor/league/oauth2-github/src/Provider/Github.php
new file mode 100644
index 0000000000..9946adf7aa
--- /dev/null
+++ b/vendor/league/oauth2-github/src/Provider/Github.php
@@ -0,0 +1,110 @@
+domain.'/login/oauth/authorize';
+ }
+
+ /**
+ * Get access token url to retrieve token
+ *
+ * @param array $params
+ *
+ * @return string
+ */
+ public function getBaseAccessTokenUrl(array $params)
+ {
+ return $this->domain.'/login/oauth/access_token';
+ }
+
+ /**
+ * Get provider url to fetch user details
+ *
+ * @param AccessToken $token
+ *
+ * @return string
+ */
+ public function getResourceOwnerDetailsUrl(AccessToken $token)
+ {
+ if ($this->domain === 'https://github.com') {
+ return $this->apiDomain.'/user';
+ }
+ return $this->domain.'/api/v3/user';
+ }
+
+ /**
+ * Get the default scopes used by this provider.
+ *
+ * This should not be a complete list of all scopes, but the minimum
+ * required for the provider user interface!
+ *
+ * @return array
+ */
+ protected function getDefaultScopes()
+ {
+ return [];
+ }
+
+ /**
+ * Check a provider response for errors.
+ *
+ * @link https://developer.github.com/v3/#client-errors
+ * @link https://developer.github.com/v3/oauth/#common-errors-for-the-access-token-request
+ * @throws IdentityProviderException
+ * @param ResponseInterface $response
+ * @param string $data Parsed response data
+ * @return void
+ */
+ protected function checkResponse(ResponseInterface $response, $data)
+ {
+ if ($response->getStatusCode() >= 400) {
+ throw GithubIdentityProviderException::clientException($response, $data);
+ } elseif (isset($data['error'])) {
+ throw GithubIdentityProviderException::oauthException($response, $data);
+ }
+ }
+
+ /**
+ * Generate a user object from a successful user details request.
+ *
+ * @param array $response
+ * @param AccessToken $token
+ * @return League\OAuth2\Client\Provider\ResourceOwnerInterface
+ */
+ protected function createResourceOwner(array $response, AccessToken $token)
+ {
+ $user = new GithubResourceOwner($response);
+
+ return $user->setDomain($this->domain);
+ }
+}
diff --git a/vendor/league/oauth2-github/src/Provider/GithubResourceOwner.php b/vendor/league/oauth2-github/src/Provider/GithubResourceOwner.php
new file mode 100644
index 0000000000..712e496a23
--- /dev/null
+++ b/vendor/league/oauth2-github/src/Provider/GithubResourceOwner.php
@@ -0,0 +1,108 @@
+response = $response;
+ }
+
+ /**
+ * Get resource owner id
+ *
+ * @return string|null
+ */
+ public function getId()
+ {
+ return $this->getValueByKey($this->response, 'id');
+ }
+
+ /**
+ * Get resource owner email
+ *
+ * @return string|null
+ */
+ public function getEmail()
+ {
+ return $this->getValueByKey($this->response, 'email');
+ }
+
+ /**
+ * Get resource owner name
+ *
+ * @return string|null
+ */
+ public function getName()
+ {
+ return $this->getValueByKey($this->response, 'name');
+ }
+
+ /**
+ * Get resource owner nickname
+ *
+ * @return string|null
+ */
+ public function getNickname()
+ {
+ return $this->getValueByKey($this->response, 'login');
+ }
+
+ /**
+ * Get resource owner url
+ *
+ * @return string|null
+ */
+ public function getUrl()
+ {
+ $urlParts = array_filter([$this->domain, $this->getNickname()]);
+
+ return count($urlParts) ? implode('/', $urlParts) : null;
+ }
+
+ /**
+ * Set resource owner domain
+ *
+ * @param string $domain
+ *
+ * @return ResourceOwner
+ */
+ public function setDomain($domain)
+ {
+ $this->domain = $domain;
+
+ return $this;
+ }
+
+ /**
+ * Return all of the owner details available as an array.
+ *
+ * @return array
+ */
+ public function toArray()
+ {
+ return $this->response;
+ }
+}
diff --git a/vendor/league/oauth2-github/test/src/Provider/GithubResourceOwnerTest.php b/vendor/league/oauth2-github/test/src/Provider/GithubResourceOwnerTest.php
new file mode 100644
index 0000000000..79568b4700
--- /dev/null
+++ b/vendor/league/oauth2-github/test/src/Provider/GithubResourceOwnerTest.php
@@ -0,0 +1,36 @@
+getUrl();
+
+ $this->assertNull($url);
+ }
+
+ public function testUrlIsDomainWithoutNickname()
+ {
+ $domain = uniqid();
+ $user = new \League\OAuth2\Client\Provider\GithubResourceOwner;
+ $user->setDomain($domain);
+
+ $url = $user->getUrl();
+
+ $this->assertEquals($domain, $url);
+ }
+
+ public function testUrlIsNicknameWithoutDomain()
+ {
+ $nickname = uniqid();
+ $user = new \League\OAuth2\Client\Provider\GithubResourceOwner(['login' => $nickname]);
+
+ $url = $user->getUrl();
+
+ $this->assertEquals($nickname, $url);
+ }
+}
diff --git a/vendor/league/oauth2-github/test/src/Provider/GithubTest.php b/vendor/league/oauth2-github/test/src/Provider/GithubTest.php
new file mode 100644
index 0000000000..fd01b6866a
--- /dev/null
+++ b/vendor/league/oauth2-github/test/src/Provider/GithubTest.php
@@ -0,0 +1,215 @@
+provider = new \League\OAuth2\Client\Provider\Github([
+ 'clientId' => 'mock_client_id',
+ 'clientSecret' => 'mock_secret',
+ 'redirectUri' => 'none',
+ ]);
+ }
+
+ public function tearDown()
+ {
+ m::close();
+ parent::tearDown();
+ }
+
+ public function testAuthorizationUrl()
+ {
+ $url = $this->provider->getAuthorizationUrl();
+ $uri = parse_url($url);
+ parse_str($uri['query'], $query);
+
+ $this->assertArrayHasKey('client_id', $query);
+ $this->assertArrayHasKey('redirect_uri', $query);
+ $this->assertArrayHasKey('state', $query);
+ $this->assertArrayHasKey('scope', $query);
+ $this->assertArrayHasKey('response_type', $query);
+ $this->assertArrayHasKey('approval_prompt', $query);
+ $this->assertNotNull($this->provider->getState());
+ }
+
+
+ public function testScopes()
+ {
+ $options = ['scope' => [uniqid(),uniqid()]];
+
+ $url = $this->provider->getAuthorizationUrl($options);
+
+ $this->assertContains(urlencode(implode(',', $options['scope'])), $url);
+ }
+
+ public function testGetAuthorizationUrl()
+ {
+ $url = $this->provider->getAuthorizationUrl();
+ $uri = parse_url($url);
+
+ $this->assertEquals('/login/oauth/authorize', $uri['path']);
+ }
+
+ public function testGetBaseAccessTokenUrl()
+ {
+ $params = [];
+
+ $url = $this->provider->getBaseAccessTokenUrl($params);
+ $uri = parse_url($url);
+
+ $this->assertEquals('/login/oauth/access_token', $uri['path']);
+ }
+
+ public function testGetAccessToken()
+ {
+ $response = m::mock('Psr\Http\Message\ResponseInterface');
+ $response->shouldReceive('getBody')->andReturn('{"access_token":"mock_access_token", "scope":"repo,gist", "token_type":"bearer"}');
+ $response->shouldReceive('getHeader')->andReturn(['content-type' => 'json']);
+ $response->shouldReceive('getStatusCode')->andReturn(200);
+
+ $client = m::mock('GuzzleHttp\ClientInterface');
+ $client->shouldReceive('send')->times(1)->andReturn($response);
+ $this->provider->setHttpClient($client);
+
+ $token = $this->provider->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']);
+
+ $this->assertEquals('mock_access_token', $token->getToken());
+ $this->assertNull($token->getExpires());
+ $this->assertNull($token->getRefreshToken());
+ $this->assertNull($token->getResourceOwnerId());
+ }
+
+ public function testGithubEnterpriseDomainUrls()
+ {
+ $this->provider->domain = 'https://github.company.com';
+
+
+ $response = m::mock('Psr\Http\Message\ResponseInterface');
+ $response->shouldReceive('getBody')->times(1)->andReturn('access_token=mock_access_token&expires=3600&refresh_token=mock_refresh_token&otherKey={1234}');
+ $response->shouldReceive('getHeader')->andReturn(['content-type' => 'application/x-www-form-urlencoded']);
+ $response->shouldReceive('getStatusCode')->andReturn(200);
+
+ $client = m::mock('GuzzleHttp\ClientInterface');
+ $client->shouldReceive('send')->times(1)->andReturn($response);
+ $this->provider->setHttpClient($client);
+
+ $token = $this->provider->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']);
+
+ $this->assertEquals($this->provider->domain.'/login/oauth/authorize', $this->provider->getBaseAuthorizationUrl());
+ $this->assertEquals($this->provider->domain.'/login/oauth/access_token', $this->provider->getBaseAccessTokenUrl([]));
+ $this->assertEquals($this->provider->domain.'/api/v3/user', $this->provider->getResourceOwnerDetailsUrl($token));
+ //$this->assertEquals($this->provider->domain.'/api/v3/user/emails', $this->provider->urlUserEmails($token));
+ }
+
+ public function testUserData()
+ {
+ $userId = rand(1000,9999);
+ $name = uniqid();
+ $nickname = uniqid();
+ $email = uniqid();
+
+ $postResponse = m::mock('Psr\Http\Message\ResponseInterface');
+ $postResponse->shouldReceive('getBody')->andReturn('access_token=mock_access_token&expires=3600&refresh_token=mock_refresh_token&otherKey={1234}');
+ $postResponse->shouldReceive('getHeader')->andReturn(['content-type' => 'application/x-www-form-urlencoded']);
+ $postResponse->shouldReceive('getStatusCode')->andReturn(200);
+
+ $userResponse = m::mock('Psr\Http\Message\ResponseInterface');
+ $userResponse->shouldReceive('getBody')->andReturn('{"id": '.$userId.', "login": "'.$nickname.'", "name": "'.$name.'", "email": "'.$email.'"}');
+ $userResponse->shouldReceive('getHeader')->andReturn(['content-type' => 'json']);
+ $userResponse->shouldReceive('getStatusCode')->andReturn(200);
+
+ $client = m::mock('GuzzleHttp\ClientInterface');
+ $client->shouldReceive('send')
+ ->times(2)
+ ->andReturn($postResponse, $userResponse);
+ $this->provider->setHttpClient($client);
+
+ $token = $this->provider->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']);
+ $user = $this->provider->getResourceOwner($token);
+
+ $this->assertEquals($userId, $user->getId());
+ $this->assertEquals($userId, $user->toArray()['id']);
+ $this->assertEquals($name, $user->getName());
+ $this->assertEquals($name, $user->toArray()['name']);
+ $this->assertEquals($nickname, $user->getNickname());
+ $this->assertEquals($nickname, $user->toArray()['login']);
+ $this->assertEquals($email, $user->getEmail());
+ $this->assertEquals($email, $user->toArray()['email']);
+ $this->assertContains($nickname, $user->getUrl());
+ }
+
+ public function testUserEmails()
+ {
+ /*
+ $userId = rand(1000,9999);
+ $name = uniqid();
+ $nickname = uniqid();
+ $email = uniqid();
+
+ $postResponse = m::mock('Psr\Http\Message\ResponseInterface');
+ $postResponse->shouldReceive('getBody')->andReturn('access_token=mock_access_token&expires=3600&refresh_token=mock_refresh_token&otherKey={1234}');
+ $postResponse->shouldReceive('getHeader')->andReturn(['content-type' => 'application/x-www-form-urlencoded']);
+
+ $userResponse = m::mock('Psr\Http\Message\ResponseInterface');
+ $userResponse->shouldReceive('getBody')->andReturn('[{"email":"mock_email_1","primary":false,"verified":true},{"email":"mock_email_2","primary":false,"verified":true},{"email":"mock_email_3","primary":true,"verified":true}]');
+ $userResponse->shouldReceive('getHeader')->andReturn(['content-type' => 'json']);
+
+ $client = m::mock('GuzzleHttp\ClientInterface');
+ $client->shouldReceive('send')
+ ->times(2)
+ ->andReturn($postResponse, $userResponse);
+ $this->provider->setHttpClient($client);
+
+ $token = $this->provider->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']);
+ $emails = $this->provider->getUserEmails($token);
+
+ $this->assertEquals($userId, $user->getUserId());
+ $this->assertEquals($name, $user->getName());
+ $this->assertEquals($nickname, $user->getNickname());
+ $this->assertEquals($email, $user->getEmail());
+ $this->assertContains($nickname, $user->getUrl());
+ */
+ }
+
+ /**
+ * @expectedException League\OAuth2\Client\Provider\Exception\IdentityProviderException
+ **/
+ public function testExceptionThrownWhenErrorObjectReceived()
+ {
+ $status = rand(400,600);
+ $postResponse = m::mock('Psr\Http\Message\ResponseInterface');
+ $postResponse->shouldReceive('getBody')->andReturn('{"message": "Validation Failed","errors": [{"resource": "Issue","field": "title","code": "missing_field"}]}');
+ $postResponse->shouldReceive('getHeader')->andReturn(['content-type' => 'json']);
+ $postResponse->shouldReceive('getStatusCode')->andReturn($status);
+
+ $client = m::mock('GuzzleHttp\ClientInterface');
+ $client->shouldReceive('send')
+ ->times(1)
+ ->andReturn($postResponse);
+ $this->provider->setHttpClient($client);
+ $token = $this->provider->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']);
+ }
+
+ /**
+ * @expectedException League\OAuth2\Client\Provider\Exception\IdentityProviderException
+ **/
+ public function testExceptionThrownWhenOAuthErrorReceived()
+ {
+ $status = 200;
+ $postResponse = m::mock('Psr\Http\Message\ResponseInterface');
+ $postResponse->shouldReceive('getBody')->andReturn('{"error": "bad_verification_code","error_description": "The code passed is incorrect or expired.","error_uri": "https://developer.github.com/v3/oauth/#bad-verification-code"}');
+ $postResponse->shouldReceive('getHeader')->andReturn(['content-type' => 'json']);
+ $postResponse->shouldReceive('getStatusCode')->andReturn($status);
+
+ $client = m::mock('GuzzleHttp\ClientInterface');
+ $client->shouldReceive('send')
+ ->times(1)
+ ->andReturn($postResponse);
+ $this->provider->setHttpClient($client);
+ $token = $this->provider->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']);
+ }
+}
diff --git a/vendor/league/oauth2-google/CONTRIBUTING.md b/vendor/league/oauth2-google/CONTRIBUTING.md
new file mode 100644
index 0000000000..9dd0b4ddcc
--- /dev/null
+++ b/vendor/league/oauth2-google/CONTRIBUTING.md
@@ -0,0 +1,42 @@
+# Contributing
+
+Contributions are **welcome** and will be fully **credited**.
+
+We accept contributions via Pull Requests on [Github](https://github.com/thephpleague/oauth2-google).
+
+
+## Pull Requests
+
+- **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** - The easiest way to apply the conventions is to install [PHP Code Sniffer](http://pear.php.net/package/PHP_CodeSniffer).
+
+- **Add tests!** - Your patch won't be accepted if it doesn't have tests.
+
+- **Document any change in behaviour** - Make sure the README and any other relevant documentation are kept up-to-date.
+
+- **Consider our release cycle** - We try to follow SemVer. Randomly breaking public APIs is not an option.
+
+- **Create topic branches** - Don't ask us to pull from your master branch.
+
+- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests.
+
+- **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please squash them before submitting.
+
+- **Ensure tests pass!** - Please run the tests (see below) before submitting your pull request, and make sure they pass. We won't accept a patch until all tests pass.
+
+- **Ensure no coding standards violations** - Please run PHP Code Sniffer using the PSR-2 standard (see below) before submitting your pull request. A violation will cause the build to fail, so please make sure there are no violations. We can't accept a patch if the build fails.
+
+
+## Running Tests
+
+``` bash
+$ ./vendor/bin/phpunit
+```
+
+
+## Running PHP Code Sniffer
+
+``` bash
+$ ./vendor/bin/phpcs src --standard=psr2 -sp
+```
+
+**Happy coding**!
diff --git a/vendor/league/oauth2-google/LICENSE b/vendor/league/oauth2-google/LICENSE
new file mode 100644
index 0000000000..6d451561ed
--- /dev/null
+++ b/vendor/league/oauth2-google/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Woody Gilk
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/league/oauth2-google/README.md b/vendor/league/oauth2-google/README.md
new file mode 100644
index 0000000000..d7056e0eb0
--- /dev/null
+++ b/vendor/league/oauth2-google/README.md
@@ -0,0 +1,190 @@
+# Google Provider for OAuth 2.0 Client
+
+[![Join the chat](https://img.shields.io/badge/gitter-join-1DCE73.svg)](https://gitter.im/thephpleague/oauth2-google)
+[![Build Status](https://img.shields.io/travis/thephpleague/oauth2-google.svg)](https://travis-ci.org/thephpleague/oauth2-google)
+[![Code Coverage](https://img.shields.io/coveralls/thephpleague/oauth2-google.svg)](https://coveralls.io/r/thephpleague/oauth2-google)
+[![Code Quality](https://img.shields.io/scrutinizer/g/thephpleague/oauth2-google.svg)](https://scrutinizer-ci.com/g/thephpleague/oauth2-google/)
+[![License](https://img.shields.io/packagist/l/league/oauth2-google.svg)](https://github.com/thephpleague/oauth2-google/blob/master/LICENSE)
+[![Latest Stable Version](https://img.shields.io/packagist/v/league/oauth2-google.svg)](https://packagist.org/packages/league/oauth2-google)
+
+This package provides Google OAuth 2.0 support for the PHP League's [OAuth 2.0 Client](https://github.com/thephpleague/oauth2-client).
+
+This package is compliant with [PSR-1][], [PSR-2][] and [PSR-4][]. If you notice compliance oversights, please send
+a patch via pull request.
+
+[PSR-1]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md
+[PSR-2]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
+[PSR-4]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md
+
+## Requirements
+
+The following versions of PHP are supported.
+
+* PHP 5.6
+* PHP 7.0
+* PHP 7.1
+* HHVM
+
+[Google Sign In](https://developers.google.com/identity/sign-in/web/sign-in) will also need to be set up, which will provide you with the `{google-app-id}` and `{google-app-secret}` required (see [Usage](#usage) below).
+
+If you're using the default [scopes](#scopes) then you'll also need to enable the [Google+ API](https://developers.google.com/+/web/api/rest/) for your project.
+
+## Installation
+
+To install, use composer:
+
+```
+composer require league/oauth2-google
+```
+
+## Usage
+
+### Authorization Code Flow
+
+```php
+$provider = new League\OAuth2\Client\Provider\Google([
+ 'clientId' => '{google-app-id}',
+ 'clientSecret' => '{google-app-secret}',
+ 'redirectUri' => 'https://example.com/callback-url',
+ 'hostedDomain' => 'example.com',
+]);
+
+if (!empty($_GET['error'])) {
+
+ // Got an error, probably user denied access
+ exit('Got error: ' . htmlspecialchars($_GET['error'], ENT_QUOTES, 'UTF-8'));
+
+} elseif (empty($_GET['code'])) {
+
+ // If we don't have an authorization code then get one
+ $authUrl = $provider->getAuthorizationUrl();
+ $_SESSION['oauth2state'] = $provider->getState();
+ header('Location: ' . $authUrl);
+ exit;
+
+} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
+
+ // State is invalid, possible CSRF attack in progress
+ unset($_SESSION['oauth2state']);
+ exit('Invalid state');
+
+} else {
+
+ // Try to get an access token (using the authorization code grant)
+ $token = $provider->getAccessToken('authorization_code', [
+ 'code' => $_GET['code']
+ ]);
+
+ // Optional: Now you have a token you can look up a users profile data
+ try {
+
+ // We got an access token, let's now get the owner details
+ $ownerDetails = $provider->getResourceOwner($token);
+
+ // Use these details to create a new profile
+ printf('Hello %s!', $ownerDetails->getFirstName());
+
+ } catch (Exception $e) {
+
+ // Failed to get user details
+ exit('Something went wrong: ' . $e->getMessage());
+
+ }
+
+ // Use this to interact with an API on the users behalf
+ echo $token->getToken();
+
+ // Use this to get a new access token if the old one expires
+ echo $token->getRefreshToken();
+
+ // Number of seconds until the access token will expire, and need refreshing
+ echo $token->getExpires();
+}
+```
+
+### Refreshing a Token
+
+Refresh tokens are only provided to applications which request offline access. You can specify offline access by setting the `accessType` option in your provider:
+
+```php
+$provider = new League\OAuth2\Client\Provider\Google([
+ 'clientId' => '{google-app-id}',
+ 'clientSecret' => '{google-app-secret}',
+ 'redirectUri' => 'https://example.com/callback-url',
+ 'accessType' => 'offline',
+]);
+```
+
+It is important to note that the refresh token is only returned on the first request after this it will be `null`. You should securely store the refresh token when it is returned:
+
+```php
+$token = $provider->getAccessToken('authorization_code', [
+ 'code' => $code
+]);
+
+// persist the token in a database
+$refreshToken = $token->getRefreshToken();
+```
+
+If you ever need to get a new refresh token you can request one by forcing the approval prompt:
+
+```php
+$authUrl = $provider->getAuthorizationUrl(['approval_prompt' => 'force']);
+```
+
+Now you have everything you need to refresh an access token using a refresh token:
+
+```php
+$provider = new League\OAuth2\Client\Provider\Google([
+ 'clientId' => '{google-app-id}',
+ 'clientSecret' => '{google-app-secret}',
+ 'redirectUri' => 'https://example.com/callback-url',
+]);
+
+$grant = new League\OAuth2\Client\Grant\RefreshToken();
+$token = $provider->getAccessToken($grant, ['refresh_token' => $refreshToken]);
+```
+## Resource Owner Attributes
+
+By default the Google plus API is used to load profile information. If you want to use the OpenIDConnect
+user info endpoint to load profile information then add `useOidcMode => true` to your configuration.
+
+The two endpoints provide attributes with different names and structures. The `GoogleUser` class hides
+these differences for the most common attributes.
+
+## Scopes
+
+If needed, you can include an array of scopes when getting the authorization url. Example:
+
+```
+$authorizationUrl = $provider->getAuthorizationUrl([
+ 'scope' => [
+ 'https://www.googleapis.com/auth/drive',
+ ]
+]);
+header('Location: ' . $authorizationUrl);
+exit;
+```
+
+Note that the default scopes include `email` and `profile`, which require that the [Google+ API](https://developers.google.com/+/web/api/rest/) is enabled for your project.
+
+## Testing
+
+``` bash
+$ ./vendor/bin/phpunit
+```
+
+## Contributing
+
+Please see [CONTRIBUTING](https://github.com/thephpleague/oauth2-google/blob/master/CONTRIBUTING.md) for details.
+
+
+## Credits
+
+- [Woody Gilk](https://github.com/shadowhand)
+- [All Contributors](https://github.com/thephpleague/oauth2-google/contributors)
+
+
+## License
+
+The MIT License (MIT). Please see [License File](https://github.com/thephpleague/oauth2-google/blob/master/LICENSE) for more information.
diff --git a/vendor/league/oauth2-google/composer.json b/vendor/league/oauth2-google/composer.json
new file mode 100644
index 0000000000..eaebe548df
--- /dev/null
+++ b/vendor/league/oauth2-google/composer.json
@@ -0,0 +1,44 @@
+{
+ "name": "league/oauth2-google",
+ "description": "Google OAuth 2.0 Client Provider for The PHP League OAuth2-Client",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Woody Gilk",
+ "email": "woody.gilk@gmail.com",
+ "homepage": "http://shadowhand.me"
+ }
+ ],
+ "keywords": [
+ "oauth",
+ "oauth2",
+ "client",
+ "authorization",
+ "authentication",
+ "google"
+ ],
+ "minimum-stability": "stable",
+ "require": {
+ "league/oauth2-client": "^2.0"
+ },
+ "require-dev": {
+ "eloquent/phony": "^0.14.6",
+ "phpunit/phpunit": "^5.7",
+ "satooshi/php-coveralls": "^2.0",
+ "squizlabs/php_codesniffer": "^2.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\OAuth2\\Client\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "League\\OAuth2\\Client\\Test\\": "tests/src/"
+ }
+ },
+ "scripts": {
+ "test": "phpunit",
+ "check": "phpcs src --standard=psr2 -sp"
+ }
+}
diff --git a/vendor/league/oauth2-google/examples/index.php b/vendor/league/oauth2-google/examples/index.php
new file mode 100644
index 0000000000..9138437770
--- /dev/null
+++ b/vendor/league/oauth2-google/examples/index.php
@@ -0,0 +1,35 @@
+getAuthorizationUrl();
+ $_SESSION['oauth2state'] = $provider->getState();
+ header('Location: ' . $authUrl);
+ exit;
+
+} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
+
+ // State is invalid, possible CSRF attack in progress
+ unset($_SESSION['oauth2state']);
+ exit('Invalid state');
+
+} else {
+
+ // Try to get an access token (using the authorization code grant)
+ $token = $provider->getAccessToken('authorization_code', [
+ 'code' => $_GET['code']
+ ]);
+
+ $_SESSION['token'] = serialize($token);
+
+ // Optional: Now you have a token you can look up a users profile data
+ header('Location: /user.php');
+}
diff --git a/vendor/league/oauth2-google/examples/provider.php b/vendor/league/oauth2-google/examples/provider.php
new file mode 100644
index 0000000000..4001f68570
--- /dev/null
+++ b/vendor/league/oauth2-google/examples/provider.php
@@ -0,0 +1,24 @@
+getResourceOwner($token);
+
+ // Use these details to create a new profile
+ printf('Hello %s! ', $userDetails->getFirstname());
+
+} catch (Exception $e) {
+
+ // Failed to get user details
+ exit('Something went wrong: ' . $e->getMessage());
+
+}
+
+// Use this to interact with an API on the users behalf
+echo $token->getToken()." ";
+
+// Use this to get a new access token if the old one expires
+echo $token->getRefreshToken()." ";
+
+// Number of seconds until the access token will expire, and need refreshing
+echo $token->getExpires()." ";
diff --git a/vendor/league/oauth2-google/phpunit.xml.dist b/vendor/league/oauth2-google/phpunit.xml.dist
new file mode 100644
index 0000000000..7f37586aab
--- /dev/null
+++ b/vendor/league/oauth2-google/phpunit.xml.dist
@@ -0,0 +1,28 @@
+
+
+
+
+ ./test
+
+
+
+
+ src/
+
+
+
+
+
+
+
+
diff --git a/vendor/league/oauth2-google/src/Exception/HostedDomainException.php b/vendor/league/oauth2-google/src/Exception/HostedDomainException.php
new file mode 100644
index 0000000000..1adf9acb3e
--- /dev/null
+++ b/vendor/league/oauth2-google/src/Exception/HostedDomainException.php
@@ -0,0 +1,15 @@
+useOidcMode) {
+ // OIDC endpoints can be found https://accounts.google.com/.well-known/openid-configuration
+ return 'https://www.googleapis.com/oauth2/v3/userinfo';
+ }
+ // fields that are required based on other configuration options
+ $configurationUserFields = [];
+ if (isset($this->hostedDomain)) {
+ $configurationUserFields[] = 'domain';
+ }
+ $fields = array_merge($this->defaultUserFields, $this->userFields, $configurationUserFields);
+ return 'https://www.googleapis.com/plus/v1/people/me?' . http_build_query([
+ 'fields' => implode(',', $fields),
+ 'alt' => 'json',
+ ]);
+ }
+
+ protected function getAuthorizationParameters(array $options)
+ {
+ $params = array_merge(
+ parent::getAuthorizationParameters($options),
+ array_filter([
+ 'hd' => $this->hostedDomain,
+ 'access_type' => $this->accessType,
+ // if the user is logged in with more than one account ask which one to use for the login!
+ 'authuser' => '-1'
+ ])
+ );
+
+ return $params;
+ }
+
+ protected function getDefaultScopes()
+ {
+ return [
+ 'email',
+ 'openid',
+ 'profile',
+ ];
+ }
+
+ protected function getScopeSeparator()
+ {
+ return ' ';
+ }
+
+ protected function checkResponse(ResponseInterface $response, $data)
+ {
+ if (!empty($data['error'])) {
+ $code = 0;
+ $error = $data['error'];
+
+ if (is_array($error)) {
+ $code = $error['code'];
+ $error = $error['message'];
+ }
+
+ throw new IdentityProviderException($error, $code, $data);
+ }
+ }
+
+ protected function createResourceOwner(array $response, AccessToken $token)
+ {
+ $user = new GoogleUser($response);
+ // Validate hosted domain incase the user edited the initial authorization code grant request
+ if ($this->hostedDomain === '*') {
+ if (empty($user->getHostedDomain())) {
+ throw HostedDomainException::notMatchingDomain($this->hostedDomain);
+ }
+ } elseif (!empty($this->hostedDomain) && $this->hostedDomain !== $user->getHostedDomain()) {
+ throw HostedDomainException::notMatchingDomain($this->hostedDomain);
+ }
+
+ return $user;
+ }
+}
diff --git a/vendor/league/oauth2-google/src/Provider/GoogleUser.php b/vendor/league/oauth2-google/src/Provider/GoogleUser.php
new file mode 100644
index 0000000000..23f70aab1f
--- /dev/null
+++ b/vendor/league/oauth2-google/src/Provider/GoogleUser.php
@@ -0,0 +1,125 @@
+response = $response;
+ }
+
+ public function getId()
+ {
+ if (array_key_exists('sub', $this->response)) {
+ return $this->response['sub'];
+ }
+ return $this->response['id'];
+ }
+
+ /**
+ * Get preferred display name.
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ if (array_key_exists('name', $this->response) && is_string($this->response['name'])) {
+ return $this->response['name'];
+ }
+ return $this->response['displayName'];
+ }
+
+ /**
+ * Get preferred first name.
+ *
+ * @return string
+ */
+ public function getFirstName()
+ {
+ if (array_key_exists('given_name', $this->response)) {
+ return $this->response['given_name'];
+ }
+ return $this->response['name']['givenName'];
+ }
+
+ /**
+ * Get preferred last name.
+ *
+ * @return string
+ */
+ public function getLastName()
+ {
+ if (array_key_exists('family_name', $this->response)) {
+ return $this->response['family_name'];
+ }
+ return $this->response['name']['familyName'];
+ }
+
+ /**
+ * Get email address.
+ *
+ * @return string|null
+ */
+ public function getEmail()
+ {
+ if (array_key_exists('email', $this->response)) {
+ return $this->response['email'];
+ }
+ if (!empty($this->response['emails'])) {
+ return $this->response['emails'][0]['value'];
+ }
+ return null;
+ }
+
+ /**
+ * Get hosted domain.
+ *
+ * @return string|null
+ */
+ public function getHostedDomain()
+ {
+ if (array_key_exists('hd', $this->response)) {
+ return $this->response['hd'];
+ }
+ if (array_key_exists('domain', $this->response)) {
+ return $this->response['domain'];
+ }
+
+ return null;
+ }
+
+ /**
+ * Get avatar image URL.
+ *
+ * @return string|null
+ */
+ public function getAvatar()
+ {
+ if (array_key_exists('picture', $this->response)) {
+ return $this->response['picture'];
+ }
+ if (!empty($this->response['image']['url'])) {
+ return $this->response['image']['url'];
+ }
+ return null;
+ }
+
+ /**
+ * Get user data as an array.
+ *
+ * @return array
+ */
+ public function toArray()
+ {
+ return $this->response;
+ }
+}
diff --git a/vendor/monolog/monolog/.php_cs b/vendor/monolog/monolog/.php_cs
new file mode 100644
index 0000000000..366ccd08b6
--- /dev/null
+++ b/vendor/monolog/monolog/.php_cs
@@ -0,0 +1,59 @@
+
+
+For the full copyright and license information, please view the LICENSE
+file that was distributed with this source code.
+EOF;
+
+$finder = Symfony\CS\Finder::create()
+ ->files()
+ ->name('*.php')
+ ->exclude('Fixtures')
+ ->in(__DIR__.'/src')
+ ->in(__DIR__.'/tests')
+;
+
+return Symfony\CS\Config::create()
+ ->setUsingCache(true)
+ //->setUsingLinter(false)
+ ->setRiskyAllowed(true)
+ ->setRules(array(
+ '@PSR2' => true,
+ 'binary_operator_spaces' => true,
+ 'blank_line_before_return' => true,
+ 'header_comment' => array('header' => $header),
+ 'include' => true,
+ 'long_array_syntax' => true,
+ 'method_separation' => true,
+ 'no_blank_lines_after_class_opening' => true,
+ 'no_blank_lines_after_phpdoc' => true,
+ 'no_blank_lines_between_uses' => true,
+ 'no_duplicate_semicolons' => true,
+ 'no_extra_consecutive_blank_lines' => true,
+ 'no_leading_import_slash' => true,
+ 'no_leading_namespace_whitespace' => true,
+ 'no_trailing_comma_in_singleline_array' => true,
+ 'no_unused_imports' => true,
+ 'object_operator_without_whitespace' => true,
+ 'phpdoc_align' => true,
+ 'phpdoc_indent' => true,
+ 'phpdoc_no_access' => true,
+ 'phpdoc_no_package' => true,
+ 'phpdoc_order' => true,
+ 'phpdoc_scalar' => true,
+ 'phpdoc_trim' => true,
+ 'phpdoc_type_to_var' => true,
+ 'psr0' => true,
+ 'single_blank_line_before_namespace' => true,
+ 'spaces_cast' => true,
+ 'standardize_not_equals' => true,
+ 'ternary_operator_spaces' => true,
+ 'trailing_comma_in_multiline_array' => true,
+ 'whitespacy_lines' => true,
+ ))
+ ->finder($finder)
+;
diff --git a/vendor/monolog/monolog/CHANGELOG.md b/vendor/monolog/monolog/CHANGELOG.md
new file mode 100644
index 0000000000..cd1142d15b
--- /dev/null
+++ b/vendor/monolog/monolog/CHANGELOG.md
@@ -0,0 +1,342 @@
+### 1.23.0 (2017-06-19)
+
+ * Improved SyslogUdpHandler's support for RFC5424 and added optional `$ident` argument
+ * Fixed GelfHandler truncation to be per field and not per message
+ * Fixed compatibility issue with PHP <5.3.6
+ * Fixed support for headless Chrome in ChromePHPHandler
+ * Fixed support for latest Aws SDK in DynamoDbHandler
+ * Fixed support for SwiftMailer 6.0+ in SwiftMailerHandler
+
+### 1.22.1 (2017-03-13)
+
+ * Fixed lots of minor issues in the new Slack integrations
+ * Fixed support for allowInlineLineBreaks in LineFormatter when formatting exception backtraces
+
+### 1.22.0 (2016-11-26)
+
+ * Added SlackbotHandler and SlackWebhookHandler to set up Slack integration more easily
+ * Added MercurialProcessor to add mercurial revision and branch names to log records
+ * Added support for AWS SDK v3 in DynamoDbHandler
+ * Fixed fatal errors occuring when normalizing generators that have been fully consumed
+ * Fixed RollbarHandler to include a level (rollbar level), monolog_level (original name), channel and datetime (unix)
+ * Fixed RollbarHandler not flushing records automatically, calling close() explicitly is not necessary anymore
+ * Fixed SyslogUdpHandler to avoid sending empty frames
+ * Fixed a few PHP 7.0 and 7.1 compatibility issues
+
+### 1.21.0 (2016-07-29)
+
+ * Break: Reverted the addition of $context when the ErrorHandler handles regular php errors from 1.20.0 as it was causing issues
+ * Added support for more formats in RotatingFileHandler::setFilenameFormat as long as they have Y, m and d in order
+ * Added ability to format the main line of text the SlackHandler sends by explictly setting a formatter on the handler
+ * Added information about SoapFault instances in NormalizerFormatter
+ * Added $handleOnlyReportedErrors option on ErrorHandler::registerErrorHandler (default true) to allow logging of all errors no matter the error_reporting level
+
+### 1.20.0 (2016-07-02)
+
+ * Added FingersCrossedHandler::activate() to manually trigger the handler regardless of the activation policy
+ * Added StreamHandler::getUrl to retrieve the stream's URL
+ * Added ability to override addRow/addTitle in HtmlFormatter
+ * Added the $context to context information when the ErrorHandler handles a regular php error
+ * Deprecated RotatingFileHandler::setFilenameFormat to only support 3 formats: Y, Y-m and Y-m-d
+ * Fixed WhatFailureGroupHandler to work with PHP7 throwables
+ * Fixed a few minor bugs
+
+### 1.19.0 (2016-04-12)
+
+ * Break: StreamHandler will not close streams automatically that it does not own. If you pass in a stream (not a path/url), then it will not close it for you. You can retrieve those using getStream() if needed
+ * Added DeduplicationHandler to remove duplicate records from notifications across multiple requests, useful for email or other notifications on errors
+ * Added ability to use `%message%` and other LineFormatter replacements in the subject line of emails sent with NativeMailHandler and SwiftMailerHandler
+ * Fixed HipChatHandler handling of long messages
+
+### 1.18.2 (2016-04-02)
+
+ * Fixed ElasticaFormatter to use more precise dates
+ * Fixed GelfMessageFormatter sending too long messages
+
+### 1.18.1 (2016-03-13)
+
+ * Fixed SlackHandler bug where slack dropped messages randomly
+ * Fixed RedisHandler issue when using with the PHPRedis extension
+ * Fixed AmqpHandler content-type being incorrectly set when using with the AMQP extension
+ * Fixed BrowserConsoleHandler regression
+
+### 1.18.0 (2016-03-01)
+
+ * Added optional reduction of timestamp precision via `Logger->useMicrosecondTimestamps(false)`, disabling it gets you a bit of performance boost but reduces the precision to the second instead of microsecond
+ * Added possibility to skip some extra stack frames in IntrospectionProcessor if you have some library wrapping Monolog that is always adding frames
+ * Added `Logger->withName` to clone a logger (keeping all handlers) with a new name
+ * Added FluentdFormatter for the Fluentd unix socket protocol
+ * Added HandlerWrapper base class to ease the creation of handler wrappers, just extend it and override as needed
+ * Added support for replacing context sub-keys using `%context.*%` in LineFormatter
+ * Added support for `payload` context value in RollbarHandler
+ * Added setRelease to RavenHandler to describe the application version, sent with every log
+ * Added support for `fingerprint` context value in RavenHandler
+ * Fixed JSON encoding errors that would gobble up the whole log record, we now handle those more gracefully by dropping chars as needed
+ * Fixed write timeouts in SocketHandler and derivatives, set to 10sec by default, lower it with `setWritingTimeout()`
+ * Fixed PHP7 compatibility with regard to Exception/Throwable handling in a few places
+
+### 1.17.2 (2015-10-14)
+
+ * Fixed ErrorHandler compatibility with non-Monolog PSR-3 loggers
+ * Fixed SlackHandler handling to use slack functionalities better
+ * Fixed SwiftMailerHandler bug when sending multiple emails they all had the same id
+ * Fixed 5.3 compatibility regression
+
+### 1.17.1 (2015-08-31)
+
+ * Fixed RollbarHandler triggering PHP notices
+
+### 1.17.0 (2015-08-30)
+
+ * Added support for `checksum` and `release` context/extra values in RavenHandler
+ * Added better support for exceptions in RollbarHandler
+ * Added UidProcessor::getUid
+ * Added support for showing the resource type in NormalizedFormatter
+ * Fixed IntrospectionProcessor triggering PHP notices
+
+### 1.16.0 (2015-08-09)
+
+ * Added IFTTTHandler to notify ifttt.com triggers
+ * Added Logger::setHandlers() to allow setting/replacing all handlers
+ * Added $capSize in RedisHandler to cap the log size
+ * Fixed StreamHandler creation of directory to only trigger when the first log write happens
+ * Fixed bug in the handling of curl failures
+ * Fixed duplicate logging of fatal errors when both error and fatal error handlers are registered in monolog's ErrorHandler
+ * Fixed missing fatal errors records with handlers that need to be closed to flush log records
+ * Fixed TagProcessor::addTags support for associative arrays
+
+### 1.15.0 (2015-07-12)
+
+ * Added addTags and setTags methods to change a TagProcessor
+ * Added automatic creation of directories if they are missing for a StreamHandler to open a log file
+ * Added retry functionality to Loggly, Cube and Mandrill handlers so they retry up to 5 times in case of network failure
+ * Fixed process exit code being incorrectly reset to 0 if ErrorHandler::registerExceptionHandler was used
+ * Fixed HTML/JS escaping in BrowserConsoleHandler
+ * Fixed JSON encoding errors being silently suppressed (PHP 5.5+ only)
+
+### 1.14.0 (2015-06-19)
+
+ * Added PHPConsoleHandler to send record to Chrome's PHP Console extension and library
+ * Added support for objects implementing __toString in the NormalizerFormatter
+ * Added support for HipChat's v2 API in HipChatHandler
+ * Added Logger::setTimezone() to initialize the timezone monolog should use in case date.timezone isn't correct for your app
+ * Added an option to send formatted message instead of the raw record on PushoverHandler via ->useFormattedMessage(true)
+ * Fixed curl errors being silently suppressed
+
+### 1.13.1 (2015-03-09)
+
+ * Fixed regression in HipChat requiring a new token to be created
+
+### 1.13.0 (2015-03-05)
+
+ * Added Registry::hasLogger to check for the presence of a logger instance
+ * Added context.user support to RavenHandler
+ * Added HipChat API v2 support in the HipChatHandler
+ * Added NativeMailerHandler::addParameter to pass params to the mail() process
+ * Added context data to SlackHandler when $includeContextAndExtra is true
+ * Added ability to customize the Swift_Message per-email in SwiftMailerHandler
+ * Fixed SwiftMailerHandler to lazily create message instances if a callback is provided
+ * Fixed serialization of INF and NaN values in Normalizer and LineFormatter
+
+### 1.12.0 (2014-12-29)
+
+ * Break: HandlerInterface::isHandling now receives a partial record containing only a level key. This was always the intent and does not break any Monolog handler but is strictly speaking a BC break and you should check if you relied on any other field in your own handlers.
+ * Added PsrHandler to forward records to another PSR-3 logger
+ * Added SamplingHandler to wrap around a handler and include only every Nth record
+ * Added MongoDBFormatter to support better storage with MongoDBHandler (it must be enabled manually for now)
+ * Added exception codes in the output of most formatters
+ * Added LineFormatter::includeStacktraces to enable exception stack traces in logs (uses more than one line)
+ * Added $useShortAttachment to SlackHandler to minify attachment size and $includeExtra to append extra data
+ * Added $host to HipChatHandler for users of private instances
+ * Added $transactionName to NewRelicHandler and support for a transaction_name context value
+ * Fixed MandrillHandler to avoid outputing API call responses
+ * Fixed some non-standard behaviors in SyslogUdpHandler
+
+### 1.11.0 (2014-09-30)
+
+ * Break: The NewRelicHandler extra and context data are now prefixed with extra_ and context_ to avoid clashes. Watch out if you have scripts reading those from the API and rely on names
+ * Added WhatFailureGroupHandler to suppress any exception coming from the wrapped handlers and avoid chain failures if a logging service fails
+ * Added MandrillHandler to send emails via the Mandrillapp.com API
+ * Added SlackHandler to log records to a Slack.com account
+ * Added FleepHookHandler to log records to a Fleep.io account
+ * Added LogglyHandler::addTag to allow adding tags to an existing handler
+ * Added $ignoreEmptyContextAndExtra to LineFormatter to avoid empty [] at the end
+ * Added $useLocking to StreamHandler and RotatingFileHandler to enable flock() while writing
+ * Added support for PhpAmqpLib in the AmqpHandler
+ * Added FingersCrossedHandler::clear and BufferHandler::clear to reset them between batches in long running jobs
+ * Added support for adding extra fields from $_SERVER in the WebProcessor
+ * Fixed support for non-string values in PrsLogMessageProcessor
+ * Fixed SwiftMailer messages being sent with the wrong date in long running scripts
+ * Fixed minor PHP 5.6 compatibility issues
+ * Fixed BufferHandler::close being called twice
+
+### 1.10.0 (2014-06-04)
+
+ * Added Logger::getHandlers() and Logger::getProcessors() methods
+ * Added $passthruLevel argument to FingersCrossedHandler to let it always pass some records through even if the trigger level is not reached
+ * Added support for extra data in NewRelicHandler
+ * Added $expandNewlines flag to the ErrorLogHandler to create multiple log entries when a message has multiple lines
+
+### 1.9.1 (2014-04-24)
+
+ * Fixed regression in RotatingFileHandler file permissions
+ * Fixed initialization of the BufferHandler to make sure it gets flushed after receiving records
+ * Fixed ChromePHPHandler and FirePHPHandler's activation strategies to be more conservative
+
+### 1.9.0 (2014-04-20)
+
+ * Added LogEntriesHandler to send logs to a LogEntries account
+ * Added $filePermissions to tweak file mode on StreamHandler and RotatingFileHandler
+ * Added $useFormatting flag to MemoryProcessor to make it send raw data in bytes
+ * Added support for table formatting in FirePHPHandler via the table context key
+ * Added a TagProcessor to add tags to records, and support for tags in RavenHandler
+ * Added $appendNewline flag to the JsonFormatter to enable using it when logging to files
+ * Added sound support to the PushoverHandler
+ * Fixed multi-threading support in StreamHandler
+ * Fixed empty headers issue when ChromePHPHandler received no records
+ * Fixed default format of the ErrorLogHandler
+
+### 1.8.0 (2014-03-23)
+
+ * Break: the LineFormatter now strips newlines by default because this was a bug, set $allowInlineLineBreaks to true if you need them
+ * Added BrowserConsoleHandler to send logs to any browser's console via console.log() injection in the output
+ * Added FilterHandler to filter records and only allow those of a given list of levels through to the wrapped handler
+ * Added FlowdockHandler to send logs to a Flowdock account
+ * Added RollbarHandler to send logs to a Rollbar account
+ * Added HtmlFormatter to send prettier log emails with colors for each log level
+ * Added GitProcessor to add the current branch/commit to extra record data
+ * Added a Monolog\Registry class to allow easier global access to pre-configured loggers
+ * Added support for the new official graylog2/gelf-php lib for GelfHandler, upgrade if you can by replacing the mlehner/gelf-php requirement
+ * Added support for HHVM
+ * Added support for Loggly batch uploads
+ * Added support for tweaking the content type and encoding in NativeMailerHandler
+ * Added $skipClassesPartials to tweak the ignored classes in the IntrospectionProcessor
+ * Fixed batch request support in GelfHandler
+
+### 1.7.0 (2013-11-14)
+
+ * Added ElasticSearchHandler to send logs to an Elastic Search server
+ * Added DynamoDbHandler and ScalarFormatter to send logs to Amazon's Dynamo DB
+ * Added SyslogUdpHandler to send logs to a remote syslogd server
+ * Added LogglyHandler to send logs to a Loggly account
+ * Added $level to IntrospectionProcessor so it only adds backtraces when needed
+ * Added $version to LogstashFormatter to allow using the new v1 Logstash format
+ * Added $appName to NewRelicHandler
+ * Added configuration of Pushover notification retries/expiry
+ * Added $maxColumnWidth to NativeMailerHandler to change the 70 chars default
+ * Added chainability to most setters for all handlers
+ * Fixed RavenHandler batch processing so it takes the message from the record with highest priority
+ * Fixed HipChatHandler batch processing so it sends all messages at once
+ * Fixed issues with eAccelerator
+ * Fixed and improved many small things
+
+### 1.6.0 (2013-07-29)
+
+ * Added HipChatHandler to send logs to a HipChat chat room
+ * Added ErrorLogHandler to send logs to PHP's error_log function
+ * Added NewRelicHandler to send logs to NewRelic's service
+ * Added Monolog\ErrorHandler helper class to register a Logger as exception/error/fatal handler
+ * Added ChannelLevelActivationStrategy for the FingersCrossedHandler to customize levels by channel
+ * Added stack traces output when normalizing exceptions (json output & co)
+ * Added Monolog\Logger::API constant (currently 1)
+ * Added support for ChromePHP's v4.0 extension
+ * Added support for message priorities in PushoverHandler, see $highPriorityLevel and $emergencyLevel
+ * Added support for sending messages to multiple users at once with the PushoverHandler
+ * Fixed RavenHandler's support for batch sending of messages (when behind a Buffer or FingersCrossedHandler)
+ * Fixed normalization of Traversables with very large data sets, only the first 1000 items are shown now
+ * Fixed issue in RotatingFileHandler when an open_basedir restriction is active
+ * Fixed minor issues in RavenHandler and bumped the API to Raven 0.5.0
+ * Fixed SyslogHandler issue when many were used concurrently with different facilities
+
+### 1.5.0 (2013-04-23)
+
+ * Added ProcessIdProcessor to inject the PID in log records
+ * Added UidProcessor to inject a unique identifier to all log records of one request/run
+ * Added support for previous exceptions in the LineFormatter exception serialization
+ * Added Monolog\Logger::getLevels() to get all available levels
+ * Fixed ChromePHPHandler so it avoids sending headers larger than Chrome can handle
+
+### 1.4.1 (2013-04-01)
+
+ * Fixed exception formatting in the LineFormatter to be more minimalistic
+ * Fixed RavenHandler's handling of context/extra data, requires Raven client >0.1.0
+ * Fixed log rotation in RotatingFileHandler to work with long running scripts spanning multiple days
+ * Fixed WebProcessor array access so it checks for data presence
+ * Fixed Buffer, Group and FingersCrossed handlers to make use of their processors
+
+### 1.4.0 (2013-02-13)
+
+ * Added RedisHandler to log to Redis via the Predis library or the phpredis extension
+ * Added ZendMonitorHandler to log to the Zend Server monitor
+ * Added the possibility to pass arrays of handlers and processors directly in the Logger constructor
+ * Added `$useSSL` option to the PushoverHandler which is enabled by default
+ * Fixed ChromePHPHandler and FirePHPHandler issue when multiple instances are used simultaneously
+ * Fixed header injection capability in the NativeMailHandler
+
+### 1.3.1 (2013-01-11)
+
+ * Fixed LogstashFormatter to be usable with stream handlers
+ * Fixed GelfMessageFormatter levels on Windows
+
+### 1.3.0 (2013-01-08)
+
+ * Added PSR-3 compliance, the `Monolog\Logger` class is now an instance of `Psr\Log\LoggerInterface`
+ * Added PsrLogMessageProcessor that you can selectively enable for full PSR-3 compliance
+ * Added LogstashFormatter (combine with SocketHandler or StreamHandler to send logs to Logstash)
+ * Added PushoverHandler to send mobile notifications
+ * Added CouchDBHandler and DoctrineCouchDBHandler
+ * Added RavenHandler to send data to Sentry servers
+ * Added support for the new MongoClient class in MongoDBHandler
+ * Added microsecond precision to log records' timestamps
+ * Added `$flushOnOverflow` param to BufferHandler to flush by batches instead of losing
+ the oldest entries
+ * Fixed normalization of objects with cyclic references
+
+### 1.2.1 (2012-08-29)
+
+ * Added new $logopts arg to SyslogHandler to provide custom openlog options
+ * Fixed fatal error in SyslogHandler
+
+### 1.2.0 (2012-08-18)
+
+ * Added AmqpHandler (for use with AMQP servers)
+ * Added CubeHandler
+ * Added NativeMailerHandler::addHeader() to send custom headers in mails
+ * Added the possibility to specify more than one recipient in NativeMailerHandler
+ * Added the possibility to specify float timeouts in SocketHandler
+ * Added NOTICE and EMERGENCY levels to conform with RFC 5424
+ * Fixed the log records to use the php default timezone instead of UTC
+ * Fixed BufferHandler not being flushed properly on PHP fatal errors
+ * Fixed normalization of exotic resource types
+ * Fixed the default format of the SyslogHandler to avoid duplicating datetimes in syslog
+
+### 1.1.0 (2012-04-23)
+
+ * Added Monolog\Logger::isHandling() to check if a handler will
+ handle the given log level
+ * Added ChromePHPHandler
+ * Added MongoDBHandler
+ * Added GelfHandler (for use with Graylog2 servers)
+ * Added SocketHandler (for use with syslog-ng for example)
+ * Added NormalizerFormatter
+ * Added the possibility to change the activation strategy of the FingersCrossedHandler
+ * Added possibility to show microseconds in logs
+ * Added `server` and `referer` to WebProcessor output
+
+### 1.0.2 (2011-10-24)
+
+ * Fixed bug in IE with large response headers and FirePHPHandler
+
+### 1.0.1 (2011-08-25)
+
+ * Added MemoryPeakUsageProcessor and MemoryUsageProcessor
+ * Added Monolog\Logger::getName() to get a logger's channel name
+
+### 1.0.0 (2011-07-06)
+
+ * Added IntrospectionProcessor to get info from where the logger was called
+ * Fixed WebProcessor in CLI
+
+### 1.0.0-RC1 (2011-07-01)
+
+ * Initial release
diff --git a/vendor/monolog/monolog/LICENSE b/vendor/monolog/monolog/LICENSE
new file mode 100644
index 0000000000..16473219bf
--- /dev/null
+++ b/vendor/monolog/monolog/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2011-2016 Jordi Boggiano
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/monolog/monolog/README.md b/vendor/monolog/monolog/README.md
new file mode 100644
index 0000000000..7d8ade5268
--- /dev/null
+++ b/vendor/monolog/monolog/README.md
@@ -0,0 +1,95 @@
+# Monolog - Logging for PHP [![Build Status](https://img.shields.io/travis/Seldaek/monolog.svg)](https://travis-ci.org/Seldaek/monolog)
+
+[![Total Downloads](https://img.shields.io/packagist/dt/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog)
+[![Latest Stable Version](https://img.shields.io/packagist/v/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog)
+[![Reference Status](https://www.versioneye.com/php/monolog:monolog/reference_badge.svg)](https://www.versioneye.com/php/monolog:monolog/references)
+
+
+Monolog sends your logs to files, sockets, inboxes, databases and various
+web services. See the complete list of handlers below. Special handlers
+allow you to build advanced logging strategies.
+
+This library implements the [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)
+interface that you can type-hint against in your own libraries to keep
+a maximum of interoperability. You can also use it in your applications to
+make sure you can always use another compatible logger at a later time.
+As of 1.11.0 Monolog public APIs will also accept PSR-3 log levels.
+Internally Monolog still uses its own level scheme since it predates PSR-3.
+
+## Installation
+
+Install the latest version with
+
+```bash
+$ composer require monolog/monolog
+```
+
+## Basic Usage
+
+```php
+pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
+
+// add records to the log
+$log->addWarning('Foo');
+$log->addError('Bar');
+```
+
+## Documentation
+
+- [Usage Instructions](doc/01-usage.md)
+- [Handlers, Formatters and Processors](doc/02-handlers-formatters-processors.md)
+- [Utility classes](doc/03-utilities.md)
+- [Extending Monolog](doc/04-extending.md)
+
+## Third Party Packages
+
+Third party handlers, formatters and processors are
+[listed in the wiki](https://github.com/Seldaek/monolog/wiki/Third-Party-Packages). You
+can also add your own there if you publish one.
+
+## About
+
+### Requirements
+
+- Monolog works with PHP 5.3 or above, and is also tested to work with HHVM.
+
+### Submitting bugs and feature requests
+
+Bugs and feature request are tracked on [GitHub](https://github.com/Seldaek/monolog/issues)
+
+### Framework Integrations
+
+- Frameworks and libraries using [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)
+ can be used very easily with Monolog since it implements the interface.
+- [Symfony2](http://symfony.com) comes out of the box with Monolog.
+- [Silex](http://silex.sensiolabs.org/) comes out of the box with Monolog.
+- [Laravel 4 & 5](http://laravel.com/) come out of the box with Monolog.
+- [Lumen](http://lumen.laravel.com/) comes out of the box with Monolog.
+- [PPI](http://www.ppi.io/) comes out of the box with Monolog.
+- [CakePHP](http://cakephp.org/) is usable with Monolog via the [cakephp-monolog](https://github.com/jadb/cakephp-monolog) plugin.
+- [Slim](http://www.slimframework.com/) is usable with Monolog via the [Slim-Monolog](https://github.com/Flynsarmy/Slim-Monolog) log writer.
+- [XOOPS 2.6](http://xoops.org/) comes out of the box with Monolog.
+- [Aura.Web_Project](https://github.com/auraphp/Aura.Web_Project) comes out of the box with Monolog.
+- [Nette Framework](http://nette.org/en/) can be used with Monolog via [Kdyby/Monolog](https://github.com/Kdyby/Monolog) extension.
+- [Proton Micro Framework](https://github.com/alexbilbie/Proton) comes out of the box with Monolog.
+
+### Author
+
+Jordi Boggiano - -
+See also the list of [contributors](https://github.com/Seldaek/monolog/contributors) which participated in this project.
+
+### License
+
+Monolog is licensed under the MIT License - see the `LICENSE` file for details
+
+### Acknowledgements
+
+This library is heavily inspired by Python's [Logbook](http://packages.python.org/Logbook/)
+library, although most concepts have been adjusted to fit to the PHP world.
diff --git a/vendor/monolog/monolog/composer.json b/vendor/monolog/monolog/composer.json
new file mode 100644
index 0000000000..3b0c880557
--- /dev/null
+++ b/vendor/monolog/monolog/composer.json
@@ -0,0 +1,66 @@
+{
+ "name": "monolog/monolog",
+ "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+ "keywords": ["log", "logging", "psr-3"],
+ "homepage": "http://github.com/Seldaek/monolog",
+ "type": "library",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.0",
+ "psr/log": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.5",
+ "graylog2/gelf-php": "~1.0",
+ "sentry/sentry": "^0.13",
+ "ruflin/elastica": ">=0.90 <3.0",
+ "doctrine/couchdb": "~1.0@dev",
+ "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+ "php-amqplib/php-amqplib": "~2.4",
+ "swiftmailer/swiftmailer": "^5.3|^6.0",
+ "php-console/php-console": "^3.1.3",
+ "phpunit/phpunit-mock-objects": "2.3.0",
+ "jakub-onderka/php-parallel-lint": "0.9"
+ },
+ "_": "phpunit/phpunit-mock-objects required in 2.3.0 due to https://github.com/sebastianbergmann/phpunit-mock-objects/issues/223 - needs hhvm 3.8+ on travis",
+ "suggest": {
+ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+ "sentry/sentry": "Allow sending log messages to a Sentry server",
+ "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+ "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
+ "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+ "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+ "ext-mongo": "Allow sending log messages to a MongoDB server",
+ "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
+ "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+ "rollbar/rollbar": "Allow sending log messages to Rollbar",
+ "php-console/php-console": "Allow sending log messages to Google Chrome"
+ },
+ "autoload": {
+ "psr-4": {"Monolog\\": "src/Monolog"}
+ },
+ "autoload-dev": {
+ "psr-4": {"Monolog\\": "tests/Monolog"}
+ },
+ "provide": {
+ "psr/log-implementation": "1.0.0"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "scripts": {
+ "test": [
+ "parallel-lint . --exclude vendor",
+ "phpunit"
+ ]
+ }
+}
diff --git a/vendor/monolog/monolog/doc/01-usage.md b/vendor/monolog/monolog/doc/01-usage.md
new file mode 100644
index 0000000000..8e2551f38d
--- /dev/null
+++ b/vendor/monolog/monolog/doc/01-usage.md
@@ -0,0 +1,231 @@
+# Using Monolog
+
+- [Installation](#installation)
+- [Core Concepts](#core-concepts)
+- [Log Levels](#log-levels)
+- [Configuring a logger](#configuring-a-logger)
+- [Adding extra data in the records](#adding-extra-data-in-the-records)
+- [Leveraging channels](#leveraging-channels)
+- [Customizing the log format](#customizing-the-log-format)
+
+## Installation
+
+Monolog is available on Packagist ([monolog/monolog](http://packagist.org/packages/monolog/monolog))
+and as such installable via [Composer](http://getcomposer.org/).
+
+```bash
+composer require monolog/monolog
+```
+
+If you do not use Composer, you can grab the code from GitHub, and use any
+PSR-0 compatible autoloader (e.g. the [Symfony2 ClassLoader component](https://github.com/symfony/ClassLoader))
+to load Monolog classes.
+
+## Core Concepts
+
+Every `Logger` instance has a channel (name) and a stack of handlers. Whenever
+you add a record to the logger, it traverses the handler stack. Each handler
+decides whether it fully handled the record, and if so, the propagation of the
+record ends there.
+
+This allows for flexible logging setups, for example having a `StreamHandler` at
+the bottom of the stack that will log anything to disk, and on top of that add
+a `MailHandler` that will send emails only when an error message is logged.
+Handlers also have a `$bubble` property which defines whether they block the
+record or not if they handled it. In this example, setting the `MailHandler`'s
+`$bubble` argument to false means that records handled by the `MailHandler` will
+not propagate to the `StreamHandler` anymore.
+
+You can create many `Logger`s, each defining a channel (e.g.: db, request,
+router, ..) and each of them combining various handlers, which can be shared
+or not. The channel is reflected in the logs and allows you to easily see or
+filter records.
+
+Each Handler also has a Formatter, a default one with settings that make sense
+will be created if you don't set one. The formatters normalize and format
+incoming records so that they can be used by the handlers to output useful
+information.
+
+Custom severity levels are not available. Only the eight
+[RFC 5424](http://tools.ietf.org/html/rfc5424) levels (debug, info, notice,
+warning, error, critical, alert, emergency) are present for basic filtering
+purposes, but for sorting and other use cases that would require
+flexibility, you should add Processors to the Logger that can add extra
+information (tags, user ip, ..) to the records before they are handled.
+
+## Log Levels
+
+Monolog supports the logging levels described by [RFC 5424](http://tools.ietf.org/html/rfc5424).
+
+- **DEBUG** (100): Detailed debug information.
+
+- **INFO** (200): Interesting events. Examples: User logs in, SQL logs.
+
+- **NOTICE** (250): Normal but significant events.
+
+- **WARNING** (300): Exceptional occurrences that are not errors. Examples:
+ Use of deprecated APIs, poor use of an API, undesirable things that are not
+ necessarily wrong.
+
+- **ERROR** (400): Runtime errors that do not require immediate action but
+ should typically be logged and monitored.
+
+- **CRITICAL** (500): Critical conditions. Example: Application component
+ unavailable, unexpected exception.
+
+- **ALERT** (550): Action must be taken immediately. Example: Entire website
+ down, database unavailable, etc. This should trigger the SMS alerts and wake
+ you up.
+
+- **EMERGENCY** (600): Emergency: system is unusable.
+
+## Configuring a logger
+
+Here is a basic setup to log to a file and to firephp on the DEBUG level:
+
+```php
+pushHandler(new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG));
+$logger->pushHandler(new FirePHPHandler());
+
+// You can now use your logger
+$logger->addInfo('My logger is now ready');
+```
+
+Let's explain it. The first step is to create the logger instance which will
+be used in your code. The argument is a channel name, which is useful when
+you use several loggers (see below for more details about it).
+
+The logger itself does not know how to handle a record. It delegates it to
+some handlers. The code above registers two handlers in the stack to allow
+handling records in two different ways.
+
+Note that the FirePHPHandler is called first as it is added on top of the
+stack. This allows you to temporarily add a logger with bubbling disabled if
+you want to override other configured loggers.
+
+> If you use Monolog standalone and are looking for an easy way to
+> configure many handlers, the [theorchard/monolog-cascade](https://github.com/theorchard/monolog-cascade)
+> can help you build complex logging configs via PHP arrays, yaml or json configs.
+
+## Adding extra data in the records
+
+Monolog provides two different ways to add extra informations along the simple
+textual message.
+
+### Using the logging context
+
+The first way is the context, allowing to pass an array of data along the
+record:
+
+```php
+addInfo('Adding a new user', array('username' => 'Seldaek'));
+```
+
+Simple handlers (like the StreamHandler for instance) will simply format
+the array to a string but richer handlers can take advantage of the context
+(FirePHP is able to display arrays in pretty way for instance).
+
+### Using processors
+
+The second way is to add extra data for all records by using a processor.
+Processors can be any callable. They will get the record as parameter and
+must return it after having eventually changed the `extra` part of it. Let's
+write a processor adding some dummy data in the record:
+
+```php
+pushProcessor(function ($record) {
+ $record['extra']['dummy'] = 'Hello world!';
+
+ return $record;
+});
+```
+
+Monolog provides some built-in processors that can be used in your project.
+Look at the [dedicated chapter](https://github.com/Seldaek/monolog/blob/master/doc/02-handlers-formatters-processors.md#processors) for the list.
+
+> Tip: processors can also be registered on a specific handler instead of
+ the logger to apply only for this handler.
+
+## Leveraging channels
+
+Channels are a great way to identify to which part of the application a record
+is related. This is useful in big applications (and is leveraged by
+MonologBundle in Symfony2).
+
+Picture two loggers sharing a handler that writes to a single log file.
+Channels would allow you to identify the logger that issued every record.
+You can easily grep through the log files filtering this or that channel.
+
+```php
+pushHandler($stream);
+$logger->pushHandler($firephp);
+
+// Create a logger for the security-related stuff with a different channel
+$securityLogger = new Logger('security');
+$securityLogger->pushHandler($stream);
+$securityLogger->pushHandler($firephp);
+
+// Or clone the first one to only change the channel
+$securityLogger = $logger->withName('security');
+```
+
+## Customizing the log format
+
+In Monolog it's easy to customize the format of the logs written into files,
+sockets, mails, databases and other handlers. Most of the handlers use the
+
+```php
+$record['formatted']
+```
+
+value to be automatically put into the log device. This value depends on the
+formatter settings. You can choose between predefined formatter classes or
+write your own (e.g. a multiline text file for human-readable output).
+
+To configure a predefined formatter class, just set it as the handler's field:
+
+```php
+// the default date format is "Y-m-d H:i:s"
+$dateFormat = "Y n j, g:i a";
+// the default output format is "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n"
+$output = "%datetime% > %level_name% > %message% %context% %extra%\n";
+// finally, create a formatter
+$formatter = new LineFormatter($output, $dateFormat);
+
+// Create a handler
+$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG);
+$stream->setFormatter($formatter);
+// bind it to a logger object
+$securityLogger = new Logger('security');
+$securityLogger->pushHandler($stream);
+```
+
+You may also reuse the same formatter between multiple handlers and share those
+handlers between multiple loggers.
+
+[Handlers, Formatters and Processors](02-handlers-formatters-processors.md) →
diff --git a/vendor/monolog/monolog/doc/02-handlers-formatters-processors.md b/vendor/monolog/monolog/doc/02-handlers-formatters-processors.md
new file mode 100644
index 0000000000..bea968ace8
--- /dev/null
+++ b/vendor/monolog/monolog/doc/02-handlers-formatters-processors.md
@@ -0,0 +1,157 @@
+# Handlers, Formatters and Processors
+
+- [Handlers](#handlers)
+ - [Log to files and syslog](#log-to-files-and-syslog)
+ - [Send alerts and emails](#send-alerts-and-emails)
+ - [Log specific servers and networked logging](#log-specific-servers-and-networked-logging)
+ - [Logging in development](#logging-in-development)
+ - [Log to databases](#log-to-databases)
+ - [Wrappers / Special Handlers](#wrappers--special-handlers)
+- [Formatters](#formatters)
+- [Processors](#processors)
+- [Third Party Packages](#third-party-packages)
+
+## Handlers
+
+### Log to files and syslog
+
+- _StreamHandler_: Logs records into any PHP stream, use this for log files.
+- _RotatingFileHandler_: Logs records to a file and creates one logfile per day.
+ It will also delete files older than `$maxFiles`. You should use
+ [logrotate](http://linuxcommand.org/man_pages/logrotate8.html) for high profile
+ setups though, this is just meant as a quick and dirty solution.
+- _SyslogHandler_: Logs records to the syslog.
+- _ErrorLogHandler_: Logs records to PHP's
+ [`error_log()`](http://docs.php.net/manual/en/function.error-log.php) function.
+
+### Send alerts and emails
+
+- _NativeMailerHandler_: Sends emails using PHP's
+ [`mail()`](http://php.net/manual/en/function.mail.php) function.
+- _SwiftMailerHandler_: Sends emails using a [`Swift_Mailer`](http://swiftmailer.org/) instance.
+- _PushoverHandler_: Sends mobile notifications via the [Pushover](https://www.pushover.net/) API.
+- _HipChatHandler_: Logs records to a [HipChat](http://hipchat.com) chat room using its API.
+- _FlowdockHandler_: Logs records to a [Flowdock](https://www.flowdock.com/) account.
+- _SlackHandler_: Logs records to a [Slack](https://www.slack.com/) account using the Slack API.
+- _SlackbotHandler_: Logs records to a [Slack](https://www.slack.com/) account using the Slackbot incoming hook.
+- _SlackWebhookHandler_: Logs records to a [Slack](https://www.slack.com/) account using Slack Webhooks.
+- _MandrillHandler_: Sends emails via the Mandrill API using a [`Swift_Message`](http://swiftmailer.org/) instance.
+- _FleepHookHandler_: Logs records to a [Fleep](https://fleep.io/) conversation using Webhooks.
+- _IFTTTHandler_: Notifies an [IFTTT](https://ifttt.com/maker) trigger with the log channel, level name and message.
+
+### Log specific servers and networked logging
+
+- _SocketHandler_: Logs records to [sockets](http://php.net/fsockopen), use this
+ for UNIX and TCP sockets. See an [example](sockets.md).
+- _AmqpHandler_: Logs records to an [amqp](http://www.amqp.org/) compatible
+ server. Requires the [php-amqp](http://pecl.php.net/package/amqp) extension (1.0+).
+- _GelfHandler_: Logs records to a [Graylog2](http://www.graylog2.org) server.
+- _CubeHandler_: Logs records to a [Cube](http://square.github.com/cube/) server.
+- _RavenHandler_: Logs records to a [Sentry](http://getsentry.com/) server using
+ [raven](https://packagist.org/packages/raven/raven).
+- _ZendMonitorHandler_: Logs records to the Zend Monitor present in Zend Server.
+- _NewRelicHandler_: Logs records to a [NewRelic](http://newrelic.com/) application.
+- _LogglyHandler_: Logs records to a [Loggly](http://www.loggly.com/) account.
+- _RollbarHandler_: Logs records to a [Rollbar](https://rollbar.com/) account.
+- _SyslogUdpHandler_: Logs records to a remote [Syslogd](http://www.rsyslog.com/) server.
+- _LogEntriesHandler_: Logs records to a [LogEntries](http://logentries.com/) account.
+
+### Logging in development
+
+- _FirePHPHandler_: Handler for [FirePHP](http://www.firephp.org/), providing
+ inline `console` messages within [FireBug](http://getfirebug.com/).
+- _ChromePHPHandler_: Handler for [ChromePHP](http://www.chromephp.com/), providing
+ inline `console` messages within Chrome.
+- _BrowserConsoleHandler_: Handler to send logs to browser's Javascript `console` with
+ no browser extension required. Most browsers supporting `console` API are supported.
+- _PHPConsoleHandler_: Handler for [PHP Console](https://chrome.google.com/webstore/detail/php-console/nfhmhhlpfleoednkpnnnkolmclajemef), providing
+ inline `console` and notification popup messages within Chrome.
+
+### Log to databases
+
+- _RedisHandler_: Logs records to a [redis](http://redis.io) server.
+- _MongoDBHandler_: Handler to write records in MongoDB via a
+ [Mongo](http://pecl.php.net/package/mongo) extension connection.
+- _CouchDBHandler_: Logs records to a CouchDB server.
+- _DoctrineCouchDBHandler_: Logs records to a CouchDB server via the Doctrine CouchDB ODM.
+- _ElasticSearchHandler_: Logs records to an Elastic Search server.
+- _DynamoDbHandler_: Logs records to a DynamoDB table with the [AWS SDK](https://github.com/aws/aws-sdk-php).
+
+### Wrappers / Special Handlers
+
+- _FingersCrossedHandler_: A very interesting wrapper. It takes a logger as
+ parameter and will accumulate log records of all levels until a record
+ exceeds the defined severity level. At which point it delivers all records,
+ including those of lower severity, to the handler it wraps. This means that
+ until an error actually happens you will not see anything in your logs, but
+ when it happens you will have the full information, including debug and info
+ records. This provides you with all the information you need, but only when
+ you need it.
+- _DeduplicationHandler_: Useful if you are sending notifications or emails
+ when critical errors occur. It takes a logger as parameter and will
+ accumulate log records of all levels until the end of the request (or
+ `flush()` is called). At that point it delivers all records to the handler
+ it wraps, but only if the records are unique over a given time period
+ (60seconds by default). If the records are duplicates they are simply
+ discarded. The main use of this is in case of critical failure like if your
+ database is unreachable for example all your requests will fail and that
+ can result in a lot of notifications being sent. Adding this handler reduces
+ the amount of notifications to a manageable level.
+- _WhatFailureGroupHandler_: This handler extends the _GroupHandler_ ignoring
+ exceptions raised by each child handler. This allows you to ignore issues
+ where a remote tcp connection may have died but you do not want your entire
+ application to crash and may wish to continue to log to other handlers.
+- _BufferHandler_: This handler will buffer all the log records it receives
+ until `close()` is called at which point it will call `handleBatch()` on the
+ handler it wraps with all the log messages at once. This is very useful to
+ send an email with all records at once for example instead of having one mail
+ for every log record.
+- _GroupHandler_: This handler groups other handlers. Every record received is
+ sent to all the handlers it is configured with.
+- _FilterHandler_: This handler only lets records of the given levels through
+ to the wrapped handler.
+- _SamplingHandler_: Wraps around another handler and lets you sample records
+ if you only want to store some of them.
+- _NullHandler_: Any record it can handle will be thrown away. This can be used
+ to put on top of an existing handler stack to disable it temporarily.
+- _PsrHandler_: Can be used to forward log records to an existing PSR-3 logger
+- _TestHandler_: Used for testing, it records everything that is sent to it and
+ has accessors to read out the information.
+- _HandlerWrapper_: A simple handler wrapper you can inherit from to create
+ your own wrappers easily.
+
+## Formatters
+
+- _LineFormatter_: Formats a log record into a one-line string.
+- _HtmlFormatter_: Used to format log records into a human readable html table, mainly suitable for emails.
+- _NormalizerFormatter_: Normalizes objects/resources down to strings so a record can easily be serialized/encoded.
+- _ScalarFormatter_: Used to format log records into an associative array of scalar values.
+- _JsonFormatter_: Encodes a log record into json.
+- _WildfireFormatter_: Used to format log records into the Wildfire/FirePHP protocol, only useful for the FirePHPHandler.
+- _ChromePHPFormatter_: Used to format log records into the ChromePHP format, only useful for the ChromePHPHandler.
+- _GelfMessageFormatter_: Used to format log records into Gelf message instances, only useful for the GelfHandler.
+- _LogstashFormatter_: Used to format log records into [logstash](http://logstash.net/) event json, useful for any handler listed under inputs [here](http://logstash.net/docs/latest).
+- _ElasticaFormatter_: Used to format log records into an Elastica\Document object, only useful for the ElasticSearchHandler.
+- _LogglyFormatter_: Used to format log records into Loggly messages, only useful for the LogglyHandler.
+- _FlowdockFormatter_: Used to format log records into Flowdock messages, only useful for the FlowdockHandler.
+- _MongoDBFormatter_: Converts \DateTime instances to \MongoDate and objects recursively to arrays, only useful with the MongoDBHandler.
+
+## Processors
+
+- _PsrLogMessageProcessor_: Processes a log record's message according to PSR-3 rules, replacing `{foo}` with the value from `$context['foo']`.
+- _IntrospectionProcessor_: Adds the line/file/class/method from which the log call originated.
+- _WebProcessor_: Adds the current request URI, request method and client IP to a log record.
+- _MemoryUsageProcessor_: Adds the current memory usage to a log record.
+- _MemoryPeakUsageProcessor_: Adds the peak memory usage to a log record.
+- _ProcessIdProcessor_: Adds the process id to a log record.
+- _UidProcessor_: Adds a unique identifier to a log record.
+- _GitProcessor_: Adds the current git branch and commit to a log record.
+- _TagProcessor_: Adds an array of predefined tags to a log record.
+
+## Third Party Packages
+
+Third party handlers, formatters and processors are
+[listed in the wiki](https://github.com/Seldaek/monolog/wiki/Third-Party-Packages). You
+can also add your own there if you publish one.
+
+← [Usage](01-usage.md) | [Utility classes](03-utilities.md) →
diff --git a/vendor/monolog/monolog/doc/03-utilities.md b/vendor/monolog/monolog/doc/03-utilities.md
new file mode 100644
index 0000000000..c62aa41611
--- /dev/null
+++ b/vendor/monolog/monolog/doc/03-utilities.md
@@ -0,0 +1,13 @@
+# Utilities
+
+- _Registry_: The `Monolog\Registry` class lets you configure global loggers that you
+ can then statically access from anywhere. It is not really a best practice but can
+ help in some older codebases or for ease of use.
+- _ErrorHandler_: The `Monolog\ErrorHandler` class allows you to easily register
+ a Logger instance as an exception handler, error handler or fatal error handler.
+- _ErrorLevelActivationStrategy_: Activates a FingersCrossedHandler when a certain log
+ level is reached.
+- _ChannelLevelActivationStrategy_: Activates a FingersCrossedHandler when a certain
+ log level is reached, depending on which channel received the log record.
+
+← [Handlers, Formatters and Processors](02-handlers-formatters-processors.md) | [Extending Monolog](04-extending.md) →
diff --git a/vendor/monolog/monolog/doc/04-extending.md b/vendor/monolog/monolog/doc/04-extending.md
new file mode 100644
index 0000000000..ebd9104db6
--- /dev/null
+++ b/vendor/monolog/monolog/doc/04-extending.md
@@ -0,0 +1,76 @@
+# Extending Monolog
+
+Monolog is fully extensible, allowing you to adapt your logger to your needs.
+
+## Writing your own handler
+
+Monolog provides many built-in handlers. But if the one you need does not
+exist, you can write it and use it in your logger. The only requirement is
+to implement `Monolog\Handler\HandlerInterface`.
+
+Let's write a PDOHandler to log records to a database. We will extend the
+abstract class provided by Monolog to keep things DRY.
+
+```php
+pdo = $pdo;
+ parent::__construct($level, $bubble);
+ }
+
+ protected function write(array $record)
+ {
+ if (!$this->initialized) {
+ $this->initialize();
+ }
+
+ $this->statement->execute(array(
+ 'channel' => $record['channel'],
+ 'level' => $record['level'],
+ 'message' => $record['formatted'],
+ 'time' => $record['datetime']->format('U'),
+ ));
+ }
+
+ private function initialize()
+ {
+ $this->pdo->exec(
+ 'CREATE TABLE IF NOT EXISTS monolog '
+ .'(channel VARCHAR(255), level INTEGER, message LONGTEXT, time INTEGER UNSIGNED)'
+ );
+ $this->statement = $this->pdo->prepare(
+ 'INSERT INTO monolog (channel, level, message, time) VALUES (:channel, :level, :message, :time)'
+ );
+
+ $this->initialized = true;
+ }
+}
+```
+
+You can now use this handler in your logger:
+
+```php
+pushHandler(new PDOHandler(new PDO('sqlite:logs.sqlite')));
+
+// You can now use your logger
+$logger->addInfo('My logger is now ready');
+```
+
+The `Monolog\Handler\AbstractProcessingHandler` class provides most of the
+logic needed for the handler, including the use of processors and the formatting
+of the record (which is why we use ``$record['formatted']`` instead of ``$record['message']``).
+
+← [Utility classes](03-utilities.md)
diff --git a/vendor/monolog/monolog/doc/sockets.md b/vendor/monolog/monolog/doc/sockets.md
new file mode 100644
index 0000000000..ea9cf0ea76
--- /dev/null
+++ b/vendor/monolog/monolog/doc/sockets.md
@@ -0,0 +1,39 @@
+Sockets Handler
+===============
+
+This handler allows you to write your logs to sockets using [fsockopen](http://php.net/fsockopen)
+or [pfsockopen](http://php.net/pfsockopen).
+
+Persistent sockets are mainly useful in web environments where you gain some performance not closing/opening
+the connections between requests.
+
+You can use a `unix://` prefix to access unix sockets and `udp://` to open UDP sockets instead of the default TCP.
+
+Basic Example
+-------------
+
+```php
+setPersistent(true);
+
+// Now add the handler
+$logger->pushHandler($handler, Logger::DEBUG);
+
+// You can now use your logger
+$logger->addInfo('My logger is now ready');
+
+```
+
+In this example, using syslog-ng, you should see the log on the log server:
+
+ cweb1 [2012-02-26 00:12:03] my_logger.INFO: My logger is now ready [] []
+
diff --git a/vendor/monolog/monolog/phpunit.xml.dist b/vendor/monolog/monolog/phpunit.xml.dist
new file mode 100644
index 0000000000..20d82b631d
--- /dev/null
+++ b/vendor/monolog/monolog/phpunit.xml.dist
@@ -0,0 +1,19 @@
+
+
+
+
+
+ tests/Monolog/
+
+
+
+
+
+ src/Monolog/
+
+
+
+
+
+
+
diff --git a/vendor/monolog/monolog/src/Monolog/ErrorHandler.php b/vendor/monolog/monolog/src/Monolog/ErrorHandler.php
new file mode 100644
index 0000000000..7bfcd833a5
--- /dev/null
+++ b/vendor/monolog/monolog/src/Monolog/ErrorHandler.php
@@ -0,0 +1,230 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog;
+
+use Psr\Log\LoggerInterface;
+use Psr\Log\LogLevel;
+use Monolog\Handler\AbstractHandler;
+
+/**
+ * Monolog error handler
+ *
+ * A facility to enable logging of runtime errors, exceptions and fatal errors.
+ *
+ * Quick setup: ErrorHandler::register($logger);
+ *
+ * @author Jordi Boggiano
+ */
+class ErrorHandler
+{
+ private $logger;
+
+ private $previousExceptionHandler;
+ private $uncaughtExceptionLevel;
+
+ private $previousErrorHandler;
+ private $errorLevelMap;
+ private $handleOnlyReportedErrors;
+
+ private $hasFatalErrorHandler;
+ private $fatalLevel;
+ private $reservedMemory;
+ private static $fatalErrors = array(E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR);
+
+ public function __construct(LoggerInterface $logger)
+ {
+ $this->logger = $logger;
+ }
+
+ /**
+ * Registers a new ErrorHandler for a given Logger
+ *
+ * By default it will handle errors, exceptions and fatal errors
+ *
+ * @param LoggerInterface $logger
+ * @param array|false $errorLevelMap an array of E_* constant to LogLevel::* constant mapping, or false to disable error handling
+ * @param int|false $exceptionLevel a LogLevel::* constant, or false to disable exception handling
+ * @param int|false $fatalLevel a LogLevel::* constant, or false to disable fatal error handling
+ * @return ErrorHandler
+ */
+ public static function register(LoggerInterface $logger, $errorLevelMap = array(), $exceptionLevel = null, $fatalLevel = null)
+ {
+ //Forces the autoloader to run for LogLevel. Fixes an autoload issue at compile-time on PHP5.3. See https://github.com/Seldaek/monolog/pull/929
+ class_exists('\\Psr\\Log\\LogLevel', true);
+
+ $handler = new static($logger);
+ if ($errorLevelMap !== false) {
+ $handler->registerErrorHandler($errorLevelMap);
+ }
+ if ($exceptionLevel !== false) {
+ $handler->registerExceptionHandler($exceptionLevel);
+ }
+ if ($fatalLevel !== false) {
+ $handler->registerFatalHandler($fatalLevel);
+ }
+
+ return $handler;
+ }
+
+ public function registerExceptionHandler($level = null, $callPrevious = true)
+ {
+ $prev = set_exception_handler(array($this, 'handleException'));
+ $this->uncaughtExceptionLevel = $level;
+ if ($callPrevious && $prev) {
+ $this->previousExceptionHandler = $prev;
+ }
+ }
+
+ public function registerErrorHandler(array $levelMap = array(), $callPrevious = true, $errorTypes = -1, $handleOnlyReportedErrors = true)
+ {
+ $prev = set_error_handler(array($this, 'handleError'), $errorTypes);
+ $this->errorLevelMap = array_replace($this->defaultErrorLevelMap(), $levelMap);
+ if ($callPrevious) {
+ $this->previousErrorHandler = $prev ?: true;
+ }
+
+ $this->handleOnlyReportedErrors = $handleOnlyReportedErrors;
+ }
+
+ public function registerFatalHandler($level = null, $reservedMemorySize = 20)
+ {
+ register_shutdown_function(array($this, 'handleFatalError'));
+
+ $this->reservedMemory = str_repeat(' ', 1024 * $reservedMemorySize);
+ $this->fatalLevel = $level;
+ $this->hasFatalErrorHandler = true;
+ }
+
+ protected function defaultErrorLevelMap()
+ {
+ return array(
+ E_ERROR => LogLevel::CRITICAL,
+ E_WARNING => LogLevel::WARNING,
+ E_PARSE => LogLevel::ALERT,
+ E_NOTICE => LogLevel::NOTICE,
+ E_CORE_ERROR => LogLevel::CRITICAL,
+ E_CORE_WARNING => LogLevel::WARNING,
+ E_COMPILE_ERROR => LogLevel::ALERT,
+ E_COMPILE_WARNING => LogLevel::WARNING,
+ E_USER_ERROR => LogLevel::ERROR,
+ E_USER_WARNING => LogLevel::WARNING,
+ E_USER_NOTICE => LogLevel::NOTICE,
+ E_STRICT => LogLevel::NOTICE,
+ E_RECOVERABLE_ERROR => LogLevel::ERROR,
+ E_DEPRECATED => LogLevel::NOTICE,
+ E_USER_DEPRECATED => LogLevel::NOTICE,
+ );
+ }
+
+ /**
+ * @private
+ */
+ public function handleException($e)
+ {
+ $this->logger->log(
+ $this->uncaughtExceptionLevel === null ? LogLevel::ERROR : $this->uncaughtExceptionLevel,
+ sprintf('Uncaught Exception %s: "%s" at %s line %s', get_class($e), $e->getMessage(), $e->getFile(), $e->getLine()),
+ array('exception' => $e)
+ );
+
+ if ($this->previousExceptionHandler) {
+ call_user_func($this->previousExceptionHandler, $e);
+ }
+
+ exit(255);
+ }
+
+ /**
+ * @private
+ */
+ public function handleError($code, $message, $file = '', $line = 0, $context = array())
+ {
+ if ($this->handleOnlyReportedErrors && !(error_reporting() & $code)) {
+ return;
+ }
+
+ // fatal error codes are ignored if a fatal error handler is present as well to avoid duplicate log entries
+ if (!$this->hasFatalErrorHandler || !in_array($code, self::$fatalErrors, true)) {
+ $level = isset($this->errorLevelMap[$code]) ? $this->errorLevelMap[$code] : LogLevel::CRITICAL;
+ $this->logger->log($level, self::codeToString($code).': '.$message, array('code' => $code, 'message' => $message, 'file' => $file, 'line' => $line));
+ }
+
+ if ($this->previousErrorHandler === true) {
+ return false;
+ } elseif ($this->previousErrorHandler) {
+ return call_user_func($this->previousErrorHandler, $code, $message, $file, $line, $context);
+ }
+ }
+
+ /**
+ * @private
+ */
+ public function handleFatalError()
+ {
+ $this->reservedMemory = null;
+
+ $lastError = error_get_last();
+ if ($lastError && in_array($lastError['type'], self::$fatalErrors, true)) {
+ $this->logger->log(
+ $this->fatalLevel === null ? LogLevel::ALERT : $this->fatalLevel,
+ 'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'],
+ array('code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'])
+ );
+
+ if ($this->logger instanceof Logger) {
+ foreach ($this->logger->getHandlers() as $handler) {
+ if ($handler instanceof AbstractHandler) {
+ $handler->close();
+ }
+ }
+ }
+ }
+ }
+
+ private static function codeToString($code)
+ {
+ switch ($code) {
+ case E_ERROR:
+ return 'E_ERROR';
+ case E_WARNING:
+ return 'E_WARNING';
+ case E_PARSE:
+ return 'E_PARSE';
+ case E_NOTICE:
+ return 'E_NOTICE';
+ case E_CORE_ERROR:
+ return 'E_CORE_ERROR';
+ case E_CORE_WARNING:
+ return 'E_CORE_WARNING';
+ case E_COMPILE_ERROR:
+ return 'E_COMPILE_ERROR';
+ case E_COMPILE_WARNING:
+ return 'E_COMPILE_WARNING';
+ case E_USER_ERROR:
+ return 'E_USER_ERROR';
+ case E_USER_WARNING:
+ return 'E_USER_WARNING';
+ case E_USER_NOTICE:
+ return 'E_USER_NOTICE';
+ case E_STRICT:
+ return 'E_STRICT';
+ case E_RECOVERABLE_ERROR:
+ return 'E_RECOVERABLE_ERROR';
+ case E_DEPRECATED:
+ return 'E_DEPRECATED';
+ case E_USER_DEPRECATED:
+ return 'E_USER_DEPRECATED';
+ }
+
+ return 'Unknown PHP error';
+ }
+}
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php
new file mode 100644
index 0000000000..9beda1e763
--- /dev/null
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php
@@ -0,0 +1,78 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+use Monolog\Logger;
+
+/**
+ * Formats a log message according to the ChromePHP array format
+ *
+ * @author Christophe Coevoet
+ */
+class ChromePHPFormatter implements FormatterInterface
+{
+ /**
+ * Translates Monolog log levels to Wildfire levels.
+ */
+ private $logLevels = array(
+ Logger::DEBUG => 'log',
+ Logger::INFO => 'info',
+ Logger::NOTICE => 'info',
+ Logger::WARNING => 'warn',
+ Logger::ERROR => 'error',
+ Logger::CRITICAL => 'error',
+ Logger::ALERT => 'error',
+ Logger::EMERGENCY => 'error',
+ );
+
+ /**
+ * {@inheritdoc}
+ */
+ public function format(array $record)
+ {
+ // Retrieve the line and file if set and remove them from the formatted extra
+ $backtrace = 'unknown';
+ if (isset($record['extra']['file'], $record['extra']['line'])) {
+ $backtrace = $record['extra']['file'].' : '.$record['extra']['line'];
+ unset($record['extra']['file'], $record['extra']['line']);
+ }
+
+ $message = array('message' => $record['message']);
+ if ($record['context']) {
+ $message['context'] = $record['context'];
+ }
+ if ($record['extra']) {
+ $message['extra'] = $record['extra'];
+ }
+ if (count($message) === 1) {
+ $message = reset($message);
+ }
+
+ return array(
+ $record['channel'],
+ $message,
+ $backtrace,
+ $this->logLevels[$record['level']],
+ );
+ }
+
+ public function formatBatch(array $records)
+ {
+ $formatted = array();
+
+ foreach ($records as $record) {
+ $formatted[] = $this->format($record);
+ }
+
+ return $formatted;
+ }
+}
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php
new file mode 100644
index 0000000000..4c556cf178
--- /dev/null
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php
@@ -0,0 +1,89 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+use Elastica\Document;
+
+/**
+ * Format a log message into an Elastica Document
+ *
+ * @author Jelle Vink
+ */
+class ElasticaFormatter extends NormalizerFormatter
+{
+ /**
+ * @var string Elastic search index name
+ */
+ protected $index;
+
+ /**
+ * @var string Elastic search document type
+ */
+ protected $type;
+
+ /**
+ * @param string $index Elastic Search index name
+ * @param string $type Elastic Search document type
+ */
+ public function __construct($index, $type)
+ {
+ // elasticsearch requires a ISO 8601 format date with optional millisecond precision.
+ parent::__construct('Y-m-d\TH:i:s.uP');
+
+ $this->index = $index;
+ $this->type = $type;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function format(array $record)
+ {
+ $record = parent::format($record);
+
+ return $this->getDocument($record);
+ }
+
+ /**
+ * Getter index
+ * @return string
+ */
+ public function getIndex()
+ {
+ return $this->index;
+ }
+
+ /**
+ * Getter type
+ * @return string
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ /**
+ * Convert a log message into an Elastica Document
+ *
+ * @param array $record Log message
+ * @return Document
+ */
+ protected function getDocument($record)
+ {
+ $document = new Document();
+ $document->setData($record);
+ $document->setType($this->type);
+ $document->setIndex($this->index);
+
+ return $document;
+ }
+}
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php
new file mode 100644
index 0000000000..5094af3c77
--- /dev/null
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php
@@ -0,0 +1,116 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+/**
+ * formats the record to be used in the FlowdockHandler
+ *
+ * @author Dominik Liebler
+ */
+class FlowdockFormatter implements FormatterInterface
+{
+ /**
+ * @var string
+ */
+ private $source;
+
+ /**
+ * @var string
+ */
+ private $sourceEmail;
+
+ /**
+ * @param string $source
+ * @param string $sourceEmail
+ */
+ public function __construct($source, $sourceEmail)
+ {
+ $this->source = $source;
+ $this->sourceEmail = $sourceEmail;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function format(array $record)
+ {
+ $tags = array(
+ '#logs',
+ '#' . strtolower($record['level_name']),
+ '#' . $record['channel'],
+ );
+
+ foreach ($record['extra'] as $value) {
+ $tags[] = '#' . $value;
+ }
+
+ $subject = sprintf(
+ 'in %s: %s - %s',
+ $this->source,
+ $record['level_name'],
+ $this->getShortMessage($record['message'])
+ );
+
+ $record['flowdock'] = array(
+ 'source' => $this->source,
+ 'from_address' => $this->sourceEmail,
+ 'subject' => $subject,
+ 'content' => $record['message'],
+ 'tags' => $tags,
+ 'project' => $this->source,
+ );
+
+ return $record;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function formatBatch(array $records)
+ {
+ $formatted = array();
+
+ foreach ($records as $record) {
+ $formatted[] = $this->format($record);
+ }
+
+ return $formatted;
+ }
+
+ /**
+ * @param string $message
+ *
+ * @return string
+ */
+ public function getShortMessage($message)
+ {
+ static $hasMbString;
+
+ if (null === $hasMbString) {
+ $hasMbString = function_exists('mb_strlen');
+ }
+
+ $maxLength = 45;
+
+ if ($hasMbString) {
+ if (mb_strlen($message, 'UTF-8') > $maxLength) {
+ $message = mb_substr($message, 0, $maxLength - 4, 'UTF-8') . ' ...';
+ }
+ } else {
+ if (strlen($message) > $maxLength) {
+ $message = substr($message, 0, $maxLength - 4) . ' ...';
+ }
+ }
+
+ return $message;
+ }
+}
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php
new file mode 100644
index 0000000000..02632bb56f
--- /dev/null
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php
@@ -0,0 +1,85 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+/**
+ * Class FluentdFormatter
+ *
+ * Serializes a log message to Fluentd unix socket protocol
+ *
+ * Fluentd config:
+ *
+ *
+ *
+ * Monolog setup:
+ *
+ * $logger = new Monolog\Logger('fluent.tag');
+ * $fluentHandler = new Monolog\Handler\SocketHandler('unix:///var/run/td-agent/td-agent.sock');
+ * $fluentHandler->setFormatter(new Monolog\Formatter\FluentdFormatter());
+ * $logger->pushHandler($fluentHandler);
+ *
+ * @author Andrius Putna
+ */
+class FluentdFormatter implements FormatterInterface
+{
+ /**
+ * @var bool $levelTag should message level be a part of the fluentd tag
+ */
+ protected $levelTag = false;
+
+ public function __construct($levelTag = false)
+ {
+ if (!function_exists('json_encode')) {
+ throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s FluentdUnixFormatter');
+ }
+
+ $this->levelTag = (bool) $levelTag;
+ }
+
+ public function isUsingLevelsInTag()
+ {
+ return $this->levelTag;
+ }
+
+ public function format(array $record)
+ {
+ $tag = $record['channel'];
+ if ($this->levelTag) {
+ $tag .= '.' . strtolower($record['level_name']);
+ }
+
+ $message = array(
+ 'message' => $record['message'],
+ 'extra' => $record['extra'],
+ );
+
+ if (!$this->levelTag) {
+ $message['level'] = $record['level'];
+ $message['level_name'] = $record['level_name'];
+ }
+
+ return json_encode(array($tag, $record['datetime']->getTimestamp(), $message));
+ }
+
+ public function formatBatch(array $records)
+ {
+ $message = '';
+ foreach ($records as $record) {
+ $message .= $this->format($record);
+ }
+
+ return $message;
+ }
+}
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php b/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php
new file mode 100644
index 0000000000..b5de751112
--- /dev/null
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php
@@ -0,0 +1,36 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+/**
+ * Interface for formatters
+ *
+ * @author Jordi Boggiano
+ */
+interface FormatterInterface
+{
+ /**
+ * Formats a log record.
+ *
+ * @param array $record A record to format
+ * @return mixed The formatted record
+ */
+ public function format(array $record);
+
+ /**
+ * Formats a set of log records.
+ *
+ * @param array $records A set of records to format
+ * @return mixed The formatted set of records
+ */
+ public function formatBatch(array $records);
+}
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php
new file mode 100644
index 0000000000..2c1b0e86c5
--- /dev/null
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php
@@ -0,0 +1,138 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+use Monolog\Logger;
+use Gelf\Message;
+
+/**
+ * Serializes a log message to GELF
+ * @see http://www.graylog2.org/about/gelf
+ *
+ * @author Matt Lehner
+ */
+class GelfMessageFormatter extends NormalizerFormatter
+{
+ const DEFAULT_MAX_LENGTH = 32766;
+
+ /**
+ * @var string the name of the system for the Gelf log message
+ */
+ protected $systemName;
+
+ /**
+ * @var string a prefix for 'extra' fields from the Monolog record (optional)
+ */
+ protected $extraPrefix;
+
+ /**
+ * @var string a prefix for 'context' fields from the Monolog record (optional)
+ */
+ protected $contextPrefix;
+
+ /**
+ * @var int max length per field
+ */
+ protected $maxLength;
+
+ /**
+ * Translates Monolog log levels to Graylog2 log priorities.
+ */
+ private $logLevels = array(
+ Logger::DEBUG => 7,
+ Logger::INFO => 6,
+ Logger::NOTICE => 5,
+ Logger::WARNING => 4,
+ Logger::ERROR => 3,
+ Logger::CRITICAL => 2,
+ Logger::ALERT => 1,
+ Logger::EMERGENCY => 0,
+ );
+
+ public function __construct($systemName = null, $extraPrefix = null, $contextPrefix = 'ctxt_', $maxLength = null)
+ {
+ parent::__construct('U.u');
+
+ $this->systemName = $systemName ?: gethostname();
+
+ $this->extraPrefix = $extraPrefix;
+ $this->contextPrefix = $contextPrefix;
+ $this->maxLength = is_null($maxLength) ? self::DEFAULT_MAX_LENGTH : $maxLength;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function format(array $record)
+ {
+ $record = parent::format($record);
+
+ if (!isset($record['datetime'], $record['message'], $record['level'])) {
+ throw new \InvalidArgumentException('The record should at least contain datetime, message and level keys, '.var_export($record, true).' given');
+ }
+
+ $message = new Message();
+ $message
+ ->setTimestamp($record['datetime'])
+ ->setShortMessage((string) $record['message'])
+ ->setHost($this->systemName)
+ ->setLevel($this->logLevels[$record['level']]);
+
+ // message length + system name length + 200 for padding / metadata
+ $len = 200 + strlen((string) $record['message']) + strlen($this->systemName);
+
+ if ($len > $this->maxLength) {
+ $message->setShortMessage(substr($record['message'], 0, $this->maxLength));
+ }
+
+ if (isset($record['channel'])) {
+ $message->setFacility($record['channel']);
+ }
+ if (isset($record['extra']['line'])) {
+ $message->setLine($record['extra']['line']);
+ unset($record['extra']['line']);
+ }
+ if (isset($record['extra']['file'])) {
+ $message->setFile($record['extra']['file']);
+ unset($record['extra']['file']);
+ }
+
+ foreach ($record['extra'] as $key => $val) {
+ $val = is_scalar($val) || null === $val ? $val : $this->toJson($val);
+ $len = strlen($this->extraPrefix . $key . $val);
+ if ($len > $this->maxLength) {
+ $message->setAdditional($this->extraPrefix . $key, substr($val, 0, $this->maxLength));
+ break;
+ }
+ $message->setAdditional($this->extraPrefix . $key, $val);
+ }
+
+ foreach ($record['context'] as $key => $val) {
+ $val = is_scalar($val) || null === $val ? $val : $this->toJson($val);
+ $len = strlen($this->contextPrefix . $key . $val);
+ if ($len > $this->maxLength) {
+ $message->setAdditional($this->contextPrefix . $key, substr($val, 0, $this->maxLength));
+ break;
+ }
+ $message->setAdditional($this->contextPrefix . $key, $val);
+ }
+
+ if (null === $message->getFile() && isset($record['context']['exception']['file'])) {
+ if (preg_match("/^(.+):([0-9]+)$/", $record['context']['exception']['file'], $matches)) {
+ $message->setFile($matches[1]);
+ $message->setLine($matches[2]);
+ }
+ }
+
+ return $message;
+ }
+}
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php
new file mode 100644
index 0000000000..3eec95f6cc
--- /dev/null
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php
@@ -0,0 +1,141 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Formatter;
+
+use Monolog\Logger;
+
+/**
+ * Formats incoming records into an HTML table
+ *
+ * This is especially useful for html email logging
+ *
+ * @author Tiago Brito
+ */
+class HtmlFormatter extends NormalizerFormatter
+{
+ /**
+ * Translates Monolog log levels to html color priorities.
+ */
+ protected $logLevels = array(
+ Logger::DEBUG => '#cccccc',
+ Logger::INFO => '#468847',
+ Logger::NOTICE => '#3a87ad',
+ Logger::WARNING => '#c09853',
+ Logger::ERROR => '#f0ad4e',
+ Logger::CRITICAL => '#FF7708',
+ Logger::ALERT => '#C12A19',
+ Logger::EMERGENCY => '#000000',
+ );
+
+ /**
+ * @param string $dateFormat The format of the timestamp: one supported by DateTime::format
+ */
+ public function __construct($dateFormat = null)
+ {
+ parent::__construct($dateFormat);
+ }
+
+ /**
+ * Creates an HTML table row
+ *
+ * @param string $th Row header content
+ * @param string $td Row standard cell content
+ * @param bool $escapeTd false if td content must not be html escaped
+ * @return string
+ */
+ protected function addRow($th, $td = ' ', $escapeTd = true)
+ {
+ $th = htmlspecialchars($th, ENT_NOQUOTES, 'UTF-8');
+ if ($escapeTd) {
+ $td = '
'.htmlspecialchars($td, ENT_NOQUOTES, 'UTF-8').'
';
+ }
+
+ return "
\n
$th:
\n
".$td."
\n
";
+ }
+
+ /**
+ * Create a HTML h1 tag
+ *
+ * @param string $title Text to be in the h1
+ * @param int $level Error level
+ * @return string
+ */
+ protected function addTitle($title, $level)
+ {
+ $title = htmlspecialchars($title, ENT_NOQUOTES, 'UTF-8');
+
+ return '
'.$title.'
';
+ }
+
+ /**
+ * Formats a log record.
+ *
+ * @param array $record A record to format
+ * @return mixed The formatted record
+ */
+ public function format(array $record)
+ {
+ $output = $this->addTitle($record['level_name'], $record['level']);
+ $output .= '